From 91a5834dd701211f929fd25419dc34561ce3b4e7 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Fri, 14 Feb 2025 09:15:20 +0100 Subject: Initialize dev docs --- docs/dev/articles/FOCUS_D.html | 338 + .../articles/FOCUS_D_files/figure-html/plot-1.png | Bin 0 -> 80361 bytes .../FOCUS_D_files/figure-html/plot_2-1.png | Bin 0 -> 25051 bytes docs/dev/articles/FOCUS_L.html | 894 ++ .../figure-html/unnamed-chunk-10-1.png | Bin 0 -> 42974 bytes .../figure-html/unnamed-chunk-12-1.png | Bin 0 -> 83736 bytes .../figure-html/unnamed-chunk-13-1.png | Bin 0 -> 33606 bytes .../figure-html/unnamed-chunk-15-1.png | Bin 0 -> 58683 bytes .../figure-html/unnamed-chunk-4-1.png | Bin 0 -> 36066 bytes .../figure-html/unnamed-chunk-5-1.png | Bin 0 -> 22386 bytes .../figure-html/unnamed-chunk-6-1.png | Bin 0 -> 36579 bytes .../figure-html/unnamed-chunk-8-1.png | Bin 0 -> 41775 bytes .../figure-html/unnamed-chunk-9-1.png | Bin 0 -> 41403 bytes docs/dev/articles/index.html | 114 + docs/dev/articles/mkin.html | 414 + .../mkin_files/figure-html/unnamed-chunk-2-1.png | Bin 0 -> 91109 bytes docs/dev/articles/prebuilt/2022_cyan_pathway.html | 5397 +++++++++ .../figure-html/unnamed-chunk-13-1.png | Bin 0 -> 352828 bytes .../figure-html/unnamed-chunk-14-1.png | Bin 0 -> 358040 bytes .../figure-html/unnamed-chunk-15-1.png | Bin 0 -> 358363 bytes .../figure-html/unnamed-chunk-20-1.png | Bin 0 -> 372544 bytes .../figure-html/unnamed-chunk-21-1.png | Bin 0 -> 364943 bytes .../figure-html/unnamed-chunk-22-1.png | Bin 0 -> 367124 bytes .../figure-html/unnamed-chunk-7-1.png | Bin 0 -> 367815 bytes .../figure-html/unnamed-chunk-8-1.png | Bin 0 -> 367124 bytes docs/dev/articles/prebuilt/2022_dmta_parent.html | 2166 ++++ .../figure-html/convergence-saem-dfop-const-1.png | Bin 0 -> 174831 bytes .../figure-html/convergence-saem-dfop-tc-1.png | Bin 0 -> 150241 bytes .../convergence-saem-dfop-tc-no-ranef-k2-1.png | Bin 0 -> 163652 bytes .../figure-html/convergence-saem-fomc-const-1.png | Bin 0 -> 134868 bytes .../figure-html/convergence-saem-fomc-tc-1.png | Bin 0 -> 133755 bytes .../figure-html/convergence-saem-hs-const-1.png | Bin 0 -> 176784 bytes .../figure-html/convergence-saem-hs-tc-1.png | Bin 0 -> 138687 bytes .../figure-html/convergence-saem-sfo-const-1.png | Bin 0 -> 96920 bytes .../figure-html/convergence-saem-sfo-tc-1.png | Bin 0 -> 87496 bytes .../figure-html/multistart-full-par-1.png | Bin 0 -> 89747 bytes .../figure-html/multistart-reduced-par-1.png | Bin 0 -> 85433 bytes .../multistart-reduced-par-llquant-1.png | Bin 0 -> 71921 bytes .../plot-saem-dfop-tc-no-ranef-k2-1.png | Bin 0 -> 158350 bytes docs/dev/articles/prebuilt/2022_dmta_pathway.html | 2002 ++++ .../saem-sforb-path-1-tc-reduced-convergence-1.png | Bin 0 -> 211998 bytes .../figure-html/unnamed-chunk-2-1.png | Bin 0 -> 133547 bytes .../figure-html/unnamed-chunk-3-1.png | Bin 0 -> 391774 bytes .../figure-html/unnamed-chunk-4-1.png | Bin 0 -> 391056 bytes .../figure-html/unnamed-chunk-6-1.png | Bin 0 -> 386367 bytes .../figure-html/unnamed-chunk-7-1.png | Bin 0 -> 388971 bytes .../figure-html/unnamed-chunk-8-1.png | Bin 0 -> 391774 bytes .../articles/prebuilt/2023_mesotrione_parent.html | 2500 +++++ .../figure-html/unnamed-chunk-14-1.png | Bin 0 -> 209282 bytes .../figure-html/unnamed-chunk-19-1.png | Bin 0 -> 205377 bytes .../figure-html/unnamed-chunk-25-1.png | Bin 0 -> 208189 bytes .../figure-html/unnamed-chunk-30-1.png | Bin 0 -> 206155 bytes .../figure-html/unnamed-chunk-8-1.png | Bin 0 -> 202743 bytes docs/dev/articles/twa.html | 181 + docs/dev/articles/web_only/FOCUS_Z.html | 446 + .../figure-html/FOCUS_2006_Z_fits_1-1.png | Bin 0 -> 67444 bytes .../figure-html/FOCUS_2006_Z_fits_10-1.png | Bin 0 -> 107009 bytes .../figure-html/FOCUS_2006_Z_fits_11-1.png | Bin 0 -> 106098 bytes .../figure-html/FOCUS_2006_Z_fits_11a-1.png | Bin 0 -> 76831 bytes .../figure-html/FOCUS_2006_Z_fits_11b-1.png | Bin 0 -> 37494 bytes .../figure-html/FOCUS_2006_Z_fits_2-1.png | Bin 0 -> 67444 bytes .../figure-html/FOCUS_2006_Z_fits_3-1.png | Bin 0 -> 67259 bytes .../figure-html/FOCUS_2006_Z_fits_5-1.png | Bin 0 -> 81751 bytes .../figure-html/FOCUS_2006_Z_fits_6-1.png | Bin 0 -> 106406 bytes .../figure-html/FOCUS_2006_Z_fits_7-1.png | Bin 0 -> 105359 bytes .../figure-html/FOCUS_2006_Z_fits_9-1.png | Bin 0 -> 89110 bytes docs/dev/articles/web_only/NAFTA_examples.html | 1049 ++ .../NAFTA_examples_files/figure-html/p10-1.png | Bin 0 -> 81542 bytes .../NAFTA_examples_files/figure-html/p11-1.png | Bin 0 -> 77600 bytes .../NAFTA_examples_files/figure-html/p12a-1.png | Bin 0 -> 83512 bytes .../NAFTA_examples_files/figure-html/p12b-1.png | Bin 0 -> 71409 bytes .../NAFTA_examples_files/figure-html/p13-1.png | Bin 0 -> 78613 bytes .../NAFTA_examples_files/figure-html/p14-1.png | Bin 0 -> 81557 bytes .../NAFTA_examples_files/figure-html/p15a-1.png | Bin 0 -> 77580 bytes .../NAFTA_examples_files/figure-html/p15b-1.png | Bin 0 -> 79748 bytes .../NAFTA_examples_files/figure-html/p16-1.png | Bin 0 -> 94540 bytes .../NAFTA_examples_files/figure-html/p5a-1.png | Bin 0 -> 83061 bytes .../NAFTA_examples_files/figure-html/p5b-1.png | Bin 0 -> 81186 bytes .../NAFTA_examples_files/figure-html/p6-1.png | Bin 0 -> 83142 bytes .../NAFTA_examples_files/figure-html/p7-1.png | Bin 0 -> 102934 bytes .../NAFTA_examples_files/figure-html/p8-1.png | Bin 0 -> 93632 bytes .../NAFTA_examples_files/figure-html/p9a-1.png | Bin 0 -> 78782 bytes .../NAFTA_examples_files/figure-html/p9b-1.png | Bin 0 -> 76883 bytes docs/dev/articles/web_only/benchmarks.html | 1133 ++ docs/dev/articles/web_only/compiled_models.html | 231 + docs/dev/articles/web_only/dimethenamid_2018.html | 651 ++ .../figure-html/f_parent_mkin_dfop_const-1.png | Bin 0 -> 57786 bytes .../f_parent_mkin_dfop_const_test-1.png | Bin 0 -> 57786 bytes .../figure-html/f_parent_mkin_dfop_tc_test-1.png | Bin 0 -> 59146 bytes .../figure-html/f_parent_mkin_sfo_const-1.png | Bin 0 -> 55982 bytes .../figure-html/f_parent_saemix_dfop_const-1.png | Bin 0 -> 36337 bytes .../figure-html/f_parent_saemix_dfop_tc-1.png | Bin 0 -> 29343 bytes .../figure-html/f_parent_saemix_sfo_const-1.png | Bin 0 -> 32949 bytes .../figure-html/f_parent_saemix_sfo_tc-1.png | Bin 0 -> 28538 bytes .../figure-html/plot_parent_nlme-1.png | Bin 0 -> 59209 bytes docs/dev/articles/web_only/multistart.html | 179 + .../figure-html/unnamed-chunk-3-1.png | Bin 0 -> 62571 bytes .../figure-html/unnamed-chunk-4-1.png | Bin 0 -> 53560 bytes .../figure-html/unnamed-chunk-5-1.png | Bin 0 -> 22804 bytes docs/dev/articles/web_only/saem_benchmarks.html | 789 ++ docs/dev/authors.html | 118 + .../deps/bootstrap-5.3.1/bootstrap.bundle.min.js | 7 + .../bootstrap-5.3.1/bootstrap.bundle.min.js.map | 1 + docs/dev/deps/bootstrap-5.3.1/bootstrap.min.css | 5 + docs/dev/deps/bootstrap-5.3.1/font.css | 400 + .../fonts/07d40e985ad7c747025dabb9f22142c4.woff2 | Bin 0 -> 16456 bytes .../fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 | Bin 0 -> 48336 bytes .../fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 | Bin 0 -> 26988 bytes .../fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2 | Bin 0 -> 11384 bytes .../fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2 | Bin 0 -> 30860 bytes .../fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 | Bin 0 -> 25796 bytes .../fonts/1f5e011d6aae0d98fc0518e1a303e99a.woff2 | Bin 0 -> 10332 bytes .../fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2 | Bin 0 -> 46796 bytes .../fonts/4iCs6KVjbNBYlgoKcg72j00.woff2 | Bin 0 -> 24448 bytes .../fonts/4iCs6KVjbNBYlgoKcw72j00.woff2 | Bin 0 -> 14588 bytes .../fonts/4iCs6KVjbNBYlgoKew72j00.woff2 | Bin 0 -> 20860 bytes .../fonts/4iCs6KVjbNBYlgoKfA72j00.woff2 | Bin 0 -> 15116 bytes .../fonts/4iCs6KVjbNBYlgoKfw72.woff2 | Bin 0 -> 34852 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2 | Bin 0 -> 12936 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2 | Bin 0 -> 29752 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2 | Bin 0 -> 18200 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2 | Bin 0 -> 13284 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2 | Bin 0 -> 20876 bytes .../fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2 | Bin 0 -> 37840 bytes .../fonts/626330658504e338ee86aec8e957426b.woff2 | Bin 0 -> 21616 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2 | Bin 0 -> 1036 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2 | Bin 0 -> 1212 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2 | Bin 0 -> 14160 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2 | Bin 0 -> 5736 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2 | Bin 0 -> 19612 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2 | Bin 0 -> 1028 bytes .../6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2 | Bin 0 -> 908 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 | Bin 0 -> 5836 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 | Bin 0 -> 6004 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 | Bin 0 -> 5024 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 | Bin 0 -> 20616 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 | Bin 0 -> 7036 bytes .../fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 | Bin 0 -> 14892 bytes .../6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 | Bin 0 -> 7972 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2 | Bin 0 -> 7968 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2 | Bin 0 -> 6912 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 | Bin 0 -> 14824 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2 | Bin 0 -> 5828 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2 | Bin 0 -> 20428 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2 | Bin 0 -> 5016 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2 | Bin 0 -> 5944 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 | Bin 0 -> 7860 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 | Bin 0 -> 6904 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 | Bin 0 -> 14712 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 | Bin 0 -> 5728 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 | Bin 0 -> 20392 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 | Bin 0 -> 4972 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 | Bin 0 -> 5948 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 | Bin 0 -> 7912 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 | Bin 0 -> 6968 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 | Bin 0 -> 14780 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 | Bin 0 -> 5816 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 | Bin 0 -> 20388 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 | Bin 0 -> 4928 bytes .../6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 | Bin 0 -> 5996 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2 | Bin 0 -> 13436 bytes .../fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2 | Bin 0 -> 12228 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2 | Bin 0 -> 19980 bytes .../fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2 | Bin 0 -> 13360 bytes .../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2 | Bin 0 -> 2312 bytes .../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2 | Bin 0 -> 21792 bytes .../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2 | Bin 0 -> 1832 bytes .../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2 | Bin 0 -> 1636 bytes .../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2 | Bin 0 -> 1864 bytes .../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2 | Bin 0 -> 29280 bytes .../HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2 | Bin 0 -> 7700 bytes .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2 | Bin 0 -> 28908 bytes .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2 | Bin 0 -> 8488 bytes .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2 | Bin 0 -> 2932 bytes .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2 | Bin 0 -> 7692 bytes .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2 | Bin 0 -> 13872 bytes .../fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2 | Bin 0 -> 21528 bytes .../HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2 | Bin 0 -> 10312 bytes .../fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2 | Bin 0 -> 21288 bytes .../fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2 | Bin 0 -> 23516 bytes .../fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2 | Bin 0 -> 9512 bytes .../fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2 | Bin 0 -> 27812 bytes .../fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2 | Bin 0 -> 33092 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2 | Bin 0 -> 9840 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 | Bin 0 -> 15920 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2 | Bin 0 -> 7016 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2 | Bin 0 -> 1500 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2 | Bin 0 -> 14968 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 | Bin 0 -> 11800 bytes .../fonts/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2 | Bin 0 -> 5604 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 | Bin 0 -> 9576 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 | Bin 0 -> 15740 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 | Bin 0 -> 7120 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 | Bin 0 -> 1480 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 | Bin 0 -> 15000 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 | Bin 0 -> 11796 bytes .../fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 | Bin 0 -> 5468 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 | Bin 0 -> 9644 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 | Bin 0 -> 15860 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 | Bin 0 -> 6936 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 | Bin 0 -> 1432 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 | Bin 0 -> 14684 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 | Bin 0 -> 11824 bytes .../fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 | Bin 0 -> 5548 bytes .../fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 | Bin 0 -> 7112 bytes .../fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 | Bin 0 -> 15744 bytes .../fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 | Bin 0 -> 9628 bytes .../fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 | Bin 0 -> 15344 bytes .../fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 | Bin 0 -> 11872 bytes .../fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 | Bin 0 -> 5560 bytes .../fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 | Bin 0 -> 1484 bytes .../fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2 | Bin 0 -> 78908 bytes .../fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2 | Bin 0 -> 5600 bytes .../fonts/S6u8w4BMUTPHjxsAXC-q.woff2 | Bin 0 -> 24408 bytes .../fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2 | Bin 0 -> 5368 bytes .../fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 | Bin 0 -> 23040 bytes .../fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2 | Bin 0 -> 5624 bytes .../fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2 | Bin 0 -> 23236 bytes .../bootstrap-5.3.1/fonts/S6uyw4BMUTPHjx4wXg.woff2 | Bin 0 -> 23580 bytes .../fonts/S6uyw4BMUTPHjxAwXjeu.woff2 | Bin 0 -> 5472 bytes .../UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa0ZL7SUc.woff2 | Bin 0 -> 17600 bytes .../UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7.woff2 | Bin 0 -> 46704 bytes .../UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1pL7SUc.woff2 | Bin 0 -> 22480 bytes .../UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7SUc.woff2 | Bin 0 -> 79940 bytes .../UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7SUc.woff2 | Bin 0 -> 27284 bytes .../UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2ZL7SUc.woff2 | Bin 0 -> 12732 bytes .../UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7SUc.woff2 | Bin 0 -> 10540 bytes .../fonts/XRXV3I6Li01BKofIMeaBXso.woff2 | Bin 0 -> 20708 bytes .../fonts/XRXV3I6Li01BKofINeaB.woff2 | Bin 0 -> 39124 bytes .../fonts/XRXV3I6Li01BKofIO-aBXso.woff2 | Bin 0 -> 34608 bytes .../fonts/XRXV3I6Li01BKofIOOaBXso.woff2 | Bin 0 -> 28868 bytes .../fonts/XRXV3I6Li01BKofIOuaBXso.woff2 | Bin 0 -> 12960 bytes .../fonts/c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2 | Bin 0 -> 27216 bytes .../fonts/ee91700cdbf7ce16c054c2bb8946c736.woff2 | Bin 0 -> 31052 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 | Bin 0 -> 25968 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 | Bin 0 -> 37696 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 | Bin 0 -> 54888 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 | Bin 0 -> 4880 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 | Bin 0 -> 17136 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 | Bin 0 -> 17064 bytes ...tYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 | Bin 0 -> 50296 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 | Bin 0 -> 22780 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 | Bin 0 -> 32204 bytes ...Gs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 | Bin 0 -> 50484 bytes ...emvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 | Bin 0 -> 48236 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 | Bin 0 -> 16516 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 | Bin 0 -> 16552 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 | Bin 0 -> 35328 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 | Bin 0 -> 49436 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 | Bin 0 -> 4524 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 | Bin 0 -> 26736 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 | Bin 0 -> 21272 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 | Bin 0 -> 24984 bytes ...vYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 | Bin 0 -> 47136 bytes .../fonts/q5uGsou0JOdh94bfuQltOxU.woff2 | Bin 0 -> 19248 bytes .../fonts/q5uGsou0JOdh94bfvQlt.woff2 | Bin 0 -> 25376 bytes .../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js | 5 + docs/dev/deps/clipboard.js-2.0.11/clipboard.min.js | 7 + docs/dev/deps/data-deps.txt | 13 + docs/dev/deps/font-awesome-6.5.2/css/all.css | 8028 ++++++++++++++ docs/dev/deps/font-awesome-6.5.2/css/all.min.css | 9 + docs/dev/deps/font-awesome-6.5.2/css/v4-shims.css | 2194 ++++ .../deps/font-awesome-6.5.2/css/v4-shims.min.css | 6 + .../font-awesome-6.5.2/webfonts/fa-brands-400.ttf | Bin 0 -> 209128 bytes .../webfonts/fa-brands-400.woff2 | Bin 0 -> 117852 bytes .../font-awesome-6.5.2/webfonts/fa-regular-400.ttf | Bin 0 -> 67860 bytes .../webfonts/fa-regular-400.woff2 | Bin 0 -> 25392 bytes .../font-awesome-6.5.2/webfonts/fa-solid-900.ttf | Bin 0 -> 420332 bytes .../font-awesome-6.5.2/webfonts/fa-solid-900.woff2 | Bin 0 -> 156400 bytes .../webfonts/fa-v4compatibility.ttf | Bin 0 -> 10832 bytes .../webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4792 bytes docs/dev/deps/headroom-0.11.0/headroom.min.js | 7 + .../deps/headroom-0.11.0/jQuery.headroom.min.js | 7 + docs/dev/deps/jquery-3.6.0/jquery-3.6.0.js | 10881 +++++++++++++++++++ docs/dev/deps/jquery-3.6.0/jquery-3.6.0.min.js | 2 + docs/dev/deps/jquery-3.6.0/jquery-3.6.0.min.map | 1 + .../deps/search-1.0.0/autocomplete.jquery.min.js | 7 + docs/dev/deps/search-1.0.0/fuse.min.js | 9 + docs/dev/deps/search-1.0.0/mark.min.js | 7 + docs/dev/index.html | 280 + docs/dev/katex-auto.js | 14 + docs/dev/lightswitch.js | 85 + docs/dev/link.svg | 12 + docs/dev/news/index.html | 675 ++ docs/dev/pkgdown.js | 162 + docs/dev/pkgdown.yml | 23 + docs/dev/reference/AIC.mmkin.html | 175 + docs/dev/reference/BIC.mmkin.html | 8 + docs/dev/reference/CAKE_export.html | 178 + docs/dev/reference/D24_2014.html | 218 + docs/dev/reference/DFOP.solution-1.png | Bin 0 -> 31964 bytes docs/dev/reference/DFOP.solution.html | 155 + docs/dev/reference/Extract.mmkin.html | 187 + docs/dev/reference/FOCUS_2006_A.html | 8 + docs/dev/reference/FOCUS_2006_B.html | 8 + docs/dev/reference/FOCUS_2006_C.html | 8 + docs/dev/reference/FOCUS_2006_D.html | 8 + docs/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html | 145 + docs/dev/reference/FOCUS_2006_E.html | 8 + docs/dev/reference/FOCUS_2006_F.html | 8 + docs/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html | 142 + docs/dev/reference/FOCUS_2006_HS_ref_A_to_F.html | 145 + docs/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html | 139 + docs/dev/reference/FOCUS_2006_datasets.html | 133 + docs/dev/reference/FOMC.solution-1.png | Bin 0 -> 29520 bytes docs/dev/reference/FOMC.solution.html | 166 + docs/dev/reference/HS.solution-1.png | Bin 0 -> 29572 bytes docs/dev/reference/HS.solution.html | 156 + docs/dev/reference/IORE.solution-1.png | Bin 0 -> 30800 bytes docs/dev/reference/IORE.solution.html | 171 + docs/dev/reference/NAFTA_SOP_2015-1.png | Bin 0 -> 63875 bytes docs/dev/reference/NAFTA_SOP_2015.html | 167 + docs/dev/reference/NAFTA_SOP_Appendix_B.html | 8 + docs/dev/reference/NAFTA_SOP_Appendix_D.html | 8 + docs/dev/reference/NAFTA_SOP_Attachment-1.png | Bin 0 -> 65176 bytes docs/dev/reference/NAFTA_SOP_Attachment.html | 156 + docs/dev/reference/SFO.solution-1.png | Bin 0 -> 29614 bytes docs/dev/reference/SFO.solution.html | 143 + docs/dev/reference/SFORB.solution-1.png | Bin 0 -> 31673 bytes docs/dev/reference/SFORB.solution.html | 165 + docs/dev/reference/[.mhmkin.html | 8 + docs/dev/reference/add_err-1.png | Bin 0 -> 109428 bytes docs/dev/reference/add_err-2.png | Bin 0 -> 64140 bytes docs/dev/reference/add_err-3.png | Bin 0 -> 59180 bytes docs/dev/reference/add_err.html | 216 + docs/dev/reference/anova.saem.mmkin.html | 140 + docs/dev/reference/aw.html | 153 + docs/dev/reference/aw.mixed.mmkin.html | 8 + docs/dev/reference/aw.mkinfit.html | 8 + docs/dev/reference/aw.mmkin.html | 8 + docs/dev/reference/aw.multistart.html | 8 + docs/dev/reference/backtransform_odeparms.html | 8 + docs/dev/reference/best.default.html | 8 + docs/dev/reference/best.html | 8 + docs/dev/reference/check_failed.html | 100 + docs/dev/reference/confint.mkinfit.html | 382 + docs/dev/reference/create_deg_func.html | 148 + docs/dev/reference/dimethenamid_2018-1.png | Bin 0 -> 253131 bytes docs/dev/reference/dimethenamid_2018.html | 347 + docs/dev/reference/ds_dfop.html | 8 + docs/dev/reference/ds_dfop_sfo.html | 8 + docs/dev/reference/ds_fomc.html | 8 + docs/dev/reference/ds_hs.html | 8 + docs/dev/reference/ds_mixed-1.png | Bin 0 -> 219327 bytes docs/dev/reference/ds_mixed.html | 208 + docs/dev/reference/ds_sfo.html | 8 + docs/dev/reference/endpoints.html | 181 + docs/dev/reference/experimental_data_for_UBA-1.png | Bin 0 -> 103371 bytes docs/dev/reference/experimental_data_for_UBA.html | 255 + docs/dev/reference/f_time_norm_focus.html | 203 + docs/dev/reference/f_time_norm_focus.mkindsg.html | 8 + docs/dev/reference/f_time_norm_focus.numeric.html | 8 + docs/dev/reference/focus_soil_moisture.html | 123 + docs/dev/reference/get_deg_func.html | 97 + docs/dev/reference/hierarchical_kinetics.html | 158 + docs/dev/reference/html_listing.html | 8 + docs/dev/reference/illparms.html | 211 + docs/dev/reference/illparms.mhmkin.html | 8 + docs/dev/reference/illparms.mkinfit.html | 8 + docs/dev/reference/illparms.mmkin.html | 8 + docs/dev/reference/illparms.saem.mmkin.html | 8 + docs/dev/reference/ilr.html | 163 + docs/dev/reference/index.html | 735 ++ docs/dev/reference/intervals.html | 8 + docs/dev/reference/intervals.saem.mmkin.html | 121 + docs/dev/reference/invilr.html | 8 + docs/dev/reference/llhist.html | 123 + docs/dev/reference/loftest-1.png | Bin 0 -> 40997 bytes docs/dev/reference/loftest-2.png | Bin 0 -> 40551 bytes docs/dev/reference/loftest-3.png | Bin 0 -> 78294 bytes docs/dev/reference/loftest-4.png | Bin 0 -> 75822 bytes docs/dev/reference/loftest-5.png | Bin 0 -> 74615 bytes docs/dev/reference/loftest.html | 299 + docs/dev/reference/loftest.mkinfit.html | 8 + docs/dev/reference/logLik.mkinfit.html | 160 + docs/dev/reference/logLik.saem.mmkin.html | 109 + docs/dev/reference/logistic.solution-1.png | Bin 0 -> 81046 bytes docs/dev/reference/logistic.solution-2.png | Bin 0 -> 44080 bytes docs/dev/reference/logistic.solution.html | 206 + docs/dev/reference/lrtest.html | 8 + docs/dev/reference/lrtest.mkinfit.html | 191 + docs/dev/reference/lrtest.mmkin.html | 8 + docs/dev/reference/max_twa_dfop.html | 8 + docs/dev/reference/max_twa_fomc.html | 8 + docs/dev/reference/max_twa_hs.html | 8 + docs/dev/reference/max_twa_parent.html | 192 + docs/dev/reference/max_twa_sfo.html | 8 + docs/dev/reference/mccall81_245T-1.png | Bin 0 -> 62916 bytes docs/dev/reference/mccall81_245T.html | 201 + docs/dev/reference/mean_degparms.html | 134 + docs/dev/reference/mhmkin-1.png | Bin 0 -> 53533 bytes docs/dev/reference/mhmkin-2.png | Bin 0 -> 112620 bytes docs/dev/reference/mhmkin.html | 286 + docs/dev/reference/mhmkin.list.html | 8 + docs/dev/reference/mhmkin.mmkin.html | 8 + docs/dev/reference/mixed-1.png | Bin 0 -> 215777 bytes docs/dev/reference/mixed.html | 199 + docs/dev/reference/mixed.mmkin.html | 8 + docs/dev/reference/mkin_long_to_wide.html | 155 + docs/dev/reference/mkin_wide_to_long.html | 135 + docs/dev/reference/mkinds.html | 219 + docs/dev/reference/mkindsg.html | 407 + docs/dev/reference/mkinerrmin.html | 163 + docs/dev/reference/mkinerrplot-1.png | Bin 0 -> 41444 bytes docs/dev/reference/mkinerrplot.html | 201 + docs/dev/reference/mkinfit-1.png | Bin 0 -> 65304 bytes docs/dev/reference/mkinfit.html | 679 ++ docs/dev/reference/mkinmod.html | 382 + docs/dev/reference/mkinparplot-1.png | Bin 0 -> 26968 bytes docs/dev/reference/mkinparplot.html | 128 + docs/dev/reference/mkinplot.html | 115 + docs/dev/reference/mkinpredict.html | 390 + docs/dev/reference/mkinpredict.mkinfit.html | 8 + docs/dev/reference/mkinpredict.mkinmod.html | 8 + docs/dev/reference/mkinresplot-1.png | Bin 0 -> 24037 bytes docs/dev/reference/mkinresplot.html | 203 + docs/dev/reference/mkinsub.html | 8 + docs/dev/reference/mmkin-1.png | Bin 0 -> 111703 bytes docs/dev/reference/mmkin-2.png | Bin 0 -> 108899 bytes docs/dev/reference/mmkin-3.png | Bin 0 -> 96986 bytes docs/dev/reference/mmkin-4.png | Bin 0 -> 67584 bytes docs/dev/reference/mmkin-5.png | Bin 0 -> 65242 bytes docs/dev/reference/mmkin.html | 239 + docs/dev/reference/multistart-1.png | Bin 0 -> 68074 bytes docs/dev/reference/multistart-2.png | Bin 0 -> 56348 bytes docs/dev/reference/multistart.html | 212 + docs/dev/reference/multistart.saem.mmkin.html | 8 + docs/dev/reference/nafta-1.png | Bin 0 -> 63875 bytes docs/dev/reference/nafta.html | 215 + docs/dev/reference/nlme-1.png | Bin 0 -> 78105 bytes docs/dev/reference/nlme-2.png | Bin 0 -> 90362 bytes docs/dev/reference/nlme.html | 197 + docs/dev/reference/nlme.mmkin-1.png | Bin 0 -> 123589 bytes docs/dev/reference/nlme.mmkin-2.png | Bin 0 -> 169384 bytes docs/dev/reference/nlme.mmkin-3.png | Bin 0 -> 173476 bytes docs/dev/reference/nlme.mmkin.html | 415 + docs/dev/reference/nlme_data.html | 8 + docs/dev/reference/nobs.mkinfit.html | 109 + docs/dev/reference/parms.html | 250 + docs/dev/reference/parms.mkinfit.html | 8 + docs/dev/reference/parms.mmkin.html | 8 + docs/dev/reference/parms.multistart.html | 8 + docs/dev/reference/parms.saem.mmkin.html | 8 + docs/dev/reference/parplot.html | 161 + .../reference/parplot.multistart.saem.mmkin.html | 8 + docs/dev/reference/plot.mixed.mmkin-1.png | Bin 0 -> 86863 bytes docs/dev/reference/plot.mixed.mmkin-2.png | Bin 0 -> 174836 bytes docs/dev/reference/plot.mixed.mmkin-3.png | Bin 0 -> 173680 bytes docs/dev/reference/plot.mixed.mmkin-4.png | Bin 0 -> 176755 bytes docs/dev/reference/plot.mixed.mmkin.html | 294 + docs/dev/reference/plot.mkinfit-1.png | Bin 0 -> 53909 bytes docs/dev/reference/plot.mkinfit-2.png | Bin 0 -> 74783 bytes docs/dev/reference/plot.mkinfit-3.png | Bin 0 -> 69703 bytes docs/dev/reference/plot.mkinfit-4.png | Bin 0 -> 73776 bytes docs/dev/reference/plot.mkinfit-5.png | Bin 0 -> 66319 bytes docs/dev/reference/plot.mkinfit-6.png | Bin 0 -> 72434 bytes docs/dev/reference/plot.mkinfit-7.png | Bin 0 -> 73460 bytes docs/dev/reference/plot.mkinfit.html | 321 + docs/dev/reference/plot.mmkin-1.png | Bin 0 -> 49892 bytes docs/dev/reference/plot.mmkin-2.png | Bin 0 -> 51179 bytes docs/dev/reference/plot.mmkin-3.png | Bin 0 -> 47146 bytes docs/dev/reference/plot.mmkin-4.png | Bin 0 -> 33484 bytes docs/dev/reference/plot.mmkin-5.png | Bin 0 -> 59021 bytes docs/dev/reference/plot.mmkin.html | 222 + docs/dev/reference/plot.nafta.html | 128 + docs/dev/reference/plot_err.html | 8 + docs/dev/reference/plot_res.html | 8 + docs/dev/reference/plot_sep.html | 8 + docs/dev/reference/print.illparms.mhmkin.html | 8 + docs/dev/reference/print.illparms.mkinfit.html | 8 + docs/dev/reference/print.illparms.mmkin.html | 8 + docs/dev/reference/print.illparms.saem.mmkin.html | 8 + docs/dev/reference/print.mhmkin.html | 8 + docs/dev/reference/print.mixed.mmkin.html | 8 + docs/dev/reference/print.mkinds.html | 8 + docs/dev/reference/print.mkindsg.html | 8 + docs/dev/reference/print.mkinmod.html | 8 + docs/dev/reference/print.mmkin.html | 8 + docs/dev/reference/print.multistart.html | 8 + docs/dev/reference/print.nafta.html | 8 + docs/dev/reference/print.nlme.mmkin.html | 8 + docs/dev/reference/print.saem.mmkin.html | 8 + docs/dev/reference/print.status.mhmkin.html | 8 + docs/dev/reference/print.status.mmkin.html | 8 + docs/dev/reference/print.summary.mkinfit.html | 8 + docs/dev/reference/print.summary.mmkin.html | 8 + docs/dev/reference/print.summary.nlme.mmkin.html | 8 + docs/dev/reference/print.summary.saem.mmkin.html | 8 + docs/dev/reference/read_spreadsheet.html | 155 + docs/dev/reference/reexports.html | 118 + docs/dev/reference/residuals.mkinfit.html | 121 + docs/dev/reference/saem-1.png | Bin 0 -> 55172 bytes docs/dev/reference/saem-2.png | Bin 0 -> 49938 bytes docs/dev/reference/saem-3.png | Bin 0 -> 128590 bytes docs/dev/reference/saem-4.png | Bin 0 -> 174573 bytes docs/dev/reference/saem.html | 731 ++ docs/dev/reference/saem.mmkin.html | 8 + docs/dev/reference/saemix_data.html | 8 + docs/dev/reference/saemix_model.html | 8 + docs/dev/reference/schaefer07_complex_case-1.png | Bin 0 -> 67631 bytes docs/dev/reference/schaefer07_complex_case.html | 175 + docs/dev/reference/schaefer07_complex_results.html | 8 + docs/dev/reference/set_nd_nq.html | 234 + docs/dev/reference/set_nd_nq_focus.html | 8 + docs/dev/reference/sigma_twocomp-1.png | Bin 0 -> 44956 bytes docs/dev/reference/sigma_twocomp.html | 169 + docs/dev/reference/status.html | 145 + docs/dev/reference/status.mhmkin.html | 8 + docs/dev/reference/status.mmkin.html | 8 + docs/dev/reference/summary.mkinfit.html | 290 + docs/dev/reference/summary.mmkin.html | 155 + docs/dev/reference/summary.nlme.mmkin.html | 391 + docs/dev/reference/summary.saem.mmkin.html | 631 ++ docs/dev/reference/summary_listing.html | 119 + .../reference/synthetic_data_for_UBA_2014-1.png | Bin 0 -> 67584 bytes .../dev/reference/synthetic_data_for_UBA_2014.html | 413 + docs/dev/reference/test_data_from_UBA_2014-1.png | Bin 0 -> 57059 bytes docs/dev/reference/test_data_from_UBA_2014-2.png | Bin 0 -> 73973 bytes docs/dev/reference/test_data_from_UBA_2014.html | 195 + docs/dev/reference/tex_listing.html | 8 + docs/dev/reference/transform_odeparms.html | 293 + docs/dev/reference/update.mkinfit-1.png | Bin 0 -> 44121 bytes docs/dev/reference/update.mkinfit-2.png | Bin 0 -> 44072 bytes docs/dev/reference/update.mkinfit.html | 138 + docs/dev/reference/update.nlme.mmkin.html | 8 + docs/dev/reference/which.best.default.html | 8 + docs/dev/reference/which.best.html | 8 + docs/dev/search.json | 1 + docs/dev/sitemap.xml | 109 + 529 files changed, 61434 insertions(+) create mode 100644 docs/dev/articles/FOCUS_D.html create mode 100644 docs/dev/articles/FOCUS_D_files/figure-html/plot-1.png create mode 100644 docs/dev/articles/FOCUS_D_files/figure-html/plot_2-1.png create mode 100644 docs/dev/articles/FOCUS_L.html create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-10-1.png create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-12-1.png create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-13-1.png create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-15-1.png create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-4-1.png create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-5-1.png create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-6-1.png create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-8-1.png create mode 100644 docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-9-1.png create mode 100644 docs/dev/articles/index.html create mode 100644 docs/dev/articles/mkin.html create mode 100644 docs/dev/articles/mkin_files/figure-html/unnamed-chunk-2-1.png create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway.html create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-13-1.png create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-14-1.png create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-15-1.png create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-20-1.png create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-21-1.png create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-22-1.png create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-7-1.png create mode 100644 docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-8-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent.html create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-const-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-tc-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-tc-no-ranef-k2-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-fomc-const-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-fomc-tc-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-hs-const-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-hs-tc-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-sfo-const-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-sfo-tc-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-full-par-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-reduced-par-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-reduced-par-llquant-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/plot-saem-dfop-tc-no-ranef-k2-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_pathway.html create mode 100644 docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/saem-sforb-path-1-tc-reduced-convergence-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-2-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-3-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-4-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-6-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-7-1.png create mode 100644 docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-8-1.png create mode 100644 docs/dev/articles/prebuilt/2023_mesotrione_parent.html create mode 100644 docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-14-1.png create mode 100644 docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-19-1.png create mode 100644 docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-25-1.png create mode 100644 docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-30-1.png create mode 100644 docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-8-1.png create mode 100644 docs/dev/articles/twa.html create mode 100644 docs/dev/articles/web_only/FOCUS_Z.html create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_1-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_10-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11a-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11b-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_2-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_3-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_5-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_6-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_7-1.png create mode 100644 docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_9-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples.html create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p10-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p11-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p12a-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p12b-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p13-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p14-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p15a-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p15b-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p16-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p5a-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p5b-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p6-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p7-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p8-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p9a-1.png create mode 100644 docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p9b-1.png create mode 100644 docs/dev/articles/web_only/benchmarks.html create mode 100644 docs/dev/articles/web_only/compiled_models.html create mode 100644 docs/dev/articles/web_only/dimethenamid_2018.html create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_const-1.png create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_const_test-1.png create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_tc_test-1.png create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_sfo_const-1.png create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_dfop_const-1.png create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_dfop_tc-1.png create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_sfo_const-1.png create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_sfo_tc-1.png create mode 100644 docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/plot_parent_nlme-1.png create mode 100644 docs/dev/articles/web_only/multistart.html create mode 100644 docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-3-1.png create mode 100644 docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-4-1.png create mode 100644 docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-5-1.png create mode 100644 docs/dev/articles/web_only/saem_benchmarks.html create mode 100644 docs/dev/authors.html create mode 100644 docs/dev/deps/bootstrap-5.3.1/bootstrap.bundle.min.js create mode 100644 docs/dev/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map create mode 100644 docs/dev/deps/bootstrap-5.3.1/bootstrap.min.css create mode 100644 docs/dev/deps/bootstrap-5.3.1/font.css create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/07d40e985ad7c747025dabb9f22142c4.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/1f5e011d6aae0d98fc0518e1a303e99a.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcQ72j00.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcg72j00.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKcw72j00.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKew72j00.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKfA72j00.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCs6KVjbNBYlgoKfw72.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjs2yNL4U.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjsGyN.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjtGyNL4U.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvGyNL4U.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvWyNL4U.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/4iCv6KVjbNBYlgoCxCvjvmyNL4U.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/626330658504e338ee86aec8e957426b.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuQ.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeudwk.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/CSR64z1Qlv-GDxkbKVQ_fO4KTet_.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/CSR64z1Qlv-GDxkbKVQ_fOAKTQ.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvQlMIXxw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvUlMI.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvXlMIXxw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvYlMIXxw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvZlMIXxw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvalMIXxw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_QiYsKILxRpg3hIP6sJ7fM7PqlONvblMIXxw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlM-vWjMY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMOvWjMY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMevWjMY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlMuvWjMY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlOevWjMY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPevW.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/HI_SiYsKILxRpg3hIP6sJ7fM7PqlPuvWjMY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459W1hyzbi.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459WRhyzbi.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459WZhyzbi.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459Wdhyzbi.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/JTUSjIg1_i6t8kCHKm459Wlhyw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fABc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fBBc4.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fBxc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCBc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCRc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmEU9fCxc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fABc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fBBc4.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fBxc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCBc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCRc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmSU5fCxc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfABc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfBBc4.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfBxc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCBc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCRc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOlCnqEu92Fr1MmWUlfCxc4EsA.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu4WxKOzY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu4mxK.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu5mxKOzY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu72xKOzY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7GxKOzY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7WxKOzY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/KFOmCnqEu92Fr1Mu7mxKOzY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/QGYpz_kZZAGCONcK2A4bGOj8mNhN.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/S6u8w4BMUTPHjxsAXC-q.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh7USSwaPGR_p.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/S6u9w4BMUTPHh7USSwiPGQ.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/S6uyw4BMUTPHjx4wXg.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/S6uyw4BMUTPHjxAwXjeu.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa0ZL7SUc.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1ZL7.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa1pL7SUc.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa25L7SUc.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2JL7SUc.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2ZL7SUc.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/UcC73FwrK3iLTeHuS_fvQtMwCp50KnMa2pL7SUc.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIMeaBXso.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofINeaB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIO-aBXso.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIOOaBXso.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/XRXV3I6Li01BKofIOuaBXso.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/c2f002b3a87d3f9bfeebb23d32cfd9f8.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/ee91700cdbf7ce16c054c2bb8946c736.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/q5uGsou0JOdh94bfuQltOxU.woff2 create mode 100644 docs/dev/deps/bootstrap-5.3.1/fonts/q5uGsou0JOdh94bfvQlt.woff2 create mode 100644 docs/dev/deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js create mode 100644 docs/dev/deps/clipboard.js-2.0.11/clipboard.min.js create mode 100644 docs/dev/deps/data-deps.txt create mode 100644 docs/dev/deps/font-awesome-6.5.2/css/all.css create mode 100644 docs/dev/deps/font-awesome-6.5.2/css/all.min.css create mode 100644 docs/dev/deps/font-awesome-6.5.2/css/v4-shims.css create mode 100644 docs/dev/deps/font-awesome-6.5.2/css/v4-shims.min.css create mode 100644 docs/dev/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf create mode 100644 docs/dev/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 create mode 100644 docs/dev/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf create mode 100644 docs/dev/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 create mode 100644 docs/dev/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf create mode 100644 docs/dev/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 create mode 100644 docs/dev/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf create mode 100644 docs/dev/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 create mode 100644 docs/dev/deps/headroom-0.11.0/headroom.min.js create mode 100644 docs/dev/deps/headroom-0.11.0/jQuery.headroom.min.js create mode 100644 docs/dev/deps/jquery-3.6.0/jquery-3.6.0.js create mode 100644 docs/dev/deps/jquery-3.6.0/jquery-3.6.0.min.js create mode 100644 docs/dev/deps/jquery-3.6.0/jquery-3.6.0.min.map create mode 100644 docs/dev/deps/search-1.0.0/autocomplete.jquery.min.js create mode 100644 docs/dev/deps/search-1.0.0/fuse.min.js create mode 100644 docs/dev/deps/search-1.0.0/mark.min.js create mode 100644 docs/dev/index.html create mode 100644 docs/dev/katex-auto.js create mode 100644 docs/dev/lightswitch.js create mode 100644 docs/dev/link.svg create mode 100644 docs/dev/news/index.html create mode 100644 docs/dev/pkgdown.js create mode 100644 docs/dev/pkgdown.yml create mode 100644 docs/dev/reference/AIC.mmkin.html create mode 100644 docs/dev/reference/BIC.mmkin.html create mode 100644 docs/dev/reference/CAKE_export.html create mode 100644 docs/dev/reference/D24_2014.html create mode 100644 docs/dev/reference/DFOP.solution-1.png create mode 100644 docs/dev/reference/DFOP.solution.html create mode 100644 docs/dev/reference/Extract.mmkin.html create mode 100644 docs/dev/reference/FOCUS_2006_A.html create mode 100644 docs/dev/reference/FOCUS_2006_B.html create mode 100644 docs/dev/reference/FOCUS_2006_C.html create mode 100644 docs/dev/reference/FOCUS_2006_D.html create mode 100644 docs/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html create mode 100644 docs/dev/reference/FOCUS_2006_E.html create mode 100644 docs/dev/reference/FOCUS_2006_F.html create mode 100644 docs/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html create mode 100644 docs/dev/reference/FOCUS_2006_HS_ref_A_to_F.html create mode 100644 docs/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html create mode 100644 docs/dev/reference/FOCUS_2006_datasets.html create mode 100644 docs/dev/reference/FOMC.solution-1.png create mode 100644 docs/dev/reference/FOMC.solution.html create mode 100644 docs/dev/reference/HS.solution-1.png create mode 100644 docs/dev/reference/HS.solution.html create mode 100644 docs/dev/reference/IORE.solution-1.png create mode 100644 docs/dev/reference/IORE.solution.html create mode 100644 docs/dev/reference/NAFTA_SOP_2015-1.png create mode 100644 docs/dev/reference/NAFTA_SOP_2015.html create mode 100644 docs/dev/reference/NAFTA_SOP_Appendix_B.html create mode 100644 docs/dev/reference/NAFTA_SOP_Appendix_D.html create mode 100644 docs/dev/reference/NAFTA_SOP_Attachment-1.png create mode 100644 docs/dev/reference/NAFTA_SOP_Attachment.html create mode 100644 docs/dev/reference/SFO.solution-1.png create mode 100644 docs/dev/reference/SFO.solution.html create mode 100644 docs/dev/reference/SFORB.solution-1.png create mode 100644 docs/dev/reference/SFORB.solution.html create mode 100644 docs/dev/reference/[.mhmkin.html create mode 100644 docs/dev/reference/add_err-1.png create mode 100644 docs/dev/reference/add_err-2.png create mode 100644 docs/dev/reference/add_err-3.png create mode 100644 docs/dev/reference/add_err.html create mode 100644 docs/dev/reference/anova.saem.mmkin.html create mode 100644 docs/dev/reference/aw.html create mode 100644 docs/dev/reference/aw.mixed.mmkin.html create mode 100644 docs/dev/reference/aw.mkinfit.html create mode 100644 docs/dev/reference/aw.mmkin.html create mode 100644 docs/dev/reference/aw.multistart.html create mode 100644 docs/dev/reference/backtransform_odeparms.html create mode 100644 docs/dev/reference/best.default.html create mode 100644 docs/dev/reference/best.html create mode 100644 docs/dev/reference/check_failed.html create mode 100644 docs/dev/reference/confint.mkinfit.html create mode 100644 docs/dev/reference/create_deg_func.html create mode 100644 docs/dev/reference/dimethenamid_2018-1.png create mode 100644 docs/dev/reference/dimethenamid_2018.html create mode 100644 docs/dev/reference/ds_dfop.html create mode 100644 docs/dev/reference/ds_dfop_sfo.html create mode 100644 docs/dev/reference/ds_fomc.html create mode 100644 docs/dev/reference/ds_hs.html create mode 100644 docs/dev/reference/ds_mixed-1.png create mode 100644 docs/dev/reference/ds_mixed.html create mode 100644 docs/dev/reference/ds_sfo.html create mode 100644 docs/dev/reference/endpoints.html create mode 100644 docs/dev/reference/experimental_data_for_UBA-1.png create mode 100644 docs/dev/reference/experimental_data_for_UBA.html create mode 100644 docs/dev/reference/f_time_norm_focus.html create mode 100644 docs/dev/reference/f_time_norm_focus.mkindsg.html create mode 100644 docs/dev/reference/f_time_norm_focus.numeric.html create mode 100644 docs/dev/reference/focus_soil_moisture.html create mode 100644 docs/dev/reference/get_deg_func.html create mode 100644 docs/dev/reference/hierarchical_kinetics.html create mode 100644 docs/dev/reference/html_listing.html create mode 100644 docs/dev/reference/illparms.html create mode 100644 docs/dev/reference/illparms.mhmkin.html create mode 100644 docs/dev/reference/illparms.mkinfit.html create mode 100644 docs/dev/reference/illparms.mmkin.html create mode 100644 docs/dev/reference/illparms.saem.mmkin.html create mode 100644 docs/dev/reference/ilr.html create mode 100644 docs/dev/reference/index.html create mode 100644 docs/dev/reference/intervals.html create mode 100644 docs/dev/reference/intervals.saem.mmkin.html create mode 100644 docs/dev/reference/invilr.html create mode 100644 docs/dev/reference/llhist.html create mode 100644 docs/dev/reference/loftest-1.png create mode 100644 docs/dev/reference/loftest-2.png create mode 100644 docs/dev/reference/loftest-3.png create mode 100644 docs/dev/reference/loftest-4.png create mode 100644 docs/dev/reference/loftest-5.png create mode 100644 docs/dev/reference/loftest.html create mode 100644 docs/dev/reference/loftest.mkinfit.html create mode 100644 docs/dev/reference/logLik.mkinfit.html create mode 100644 docs/dev/reference/logLik.saem.mmkin.html create mode 100644 docs/dev/reference/logistic.solution-1.png create mode 100644 docs/dev/reference/logistic.solution-2.png create mode 100644 docs/dev/reference/logistic.solution.html create mode 100644 docs/dev/reference/lrtest.html create mode 100644 docs/dev/reference/lrtest.mkinfit.html create mode 100644 docs/dev/reference/lrtest.mmkin.html create mode 100644 docs/dev/reference/max_twa_dfop.html create mode 100644 docs/dev/reference/max_twa_fomc.html create mode 100644 docs/dev/reference/max_twa_hs.html create mode 100644 docs/dev/reference/max_twa_parent.html create mode 100644 docs/dev/reference/max_twa_sfo.html create mode 100644 docs/dev/reference/mccall81_245T-1.png create mode 100644 docs/dev/reference/mccall81_245T.html create mode 100644 docs/dev/reference/mean_degparms.html create mode 100644 docs/dev/reference/mhmkin-1.png create mode 100644 docs/dev/reference/mhmkin-2.png create mode 100644 docs/dev/reference/mhmkin.html create mode 100644 docs/dev/reference/mhmkin.list.html create mode 100644 docs/dev/reference/mhmkin.mmkin.html create mode 100644 docs/dev/reference/mixed-1.png create mode 100644 docs/dev/reference/mixed.html create mode 100644 docs/dev/reference/mixed.mmkin.html create mode 100644 docs/dev/reference/mkin_long_to_wide.html create mode 100644 docs/dev/reference/mkin_wide_to_long.html create mode 100644 docs/dev/reference/mkinds.html create mode 100644 docs/dev/reference/mkindsg.html create mode 100644 docs/dev/reference/mkinerrmin.html create mode 100644 docs/dev/reference/mkinerrplot-1.png create mode 100644 docs/dev/reference/mkinerrplot.html create mode 100644 docs/dev/reference/mkinfit-1.png create mode 100644 docs/dev/reference/mkinfit.html create mode 100644 docs/dev/reference/mkinmod.html create mode 100644 docs/dev/reference/mkinparplot-1.png create mode 100644 docs/dev/reference/mkinparplot.html create mode 100644 docs/dev/reference/mkinplot.html create mode 100644 docs/dev/reference/mkinpredict.html create mode 100644 docs/dev/reference/mkinpredict.mkinfit.html create mode 100644 docs/dev/reference/mkinpredict.mkinmod.html create mode 100644 docs/dev/reference/mkinresplot-1.png create mode 100644 docs/dev/reference/mkinresplot.html create mode 100644 docs/dev/reference/mkinsub.html create mode 100644 docs/dev/reference/mmkin-1.png create mode 100644 docs/dev/reference/mmkin-2.png create mode 100644 docs/dev/reference/mmkin-3.png create mode 100644 docs/dev/reference/mmkin-4.png create mode 100644 docs/dev/reference/mmkin-5.png create mode 100644 docs/dev/reference/mmkin.html create mode 100644 docs/dev/reference/multistart-1.png create mode 100644 docs/dev/reference/multistart-2.png create mode 100644 docs/dev/reference/multistart.html create mode 100644 docs/dev/reference/multistart.saem.mmkin.html create mode 100644 docs/dev/reference/nafta-1.png create mode 100644 docs/dev/reference/nafta.html create mode 100644 docs/dev/reference/nlme-1.png create mode 100644 docs/dev/reference/nlme-2.png create mode 100644 docs/dev/reference/nlme.html create mode 100644 docs/dev/reference/nlme.mmkin-1.png create mode 100644 docs/dev/reference/nlme.mmkin-2.png create mode 100644 docs/dev/reference/nlme.mmkin-3.png create mode 100644 docs/dev/reference/nlme.mmkin.html create mode 100644 docs/dev/reference/nlme_data.html create mode 100644 docs/dev/reference/nobs.mkinfit.html create mode 100644 docs/dev/reference/parms.html create mode 100644 docs/dev/reference/parms.mkinfit.html create mode 100644 docs/dev/reference/parms.mmkin.html create mode 100644 docs/dev/reference/parms.multistart.html create mode 100644 docs/dev/reference/parms.saem.mmkin.html create mode 100644 docs/dev/reference/parplot.html create mode 100644 docs/dev/reference/parplot.multistart.saem.mmkin.html create mode 100644 docs/dev/reference/plot.mixed.mmkin-1.png create mode 100644 docs/dev/reference/plot.mixed.mmkin-2.png create mode 100644 docs/dev/reference/plot.mixed.mmkin-3.png create mode 100644 docs/dev/reference/plot.mixed.mmkin-4.png create mode 100644 docs/dev/reference/plot.mixed.mmkin.html create mode 100644 docs/dev/reference/plot.mkinfit-1.png create mode 100644 docs/dev/reference/plot.mkinfit-2.png create mode 100644 docs/dev/reference/plot.mkinfit-3.png create mode 100644 docs/dev/reference/plot.mkinfit-4.png create mode 100644 docs/dev/reference/plot.mkinfit-5.png create mode 100644 docs/dev/reference/plot.mkinfit-6.png create mode 100644 docs/dev/reference/plot.mkinfit-7.png create mode 100644 docs/dev/reference/plot.mkinfit.html create mode 100644 docs/dev/reference/plot.mmkin-1.png create mode 100644 docs/dev/reference/plot.mmkin-2.png create mode 100644 docs/dev/reference/plot.mmkin-3.png create mode 100644 docs/dev/reference/plot.mmkin-4.png create mode 100644 docs/dev/reference/plot.mmkin-5.png create mode 100644 docs/dev/reference/plot.mmkin.html create mode 100644 docs/dev/reference/plot.nafta.html create mode 100644 docs/dev/reference/plot_err.html create mode 100644 docs/dev/reference/plot_res.html create mode 100644 docs/dev/reference/plot_sep.html create mode 100644 docs/dev/reference/print.illparms.mhmkin.html create mode 100644 docs/dev/reference/print.illparms.mkinfit.html create mode 100644 docs/dev/reference/print.illparms.mmkin.html create mode 100644 docs/dev/reference/print.illparms.saem.mmkin.html create mode 100644 docs/dev/reference/print.mhmkin.html create mode 100644 docs/dev/reference/print.mixed.mmkin.html create mode 100644 docs/dev/reference/print.mkinds.html create mode 100644 docs/dev/reference/print.mkindsg.html create mode 100644 docs/dev/reference/print.mkinmod.html create mode 100644 docs/dev/reference/print.mmkin.html create mode 100644 docs/dev/reference/print.multistart.html create mode 100644 docs/dev/reference/print.nafta.html create mode 100644 docs/dev/reference/print.nlme.mmkin.html create mode 100644 docs/dev/reference/print.saem.mmkin.html create mode 100644 docs/dev/reference/print.status.mhmkin.html create mode 100644 docs/dev/reference/print.status.mmkin.html create mode 100644 docs/dev/reference/print.summary.mkinfit.html create mode 100644 docs/dev/reference/print.summary.mmkin.html create mode 100644 docs/dev/reference/print.summary.nlme.mmkin.html create mode 100644 docs/dev/reference/print.summary.saem.mmkin.html create mode 100644 docs/dev/reference/read_spreadsheet.html create mode 100644 docs/dev/reference/reexports.html create mode 100644 docs/dev/reference/residuals.mkinfit.html create mode 100644 docs/dev/reference/saem-1.png create mode 100644 docs/dev/reference/saem-2.png create mode 100644 docs/dev/reference/saem-3.png create mode 100644 docs/dev/reference/saem-4.png create mode 100644 docs/dev/reference/saem.html create mode 100644 docs/dev/reference/saem.mmkin.html create mode 100644 docs/dev/reference/saemix_data.html create mode 100644 docs/dev/reference/saemix_model.html create mode 100644 docs/dev/reference/schaefer07_complex_case-1.png create mode 100644 docs/dev/reference/schaefer07_complex_case.html create mode 100644 docs/dev/reference/schaefer07_complex_results.html create mode 100644 docs/dev/reference/set_nd_nq.html create mode 100644 docs/dev/reference/set_nd_nq_focus.html create mode 100644 docs/dev/reference/sigma_twocomp-1.png create mode 100644 docs/dev/reference/sigma_twocomp.html create mode 100644 docs/dev/reference/status.html create mode 100644 docs/dev/reference/status.mhmkin.html create mode 100644 docs/dev/reference/status.mmkin.html create mode 100644 docs/dev/reference/summary.mkinfit.html create mode 100644 docs/dev/reference/summary.mmkin.html create mode 100644 docs/dev/reference/summary.nlme.mmkin.html create mode 100644 docs/dev/reference/summary.saem.mmkin.html create mode 100644 docs/dev/reference/summary_listing.html create mode 100644 docs/dev/reference/synthetic_data_for_UBA_2014-1.png create mode 100644 docs/dev/reference/synthetic_data_for_UBA_2014.html create mode 100644 docs/dev/reference/test_data_from_UBA_2014-1.png create mode 100644 docs/dev/reference/test_data_from_UBA_2014-2.png create mode 100644 docs/dev/reference/test_data_from_UBA_2014.html create mode 100644 docs/dev/reference/tex_listing.html create mode 100644 docs/dev/reference/transform_odeparms.html create mode 100644 docs/dev/reference/update.mkinfit-1.png create mode 100644 docs/dev/reference/update.mkinfit-2.png create mode 100644 docs/dev/reference/update.mkinfit.html create mode 100644 docs/dev/reference/update.nlme.mmkin.html create mode 100644 docs/dev/reference/which.best.default.html create mode 100644 docs/dev/reference/which.best.html create mode 100644 docs/dev/search.json create mode 100644 docs/dev/sitemap.xml (limited to 'docs/dev') diff --git a/docs/dev/articles/FOCUS_D.html b/docs/dev/articles/FOCUS_D.html new file mode 100644 index 00000000..a21ed6d4 --- /dev/null +++ b/docs/dev/articles/FOCUS_D.html @@ -0,0 +1,338 @@ + + + + + + + +Example evaluation of FOCUS Example Dataset D • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +

This is just a very simple vignette showing how to fit a degradation +model for a parent compound with one transformation product using +mkin. After loading the library we look at the data. We +have observed concentrations in the column named value at +the times specified in column time for the two observed +variables named parent and m1.

+
+library(mkin, quietly = TRUE)
+print(FOCUS_2006_D)
+
##      name time  value
+## 1  parent    0  99.46
+## 2  parent    0 102.04
+## 3  parent    1  93.50
+## 4  parent    1  92.50
+## 5  parent    3  63.23
+## 6  parent    3  68.99
+## 7  parent    7  52.32
+## 8  parent    7  55.13
+## 9  parent   14  27.27
+## 10 parent   14  26.64
+## 11 parent   21  11.50
+## 12 parent   21  11.64
+## 13 parent   35   2.85
+## 14 parent   35   2.91
+## 15 parent   50   0.69
+## 16 parent   50   0.63
+## 17 parent   75   0.05
+## 18 parent   75   0.06
+## 19 parent  100     NA
+## 20 parent  100     NA
+## 21 parent  120     NA
+## 22 parent  120     NA
+## 23     m1    0   0.00
+## 24     m1    0   0.00
+## 25     m1    1   4.84
+## 26     m1    1   5.64
+## 27     m1    3  12.91
+## 28     m1    3  12.96
+## 29     m1    7  22.97
+## 30     m1    7  24.47
+## 31     m1   14  41.69
+## 32     m1   14  33.21
+## 33     m1   21  44.37
+## 34     m1   21  46.44
+## 35     m1   35  41.22
+## 36     m1   35  37.95
+## 37     m1   50  41.19
+## 38     m1   50  40.01
+## 39     m1   75  40.09
+## 40     m1   75  33.85
+## 41     m1  100  31.04
+## 42     m1  100  33.13
+## 43     m1  120  25.15
+## 44     m1  120  33.31
+

Next we specify the degradation model: The parent compound degrades +with simple first-order kinetics (SFO) to one metabolite named m1, which +also degrades with SFO kinetics.

+

The call to mkinmod returns a degradation model. The differential +equations represented in R code can be found in the character vector +$diffs of the mkinmod object. If a C compiler +(gcc) is installed and functional, the differential equation model will +be compiled from auto-generated C code.

+
+SFO_SFO <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"))
+
## Temporary DLL for differentials generated and loaded
+
+print(SFO_SFO$diffs)
+
##                                                    parent 
+##                          "d_parent = - k_parent * parent" 
+##                                                        m1 
+## "d_m1 = + f_parent_to_m1 * k_parent * parent - k_m1 * m1"
+

We do the fitting without progress report +(quiet = TRUE).

+
+fit <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE)
+
## Warning in mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE): Observations with
+## value of zero were removed from the data
+

A plot of the fit including a residual plot for both observed +variables is obtained using the plot_sep method for +mkinfit objects, which shows separate graphs for all +compounds and their residuals.

+
+plot_sep(fit, lpos = c("topright", "bottomright"))
+

+

Confidence intervals for the parameter estimates are obtained using +the mkinparplot function.

+ +

+

A comprehensive report of the results is obtained using the +summary method for mkinfit objects.

+
+summary(fit)
+
## mkin version used for fitting:    1.2.10 
+## R version used for fitting:       4.4.2 
+## Date of fit:     Fri Feb 14 08:59:09 2025 
+## Date of summary: Fri Feb 14 08:59:09 2025 
+## 
+## Equations:
+## d_parent/dt = - k_parent * parent
+## d_m1/dt = + f_parent_to_m1 * k_parent * parent - k_m1 * m1
+## 
+## Model predictions using solution type analytical 
+## 
+## Fitted using 401 model solutions performed in 0.053 s
+## 
+## Error model: Constant variance 
+## 
+## Error model algorithm: OLS 
+## 
+## Starting values for parameters to be optimised:
+##                   value   type
+## parent_0       100.7500  state
+## k_parent         0.1000 deparm
+## k_m1             0.1001 deparm
+## f_parent_to_m1   0.5000 deparm
+## 
+## Starting values for the transformed parameters actually optimised:
+##                      value lower upper
+## parent_0        100.750000  -Inf   Inf
+## log_k_parent     -2.302585  -Inf   Inf
+## log_k_m1         -2.301586  -Inf   Inf
+## f_parent_qlogis   0.000000  -Inf   Inf
+## 
+## Fixed parameter values:
+##      value  type
+## m1_0     0 state
+## 
+## 
+## Warning(s): 
+## Observations with value of zero were removed from the data
+## 
+## Results:
+## 
+##        AIC      BIC    logLik
+##   204.4486 212.6365 -97.22429
+## 
+## Optimised, transformed parameters with symmetric confidence intervals:
+##                 Estimate Std. Error   Lower    Upper
+## parent_0        99.60000    1.57000 96.4000 102.8000
+## log_k_parent    -2.31600    0.04087 -2.3990  -2.2330
+## log_k_m1        -5.24700    0.13320 -5.5180  -4.9770
+## f_parent_qlogis  0.05792    0.08926 -0.1237   0.2395
+## sigma            3.12600    0.35850  2.3960   3.8550
+## 
+## Parameter correlation:
+##                   parent_0 log_k_parent   log_k_m1 f_parent_qlogis      sigma
+## parent_0         1.000e+00    5.174e-01 -1.688e-01      -5.471e-01 -1.172e-06
+## log_k_parent     5.174e-01    1.000e+00 -3.263e-01      -5.426e-01 -8.479e-07
+## log_k_m1        -1.688e-01   -3.263e-01  1.000e+00       7.478e-01  8.211e-07
+## f_parent_qlogis -5.471e-01   -5.426e-01  7.478e-01       1.000e+00  1.305e-06
+## sigma           -1.172e-06   -8.479e-07  8.211e-07       1.305e-06  1.000e+00
+## 
+## Backtransformed parameters:
+## Confidence intervals for internally transformed parameters are asymmetric.
+## t-test (unrealistically) based on the assumption of normal distribution
+## for estimators of untransformed parameters.
+##                 Estimate t value    Pr(>t)     Lower     Upper
+## parent_0       99.600000  63.430 2.298e-36 96.400000 1.028e+02
+## k_parent        0.098700  24.470 4.955e-23  0.090820 1.073e-01
+## k_m1            0.005261   7.510 6.165e-09  0.004012 6.898e-03
+## f_parent_to_m1  0.514500  23.070 3.104e-22  0.469100 5.596e-01
+## sigma           3.126000   8.718 2.235e-10  2.396000 3.855e+00
+## 
+## FOCUS Chi2 error levels in percent:
+##          err.min n.optim df
+## All data   6.398       4 15
+## parent     6.459       2  7
+## m1         4.690       2  8
+## 
+## Resulting formation fractions:
+##                 ff
+## parent_m1   0.5145
+## parent_sink 0.4855
+## 
+## Estimated disappearance times:
+##           DT50   DT90
+## parent   7.023  23.33
+## m1     131.761 437.70
+## 
+## Data:
+##  time variable observed predicted   residual
+##     0   parent    99.46  99.59848 -1.385e-01
+##     0   parent   102.04  99.59848  2.442e+00
+##     1   parent    93.50  90.23787  3.262e+00
+##     1   parent    92.50  90.23787  2.262e+00
+##     3   parent    63.23  74.07319 -1.084e+01
+##     3   parent    68.99  74.07319 -5.083e+00
+##     7   parent    52.32  49.91207  2.408e+00
+##     7   parent    55.13  49.91207  5.218e+00
+##    14   parent    27.27  25.01258  2.257e+00
+##    14   parent    26.64  25.01258  1.627e+00
+##    21   parent    11.50  12.53462 -1.035e+00
+##    21   parent    11.64  12.53462 -8.946e-01
+##    35   parent     2.85   3.14787 -2.979e-01
+##    35   parent     2.91   3.14787 -2.379e-01
+##    50   parent     0.69   0.71624 -2.624e-02
+##    50   parent     0.63   0.71624 -8.624e-02
+##    75   parent     0.05   0.06074 -1.074e-02
+##    75   parent     0.06   0.06074 -7.382e-04
+##     1       m1     4.84   4.80296  3.704e-02
+##     1       m1     5.64   4.80296  8.370e-01
+##     3       m1    12.91  13.02400 -1.140e-01
+##     3       m1    12.96  13.02400 -6.400e-02
+##     7       m1    22.97  25.04476 -2.075e+00
+##     7       m1    24.47  25.04476 -5.748e-01
+##    14       m1    41.69  36.69003  5.000e+00
+##    14       m1    33.21  36.69003 -3.480e+00
+##    21       m1    44.37  41.65310  2.717e+00
+##    21       m1    46.44  41.65310  4.787e+00
+##    35       m1    41.22  43.31313 -2.093e+00
+##    35       m1    37.95  43.31313 -5.363e+00
+##    50       m1    41.19  41.21832 -2.832e-02
+##    50       m1    40.01  41.21832 -1.208e+00
+##    75       m1    40.09  36.44704  3.643e+00
+##    75       m1    33.85  36.44704 -2.597e+00
+##   100       m1    31.04  31.98162 -9.416e-01
+##   100       m1    33.13  31.98162  1.148e+00
+##   120       m1    25.15  28.78984 -3.640e+00
+##   120       m1    33.31  28.78984  4.520e+00
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/FOCUS_D_files/figure-html/plot-1.png b/docs/dev/articles/FOCUS_D_files/figure-html/plot-1.png new file mode 100644 index 00000000..c0832a1a Binary files /dev/null and b/docs/dev/articles/FOCUS_D_files/figure-html/plot-1.png differ diff --git a/docs/dev/articles/FOCUS_D_files/figure-html/plot_2-1.png b/docs/dev/articles/FOCUS_D_files/figure-html/plot_2-1.png new file mode 100644 index 00000000..02cfcfb4 Binary files /dev/null and b/docs/dev/articles/FOCUS_D_files/figure-html/plot_2-1.png differ diff --git a/docs/dev/articles/FOCUS_L.html b/docs/dev/articles/FOCUS_L.html new file mode 100644 index 00000000..badf4822 --- /dev/null +++ b/docs/dev/articles/FOCUS_L.html @@ -0,0 +1,894 @@ + + + + + + + +Example evaluation of FOCUS Laboratory Data L1 to L3 • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

Laboratory Data L1 +

+

The following code defines example dataset L1 from the FOCUS kinetics +report, p. 284:

+
+library("mkin", quietly = TRUE)
+FOCUS_2006_L1 = data.frame(
+  t = rep(c(0, 1, 2, 3, 5, 7, 14, 21, 30), each = 2),
+  parent = c(88.3, 91.4, 85.6, 84.5, 78.9, 77.6,
+             72.0, 71.9, 50.3, 59.4, 47.0, 45.1,
+             27.7, 27.3, 10.0, 10.4, 2.9, 4.0))
+FOCUS_2006_L1_mkin <- mkin_wide_to_long(FOCUS_2006_L1)
+

Here we use the assumptions of simple first order (SFO), the case of +declining rate constant over time (FOMC) and the case of two different +phases of the kinetics (DFOP). For a more detailed discussion of the +models, please see the FOCUS kinetics report.

+

Since mkin version 0.9-32 (July 2014), we can use shorthand notation +like "SFO" for parent only degradation models. The +following two lines fit the model and produce the summary report of the +model fit. This covers the numerical analysis given in the FOCUS +report.

+
+m.L1.SFO <- mkinfit("SFO", FOCUS_2006_L1_mkin, quiet = TRUE)
+summary(m.L1.SFO)
+
## mkin version used for fitting:    1.2.10 
+## R version used for fitting:       4.4.2 
+## Date of fit:     Fri Feb 14 08:59:11 2025 
+## Date of summary: Fri Feb 14 08:59:11 2025 
+## 
+## Equations:
+## d_parent/dt = - k_parent * parent
+## 
+## Model predictions using solution type analytical 
+## 
+## Fitted using 133 model solutions performed in 0.01 s
+## 
+## Error model: Constant variance 
+## 
+## Error model algorithm: OLS 
+## 
+## Starting values for parameters to be optimised:
+##          value   type
+## parent_0 89.85  state
+## k_parent  0.10 deparm
+## 
+## Starting values for the transformed parameters actually optimised:
+##                  value lower upper
+## parent_0     89.850000  -Inf   Inf
+## log_k_parent -2.302585  -Inf   Inf
+## 
+## Fixed parameter values:
+## None
+## 
+## Results:
+## 
+##        AIC     BIC    logLik
+##   93.88778 96.5589 -43.94389
+## 
+## Optimised, transformed parameters with symmetric confidence intervals:
+##              Estimate Std. Error  Lower  Upper
+## parent_0       92.470    1.28200 89.740 95.200
+## log_k_parent   -2.347    0.03763 -2.428 -2.267
+## sigma           2.780    0.46330  1.792  3.767
+## 
+## Parameter correlation:
+##                parent_0 log_k_parent      sigma
+## parent_0      1.000e+00    6.186e-01 -1.516e-09
+## log_k_parent  6.186e-01    1.000e+00 -3.124e-09
+## sigma        -1.516e-09   -3.124e-09  1.000e+00
+## 
+## Backtransformed parameters:
+## Confidence intervals for internally transformed parameters are asymmetric.
+## t-test (unrealistically) based on the assumption of normal distribution
+## for estimators of untransformed parameters.
+##          Estimate t value    Pr(>t)    Lower   Upper
+## parent_0 92.47000   72.13 8.824e-21 89.74000 95.2000
+## k_parent  0.09561   26.57 2.487e-14  0.08824  0.1036
+## sigma     2.78000    6.00 1.216e-05  1.79200  3.7670
+## 
+## FOCUS Chi2 error levels in percent:
+##          err.min n.optim df
+## All data   3.424       2  7
+## parent     3.424       2  7
+## 
+## Estimated disappearance times:
+##         DT50  DT90
+## parent 7.249 24.08
+## 
+## Data:
+##  time variable observed predicted residual
+##     0   parent     88.3    92.471  -4.1710
+##     0   parent     91.4    92.471  -1.0710
+##     1   parent     85.6    84.039   1.5610
+##     1   parent     84.5    84.039   0.4610
+##     2   parent     78.9    76.376   2.5241
+##     2   parent     77.6    76.376   1.2241
+##     3   parent     72.0    69.412   2.5884
+##     3   parent     71.9    69.412   2.4884
+##     5   parent     50.3    57.330  -7.0301
+##     5   parent     59.4    57.330   2.0699
+##     7   parent     47.0    47.352  -0.3515
+##     7   parent     45.1    47.352  -2.2515
+##    14   parent     27.7    24.247   3.4528
+##    14   parent     27.3    24.247   3.0528
+##    21   parent     10.0    12.416  -2.4163
+##    21   parent     10.4    12.416  -2.0163
+##    30   parent      2.9     5.251  -2.3513
+##    30   parent      4.0     5.251  -1.2513
+

A plot of the fit is obtained with the plot function for mkinfit +objects.

+
+plot(m.L1.SFO, show_errmin = TRUE, main = "FOCUS L1 - SFO")
+

+

The residual plot can be easily obtained by

+
+mkinresplot(m.L1.SFO, ylab = "Observed", xlab = "Time")
+

+

For comparison, the FOMC model is fitted as well, and the +χ2\chi^2 +error level is checked.

+
+m.L1.FOMC <- mkinfit("FOMC", FOCUS_2006_L1_mkin, quiet=TRUE)
+
## Warning in mkinfit("FOMC", FOCUS_2006_L1_mkin, quiet = TRUE): Optimisation did not converge:
+## false convergence (8)
+
+plot(m.L1.FOMC, show_errmin = TRUE, main = "FOCUS L1 - FOMC")
+

+
+summary(m.L1.FOMC, data = FALSE)
+
## Warning in sqrt(diag(covar)): NaNs produced
+
## Warning in cov2cor(ans$covar): diag(V) had non-positive or NA entries; the
+## non-finite result may be dubious
+
## mkin version used for fitting:    1.2.10 
+## R version used for fitting:       4.4.2 
+## Date of fit:     Fri Feb 14 08:59:11 2025 
+## Date of summary: Fri Feb 14 08:59:11 2025 
+## 
+## Equations:
+## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent
+## 
+## Model predictions using solution type analytical 
+## 
+## Fitted using 342 model solutions performed in 0.023 s
+## 
+## Error model: Constant variance 
+## 
+## Error model algorithm: OLS 
+## 
+## Starting values for parameters to be optimised:
+##          value   type
+## parent_0 89.85  state
+## alpha     1.00 deparm
+## beta     10.00 deparm
+## 
+## Starting values for the transformed parameters actually optimised:
+##               value lower upper
+## parent_0  89.850000  -Inf   Inf
+## log_alpha  0.000000  -Inf   Inf
+## log_beta   2.302585  -Inf   Inf
+## 
+## Fixed parameter values:
+## None
+## 
+## 
+## Warning(s): 
+## Optimisation did not converge:
+## false convergence (8)
+## 
+## Results:
+## 
+##        AIC      BIC    logLik
+##   95.88782 99.44931 -43.94391
+## 
+## Optimised, transformed parameters with symmetric confidence intervals:
+##           Estimate Std. Error  Lower  Upper
+## parent_0     92.47     1.2820 89.720 95.220
+## log_alpha    13.20        NaN    NaN    NaN
+## log_beta     15.54        NaN    NaN    NaN
+## sigma         2.78     0.4607  1.792  3.768
+## 
+## Parameter correlation:
+##           parent_0 log_alpha log_beta    sigma
+## parent_0  1.000000       NaN      NaN 0.000603
+## log_alpha      NaN         1      NaN      NaN
+## log_beta       NaN       NaN        1      NaN
+## sigma     0.000603       NaN      NaN 1.000000
+## 
+## Backtransformed parameters:
+## Confidence intervals for internally transformed parameters are asymmetric.
+## t-test (unrealistically) based on the assumption of normal distribution
+## for estimators of untransformed parameters.
+##           Estimate t value Pr(>t)  Lower  Upper
+## parent_0 9.247e+01      NA     NA 89.720 95.220
+## alpha    5.386e+05      NA     NA     NA     NA
+## beta     5.633e+06      NA     NA     NA     NA
+## sigma    2.780e+00      NA     NA  1.792  3.768
+## 
+## FOCUS Chi2 error levels in percent:
+##          err.min n.optim df
+## All data   3.619       3  6
+## parent     3.619       3  6
+## 
+## Estimated disappearance times:
+##         DT50  DT90 DT50back
+## parent 7.249 24.08    7.249
+

We get a warning that the default optimisation algorithm +Port did not converge, which is an indication that the +model is overparameterised, i.e. contains too many parameters +that are ill-defined as a consequence.

+

And in fact, due to the higher number of parameters, and the lower +number of degrees of freedom of the fit, the +χ2\chi^2 +error level is actually higher for the FOMC model (3.6%) than for the +SFO model (3.4%). Additionally, the parameters log_alpha +and log_beta internally fitted in the model have excessive +confidence intervals, that span more than 25 orders of magnitude (!) +when backtransformed to the scale of alpha and +beta. Also, the t-test for significant difference from zero +does not indicate such a significant difference, with p-values greater +than 0.1, and finally, the parameter correlation of +log_alpha and log_beta is 1.000, clearly +indicating that the model is overparameterised.

+

The +χ2\chi^2 +error levels reported in Appendix 3 and Appendix 7 to the FOCUS kinetics +report are rounded to integer percentages and partly deviate by one +percentage point from the results calculated by mkin. The reason for +this is not known. However, mkin gives the same +χ2\chi^2 +error levels as the kinfit package and the calculation routines of the +kinfit package have been extensively compared to the results obtained by +the KinGUI software, as documented in the kinfit package vignette. +KinGUI was the first widely used standard package in this field. Also, +the calculation of +χ2\chi^2 +error levels was compared with KinGUII, CAKE and DegKin manager in a +project sponsored by the German Umweltbundesamt (Ranke 2014).

+
+
+

Laboratory Data L2 +

+

The following code defines example dataset L2 from the FOCUS kinetics +report, p. 287:

+
+FOCUS_2006_L2 = data.frame(
+  t = rep(c(0, 1, 3, 7, 14, 28), each = 2),
+  parent = c(96.1, 91.8, 41.4, 38.7,
+             19.3, 22.3, 4.6, 4.6,
+             2.6, 1.2, 0.3, 0.6))
+FOCUS_2006_L2_mkin <- mkin_wide_to_long(FOCUS_2006_L2)
+
+

SFO fit for L2 +

+

Again, the SFO model is fitted and the result is plotted. The +residual plot can be obtained simply by adding the argument +show_residuals to the plot command.

+
+m.L2.SFO <- mkinfit("SFO", FOCUS_2006_L2_mkin, quiet=TRUE)
+plot(m.L2.SFO, show_residuals = TRUE, show_errmin = TRUE,
+     main = "FOCUS L2 - SFO")
+

+

The +χ2\chi^2 +error level of 14% suggests that the model does not fit very well. This +is also obvious from the plots of the fit, in which we have included the +residual plot.

+

In the FOCUS kinetics report, it is stated that there is no apparent +systematic error observed from the residual plot up to the measured DT90 +(approximately at day 5), and there is an underestimation beyond that +point.

+

We may add that it is difficult to judge the random nature of the +residuals just from the three samplings at days 0, 1 and 3. Also, it is +not clear a priori why a consistent underestimation after the +approximate DT90 should be irrelevant. However, this can be rationalised +by the fact that the FOCUS fate models generally only implement SFO +kinetics.

+
+
+

FOMC fit for L2 +

+

For comparison, the FOMC model is fitted as well, and the +χ2\chi^2 +error level is checked.

+
+m.L2.FOMC <- mkinfit("FOMC", FOCUS_2006_L2_mkin, quiet = TRUE)
+plot(m.L2.FOMC, show_residuals = TRUE,
+     main = "FOCUS L2 - FOMC")
+

+
+summary(m.L2.FOMC, data = FALSE)
+
## mkin version used for fitting:    1.2.10 
+## R version used for fitting:       4.4.2 
+## Date of fit:     Fri Feb 14 08:59:12 2025 
+## Date of summary: Fri Feb 14 08:59:12 2025 
+## 
+## Equations:
+## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent
+## 
+## Model predictions using solution type analytical 
+## 
+## Fitted using 239 model solutions performed in 0.015 s
+## 
+## Error model: Constant variance 
+## 
+## Error model algorithm: OLS 
+## 
+## Starting values for parameters to be optimised:
+##          value   type
+## parent_0 93.95  state
+## alpha     1.00 deparm
+## beta     10.00 deparm
+## 
+## Starting values for the transformed parameters actually optimised:
+##               value lower upper
+## parent_0  93.950000  -Inf   Inf
+## log_alpha  0.000000  -Inf   Inf
+## log_beta   2.302585  -Inf   Inf
+## 
+## Fixed parameter values:
+## None
+## 
+## Results:
+## 
+##        AIC      BIC    logLik
+##   61.78966 63.72928 -26.89483
+## 
+## Optimised, transformed parameters with symmetric confidence intervals:
+##           Estimate Std. Error    Lower   Upper
+## parent_0   93.7700     1.6130 90.05000 97.4900
+## log_alpha   0.3180     0.1559 -0.04149  0.6776
+## log_beta    0.2102     0.2493 -0.36460  0.7850
+## sigma       2.2760     0.4645  1.20500  3.3470
+## 
+## Parameter correlation:
+##             parent_0  log_alpha   log_beta      sigma
+## parent_0   1.000e+00 -1.151e-01 -2.085e-01 -7.436e-09
+## log_alpha -1.151e-01  1.000e+00  9.741e-01 -1.617e-07
+## log_beta  -2.085e-01  9.741e-01  1.000e+00 -1.386e-07
+## sigma     -7.436e-09 -1.617e-07 -1.386e-07  1.000e+00
+## 
+## Backtransformed parameters:
+## Confidence intervals for internally transformed parameters are asymmetric.
+## t-test (unrealistically) based on the assumption of normal distribution
+## for estimators of untransformed parameters.
+##          Estimate t value    Pr(>t)   Lower  Upper
+## parent_0   93.770  58.120 4.267e-12 90.0500 97.490
+## alpha       1.374   6.414 1.030e-04  0.9594  1.969
+## beta        1.234   4.012 1.942e-03  0.6945  2.192
+## sigma       2.276   4.899 5.977e-04  1.2050  3.347
+## 
+## FOCUS Chi2 error levels in percent:
+##          err.min n.optim df
+## All data   6.205       3  3
+## parent     6.205       3  3
+## 
+## Estimated disappearance times:
+##          DT50  DT90 DT50back
+## parent 0.8092 5.356    1.612
+

The error level at which the +χ2\chi^2 +test passes is much lower in this case. Therefore, the FOMC model +provides a better description of the data, as less experimental error +has to be assumed in order to explain the data.

+
+
+

DFOP fit for L2 +

+

Fitting the four parameter DFOP model further reduces the +χ2\chi^2 +error level.

+
+m.L2.DFOP <- mkinfit("DFOP", FOCUS_2006_L2_mkin, quiet = TRUE)
+plot(m.L2.DFOP, show_residuals = TRUE, show_errmin = TRUE,
+     main = "FOCUS L2 - DFOP")
+

+
+summary(m.L2.DFOP, data = FALSE)
+
## mkin version used for fitting:    1.2.10 
+## R version used for fitting:       4.4.2 
+## Date of fit:     Fri Feb 14 08:59:12 2025 
+## Date of summary: Fri Feb 14 08:59:12 2025 
+## 
+## Equations:
+## d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+##            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+##            * parent
+## 
+## Model predictions using solution type analytical 
+## 
+## Fitted using 581 model solutions performed in 0.042 s
+## 
+## Error model: Constant variance 
+## 
+## Error model algorithm: OLS 
+## 
+## Starting values for parameters to be optimised:
+##          value   type
+## parent_0 93.95  state
+## k1        0.10 deparm
+## k2        0.01 deparm
+## g         0.50 deparm
+## 
+## Starting values for the transformed parameters actually optimised:
+##              value lower upper
+## parent_0 93.950000  -Inf   Inf
+## log_k1   -2.302585  -Inf   Inf
+## log_k2   -4.605170  -Inf   Inf
+## g_qlogis  0.000000  -Inf   Inf
+## 
+## Fixed parameter values:
+## None
+## 
+## Results:
+## 
+##        AIC      BIC    logLik
+##   52.36695 54.79148 -21.18347
+## 
+## Optimised, transformed parameters with symmetric confidence intervals:
+##          Estimate Std. Error      Lower     Upper
+## parent_0   93.950  9.998e-01    91.5900   96.3100
+## log_k1      3.113  1.849e+03 -4369.0000 4375.0000
+## log_k2     -1.088  6.285e-02    -1.2370   -0.9394
+## g_qlogis   -0.399  9.946e-02    -0.6342   -0.1638
+## sigma       1.414  2.886e-01     0.7314    2.0960
+## 
+## Parameter correlation:
+##            parent_0     log_k1     log_k2   g_qlogis      sigma
+## parent_0  1.000e+00  6.763e-07 -8.944e-10  2.665e-01 -1.083e-09
+## log_k1    6.763e-07  1.000e+00  1.112e-04 -2.187e-04 -1.027e-05
+## log_k2   -8.944e-10  1.112e-04  1.000e+00 -7.903e-01  9.464e-09
+## g_qlogis  2.665e-01 -2.187e-04 -7.903e-01  1.000e+00 -1.532e-08
+## sigma    -1.083e-09 -1.027e-05  9.464e-09 -1.532e-08  1.000e+00
+## 
+## Backtransformed parameters:
+## Confidence intervals for internally transformed parameters are asymmetric.
+## t-test (unrealistically) based on the assumption of normal distribution
+## for estimators of untransformed parameters.
+##          Estimate   t value    Pr(>t)   Lower   Upper
+## parent_0  93.9500 9.397e+01 2.036e-12 91.5900 96.3100
+## k1        22.4900 5.533e-04 4.998e-01  0.0000     Inf
+## k2         0.3369 1.591e+01 4.697e-07  0.2904  0.3909
+## g          0.4016 1.680e+01 3.238e-07  0.3466  0.4591
+## sigma      1.4140 4.899e+00 8.776e-04  0.7314  2.0960
+## 
+## FOCUS Chi2 error levels in percent:
+##          err.min n.optim df
+## All data    2.53       4  2
+## parent      2.53       4  2
+## 
+## Estimated disappearance times:
+##          DT50  DT90 DT50back DT50_k1 DT50_k2
+## parent 0.5335 5.311    1.599 0.03083   2.058
+

Here, the DFOP model is clearly the best-fit model for dataset L2 +based on the chi^2 error level criterion.

+
+
+
+

Laboratory Data L3 +

+

The following code defines example dataset L3 from the FOCUS kinetics +report, p. 290.

+
+FOCUS_2006_L3 = data.frame(
+  t = c(0, 3, 7, 14, 30, 60, 91, 120),
+  parent = c(97.8, 60, 51, 43, 35, 22, 15, 12))
+FOCUS_2006_L3_mkin <- mkin_wide_to_long(FOCUS_2006_L3)
+
+

Fit multiple models +

+

As of mkin version 0.9-39 (June 2015), we can fit several models to +one or more datasets in one call to the function mmkin. The +datasets have to be passed in a list, in this case a named list holding +only the L3 dataset prepared above.

+
+# Only use one core here, not to offend the CRAN checks
+mm.L3 <- mmkin(c("SFO", "FOMC", "DFOP"), cores = 1,
+               list("FOCUS L3" = FOCUS_2006_L3_mkin), quiet = TRUE)
+plot(mm.L3)
+

+

The +χ2\chi^2 +error level of 21% as well as the plot suggest that the SFO model does +not fit very well. The FOMC model performs better, with an error level +at which the +χ2\chi^2 +test passes of 7%. Fitting the four parameter DFOP model further reduces +the +χ2\chi^2 +error level considerably.

+
+
+

Accessing mmkin objects +

+

The objects returned by mmkin are arranged like a matrix, with models +as a row index and datasets as a column index.

+

We can extract the summary and plot for e.g. the DFOP fit, +using square brackets for indexing which will result in the use of the +summary and plot functions working on mkinfit objects.

+
+summary(mm.L3[["DFOP", 1]])
+
## mkin version used for fitting:    1.2.10 
+## R version used for fitting:       4.4.2 
+## Date of fit:     Fri Feb 14 08:59:12 2025 
+## Date of summary: Fri Feb 14 08:59:12 2025 
+## 
+## Equations:
+## d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+##            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+##            * parent
+## 
+## Model predictions using solution type analytical 
+## 
+## Fitted using 376 model solutions performed in 0.024 s
+## 
+## Error model: Constant variance 
+## 
+## Error model algorithm: OLS 
+## 
+## Starting values for parameters to be optimised:
+##          value   type
+## parent_0 97.80  state
+## k1        0.10 deparm
+## k2        0.01 deparm
+## g         0.50 deparm
+## 
+## Starting values for the transformed parameters actually optimised:
+##              value lower upper
+## parent_0 97.800000  -Inf   Inf
+## log_k1   -2.302585  -Inf   Inf
+## log_k2   -4.605170  -Inf   Inf
+## g_qlogis  0.000000  -Inf   Inf
+## 
+## Fixed parameter values:
+## None
+## 
+## Results:
+## 
+##        AIC      BIC    logLik
+##   32.97732 33.37453 -11.48866
+## 
+## Optimised, transformed parameters with symmetric confidence intervals:
+##          Estimate Std. Error   Lower      Upper
+## parent_0  97.7500    1.01900 94.5000 101.000000
+## log_k1    -0.6612    0.10050 -0.9812  -0.341300
+## log_k2    -4.2860    0.04322 -4.4230  -4.148000
+## g_qlogis  -0.1739    0.05270 -0.3416  -0.006142
+## sigma      1.0170    0.25430  0.2079   1.827000
+## 
+## Parameter correlation:
+##            parent_0     log_k1     log_k2   g_qlogis      sigma
+## parent_0  1.000e+00  1.732e-01  2.282e-02  4.009e-01 -9.696e-08
+## log_k1    1.732e-01  1.000e+00  4.945e-01 -5.809e-01  7.148e-07
+## log_k2    2.282e-02  4.945e-01  1.000e+00 -6.812e-01  1.022e-06
+## g_qlogis  4.009e-01 -5.809e-01 -6.812e-01  1.000e+00 -7.930e-07
+## sigma    -9.696e-08  7.148e-07  1.022e-06 -7.930e-07  1.000e+00
+## 
+## Backtransformed parameters:
+## Confidence intervals for internally transformed parameters are asymmetric.
+## t-test (unrealistically) based on the assumption of normal distribution
+## for estimators of untransformed parameters.
+##          Estimate t value    Pr(>t)    Lower     Upper
+## parent_0 97.75000  95.960 1.248e-06 94.50000 101.00000
+## k1        0.51620   9.947 1.081e-03  0.37490   0.71090
+## k2        0.01376  23.140 8.840e-05  0.01199   0.01579
+## g         0.45660  34.920 2.581e-05  0.41540   0.49850
+## sigma     1.01700   4.000 1.400e-02  0.20790   1.82700
+## 
+## FOCUS Chi2 error levels in percent:
+##          err.min n.optim df
+## All data   2.225       4  4
+## parent     2.225       4  4
+## 
+## Estimated disappearance times:
+##         DT50 DT90 DT50back DT50_k1 DT50_k2
+## parent 7.464  123    37.03   1.343   50.37
+## 
+## Data:
+##  time variable observed predicted residual
+##     0   parent     97.8     97.75  0.05396
+##     3   parent     60.0     60.45 -0.44933
+##     7   parent     51.0     49.44  1.56338
+##    14   parent     43.0     43.84 -0.83632
+##    30   parent     35.0     35.15 -0.14707
+##    60   parent     22.0     23.26 -1.25919
+##    91   parent     15.0     15.18 -0.18181
+##   120   parent     12.0     10.19  1.81395
+
+plot(mm.L3[["DFOP", 1]], show_errmin = TRUE)
+

+

Here, a look to the model plot, the confidence intervals of the +parameters and the correlation matrix suggest that the parameter +estimates are reliable, and the DFOP model can be used as the best-fit +model based on the +χ2\chi^2 +error level criterion for laboratory data L3.

+

This is also an example where the standard t-test for the parameter +g_ilr is misleading, as it tests for a significant +difference from zero. In this case, zero appears to be the correct value +for this parameter, and the confidence interval for the backtransformed +parameter g is quite narrow.

+
+
+
+

Laboratory Data L4 +

+

The following code defines example dataset L4 from the FOCUS kinetics +report, p. 293:

+
+FOCUS_2006_L4 = data.frame(
+  t = c(0, 3, 7, 14, 30, 60, 91, 120),
+  parent = c(96.6, 96.3, 94.3, 88.8, 74.9, 59.9, 53.5, 49.0))
+FOCUS_2006_L4_mkin <- mkin_wide_to_long(FOCUS_2006_L4)
+

Fits of the SFO and FOMC models, plots and summaries are produced +below:

+
+# Only use one core here, not to offend the CRAN checks
+mm.L4 <- mmkin(c("SFO", "FOMC"), cores = 1,
+               list("FOCUS L4" = FOCUS_2006_L4_mkin),
+               quiet = TRUE)
+plot(mm.L4)
+

+

The +χ2\chi^2 +error level of 3.3% as well as the plot suggest that the SFO model fits +very well. The error level at which the +χ2\chi^2 +test passes is slightly lower for the FOMC model. However, the +difference appears negligible.

+
+summary(mm.L4[["SFO", 1]], data = FALSE)
+
## mkin version used for fitting:    1.2.10 
+## R version used for fitting:       4.4.2 
+## Date of fit:     Fri Feb 14 08:59:13 2025 
+## Date of summary: Fri Feb 14 08:59:13 2025 
+## 
+## Equations:
+## d_parent/dt = - k_parent * parent
+## 
+## Model predictions using solution type analytical 
+## 
+## Fitted using 142 model solutions performed in 0.01 s
+## 
+## Error model: Constant variance 
+## 
+## Error model algorithm: OLS 
+## 
+## Starting values for parameters to be optimised:
+##          value   type
+## parent_0  96.6  state
+## k_parent   0.1 deparm
+## 
+## Starting values for the transformed parameters actually optimised:
+##                  value lower upper
+## parent_0     96.600000  -Inf   Inf
+## log_k_parent -2.302585  -Inf   Inf
+## 
+## Fixed parameter values:
+## None
+## 
+## Results:
+## 
+##        AIC      BIC    logLik
+##   47.12133 47.35966 -20.56067
+## 
+## Optimised, transformed parameters with symmetric confidence intervals:
+##              Estimate Std. Error  Lower   Upper
+## parent_0       96.440    1.69900 92.070 100.800
+## log_k_parent   -5.030    0.07059 -5.211  -4.848
+## sigma           3.162    0.79050  1.130   5.194
+## 
+## Parameter correlation:
+##               parent_0 log_k_parent     sigma
+## parent_0     1.000e+00    5.938e-01 3.430e-07
+## log_k_parent 5.938e-01    1.000e+00 5.885e-07
+## sigma        3.430e-07    5.885e-07 1.000e+00
+## 
+## Backtransformed parameters:
+## Confidence intervals for internally transformed parameters are asymmetric.
+## t-test (unrealistically) based on the assumption of normal distribution
+## for estimators of untransformed parameters.
+##           Estimate t value    Pr(>t)     Lower     Upper
+## parent_0 96.440000   56.77 1.604e-08 92.070000 1.008e+02
+## k_parent  0.006541   14.17 1.578e-05  0.005455 7.842e-03
+## sigma     3.162000    4.00 5.162e-03  1.130000 5.194e+00
+## 
+## FOCUS Chi2 error levels in percent:
+##          err.min n.optim df
+## All data   3.287       2  6
+## parent     3.287       2  6
+## 
+## Estimated disappearance times:
+##        DT50 DT90
+## parent  106  352
+
+summary(mm.L4[["FOMC", 1]], data = FALSE)
+
## mkin version used for fitting:    1.2.10 
+## R version used for fitting:       4.4.2 
+## Date of fit:     Fri Feb 14 08:59:13 2025 
+## Date of summary: Fri Feb 14 08:59:13 2025 
+## 
+## Equations:
+## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent
+## 
+## Model predictions using solution type analytical 
+## 
+## Fitted using 224 model solutions performed in 0.013 s
+## 
+## Error model: Constant variance 
+## 
+## Error model algorithm: OLS 
+## 
+## Starting values for parameters to be optimised:
+##          value   type
+## parent_0  96.6  state
+## alpha      1.0 deparm
+## beta      10.0 deparm
+## 
+## Starting values for the transformed parameters actually optimised:
+##               value lower upper
+## parent_0  96.600000  -Inf   Inf
+## log_alpha  0.000000  -Inf   Inf
+## log_beta   2.302585  -Inf   Inf
+## 
+## Fixed parameter values:
+## None
+## 
+## Results:
+## 
+##        AIC      BIC    logLik
+##   40.37255 40.69032 -16.18628
+## 
+## Optimised, transformed parameters with symmetric confidence intervals:
+##           Estimate Std. Error   Lower    Upper
+## parent_0   99.1400     1.2670 95.6300 102.7000
+## log_alpha  -0.3506     0.2616 -1.0770   0.3756
+## log_beta    4.1740     0.3938  3.0810   5.2670
+## sigma       1.8300     0.4575  0.5598   3.1000
+## 
+## Parameter correlation:
+##             parent_0  log_alpha   log_beta      sigma
+## parent_0   1.000e+00 -4.696e-01 -5.543e-01 -2.447e-07
+## log_alpha -4.696e-01  1.000e+00  9.889e-01  2.198e-08
+## log_beta  -5.543e-01  9.889e-01  1.000e+00  4.923e-08
+## sigma     -2.447e-07  2.198e-08  4.923e-08  1.000e+00
+## 
+## Backtransformed parameters:
+## Confidence intervals for internally transformed parameters are asymmetric.
+## t-test (unrealistically) based on the assumption of normal distribution
+## for estimators of untransformed parameters.
+##          Estimate t value    Pr(>t)   Lower   Upper
+## parent_0  99.1400  78.250 7.993e-08 95.6300 102.700
+## alpha      0.7042   3.823 9.365e-03  0.3407   1.456
+## beta      64.9800   2.540 3.201e-02 21.7800 193.900
+## sigma      1.8300   4.000 8.065e-03  0.5598   3.100
+## 
+## FOCUS Chi2 error levels in percent:
+##          err.min n.optim df
+## All data   2.029       3  5
+## parent     2.029       3  5
+## 
+## Estimated disappearance times:
+##         DT50 DT90 DT50back
+## parent 108.9 1644    494.9
+
+
+

References +

+
+
+Ranke, Johannes. 2014. Prüfung und +Validierung von Modellierungssoftware als Alternative zu ModelMaker +4.0.” Umweltbundesamt Projektnummer 27452. +
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-10-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-10-1.png new file mode 100644 index 00000000..c732be75 Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-10-1.png differ diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-12-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-12-1.png new file mode 100644 index 00000000..daa488a3 Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-12-1.png differ diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-13-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-13-1.png new file mode 100644 index 00000000..5caea744 Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-13-1.png differ diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-15-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-15-1.png new file mode 100644 index 00000000..0dc9d57d Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-15-1.png differ diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-4-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-4-1.png new file mode 100644 index 00000000..13344b25 Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-4-1.png differ diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-5-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-5-1.png new file mode 100644 index 00000000..ec234b6e Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-5-1.png differ diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-6-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-6-1.png new file mode 100644 index 00000000..dfeb7907 Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-6-1.png differ diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-8-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-8-1.png new file mode 100644 index 00000000..d3551b47 Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-8-1.png differ diff --git a/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-9-1.png b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-9-1.png new file mode 100644 index 00000000..5f8afc00 Binary files /dev/null and b/docs/dev/articles/FOCUS_L_files/figure-html/unnamed-chunk-9-1.png differ diff --git a/docs/dev/articles/index.html b/docs/dev/articles/index.html new file mode 100644 index 00000000..be336fcb --- /dev/null +++ b/docs/dev/articles/index.html @@ -0,0 +1,114 @@ + +Articles • mkin + Skip to contents + + +
+ + + +
+ + + +
+ + + + + + + diff --git a/docs/dev/articles/mkin.html b/docs/dev/articles/mkin.html new file mode 100644 index 00000000..30b2182f --- /dev/null +++ b/docs/dev/articles/mkin.html @@ -0,0 +1,414 @@ + + + + + + + +Short introduction to mkin • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +

Wissenschaftlicher Berater, Kronacher +Str. 12, 79639 Grenzach-Wyhlen, Germany
Privatdozent at the +University of Freiburg

+
+

Abstract +

+

In the regulatory evaluation of chemical substances like plant +protection products (pesticides), biocides and other chemicals, +degradation data play an important role. For the evaluation of pesticide +degradation experiments, detailed guidance has been developed, based on +nonlinear optimisation. The R add-on package +mkin implements fitting some of the models recommended in +this guidance from within R and calculates some statistical measures for +data series within one or more compartments, for parent and +metabolites.

+
+library("mkin", quietly = TRUE)
+# Define the kinetic model
+m_SFO_SFO_SFO <- mkinmod(parent = mkinsub("SFO", "M1"),
+                         M1 = mkinsub("SFO", "M2"),
+                         M2 = mkinsub("SFO"),
+                         use_of_ff = "max", quiet = TRUE)
+
+
+# Produce model predictions using some arbitrary parameters
+sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
+d_SFO_SFO_SFO <- mkinpredict(m_SFO_SFO_SFO,
+  c(k_parent = 0.03,
+    f_parent_to_M1 = 0.5, k_M1 = log(2)/100,
+    f_M1_to_M2 = 0.9, k_M2 = log(2)/50),
+  c(parent = 100, M1 = 0, M2 = 0),
+  sampling_times)
+
+# Generate a dataset by adding normally distributed errors with
+# standard deviation 3, for two replicates at each sampling time
+d_SFO_SFO_SFO_err <- add_err(d_SFO_SFO_SFO, reps = 2,
+                             sdfunc = function(x) 3,
+                             n = 1, seed = 123456789 )
+
+# Fit the model to the dataset
+f_SFO_SFO_SFO <- mkinfit(m_SFO_SFO_SFO, d_SFO_SFO_SFO_err[[1]], quiet = TRUE)
+
+# Plot the results separately for parent and metabolites
+plot_sep(f_SFO_SFO_SFO, lpos = c("topright", "bottomright", "bottomright"))
+

+
+
+

Background +

+

The mkin package (J. Ranke +2021) implements the approach to degradation kinetics recommended +in the kinetics report provided by the FOrum for Co-ordination of +pesticide fate models and their USe (FOCUS Work +Group on Degradation Kinetics 2006, 2014). It covers data series +describing the decline of one compound, data series with transformation +products (commonly termed metabolites) and data series for more than one +compartment. It is possible to include back reactions. Therefore, +equilibrium reactions and equilibrium partitioning can be specified, +although this often leads to an overparameterisation of the model.

+

When the first mkin code was published in 2010, the most +commonly used tools for fitting more complex kinetic degradation models +to experimental data were KinGUI (Schäfer et al. +2007), a MATLAB based tool with a graphical user interface that +was specifically tailored to the task and included some output as +proposed by the FOCUS Kinetics Workgroup, and ModelMaker, a general +purpose compartment based tool providing infrastructure for fitting +dynamic simulation models based on differential equations to data.

+

The ‘mkin’ code was first uploaded to the BerliOS development +platform. When this was taken down, the version control history was +imported into the R-Forge site (see e.g. the +initial commit on 11 May 2010), where the code is still being +updated.

+

At that time, the R package FME (Flexible Modelling +Environment) (Soetaert and Petzoldt 2010) +was already available, and provided a good basis for developing a +package specifically tailored to the task. The remaining challenge was +to make it as easy as possible for the users (including the author of +this vignette) to specify the system of differential equations and to +include the output requested by the FOCUS guidance, such as the +χ2\chi^2 +error level as defined in this guidance.

+

Also, mkin introduced using analytical solutions for +parent only kinetics for improved optimization speed. Later, Eigenvalue +based solutions were introduced to mkin for the case of +linear differential equations (i.e. where the FOMC or DFOP +models were not used for the parent compound), greatly improving the +optimization speed for these cases. This, has become somehow obsolete, +as the use of compiled code described below gives even faster execution +times.

+

The possibility to specify back-reactions and a biphasic model +(SFORB) for metabolites were present in mkin from the very +beginning.

+
+

Derived software tools +

+

Soon after the publication of mkin, two derived tools +were published, namely KinGUII (developed at Bayer Crop Science) and +CAKE (commissioned to Tessella by Syngenta), which added a graphical +user interface (GUI), and added fitting by iteratively reweighted least +squares (IRLS) and characterisation of likely parameter distributions by +Markov Chain Monte Carlo (MCMC) sampling.

+

CAKE focuses on a smooth use experience, sacrificing some flexibility +in the model definition, originally allowing only two primary +metabolites in parallel. The current version 3.4 of CAKE released in May +2020 uses a scheme for up to six metabolites in a flexible arrangement +and supports biphasic modelling of metabolites, but does not support +back-reactions (non-instantaneous equilibria).

+

KinGUI offers an even more flexible widget for specifying complex +kinetic models. Back-reactions (non-instantaneous equilibria) were +supported early on, but until 2014, only simple first-order models could +be specified for transformation products. Starting with KinGUII version +2.1, biphasic modelling of metabolites was also available in +KinGUII.

+

A further graphical user interface (GUI) that has recently been +brought to a decent degree of maturity is the browser based GUI named +gmkin. Please see its documentation page and manual +for further information.

+

A comparison of scope, usability and numerical results obtained with +these tools has been recently been published by Johannes Ranke, Wöltjen, and Meinecke +(2018).

+
+
+
+

Unique features +

+

Currently, the main unique features available in mkin +are

+
    +
  • the speed +increase by using compiled code when a compiler is present,
  • +
  • parallel model fitting on multicore machines using the mmkin +function,
  • +
  • the estimation of parameter confidence intervals based on +transformed parameters (see below) and
  • +
  • the possibility to use the two-component +error model +
  • +
+

The iteratively reweighted least squares fitting of different +variances for each variable as introduced by Gao +et al. (2011) has been available in mkin since version +0.9-22. With release +0.9.49.5, the IRLS algorithm has been complemented by direct or +step-wise maximisation of the likelihood function, which makes it +possible not only to fit the variance by variable error model but also a +two-component +error model inspired by error models developed in analytical +chemistry (Johannes Ranke and Meinecke +2019).

+
+
+

Internal parameter transformations +

+

For rate constants, the log transformation is used, as proposed by +Bates and Watts (1988, 77, 149). +Approximate intervals are constructed for the transformed rate constants +(compare Bates and Watts 1988, 135), +i.e. for their logarithms. Confidence intervals for the rate +constants are then obtained using the appropriate backtransformation +using the exponential function.

+

In the first version of mkin allowing for specifying +models using formation fractions, a home-made reparameterisation was +used in order to ensure that the sum of formation fractions would not +exceed unity.

+

This method is still used in the current version of KinGUII (v2.1 +from April 2014), with a modification that allows for fixing the pathway +to sink to zero. CAKE uses penalties in the objective function in order +to enforce this constraint.

+

In 2012, an alternative reparameterisation of the formation fractions +was proposed together with René Lehmann (J. Ranke +and Lehmann 2012), based on isometric logratio transformation +(ILR). The aim was to improve the validity of the linear approximation +of the objective function during the parameter estimation procedure as +well as in the subsequent calculation of parameter confidence intervals. +In the current version of mkin, a logit transformation is used for +parameters that are bound between 0 and 1, such as the g parameter of +the DFOP model.

+
+

Confidence intervals based on transformed parameters +

+

In the first attempt at providing improved parameter confidence +intervals introduced to mkin in 2013, confidence intervals +obtained from FME on the transformed parameters were simply all +backtransformed one by one to yield asymmetric confidence intervals for +the backtransformed parameters.

+

However, while there is a 1:1 relation between the rate constants in +the model and the transformed parameters fitted in the model, the +parameters obtained by the isometric logratio transformation are +calculated from the set of formation fractions that quantify the paths +to each of the compounds formed from a specific parent compound, and no +such 1:1 relation exists.

+

Therefore, parameter confidence intervals for formation fractions +obtained with this method only appear valid for the case of a single +transformation product, where currently the logit transformation is used +for the formation fraction.

+

The confidence intervals obtained by backtransformation for the cases +where a 1:1 relation between transformed and original parameter exist +are considered by the author of this vignette to be more accurate than +those obtained using a re-estimation of the Hessian matrix after +backtransformation, as implemented in the FME package.

+
+
+

Parameter t-test based on untransformed parameters +

+

The standard output of many nonlinear regression software packages +includes the results from a test for significant difference from zero +for all parameters. Such a test is also recommended to check the +validity of rate constants in the FOCUS guidance (FOCUS Work Group on Degradation Kinetics 2014, +96ff).

+

It has been argued that the precondition for this test, i.e. +normal distribution of the estimator for the parameters, is not +fulfilled in the case of nonlinear regression (J. +Ranke and Lehmann 2015). However, this test is commonly used by +industry, consultants and national authorities in order to decide on the +reliability of parameter estimates, based on the FOCUS guidance +mentioned above. Therefore, the results of this one-sided t-test are +included in the summary output from mkin.

+

As it is not reasonable to test for significant difference of the +transformed parameters (e.g. +log(k)log(k)) +from zero, the t-test is calculated based on the model definition before +parameter transformation, i.e. in a similar way as in packages +that do not apply such an internal parameter transformation. A note is +included in the mkin output, pointing to the fact that the +t-test is based on the unjustified assumption of normal distribution of +the parameter estimators.

+
+
+
+

References +

+ +
+
+Bates, D., and D. Watts. 1988. Nonlinear Regression and Its +Applications. Wiley-Interscience. +
+
+FOCUS Work Group on Degradation Kinetics. 2006. Guidance Document on +Estimating Persistence and Degradation Kinetics from Environmental Fate +Studies on Pesticides in EU Registration. Report of the FOCUS Work Group +on Degradation Kinetics. http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics. +
+
+———. 2014. Generic Guidance for Estimating Persistence and +Degradation Kinetics from Environmental Fate Studies on Pesticides in EU +Registration. 1.1 ed. http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics. +
+
+Gao, Z., J. W. Green, J. Vanderborght, and W. Schmitt. 2011. +“Improving Uncertainty Analysis in Kinetic Evaluations Using +Iteratively Reweighted Least Squares.” Journal. Environmental +Science and Technology 45: 4429–37. +
+
+Ranke, J. 2021. mkin‘: +Kinetic Evaluation of Chemical Degradation Data. https://CRAN.R-project.org/package=mkin. +
+
+Ranke, J., and R. Lehmann. 2012. “Parameter Reliability in Kinetic +Evaluation of Environmental Metabolism Data - Assessment and the +Influence of Model Specification.” In SETAC World 20-24 +May. Berlin. https://jrwb.de/posters/Poster_SETAC_2012_Kinetic_parameter_uncertainty_model_parameterization_Lehmann_Ranke.pdf. +
+
+———. 2015. “To t-Test or Not to t-Test, That Is the +Question.” In XV Symposium on Pesticide Chemistry 2-4 +September 2015. Piacenza. https://jrwb.de/posters/piacenza_2015.pdf. +
+
+Ranke, Johannes, and Stefan Meinecke. 2019. “Error Models for the +Kinetic Evaluation of Chemical Degradation Data.” +Environments 6 (12). https://doi.org/10.3390/environments6120124. +
+
+Ranke, Johannes, Janina Wöltjen, and Stefan Meinecke. 2018. +“Comparison of Software Tools for Kinetic Evaluation of Chemical +Degradation Data.” Environmental Sciences Europe 30 (1): +17. https://doi.org/10.1186/s12302-018-0145-1. +
+
+Schäfer, D., B. Mikolasch, P. Rainbird, and B. Harvey. 2007. +KinGUI: A New Kinetic Software Tool for Evaluations +According to FOCUS Degradation Kinetics.” In +Proceedings of the XIII Symposium Pesticide Chemistry, edited +by Del Re A. A. M., Capri E., Fragoulis G., and Trevisan M., 916–23. +Piacenza. +
+
+Soetaert, Karline, and Thomas Petzoldt. 2010. “Inverse Modelling, +Sensitivity and Monte Carlo Analysis in R Using Package +FME.” Journal of Statistical Software 33 +(3): 1–28. https://doi.org/10.18637/jss.v033.i03. +
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/mkin_files/figure-html/unnamed-chunk-2-1.png b/docs/dev/articles/mkin_files/figure-html/unnamed-chunk-2-1.png new file mode 100644 index 00000000..65c1a613 Binary files /dev/null and b/docs/dev/articles/mkin_files/figure-html/unnamed-chunk-2-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway.html b/docs/dev/articles/prebuilt/2022_cyan_pathway.html new file mode 100644 index 00000000..b93e5e7e --- /dev/null +++ b/docs/dev/articles/prebuilt/2022_cyan_pathway.html @@ -0,0 +1,5397 @@ + + + + + + + +Testing hierarchical pathway kinetics with residue data on cyantraniliprole • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

Introduction +

+

The purpose of this document is to test demonstrate how nonlinear +hierarchical models (NLHM) based on the parent degradation models SFO, +FOMC, DFOP and HS, with serial formation of two or more metabolites can +be fitted with the mkin package.

+

It was assembled in the course of work package 1.2 of Project Number +173340 (Application of nonlinear hierarchical models to the kinetic +evaluation of chemical degradation data) of the German Environment +Agency carried out in 2022 and 2023.

+

The mkin package is used in version 1.2.10 which is currently under +development. The newly introduced functionality that is used here is a +simplification of excluding random effects for a set of fits based on a +related set of fits with a reduced model, and the documentation of the +starting parameters of the fit, so that all starting parameters of +saem fits are now listed in the summary. The +saemix package is used as a backend for fitting the NLHM, +but is also loaded to make the convergence plot function available.

+

This document is processed with the knitr package, which +also provides the kable function that is used to improve +the display of tabular data in R markdown documents. For parallel +processing, the parallel package is used.

+
+library(mkin)
+library(knitr)
+library(saemix)
+library(parallel)
+n_cores <- detectCores()
+
+# We need to start a new cluster after defining a compiled model that is
+# saved as a DLL to the user directory, therefore we define a function
+# This is used again after defining the pathway model
+start_cluster <- function(n_cores) {
+  if (Sys.info()["sysname"] == "Windows") {
+    ret <- makePSOCKcluster(n_cores)
+  } else {
+    ret <- makeForkCluster(n_cores)
+  }
+  return(ret)
+}
+cl <- start_cluster(n_cores)
+
+

Test data +

+

The example data are taken from the final addendum to the DAR from +2014 and are distributed with the mkin package. Residue data and time +step normalisation factors are read in using the function +read_spreadsheet from the mkin package. This function also +performs the time step normalisation.

+
+data_file <- system.file(
+  "testdata", "cyantraniliprole_soil_efsa_2014.xlsx",
+  package = "mkin")
+cyan_ds <- read_spreadsheet(data_file, parent_only = FALSE)
+

The following tables show the covariate data and the 5 datasets that +were read in from the spreadsheet file.

+
+pH <- attr(cyan_ds, "covariates")
+kable(pH, caption = "Covariate data")
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Covariate data
pH
Nambsheim7.90
Tama6.20
Gross-Umstadt7.04
Sassafras4.62
Lleida8.05
+
+for (ds_name in names(cyan_ds)) {
+  print(
+    kable(mkin_long_to_wide(cyan_ds[[ds_name]]),
+      caption = paste("Dataset", ds_name),
+      booktabs = TRUE, row.names = FALSE))
+    cat("\n\\clearpage\n")
+}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Nambsheim
timecyanJCZ38J9C38JSE76J9Z38
0.000000105.79NANANANA
3.21042477.267.9211.945.589.12
7.49098857.1315.4616.5812.5911.74
17.12225937.7415.9813.3626.0510.77
23.54310531.476.0514.4934.714.96
43.87578816.746.077.5740.386.52
67.4188938.8510.346.3930.718.90
107.0141165.199.611.9520.4112.93
129.4870803.456.181.3621.786.99
195.8358322.159.130.9516.297.69
254.6935961.926.920.2013.577.16
321.0423482.267.02NA11.128.66
383.110535NA5.05NA10.645.56
0.000000105.57NANANANA
3.21042478.8812.7711.945.479.12
7.49098859.9415.2716.5813.6011.74
17.12225939.6714.2613.3629.4410.77
23.54310530.2116.0714.4935.904.96
43.87578818.069.447.5742.306.52
67.4188938.545.786.3934.708.90
107.0141167.264.541.9523.3312.93
129.4870803.604.221.3623.566.99
195.8358322.843.050.9516.217.69
254.6935962.002.900.2015.537.16
321.0423481.790.94NA9.808.66
383.110535NA1.82NA9.495.56
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Tama
timecyanJCZ38J9Z38JSE76
0.000000106.14NANANA
2.40083393.476.462.85NA
5.60194388.3910.864.653.85
12.80444272.2911.974.9111.24
17.60610865.7913.116.6313.79
32.81138253.1611.248.9023.40
50.41749044.0111.349.9829.56
80.02776133.238.8211.3135.63
96.83359140.685.948.3229.09
146.45080320.654.498.7236.88
190.46607217.714.6611.1040.97
240.08328414.862.2711.6240.11
286.49938612.02NA10.7342.58
0.000000109.11NANANA
2.40083396.845.522.042.02
5.60194385.299.652.994.39
12.80444273.6812.485.0511.47
17.60610864.8912.446.2915.00
32.81138252.2710.867.6523.30
50.41749042.6110.549.3731.06
80.02776134.2910.029.0437.87
96.83359130.506.348.1433.97
146.45080319.216.298.5226.15
190.46607217.555.819.8932.08
240.08328413.225.9910.7940.66
286.49938611.096.058.8242.90
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Gross-Umstadt
timecyanJCZ38J9Z38JSE76
0.0000000103.03NANANA
2.101468187.854.793.260.62
4.903425577.358.059.891.32
10.507340469.339.7412.324.74
21.014680755.6514.5713.599.84
31.522021149.0314.6616.7112.32
42.029361541.8615.9713.6415.53
63.044042234.8818.2014.1222.02
84.058723028.2615.6414.0625.60
0.0000000104.05NANANA
2.101468185.252.687.320.69
4.903425577.227.288.371.45
10.507340465.2310.7310.934.74
21.014680757.7812.2914.809.05
31.522021154.8314.0512.0111.05
42.029361545.1712.1217.8915.71
63.044042234.8312.9015.8622.52
84.058723026.5914.2814.9128.48
0.0000000104.62NANANA
0.814522597.21NA4.00NA
1.900552589.643.595.24NA
4.072612587.904.109.58NA
8.145225186.905.969.45NA
12.217837674.747.8315.035.33
16.290450274.138.8414.415.10
24.435675365.2611.8418.336.71
32.580900457.7012.7419.939.74
0.0000000101.94NANANA
0.814522599.94NANANA
1.900552594.87NA4.56NA
4.072612586.966.756.90NA
8.145225180.5110.687.432.58
12.217837678.3810.359.463.69
16.290450270.0513.739.277.18
24.435675361.2812.5713.2813.19
32.580900452.8512.6712.9513.69
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Sassafras
timecyanJCZ38J9Z38JSE76
0.000000102.17NANANA
2.21671995.491.110.100.83
5.17234383.356.432.893.30
11.08359378.1810.005.590.81
22.16718670.4417.214.231.09
33.25077968.0020.455.861.17
44.33437159.6424.643.172.72
66.50155750.7327.506.191.27
88.66874245.6532.775.694.54
0.000000100.43NANANA
2.21671995.343.210.140.46
5.17234384.385.734.750.62
11.08359378.5011.893.990.73
22.16718671.1717.284.390.66
33.25077959.4118.7311.852.65
44.33437164.5722.935.132.01
66.50155749.0833.395.673.63
88.66874240.4139.605.936.17
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Lleida
timecyanJCZ38J9Z38JSE76
0.000000102.71NANANA
2.82105179.115.708.070.97
6.58245170.037.1711.314.72
14.10525350.9310.2514.849.95
28.21050533.4310.4014.8224.06
42.31575824.699.7516.3829.38
56.42101022.9910.0615.5129.25
84.63151614.635.6314.7431.04
112.84202112.434.1713.5333.28
0.00000099.31NANANA
2.82105182.076.555.601.12
6.58245170.657.618.013.21
14.10525353.5211.4810.8212.24
28.21050535.6011.1915.4323.53
42.31575834.2611.0913.2627.42
56.42101021.794.8018.3030.20
84.63151614.066.3016.3532.32
112.84202111.515.5712.6432.51
+
+
+
+

Parent only evaluations +

+

As the pathway fits have very long run times, evaluations of the +parent data are performed first, in order to determine for each +hierarchical parent degradation model which random effects on the +degradation model parameters are ill-defined.

+
+cyan_sep_const <- mmkin(c("SFO", "FOMC", "DFOP", "SFORB", "HS"),
+  cyan_ds, quiet = TRUE, cores = n_cores)
+cyan_sep_tc <- update(cyan_sep_const, error_model = "tc")
+cyan_saem_full <- mhmkin(list(cyan_sep_const, cyan_sep_tc))
+status(cyan_saem_full) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
SFOOKOK
FOMCOKOK
DFOPOKOK
SFORBOKOK
HSOKOK
+

All fits converged successfully.

+
+illparms(cyan_saem_full) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
SFOsd(cyan_0)sd(cyan_0)
FOMCsd(log_beta)sd(cyan_0)
DFOPsd(cyan_0)sd(cyan_0), sd(log_k1)
SFORBsd(cyan_free_0)sd(cyan_free_0), sd(log_k_cyan_free_bound)
HSsd(cyan_0)sd(cyan_0)
+

In almost all models, the random effect for the initial concentration +of the parent compound is ill-defined. For the biexponential models DFOP +and SFORB, the random effect of one additional parameter is ill-defined +when the two-component error model is used.

+
+anova(cyan_saem_full) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
SFO const5833.9832.0-412.0
SFO tc6831.6829.3-409.8
FOMC const7709.1706.4-347.6
FOMC tc8689.2686.1-336.6
DFOP const9703.0699.5-342.5
SFORB const9701.3697.8-341.7
HS const9718.6715.1-350.3
DFOP tc10703.1699.2-341.6
SFORB tc10700.0696.1-340.0
HS tc10716.7712.8-348.3
+

Model comparison based on AIC and BIC indicates that the +two-component error model is preferable for all parent models with the +exception of DFOP. The lowest AIC and BIC values are are obtained with +the FOMC model, followed by SFORB and DFOP.

+ +
+
+

Pathway fits +

+
+

Evaluations with pathway established previously +

+

To test the technical feasibility of coupling the relevant parent +degradation models with different transformation pathway models, a list +of mkinmod models is set up below. As in the EU evaluation, +parallel formation of metabolites JCZ38 and J9Z38 and secondary +formation of metabolite JSE76 from JCZ38 is used.

+
+if (!dir.exists("cyan_dlls")) dir.create("cyan_dlls")
+cyan_path_1 <- list(
+  sfo_path_1 = mkinmod(
+    cyan = mkinsub("SFO", c("JCZ38", "J9Z38")),
+    JCZ38 = mkinsub("SFO", "JSE76"),
+    J9Z38 = mkinsub("SFO"),
+    JSE76 = mkinsub("SFO"), quiet = TRUE,
+    name = "sfo_path_1", dll_dir = "cyan_dlls", overwrite = TRUE),
+  fomc_path_1 = mkinmod(
+    cyan = mkinsub("FOMC", c("JCZ38", "J9Z38")),
+    JCZ38 = mkinsub("SFO", "JSE76"),
+    J9Z38 = mkinsub("SFO"),
+    JSE76 = mkinsub("SFO"), quiet = TRUE,
+    name = "fomc_path_1", dll_dir = "cyan_dlls", overwrite = TRUE),
+  dfop_path_1 = mkinmod(
+    cyan = mkinsub("DFOP", c("JCZ38", "J9Z38")),
+    JCZ38 = mkinsub("SFO", "JSE76"),
+    J9Z38 = mkinsub("SFO"),
+    JSE76 = mkinsub("SFO"), quiet = TRUE,
+    name = "dfop_path_1", dll_dir = "cyan_dlls", overwrite = TRUE),
+  sforb_path_1 = mkinmod(
+    cyan = mkinsub("SFORB", c("JCZ38", "J9Z38")),
+    JCZ38 = mkinsub("SFO", "JSE76"),
+    J9Z38 = mkinsub("SFO"),
+    JSE76 = mkinsub("SFO"), quiet = TRUE,
+    name = "sforb_path_1", dll_dir = "cyan_dlls", overwrite = TRUE),
+  hs_path_1 = mkinmod(
+    cyan = mkinsub("HS", c("JCZ38", "J9Z38")),
+    JCZ38 = mkinsub("SFO", "JSE76"),
+    J9Z38 = mkinsub("SFO"),
+    JSE76 = mkinsub("SFO"), quiet = TRUE,
+    name = "hs_path_1", dll_dir = "cyan_dlls", overwrite = TRUE)
+)
+cl_path_1 <- start_cluster(n_cores)
+

To obtain suitable starting values for the NLHM fits, separate +pathway fits are performed for all datasets.

+
+f_sep_1_const <- mmkin(
+  cyan_path_1,
+  cyan_ds,
+  error_model = "const",
+  cluster = cl_path_1,
+  quiet = TRUE)
+status(f_sep_1_const) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NambsheimTamaGross-UmstadtSassafrasLleida
sfo_path_1OKOKOKCOK
fomc_path_1OKOKOKOKOK
dfop_path_1OKOKOKOKOK
sforb_path_1OKOKOKOKOK
hs_path_1CCCCC
+
+f_sep_1_tc <- update(f_sep_1_const, error_model = "tc")
+status(f_sep_1_tc) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NambsheimTamaGross-UmstadtSassafrasLleida
sfo_path_1OKOKOKOKOK
fomc_path_1OKOKOKOKOK
dfop_path_1OKOKOKOKOK
sforb_path_1OKOKOKOKOK
hs_path_1COKCOKC
+

Most separate fits converged successfully. The biggest convergence +problems are seen when using the HS model with constant variance.

+

For the hierarchical pathway fits, those random effects that could +not be quantified in the corresponding parent data analyses are +excluded.

+

In the code below, the output of the illparms function +for the parent only fits is used as an argument +no_random_effect to the mhmkin function. The +possibility to do so was introduced in mkin version 1.2.2 +which is currently under development.

+
+f_saem_1 <- mhmkin(list(f_sep_1_const, f_sep_1_tc),
+  no_random_effect = illparms(cyan_saem_full),
+  cluster = cl_path_1)
+
+status(f_saem_1) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
sfo_path_1FOFth, FO
fomc_path_1OKFth, FO
dfop_path_1Fth, FOFth, FO
sforb_path_1Fth, FOFth, FO
hs_path_1FOE
+

The status information from the individual fits shows that all fits +completed successfully. The matrix entries Fth and FO indicate that the +Fisher Information Matrix could not be inverted for the fixed effects +(theta) and the random effects (Omega), respectively. For the affected +fits, ill-defined parameters cannot be determined using the +illparms function, because it relies on the Fisher +Information Matrix.

+
+illparms(f_saem_1) |> kable()
+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
sfo_path_1NANA
fomc_path_1sd(log_k_J9Z38), sd(f_cyan_ilr_2), +sd(f_JCZ38_qlogis)NA
dfop_path_1NANA
sforb_path_1NANA
hs_path_1NAE
+

The model comparisons below suggest that the pathway fits using DFOP +or SFORB for the parent compound provide the best fit.

+
+anova(f_saem_1[, "const"]) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
sfo_path_1 const162693.02686.8-1330.5
fomc_path_1 const182427.92420.9-1196.0
dfop_path_1 const202403.22395.4-1181.6
sforb_path_1 const202401.42393.6-1180.7
hs_path_1 const202427.22419.4-1193.6
+
+anova(f_saem_1[1:4, ]) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
sfo_path_1 const162693.02686.8-1330.5
sfo_path_1 tc172657.62651.0-1311.8
fomc_path_1 const182427.92420.9-1196.0
fomc_path_1 tc192423.62416.2-1192.8
dfop_path_1 const202403.22395.4-1181.6
sforb_path_1 const202401.42393.6-1180.7
dfop_path_1 tc202398.02390.1-1179.0
sforb_path_1 tc202399.92392.1-1180.0
+

For these two parent model, successful fits are shown below. Plots of +the fits with the other parent models are shown in the Appendix.

+
+plot(f_saem_1[["dfop_path_1", "tc"]])
+
+DFOP pathway fit with two-component error

+DFOP pathway fit with two-component error +

+
+
+plot(f_saem_1[["sforb_path_1", "tc"]])
+
+SFORB pathway fit with two-component error

+SFORB pathway fit with two-component error +

+
+

A closer graphical analysis of these Figures shows that the residues +of transformation product JCZ38 in the soils Tama and Nambsheim observed +at later time points are strongly and systematically underestimated.

+
+stopCluster(cl_path_1)
+
+
+

Alternative pathway fits +

+

To improve the fit for JCZ38, a back-reaction from JSE76 to JCZ38 was +introduced in an alternative version of the transformation pathway, in +analogy to the back-reaction from K5A78 to K5A77. Both pairs of +transformation products are pairs of an organic acid with its +corresponding amide (Addendum 2014, p. 109). As FOMC provided the best +fit for the parent, and the biexponential models DFOP and SFORB provided +the best initial pathway fits, these three parent models are used in the +alternative pathway fits.

+
+cyan_path_2 <- list(
+  fomc_path_2 = mkinmod(
+    cyan = mkinsub("FOMC", c("JCZ38", "J9Z38")),
+    JCZ38 = mkinsub("SFO", "JSE76"),
+    J9Z38 = mkinsub("SFO"),
+    JSE76 = mkinsub("SFO", "JCZ38"),
+    name = "fomc_path_2", quiet = TRUE,
+    dll_dir = "cyan_dlls",
+    overwrite = TRUE
+  ),
+  dfop_path_2 = mkinmod(
+    cyan = mkinsub("DFOP", c("JCZ38", "J9Z38")),
+    JCZ38 = mkinsub("SFO", "JSE76"),
+    J9Z38 = mkinsub("SFO"),
+    JSE76 = mkinsub("SFO", "JCZ38"),
+    name = "dfop_path_2", quiet = TRUE,
+    dll_dir = "cyan_dlls",
+    overwrite = TRUE
+  ),
+  sforb_path_2 = mkinmod(
+    cyan = mkinsub("SFORB", c("JCZ38", "J9Z38")),
+    JCZ38 = mkinsub("SFO", "JSE76"),
+    J9Z38 = mkinsub("SFO"),
+    JSE76 = mkinsub("SFO", "JCZ38"),
+    name = "sforb_path_2", quiet = TRUE,
+    dll_dir = "cyan_dlls",
+    overwrite = TRUE
+  )
+)
+
+cl_path_2 <- start_cluster(n_cores)
+f_sep_2_const <- mmkin(
+  cyan_path_2,
+  cyan_ds,
+  error_model = "const",
+  cluster = cl_path_2,
+  quiet = TRUE)
+
+status(f_sep_2_const) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NambsheimTamaGross-UmstadtSassafrasLleida
fomc_path_2OKOKOKCOK
dfop_path_2OKOKOKCOK
sforb_path_2OKOKOKOKOK
+

Using constant variance, separate fits converge with the exception of +the fits to the Sassafras soil data.

+
+f_sep_2_tc <- update(f_sep_2_const, error_model = "tc")
+status(f_sep_2_tc) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NambsheimTamaGross-UmstadtSassafrasLleida
fomc_path_2OKOKOKCOK
dfop_path_2OKCOKCOK
sforb_path_2OKOKOKCOK
+

Using the two-component error model, all separate fits converge with +the exception of the alternative pathway fit with DFOP used for the +parent and the Sassafras dataset.

+
+f_saem_2 <- mhmkin(list(f_sep_2_const, f_sep_2_tc),
+  no_random_effect = illparms(cyan_saem_full[2:4, ]),
+  cluster = cl_path_2)
+
+status(f_saem_2) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + +
consttc
fomc_path_2EOK
dfop_path_2OKOK
sforb_path_2OKOK
+

The hierarchical fits for the alternative pathway completed +successfully, with the exception of the model using FOMC for the parent +compound and constant variance as the error model.

+
+illparms(f_saem_2) |> kable()
+ +++++ + + + + + + + + + + + + + + + + + + + + + + +
consttc
fomc_path_2Esd(f_JSE76_qlogis)
dfop_path_2sd(f_JCZ38_qlogis), sd(f_JSE76_qlogis)sd(f_JCZ38_qlogis), sd(f_JSE76_qlogis)
sforb_path_2sd(f_JCZ38_qlogis), sd(f_JSE76_qlogis)sd(f_JCZ38_qlogis), sd(f_JSE76_qlogis)
+

In all biphasic fits (DFOP or SFORB for the parent compound), the +random effects for the formation fractions for the pathways from JCZ38 +to JSE76, and for the reverse pathway from JSE76 to JCZ38 are +ill-defined.

+
+anova(f_saem_2[, "tc"]) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
fomc_path_2 tc212249.02240.8-1103.5
dfop_path_2 tc222234.42225.8-1095.2
sforb_path_2 tc222239.72231.1-1097.9
+
+anova(f_saem_2[2:3,]) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
dfop_path_2 const222288.42279.8-1122.2
sforb_path_2 const222283.32274.7-1119.7
dfop_path_2 tc222234.42225.8-1095.2
sforb_path_2 tc222239.72231.1-1097.9
+

The variants using the biexponential models DFOP and SFORB for the +parent compound and the two-component error model give the lowest AIC +and BIC values and are plotted below. Compared with the original +pathway, the AIC and BIC values indicate a large improvement. This is +confirmed by the plots, which show that the metabolite JCZ38 is fitted +much better with this model.

+
+plot(f_saem_2[["fomc_path_2", "tc"]])
+
+FOMC pathway fit with two-component error, alternative pathway

+FOMC pathway fit with two-component error, alternative pathway +

+
+
+plot(f_saem_2[["dfop_path_2", "tc"]])
+
+DFOP pathway fit with two-component error, alternative pathway

+DFOP pathway fit with two-component error, alternative pathway +

+
+
+plot(f_saem_2[["sforb_path_2", "tc"]])
+
+SFORB pathway fit with two-component error, alternative pathway

+SFORB pathway fit with two-component error, alternative pathway +

+
+
+
+

Refinement of alternative pathway fits +

+

All ill-defined random effects that were identified in the parent +only fits and in the above pathway fits, are excluded for the final +evaluations below. For this purpose, a list of character vectors is +created below that can be indexed by row and column indices, and which +contains the degradation parameter names for which random effects should +be excluded for each of the hierarchical fits contained in +f_saem_2.

+
+no_ranef <- matrix(list(), nrow = 3, ncol = 2, dimnames = dimnames(f_saem_2))
+no_ranef[["fomc_path_2", "const"]] <- c("log_beta", "f_JCZ38_qlogis", "f_JSE76_qlogis")
+no_ranef[["fomc_path_2", "tc"]] <- c("cyan_0", "f_JCZ38_qlogis", "f_JSE76_qlogis")
+no_ranef[["dfop_path_2", "const"]] <- c("cyan_0", "f_JCZ38_qlogis", "f_JSE76_qlogis")
+no_ranef[["dfop_path_2", "tc"]] <- c("cyan_0", "log_k1", "f_JCZ38_qlogis", "f_JSE76_qlogis")
+no_ranef[["sforb_path_2", "const"]] <- c("cyan_free_0",
+  "f_JCZ38_qlogis", "f_JSE76_qlogis")
+no_ranef[["sforb_path_2", "tc"]] <- c("cyan_free_0", "log_k_cyan_free_bound",
+  "f_JCZ38_qlogis", "f_JSE76_qlogis")
+clusterExport(cl_path_2, "no_ranef")
+
+f_saem_3 <- update(f_saem_2,
+  no_random_effect = no_ranef,
+  cluster = cl_path_2)
+
+status(f_saem_3) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + +
consttc
fomc_path_2EFth
dfop_path_2FthFth
sforb_path_2FthFth
+

With the exception of the FOMC pathway fit with constant variance, +all updated fits completed successfully. However, the Fisher Information +Matrix for the fixed effects (Fth) could not be inverted, so no +confidence intervals for the optimised parameters are available.

+
+illparms(f_saem_3) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + +
consttc
fomc_path_2E
dfop_path_2
sforb_path_2
+
+anova(f_saem_3[, "tc"]) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
fomc_path_2 tc192249.12241.6-1105.5
dfop_path_2 tc202237.32229.5-1098.6
sforb_path_2 tc202241.32233.5-1100.7
+
+anova(f_saem_3[2:3,]) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
dfop_path_2 const202282.22274.4-1121.1
sforb_path_2 const202279.72271.9-1119.9
dfop_path_2 tc202237.32229.5-1098.6
sforb_path_2 tc202241.32233.5-1100.7
+

While the AIC and BIC values of the best fit (DFOP pathway fit with +two-component error) are lower than in the previous fits with the +alternative pathway, the practical value of these refined evaluations is +limited as no confidence intervals are obtained.

+
+stopCluster(cl_path_2)
+
+
+
+

Conclusion +

+

It was demonstrated that a relatively complex transformation pathway +with parallel formation of two primary metabolites and one secondary +metabolite can be fitted even if the data in the individual datasets are +quite different and partly only cover the formation phase.

+

The run times of the pathway fits were several hours, limiting the +practical feasibility of iterative refinements based on ill-defined +parameters and of alternative checks of parameter identifiability based +on multistart runs.

+
+
+

Acknowledgements +

+

The helpful comments by Janina Wöltjen of the German Environment +Agency are gratefully acknowledged.

+
+
+

Appendix +

+
+

Plots of fits that were not refined further +

+
+plot(f_saem_1[["sfo_path_1", "tc"]])
+
+SFO pathway fit with two-component error

+SFO pathway fit with two-component error +

+
+
+plot(f_saem_1[["fomc_path_1", "tc"]])
+
+FOMC pathway fit with two-component error

+FOMC pathway fit with two-component error +

+
+
+plot(f_saem_1[["sforb_path_1", "tc"]])
+
+HS pathway fit with two-component error

+HS pathway fit with two-component error +

+
+
+
+

Hierarchical fit listings +

+
+

Pathway 1 +

+ +Hierarchical SFO path 1 fit with constant variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:42:26 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - k_cyan * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * k_cyan * cyan - k_JCZ38 * JCZ38
+d_J9Z38/dt = + f_cyan_to_J9Z38 * k_cyan * cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 437.151 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+        cyan_0     log_k_cyan    log_k_JCZ38    log_k_J9Z38    log_k_JSE76 
+       95.3304        -3.8459        -3.1305        -5.0678        -5.3196 
+  f_cyan_ilr_1   f_cyan_ilr_2 f_JCZ38_qlogis 
+        0.8158        23.5335        11.8774 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_cyan log_k_JCZ38 log_k_J9Z38 log_k_JSE76
+cyan_0          4.797     0.0000       0.000       0.000      0.0000
+log_k_cyan      0.000     0.9619       0.000       0.000      0.0000
+log_k_JCZ38     0.000     0.0000       2.139       0.000      0.0000
+log_k_J9Z38     0.000     0.0000       0.000       1.639      0.0000
+log_k_JSE76     0.000     0.0000       0.000       0.000      0.7894
+f_cyan_ilr_1    0.000     0.0000       0.000       0.000      0.0000
+f_cyan_ilr_2    0.000     0.0000       0.000       0.000      0.0000
+f_JCZ38_qlogis  0.000     0.0000       0.000       0.000      0.0000
+               f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis
+cyan_0               0.0000        0.000           0.00
+log_k_cyan           0.0000        0.000           0.00
+log_k_JCZ38          0.0000        0.000           0.00
+log_k_J9Z38          0.0000        0.000           0.00
+log_k_JSE76          0.0000        0.000           0.00
+f_cyan_ilr_1         0.7714        0.000           0.00
+f_cyan_ilr_2         0.0000        9.247           0.00
+f_JCZ38_qlogis       0.0000        0.000          16.61
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2693 2687  -1331
+
+Optimised parameters:
+                     est.      lower      upper
+cyan_0            95.1279  9.354e+01  9.671e+01
+log_k_cyan        -3.8527 -4.367e+00 -3.338e+00
+log_k_JCZ38       -3.0381 -4.187e+00 -1.889e+00
+log_k_J9Z38       -5.0095 -5.623e+00 -4.396e+00
+log_k_JSE76       -5.3357 -6.025e+00 -4.646e+00
+f_cyan_ilr_1       0.8050  5.174e-01  1.093e+00
+f_cyan_ilr_2      12.4820 -1.050e+06  1.051e+06
+f_JCZ38_qlogis     1.2912  3.561e-01  2.226e+00
+a.1                4.8393         NA         NA
+SD.log_k_cyan      0.5840         NA         NA
+SD.log_k_JCZ38     1.2740         NA         NA
+SD.log_k_J9Z38     0.3172         NA         NA
+SD.log_k_JSE76     0.5677         NA         NA
+SD.f_cyan_ilr_1    0.2623         NA         NA
+SD.f_cyan_ilr_2    1.3724         NA         NA
+SD.f_JCZ38_qlogis  0.1464         NA         NA
+
+Correlation is not available
+
+Random effects:
+                    est. lower upper
+SD.log_k_cyan     0.5840    NA    NA
+SD.log_k_JCZ38    1.2740    NA    NA
+SD.log_k_J9Z38    0.3172    NA    NA
+SD.log_k_JSE76    0.5677    NA    NA
+SD.f_cyan_ilr_1   0.2623    NA    NA
+SD.f_cyan_ilr_2   1.3724    NA    NA
+SD.f_JCZ38_qlogis 0.1464    NA    NA
+
+Variance model:
+     est. lower upper
+a.1 4.839    NA    NA
+
+Backtransformed parameters:
+                      est.     lower     upper
+cyan_0           95.127935 93.542456 96.713413
+k_cyan            0.021221  0.012687  0.035497
+k_JCZ38           0.047924  0.015189  0.151213
+k_J9Z38           0.006674  0.003612  0.012332
+k_JSE76           0.004817  0.002417  0.009601
+f_cyan_to_JCZ38   0.757402        NA        NA
+f_cyan_to_J9Z38   0.242597        NA        NA
+f_JCZ38_to_JSE76  0.784347  0.588098  0.902582
+
+Resulting formation fractions:
+                   ff
+cyan_JCZ38  7.574e-01
+cyan_J9Z38  2.426e-01
+cyan_sink   9.839e-08
+JCZ38_JSE76 7.843e-01
+JCZ38_sink  2.157e-01
+
+Estimated disappearance times:
+        DT50   DT90
+cyan   32.66 108.50
+JCZ38  14.46  48.05
+J9Z38 103.86 345.00
+JSE76 143.91 478.04
+
+
+

+ +Hierarchical SFO path 1 fit with two-component error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:42:06 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - k_cyan * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * k_cyan * cyan - k_JCZ38 * JCZ38
+d_J9Z38/dt = + f_cyan_to_J9Z38 * k_cyan * cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 417.143 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+        cyan_0     log_k_cyan    log_k_JCZ38    log_k_J9Z38    log_k_JSE76 
+       96.0039        -3.8907        -3.1276        -5.0069        -4.9367 
+  f_cyan_ilr_1   f_cyan_ilr_2 f_JCZ38_qlogis 
+        0.7937        22.3422        17.8932 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_cyan log_k_JCZ38 log_k_J9Z38 log_k_JSE76
+cyan_0          4.859      0.000        0.00        0.00      0.0000
+log_k_cyan      0.000      0.962        0.00        0.00      0.0000
+log_k_JCZ38     0.000      0.000        2.04        0.00      0.0000
+log_k_J9Z38     0.000      0.000        0.00        1.72      0.0000
+log_k_JSE76     0.000      0.000        0.00        0.00      0.9076
+f_cyan_ilr_1    0.000      0.000        0.00        0.00      0.0000
+f_cyan_ilr_2    0.000      0.000        0.00        0.00      0.0000
+f_JCZ38_qlogis  0.000      0.000        0.00        0.00      0.0000
+               f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis
+cyan_0               0.0000        0.000           0.00
+log_k_cyan           0.0000        0.000           0.00
+log_k_JCZ38          0.0000        0.000           0.00
+log_k_J9Z38          0.0000        0.000           0.00
+log_k_JSE76          0.0000        0.000           0.00
+f_cyan_ilr_1         0.7598        0.000           0.00
+f_cyan_ilr_2         0.0000        8.939           0.00
+f_JCZ38_qlogis       0.0000        0.000          14.49
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2658 2651  -1312
+
+Optimised parameters:
+                      est. lower upper
+cyan_0            94.81681    NA    NA
+log_k_cyan        -3.91558    NA    NA
+log_k_JCZ38       -3.12715    NA    NA
+log_k_J9Z38       -5.04840    NA    NA
+log_k_JSE76       -5.10443    NA    NA
+f_cyan_ilr_1       0.80760    NA    NA
+f_cyan_ilr_2      48.66960    NA    NA
+f_JCZ38_qlogis     3.03397    NA    NA
+a.1                3.93879    NA    NA
+b.1                0.08057    NA    NA
+SD.log_k_cyan      0.58921    NA    NA
+SD.log_k_JCZ38     1.29813    NA    NA
+SD.log_k_J9Z38     0.68372    NA    NA
+SD.log_k_JSE76     0.35128    NA    NA
+SD.f_cyan_ilr_1    0.38352    NA    NA
+SD.f_cyan_ilr_2    4.98884    NA    NA
+SD.f_JCZ38_qlogis  1.75636    NA    NA
+
+Correlation is not available
+
+Random effects:
+                    est. lower upper
+SD.log_k_cyan     0.5892    NA    NA
+SD.log_k_JCZ38    1.2981    NA    NA
+SD.log_k_J9Z38    0.6837    NA    NA
+SD.log_k_JSE76    0.3513    NA    NA
+SD.f_cyan_ilr_1   0.3835    NA    NA
+SD.f_cyan_ilr_2   4.9888    NA    NA
+SD.f_JCZ38_qlogis 1.7564    NA    NA
+
+Variance model:
+       est. lower upper
+a.1 3.93879    NA    NA
+b.1 0.08057    NA    NA
+
+Backtransformed parameters:
+                     est. lower upper
+cyan_0           94.81681    NA    NA
+k_cyan            0.01993    NA    NA
+k_JCZ38           0.04384    NA    NA
+k_J9Z38           0.00642    NA    NA
+k_JSE76           0.00607    NA    NA
+f_cyan_to_JCZ38   0.75807    NA    NA
+f_cyan_to_J9Z38   0.24193    NA    NA
+f_JCZ38_to_JSE76  0.95409    NA    NA
+
+Resulting formation fractions:
+                 ff
+cyan_JCZ38  0.75807
+cyan_J9Z38  0.24193
+cyan_sink   0.00000
+JCZ38_JSE76 0.95409
+JCZ38_sink  0.04591
+
+Estimated disappearance times:
+        DT50   DT90
+cyan   34.78 115.54
+JCZ38  15.81  52.52
+J9Z38 107.97 358.68
+JSE76 114.20 379.35
+
+
+

+ +Hierarchical FOMC path 1 fit with constant variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:42:57 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - (alpha/beta) * 1/((time/beta) + 1) * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * (alpha/beta) * 1/((time/beta) + 1) *
+           cyan - k_JCZ38 * JCZ38
+d_J9Z38/dt = + f_cyan_to_J9Z38 * (alpha/beta) * 1/((time/beta) + 1) *
+           cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 468.609 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      101.2314        -3.3680        -5.1108        -5.9416         0.7144 
+  f_cyan_ilr_2 f_JCZ38_qlogis      log_alpha       log_beta 
+        7.0229        14.9234        -0.1791         2.9811 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          5.416       0.000         0.0       0.000       0.0000
+log_k_JCZ38     0.000       2.439         0.0       0.000       0.0000
+log_k_J9Z38     0.000       0.000         1.7       0.000       0.0000
+log_k_JSE76     0.000       0.000         0.0       1.856       0.0000
+f_cyan_ilr_1    0.000       0.000         0.0       0.000       0.7164
+f_cyan_ilr_2    0.000       0.000         0.0       0.000       0.0000
+f_JCZ38_qlogis  0.000       0.000         0.0       0.000       0.0000
+log_alpha       0.000       0.000         0.0       0.000       0.0000
+log_beta        0.000       0.000         0.0       0.000       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis log_alpha log_beta
+cyan_0                 0.00           0.00    0.0000   0.0000
+log_k_JCZ38            0.00           0.00    0.0000   0.0000
+log_k_J9Z38            0.00           0.00    0.0000   0.0000
+log_k_JSE76            0.00           0.00    0.0000   0.0000
+f_cyan_ilr_1           0.00           0.00    0.0000   0.0000
+f_cyan_ilr_2          11.57           0.00    0.0000   0.0000
+f_JCZ38_qlogis         0.00          18.81    0.0000   0.0000
+log_alpha              0.00           0.00    0.4144   0.0000
+log_beta               0.00           0.00    0.0000   0.5077
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2428 2421  -1196
+
+Optimised parameters:
+                      est.    lower    upper
+cyan_0            101.1664 98.51265 103.8202
+log_k_JCZ38        -3.3883 -4.78250  -1.9941
+log_k_J9Z38        -5.3087 -5.91564  -4.7017
+log_k_JSE76        -6.1313 -7.30061  -4.9619
+f_cyan_ilr_1        0.7456  0.43782   1.0534
+f_cyan_ilr_2        0.8181  0.24956   1.3866
+f_JCZ38_qlogis      2.0467  0.61165   3.4817
+log_alpha          -0.2391 -0.62806   0.1499
+log_beta            2.8739  2.67664   3.0711
+a.1                 3.4160  3.17960   3.6525
+SD.cyan_0           2.4355  0.40399   4.4671
+SD.log_k_JCZ38      1.5654  0.57311   2.5576
+SD.log_k_J9Z38      0.4645 -0.06533   0.9943
+SD.log_k_JSE76      0.9841  0.10738   1.8609
+SD.f_cyan_ilr_1     0.3285  0.10546   0.5515
+SD.f_cyan_ilr_2     0.2276 -0.38711   0.8424
+SD.f_JCZ38_qlogis   0.8340 -0.20970   1.8777
+SD.log_alpha        0.4250  0.16017   0.6898
+
+Correlation: 
+               cyan_0  l__JCZ3 l__J9Z3 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 log_lph
+log_k_JCZ38    -0.0159                                                        
+log_k_J9Z38    -0.0546  0.0080                                                
+log_k_JSE76    -0.0337  0.0016  0.0074                                        
+f_cyan_ilr_1   -0.0095  0.0194 -0.1573  0.0003                                
+f_cyan_ilr_2   -0.2733  0.0799  0.3059  0.0263  0.0125                        
+f_JCZ38_qlogis  0.0755 -0.0783 -0.0516  0.1222 -0.1155 -0.5231                
+log_alpha      -0.0567  0.0120  0.0351  0.0189  0.0040  0.0829 -0.0502        
+log_beta       -0.2980  0.0461  0.1382  0.0758  0.0209  0.4079 -0.2053  0.2759
+
+Random effects:
+                    est.    lower  upper
+SD.cyan_0         2.4355  0.40399 4.4671
+SD.log_k_JCZ38    1.5654  0.57311 2.5576
+SD.log_k_J9Z38    0.4645 -0.06533 0.9943
+SD.log_k_JSE76    0.9841  0.10738 1.8609
+SD.f_cyan_ilr_1   0.3285  0.10546 0.5515
+SD.f_cyan_ilr_2   0.2276 -0.38711 0.8424
+SD.f_JCZ38_qlogis 0.8340 -0.20970 1.8777
+SD.log_alpha      0.4250  0.16017 0.6898
+
+Variance model:
+     est. lower upper
+a.1 3.416  3.18 3.652
+
+Backtransformed parameters:
+                      est.     lower     upper
+cyan_0           1.012e+02 9.851e+01 103.82023
+k_JCZ38          3.377e-02 8.375e-03   0.13614
+k_J9Z38          4.948e-03 2.697e-03   0.00908
+k_JSE76          2.174e-03 6.751e-04   0.00700
+f_cyan_to_JCZ38  6.389e-01        NA        NA
+f_cyan_to_J9Z38  2.226e-01        NA        NA
+f_JCZ38_to_JSE76 8.856e-01 6.483e-01   0.97016
+alpha            7.873e-01 5.336e-01   1.16166
+beta             1.771e+01 1.454e+01  21.56509
+
+Resulting formation fractions:
+                ff
+cyan_JCZ38  0.6389
+cyan_J9Z38  0.2226
+cyan_sink   0.1385
+JCZ38_JSE76 0.8856
+JCZ38_sink  0.1144
+
+Estimated disappearance times:
+        DT50    DT90 DT50back
+cyan   25.00  312.06    93.94
+JCZ38  20.53   68.19       NA
+J9Z38 140.07  465.32       NA
+JSE76 318.86 1059.22       NA
+
+
+

+ +Hierarchical FOMC path 1 fit with two-component error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:42:50 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - (alpha/beta) * 1/((time/beta) + 1) * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * (alpha/beta) * 1/((time/beta) + 1) *
+           cyan - k_JCZ38 * JCZ38
+d_J9Z38/dt = + f_cyan_to_J9Z38 * (alpha/beta) * 1/((time/beta) + 1) *
+           cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 460.309 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+     101.13294       -3.32499       -5.09097       -5.93566        0.71359 
+  f_cyan_ilr_2 f_JCZ38_qlogis      log_alpha       log_beta 
+      10.30315       14.62272       -0.09633        3.10634 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          5.649       0.000        0.00        0.00       0.0000
+log_k_JCZ38     0.000       2.319        0.00        0.00       0.0000
+log_k_J9Z38     0.000       0.000        1.73        0.00       0.0000
+log_k_JSE76     0.000       0.000        0.00        1.86       0.0000
+f_cyan_ilr_1    0.000       0.000        0.00        0.00       0.7183
+f_cyan_ilr_2    0.000       0.000        0.00        0.00       0.0000
+f_JCZ38_qlogis  0.000       0.000        0.00        0.00       0.0000
+log_alpha       0.000       0.000        0.00        0.00       0.0000
+log_beta        0.000       0.000        0.00        0.00       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis log_alpha log_beta
+cyan_0                 0.00           0.00    0.0000   0.0000
+log_k_JCZ38            0.00           0.00    0.0000   0.0000
+log_k_J9Z38            0.00           0.00    0.0000   0.0000
+log_k_JSE76            0.00           0.00    0.0000   0.0000
+f_cyan_ilr_1           0.00           0.00    0.0000   0.0000
+f_cyan_ilr_2          12.85           0.00    0.0000   0.0000
+f_JCZ38_qlogis         0.00          18.54    0.0000   0.0000
+log_alpha              0.00           0.00    0.3142   0.0000
+log_beta               0.00           0.00    0.0000   0.7333
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2424 2416  -1193
+
+Optimised parameters:
+                       est. lower upper
+cyan_0            100.65667    NA    NA
+log_k_JCZ38        -3.45782    NA    NA
+log_k_J9Z38        -5.23476    NA    NA
+log_k_JSE76        -5.71827    NA    NA
+f_cyan_ilr_1        0.68389    NA    NA
+f_cyan_ilr_2        0.61027    NA    NA
+f_JCZ38_qlogis    116.27482    NA    NA
+log_alpha          -0.14484    NA    NA
+log_beta            3.03220    NA    NA
+a.1                 3.11051    NA    NA
+b.1                 0.04508    NA    NA
+SD.log_k_JCZ38      1.39961    NA    NA
+SD.log_k_J9Z38      0.57920    NA    NA
+SD.log_k_JSE76      0.68364    NA    NA
+SD.f_cyan_ilr_1     0.31477    NA    NA
+SD.f_cyan_ilr_2     0.37716    NA    NA
+SD.f_JCZ38_qlogis   5.52695    NA    NA
+SD.log_alpha        0.22823    NA    NA
+SD.log_beta         0.39161    NA    NA
+
+Correlation is not available
+
+Random effects:
+                    est. lower upper
+SD.log_k_JCZ38    1.3996    NA    NA
+SD.log_k_J9Z38    0.5792    NA    NA
+SD.log_k_JSE76    0.6836    NA    NA
+SD.f_cyan_ilr_1   0.3148    NA    NA
+SD.f_cyan_ilr_2   0.3772    NA    NA
+SD.f_JCZ38_qlogis 5.5270    NA    NA
+SD.log_alpha      0.2282    NA    NA
+SD.log_beta       0.3916    NA    NA
+
+Variance model:
+       est. lower upper
+a.1 3.11051    NA    NA
+b.1 0.04508    NA    NA
+
+Backtransformed parameters:
+                      est. lower upper
+cyan_0           1.007e+02    NA    NA
+k_JCZ38          3.150e-02    NA    NA
+k_J9Z38          5.328e-03    NA    NA
+k_JSE76          3.285e-03    NA    NA
+f_cyan_to_JCZ38  5.980e-01    NA    NA
+f_cyan_to_J9Z38  2.273e-01    NA    NA
+f_JCZ38_to_JSE76 1.000e+00    NA    NA
+alpha            8.652e-01    NA    NA
+beta             2.074e+01    NA    NA
+
+Resulting formation fractions:
+                ff
+cyan_JCZ38  0.5980
+cyan_J9Z38  0.2273
+cyan_sink   0.1746
+JCZ38_JSE76 1.0000
+JCZ38_sink  0.0000
+
+Estimated disappearance times:
+        DT50  DT90 DT50back
+cyan   25.48 276.2    83.15
+JCZ38  22.01  73.1       NA
+J9Z38 130.09 432.2       NA
+JSE76 210.98 700.9       NA
+
+
+

+ +Hierarchical DFOP path 1 fit with constant variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:43:33 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38
+d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 504.014 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      102.0643        -3.4008        -5.0024        -5.8612         0.6855 
+  f_cyan_ilr_2 f_JCZ38_qlogis         log_k1         log_k2       g_qlogis 
+        1.2366        13.6901        -1.8641        -4.5063        -0.6468 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          4.466       0.000       0.000       0.000       0.0000
+log_k_JCZ38     0.000       2.382       0.000       0.000       0.0000
+log_k_J9Z38     0.000       0.000       1.595       0.000       0.0000
+log_k_JSE76     0.000       0.000       0.000       1.245       0.0000
+f_cyan_ilr_1    0.000       0.000       0.000       0.000       0.6852
+f_cyan_ilr_2    0.000       0.000       0.000       0.000       0.0000
+f_JCZ38_qlogis  0.000       0.000       0.000       0.000       0.0000
+log_k1          0.000       0.000       0.000       0.000       0.0000
+log_k2          0.000       0.000       0.000       0.000       0.0000
+g_qlogis        0.000       0.000       0.000       0.000       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 g_qlogis
+cyan_0                 0.00           0.00 0.0000 0.0000    0.000
+log_k_JCZ38            0.00           0.00 0.0000 0.0000    0.000
+log_k_J9Z38            0.00           0.00 0.0000 0.0000    0.000
+log_k_JSE76            0.00           0.00 0.0000 0.0000    0.000
+f_cyan_ilr_1           0.00           0.00 0.0000 0.0000    0.000
+f_cyan_ilr_2           1.28           0.00 0.0000 0.0000    0.000
+f_JCZ38_qlogis         0.00          16.08 0.0000 0.0000    0.000
+log_k1                 0.00           0.00 0.9866 0.0000    0.000
+log_k2                 0.00           0.00 0.0000 0.5953    0.000
+g_qlogis               0.00           0.00 0.0000 0.0000    1.583
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2403 2395  -1182
+
+Optimised parameters:
+                      est. lower upper
+cyan_0            102.5565    NA    NA
+log_k_JCZ38        -3.4729    NA    NA
+log_k_J9Z38        -5.1533    NA    NA
+log_k_JSE76        -5.6669    NA    NA
+f_cyan_ilr_1        0.6665    NA    NA
+f_cyan_ilr_2        0.5191    NA    NA
+f_JCZ38_qlogis     37.0113    NA    NA
+log_k1             -1.8497    NA    NA
+log_k2             -4.4931    NA    NA
+g_qlogis           -0.6383    NA    NA
+a.1                 3.2397    NA    NA
+SD.log_k_JCZ38      1.4286    NA    NA
+SD.log_k_J9Z38      0.5312    NA    NA
+SD.log_k_JSE76      0.6627    NA    NA
+SD.f_cyan_ilr_1     0.3013    NA    NA
+SD.f_cyan_ilr_2     0.2980    NA    NA
+SD.f_JCZ38_qlogis   0.1637    NA    NA
+SD.log_k1           0.5069    NA    NA
+SD.log_k2           0.3828    NA    NA
+SD.g_qlogis         0.8641    NA    NA
+
+Correlation is not available
+
+Random effects:
+                    est. lower upper
+SD.log_k_JCZ38    1.4286    NA    NA
+SD.log_k_J9Z38    0.5312    NA    NA
+SD.log_k_JSE76    0.6627    NA    NA
+SD.f_cyan_ilr_1   0.3013    NA    NA
+SD.f_cyan_ilr_2   0.2980    NA    NA
+SD.f_JCZ38_qlogis 0.1637    NA    NA
+SD.log_k1         0.5069    NA    NA
+SD.log_k2         0.3828    NA    NA
+SD.g_qlogis       0.8641    NA    NA
+
+Variance model:
+    est. lower upper
+a.1 3.24    NA    NA
+
+Backtransformed parameters:
+                      est. lower upper
+cyan_0           1.026e+02    NA    NA
+k_JCZ38          3.103e-02    NA    NA
+k_J9Z38          5.780e-03    NA    NA
+k_JSE76          3.459e-03    NA    NA
+f_cyan_to_JCZ38  5.813e-01    NA    NA
+f_cyan_to_J9Z38  2.265e-01    NA    NA
+f_JCZ38_to_JSE76 1.000e+00    NA    NA
+k1               1.573e-01    NA    NA
+k2               1.119e-02    NA    NA
+g                3.456e-01    NA    NA
+
+Resulting formation fractions:
+                ff
+cyan_JCZ38  0.5813
+cyan_J9Z38  0.2265
+cyan_sink   0.1922
+JCZ38_JSE76 1.0000
+JCZ38_sink  0.0000
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_k1 DT50_k2
+cyan   25.23 167.94    50.55   4.407   61.97
+JCZ38  22.34  74.22       NA      NA      NA
+J9Z38 119.92 398.36       NA      NA      NA
+JSE76 200.41 665.76       NA      NA      NA
+
+
+

+ +Hierarchical DFOP path 1 fit with two-component error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:46:07 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38
+d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 658.043 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      101.3964        -3.3626        -4.9792        -5.8727         0.6814 
+  f_cyan_ilr_2 f_JCZ38_qlogis         log_k1         log_k2       g_qlogis 
+        6.8713        13.6901        -1.9222        -4.5035        -0.7172 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          5.317       0.000       0.000       0.000       0.0000
+log_k_JCZ38     0.000       2.272       0.000       0.000       0.0000
+log_k_J9Z38     0.000       0.000       1.633       0.000       0.0000
+log_k_JSE76     0.000       0.000       0.000       1.271       0.0000
+f_cyan_ilr_1    0.000       0.000       0.000       0.000       0.6839
+f_cyan_ilr_2    0.000       0.000       0.000       0.000       0.0000
+f_JCZ38_qlogis  0.000       0.000       0.000       0.000       0.0000
+log_k1          0.000       0.000       0.000       0.000       0.0000
+log_k2          0.000       0.000       0.000       0.000       0.0000
+g_qlogis        0.000       0.000       0.000       0.000       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 g_qlogis
+cyan_0                 0.00           0.00 0.0000 0.0000    0.000
+log_k_JCZ38            0.00           0.00 0.0000 0.0000    0.000
+log_k_J9Z38            0.00           0.00 0.0000 0.0000    0.000
+log_k_JSE76            0.00           0.00 0.0000 0.0000    0.000
+f_cyan_ilr_1           0.00           0.00 0.0000 0.0000    0.000
+f_cyan_ilr_2          11.95           0.00 0.0000 0.0000    0.000
+f_JCZ38_qlogis         0.00          16.08 0.0000 0.0000    0.000
+log_k1                 0.00           0.00 0.9496 0.0000    0.000
+log_k2                 0.00           0.00 0.0000 0.5846    0.000
+g_qlogis               0.00           0.00 0.0000 0.0000    1.719
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2398 2390  -1179
+
+Optimised parameters:
+                       est. lower upper
+cyan_0            100.69709    NA    NA
+log_k_JCZ38        -3.46669    NA    NA
+log_k_J9Z38        -5.05076    NA    NA
+log_k_JSE76        -5.55558    NA    NA
+f_cyan_ilr_1        0.66045    NA    NA
+f_cyan_ilr_2        0.84275    NA    NA
+f_JCZ38_qlogis     64.22404    NA    NA
+log_k1             -2.17715    NA    NA
+log_k2             -4.55002    NA    NA
+g_qlogis           -0.55920    NA    NA
+a.1                 2.95785    NA    NA
+b.1                 0.04456    NA    NA
+SD.log_k_JCZ38      1.39881    NA    NA
+SD.log_k_J9Z38      0.67788    NA    NA
+SD.log_k_JSE76      0.52603    NA    NA
+SD.f_cyan_ilr_1     0.32490    NA    NA
+SD.f_cyan_ilr_2     0.53923    NA    NA
+SD.f_JCZ38_qlogis   2.75576    NA    NA
+SD.log_k2           0.30694    NA    NA
+SD.g_qlogis         0.83619    NA    NA
+
+Correlation is not available
+
+Random effects:
+                    est. lower upper
+SD.log_k_JCZ38    1.3988    NA    NA
+SD.log_k_J9Z38    0.6779    NA    NA
+SD.log_k_JSE76    0.5260    NA    NA
+SD.f_cyan_ilr_1   0.3249    NA    NA
+SD.f_cyan_ilr_2   0.5392    NA    NA
+SD.f_JCZ38_qlogis 2.7558    NA    NA
+SD.log_k2         0.3069    NA    NA
+SD.g_qlogis       0.8362    NA    NA
+
+Variance model:
+       est. lower upper
+a.1 2.95785    NA    NA
+b.1 0.04456    NA    NA
+
+Backtransformed parameters:
+                      est. lower upper
+cyan_0           1.007e+02    NA    NA
+k_JCZ38          3.122e-02    NA    NA
+k_J9Z38          6.404e-03    NA    NA
+k_JSE76          3.866e-03    NA    NA
+f_cyan_to_JCZ38  6.187e-01    NA    NA
+f_cyan_to_J9Z38  2.431e-01    NA    NA
+f_JCZ38_to_JSE76 1.000e+00    NA    NA
+k1               1.134e-01    NA    NA
+k2               1.057e-02    NA    NA
+g                3.637e-01    NA    NA
+
+Resulting formation fractions:
+                ff
+cyan_JCZ38  0.6187
+cyan_J9Z38  0.2431
+cyan_sink   0.1382
+JCZ38_JSE76 1.0000
+JCZ38_sink  0.0000
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_k1 DT50_k2
+cyan   26.35 175.12    52.72   6.114    65.6
+JCZ38  22.20  73.75       NA      NA      NA
+J9Z38 108.23 359.53       NA      NA      NA
+JSE76 179.30 595.62       NA      NA      NA
+
+
+

+ +Hierarchical SFORB path 1 fit with constant variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:43:36 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound *
+           cyan_free + k_cyan_bound_free * cyan_bound
+d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free *
+           cyan_bound
+d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38
+           * JCZ38
+d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38
+           * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 507.042 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+          cyan_free_0       log_k_cyan_free log_k_cyan_free_bound 
+             102.0643               -2.8987               -2.7077 
+log_k_cyan_bound_free           log_k_JCZ38           log_k_J9Z38 
+              -3.4717               -3.4008               -5.0024 
+          log_k_JSE76          f_cyan_ilr_1          f_cyan_ilr_2 
+              -5.8613                0.6855                1.2366 
+       f_JCZ38_qlogis 
+              13.7395 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+                      cyan_free_0 log_k_cyan_free log_k_cyan_free_bound
+cyan_free_0                 4.466          0.0000                 0.000
+log_k_cyan_free             0.000          0.6158                 0.000
+log_k_cyan_free_bound       0.000          0.0000                 1.463
+log_k_cyan_bound_free       0.000          0.0000                 0.000
+log_k_JCZ38                 0.000          0.0000                 0.000
+log_k_J9Z38                 0.000          0.0000                 0.000
+log_k_JSE76                 0.000          0.0000                 0.000
+f_cyan_ilr_1                0.000          0.0000                 0.000
+f_cyan_ilr_2                0.000          0.0000                 0.000
+f_JCZ38_qlogis              0.000          0.0000                 0.000
+                      log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76
+cyan_free_0                           0.000       0.000       0.000       0.000
+log_k_cyan_free                       0.000       0.000       0.000       0.000
+log_k_cyan_free_bound                 0.000       0.000       0.000       0.000
+log_k_cyan_bound_free                 1.058       0.000       0.000       0.000
+log_k_JCZ38                           0.000       2.382       0.000       0.000
+log_k_J9Z38                           0.000       0.000       1.595       0.000
+log_k_JSE76                           0.000       0.000       0.000       1.245
+f_cyan_ilr_1                          0.000       0.000       0.000       0.000
+f_cyan_ilr_2                          0.000       0.000       0.000       0.000
+f_JCZ38_qlogis                        0.000       0.000       0.000       0.000
+                      f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis
+cyan_free_0                 0.0000         0.00           0.00
+log_k_cyan_free             0.0000         0.00           0.00
+log_k_cyan_free_bound       0.0000         0.00           0.00
+log_k_cyan_bound_free       0.0000         0.00           0.00
+log_k_JCZ38                 0.0000         0.00           0.00
+log_k_J9Z38                 0.0000         0.00           0.00
+log_k_JSE76                 0.0000         0.00           0.00
+f_cyan_ilr_1                0.6852         0.00           0.00
+f_cyan_ilr_2                0.0000         1.28           0.00
+f_JCZ38_qlogis              0.0000         0.00          16.13
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2401 2394  -1181
+
+Optimised parameters:
+                             est. lower upper
+cyan_free_0              102.8136    NA    NA
+log_k_cyan_free           -2.7935    NA    NA
+log_k_cyan_free_bound     -2.5440    NA    NA
+log_k_cyan_bound_free     -3.4303    NA    NA
+log_k_JCZ38               -3.5010    NA    NA
+log_k_J9Z38               -5.1226    NA    NA
+log_k_JSE76               -5.6314    NA    NA
+f_cyan_ilr_1               0.6609    NA    NA
+f_cyan_ilr_2               0.5085    NA    NA
+f_JCZ38_qlogis            44.0153    NA    NA
+a.1                        3.2318    NA    NA
+SD.log_k_cyan_free         0.3211    NA    NA
+SD.log_k_cyan_free_bound   0.8408    NA    NA
+SD.log_k_cyan_bound_free   0.5724    NA    NA
+SD.log_k_JCZ38             1.4925    NA    NA
+SD.log_k_J9Z38             0.5816    NA    NA
+SD.log_k_JSE76             0.6037    NA    NA
+SD.f_cyan_ilr_1            0.3115    NA    NA
+SD.f_cyan_ilr_2            0.3436    NA    NA
+SD.f_JCZ38_qlogis          4.8937    NA    NA
+
+Correlation is not available
+
+Random effects:
+                           est. lower upper
+SD.log_k_cyan_free       0.3211    NA    NA
+SD.log_k_cyan_free_bound 0.8408    NA    NA
+SD.log_k_cyan_bound_free 0.5724    NA    NA
+SD.log_k_JCZ38           1.4925    NA    NA
+SD.log_k_J9Z38           0.5816    NA    NA
+SD.log_k_JSE76           0.6037    NA    NA
+SD.f_cyan_ilr_1          0.3115    NA    NA
+SD.f_cyan_ilr_2          0.3436    NA    NA
+SD.f_JCZ38_qlogis        4.8937    NA    NA
+
+Variance model:
+     est. lower upper
+a.1 3.232    NA    NA
+
+Backtransformed parameters:
+                          est. lower upper
+cyan_free_0          1.028e+02    NA    NA
+k_cyan_free          6.120e-02    NA    NA
+k_cyan_free_bound    7.855e-02    NA    NA
+k_cyan_bound_free    3.238e-02    NA    NA
+k_JCZ38              3.017e-02    NA    NA
+k_J9Z38              5.961e-03    NA    NA
+k_JSE76              3.584e-03    NA    NA
+f_cyan_free_to_JCZ38 5.784e-01    NA    NA
+f_cyan_free_to_J9Z38 2.271e-01    NA    NA
+f_JCZ38_to_JSE76     1.000e+00    NA    NA
+
+Estimated Eigenvalues of SFORB model(s):
+cyan_b1 cyan_b2  cyan_g 
+0.15973 0.01241 0.33124 
+
+Resulting formation fractions:
+                    ff
+cyan_free_JCZ38 0.5784
+cyan_free_J9Z38 0.2271
+cyan_free_sink  0.1945
+cyan_free       1.0000
+JCZ38_JSE76     1.0000
+JCZ38_sink      0.0000
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_cyan_b1 DT50_cyan_b2
+cyan   24.51 153.18    46.11         4.34        55.87
+JCZ38  22.98  76.33       NA           NA           NA
+J9Z38 116.28 386.29       NA           NA           NA
+JSE76 193.42 642.53       NA           NA           NA
+
+
+

+ +Hierarchical SFORB path 1 fit with two-component error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:46:14 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound *
+           cyan_free + k_cyan_bound_free * cyan_bound
+d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free *
+           cyan_bound
+d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38
+           * JCZ38
+d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38
+           * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 664.11 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+          cyan_free_0       log_k_cyan_free log_k_cyan_free_bound 
+             101.3964               -2.9881               -2.7949 
+log_k_cyan_bound_free           log_k_JCZ38           log_k_J9Z38 
+              -3.4376               -3.3626               -4.9792 
+          log_k_JSE76          f_cyan_ilr_1          f_cyan_ilr_2 
+              -5.8727                0.6814                6.7399 
+       f_JCZ38_qlogis 
+              13.7395 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+                      cyan_free_0 log_k_cyan_free log_k_cyan_free_bound
+cyan_free_0                 5.317          0.0000                 0.000
+log_k_cyan_free             0.000          0.7301                 0.000
+log_k_cyan_free_bound       0.000          0.0000                 1.384
+log_k_cyan_bound_free       0.000          0.0000                 0.000
+log_k_JCZ38                 0.000          0.0000                 0.000
+log_k_J9Z38                 0.000          0.0000                 0.000
+log_k_JSE76                 0.000          0.0000                 0.000
+f_cyan_ilr_1                0.000          0.0000                 0.000
+f_cyan_ilr_2                0.000          0.0000                 0.000
+f_JCZ38_qlogis              0.000          0.0000                 0.000
+                      log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76
+cyan_free_0                           0.000       0.000       0.000       0.000
+log_k_cyan_free                       0.000       0.000       0.000       0.000
+log_k_cyan_free_bound                 0.000       0.000       0.000       0.000
+log_k_cyan_bound_free                 1.109       0.000       0.000       0.000
+log_k_JCZ38                           0.000       2.272       0.000       0.000
+log_k_J9Z38                           0.000       0.000       1.633       0.000
+log_k_JSE76                           0.000       0.000       0.000       1.271
+f_cyan_ilr_1                          0.000       0.000       0.000       0.000
+f_cyan_ilr_2                          0.000       0.000       0.000       0.000
+f_JCZ38_qlogis                        0.000       0.000       0.000       0.000
+                      f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis
+cyan_free_0                 0.0000         0.00           0.00
+log_k_cyan_free             0.0000         0.00           0.00
+log_k_cyan_free_bound       0.0000         0.00           0.00
+log_k_cyan_bound_free       0.0000         0.00           0.00
+log_k_JCZ38                 0.0000         0.00           0.00
+log_k_J9Z38                 0.0000         0.00           0.00
+log_k_JSE76                 0.0000         0.00           0.00
+f_cyan_ilr_1                0.6838         0.00           0.00
+f_cyan_ilr_2                0.0000        11.69           0.00
+f_JCZ38_qlogis              0.0000         0.00          16.13
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2400 2392  -1180
+
+Optimised parameters:
+                              est. lower upper
+cyan_free_0              100.56004    NA    NA
+log_k_cyan_free           -3.12657    NA    NA
+log_k_cyan_free_bound     -3.16825    NA    NA
+log_k_cyan_bound_free     -3.66003    NA    NA
+log_k_JCZ38               -3.47278    NA    NA
+log_k_J9Z38               -5.06823    NA    NA
+log_k_JSE76               -5.54327    NA    NA
+f_cyan_ilr_1               0.66631    NA    NA
+f_cyan_ilr_2               0.82898    NA    NA
+f_JCZ38_qlogis            38.31115    NA    NA
+a.1                        2.98352    NA    NA
+b.1                        0.04388    NA    NA
+SD.log_k_cyan_free         0.49145    NA    NA
+SD.log_k_cyan_bound_free   0.27347    NA    NA
+SD.log_k_JCZ38             1.41193    NA    NA
+SD.log_k_J9Z38             0.66073    NA    NA
+SD.log_k_JSE76             0.55885    NA    NA
+SD.f_cyan_ilr_1            0.33020    NA    NA
+SD.f_cyan_ilr_2            0.51367    NA    NA
+SD.f_JCZ38_qlogis          5.52122    NA    NA
+
+Correlation is not available
+
+Random effects:
+                           est. lower upper
+SD.log_k_cyan_free       0.4914    NA    NA
+SD.log_k_cyan_bound_free 0.2735    NA    NA
+SD.log_k_JCZ38           1.4119    NA    NA
+SD.log_k_J9Z38           0.6607    NA    NA
+SD.log_k_JSE76           0.5589    NA    NA
+SD.f_cyan_ilr_1          0.3302    NA    NA
+SD.f_cyan_ilr_2          0.5137    NA    NA
+SD.f_JCZ38_qlogis        5.5212    NA    NA
+
+Variance model:
+       est. lower upper
+a.1 2.98352    NA    NA
+b.1 0.04388    NA    NA
+
+Backtransformed parameters:
+                          est. lower upper
+cyan_free_0          1.006e+02    NA    NA
+k_cyan_free          4.387e-02    NA    NA
+k_cyan_free_bound    4.208e-02    NA    NA
+k_cyan_bound_free    2.573e-02    NA    NA
+k_JCZ38              3.103e-02    NA    NA
+k_J9Z38              6.294e-03    NA    NA
+k_JSE76              3.914e-03    NA    NA
+f_cyan_free_to_JCZ38 6.188e-01    NA    NA
+f_cyan_free_to_J9Z38 2.412e-01    NA    NA
+f_JCZ38_to_JSE76     1.000e+00    NA    NA
+
+Estimated Eigenvalues of SFORB model(s):
+cyan_b1 cyan_b2  cyan_g 
+0.10044 0.01124 0.36580 
+
+Resulting formation fractions:
+                    ff
+cyan_free_JCZ38 0.6188
+cyan_free_J9Z38 0.2412
+cyan_free_sink  0.1400
+cyan_free       1.0000
+JCZ38_JSE76     1.0000
+JCZ38_sink      0.0000
+
+Estimated disappearance times:
+        DT50  DT90 DT50back DT50_cyan_b1 DT50_cyan_b2
+cyan   26.05 164.4    49.48        6.901        61.67
+JCZ38  22.34  74.2       NA           NA           NA
+J9Z38 110.14 365.9       NA           NA           NA
+JSE76 177.11 588.3       NA           NA           NA
+
+
+

+ +Hierarchical HS path 1 fit with constant variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:43:42 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - ifelse(time <= tb, k1, k2) * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * ifelse(time <= tb, k1, k2) * cyan -
+           k_JCZ38 * JCZ38
+d_J9Z38/dt = + f_cyan_to_J9Z38 * ifelse(time <= tb, k1, k2) * cyan -
+           k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 512.818 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      102.8845        -3.4495        -4.9355        -5.6040         0.6468 
+  f_cyan_ilr_2 f_JCZ38_qlogis         log_k1         log_k2         log_tb 
+        1.2396         9.7220        -2.9079        -4.1810         1.7813 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          5.406        0.00        0.00       0.000       0.0000
+log_k_JCZ38     0.000        2.33        0.00       0.000       0.0000
+log_k_J9Z38     0.000        0.00        1.59       0.000       0.0000
+log_k_JSE76     0.000        0.00        0.00       1.013       0.0000
+f_cyan_ilr_1    0.000        0.00        0.00       0.000       0.6367
+f_cyan_ilr_2    0.000        0.00        0.00       0.000       0.0000
+f_JCZ38_qlogis  0.000        0.00        0.00       0.000       0.0000
+log_k1          0.000        0.00        0.00       0.000       0.0000
+log_k2          0.000        0.00        0.00       0.000       0.0000
+log_tb          0.000        0.00        0.00       0.000       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 log_tb
+cyan_0                0.000           0.00 0.0000 0.0000 0.0000
+log_k_JCZ38           0.000           0.00 0.0000 0.0000 0.0000
+log_k_J9Z38           0.000           0.00 0.0000 0.0000 0.0000
+log_k_JSE76           0.000           0.00 0.0000 0.0000 0.0000
+f_cyan_ilr_1          0.000           0.00 0.0000 0.0000 0.0000
+f_cyan_ilr_2          2.038           0.00 0.0000 0.0000 0.0000
+f_JCZ38_qlogis        0.000          10.33 0.0000 0.0000 0.0000
+log_k1                0.000           0.00 0.7006 0.0000 0.0000
+log_k2                0.000           0.00 0.0000 0.8928 0.0000
+log_tb                0.000           0.00 0.0000 0.0000 0.6773
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2427 2419  -1194
+
+Optimised parameters:
+                      est.      lower      upper
+cyan_0            101.9660  1.005e+02  1.035e+02
+log_k_JCZ38        -3.4698 -4.716e+00 -2.224e+00
+log_k_J9Z38        -5.0947 -5.740e+00 -4.450e+00
+log_k_JSE76        -5.5977 -6.321e+00 -4.875e+00
+f_cyan_ilr_1        0.6595  3.734e-01  9.456e-01
+f_cyan_ilr_2        0.5905  1.664e-01  1.015e+00
+f_JCZ38_qlogis     25.8627 -4.224e+05  4.225e+05
+log_k1             -3.0884 -3.453e+00 -2.723e+00
+log_k2             -4.3877 -4.778e+00 -3.998e+00
+log_tb              2.3057  1.715e+00  2.896e+00
+a.1                 3.3228         NA         NA
+SD.log_k_JCZ38      1.4071         NA         NA
+SD.log_k_J9Z38      0.5774         NA         NA
+SD.log_k_JSE76      0.6214         NA         NA
+SD.f_cyan_ilr_1     0.3058         NA         NA
+SD.f_cyan_ilr_2     0.3470         NA         NA
+SD.f_JCZ38_qlogis   0.0644         NA         NA
+SD.log_k1           0.3994         NA         NA
+SD.log_k2           0.4373         NA         NA
+SD.log_tb           0.6419         NA         NA
+
+Correlation is not available
+
+Random effects:
+                    est. lower upper
+SD.log_k_JCZ38    1.4071    NA    NA
+SD.log_k_J9Z38    0.5774    NA    NA
+SD.log_k_JSE76    0.6214    NA    NA
+SD.f_cyan_ilr_1   0.3058    NA    NA
+SD.f_cyan_ilr_2   0.3470    NA    NA
+SD.f_JCZ38_qlogis 0.0644    NA    NA
+SD.log_k1         0.3994    NA    NA
+SD.log_k2         0.4373    NA    NA
+SD.log_tb         0.6419    NA    NA
+
+Variance model:
+     est. lower upper
+a.1 3.323    NA    NA
+
+Backtransformed parameters:
+                      est.     lower     upper
+cyan_0           1.020e+02 1.005e+02 1.035e+02
+k_JCZ38          3.112e-02 8.951e-03 1.082e-01
+k_J9Z38          6.129e-03 3.216e-03 1.168e-02
+k_JSE76          3.706e-03 1.798e-03 7.639e-03
+f_cyan_to_JCZ38  5.890e-01        NA        NA
+f_cyan_to_J9Z38  2.318e-01        NA        NA
+f_JCZ38_to_JSE76 1.000e+00 0.000e+00 1.000e+00
+k1               4.558e-02 3.164e-02 6.565e-02
+k2               1.243e-02 8.417e-03 1.835e-02
+tb               1.003e+01 5.557e+00 1.811e+01
+
+Resulting formation fractions:
+                   ff
+cyan_JCZ38  5.890e-01
+cyan_J9Z38  2.318e-01
+cyan_sink   1.793e-01
+JCZ38_JSE76 1.000e+00
+JCZ38_sink  5.861e-12
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_k1 DT50_k2
+cyan   29.02 158.51    47.72   15.21   55.77
+JCZ38  22.27  73.98       NA      NA      NA
+J9Z38 113.09 375.69       NA      NA      NA
+JSE76 187.01 621.23       NA      NA      NA
+
+
+

+
+
+

Pathway 2 +

+ +Hierarchical FOMC path 2 fit with two-component error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:54:36 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - (alpha/beta) * 1/((time/beta) + 1) * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * (alpha/beta) * 1/((time/beta) + 1) *
+           cyan - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_to_J9Z38 * (alpha/beta) * 1/((time/beta) + 1) *
+           cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 491.928 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      102.4477        -1.8631        -5.1087        -2.5114         0.6826 
+  f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis      log_alpha       log_beta 
+        4.7944        15.9616        13.1566        -0.1564         2.9781 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          7.701       0.000       0.000       0.000       0.0000
+log_k_JCZ38     0.000       1.448       0.000       0.000       0.0000
+log_k_J9Z38     0.000       0.000       1.724       0.000       0.0000
+log_k_JSE76     0.000       0.000       0.000       3.659       0.0000
+f_cyan_ilr_1    0.000       0.000       0.000       0.000       0.6356
+f_cyan_ilr_2    0.000       0.000       0.000       0.000       0.0000
+f_JCZ38_qlogis  0.000       0.000       0.000       0.000       0.0000
+f_JSE76_qlogis  0.000       0.000       0.000       0.000       0.0000
+log_alpha       0.000       0.000       0.000       0.000       0.0000
+log_beta        0.000       0.000       0.000       0.000       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_alpha log_beta
+cyan_0                 0.00           0.00           0.00    0.0000   0.0000
+log_k_JCZ38            0.00           0.00           0.00    0.0000   0.0000
+log_k_J9Z38            0.00           0.00           0.00    0.0000   0.0000
+log_k_JSE76            0.00           0.00           0.00    0.0000   0.0000
+f_cyan_ilr_1           0.00           0.00           0.00    0.0000   0.0000
+f_cyan_ilr_2          10.32           0.00           0.00    0.0000   0.0000
+f_JCZ38_qlogis         0.00          12.23           0.00    0.0000   0.0000
+f_JSE76_qlogis         0.00           0.00          14.99    0.0000   0.0000
+log_alpha              0.00           0.00           0.00    0.3924   0.0000
+log_beta               0.00           0.00           0.00    0.0000   0.5639
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2249 2241  -1104
+
+Optimised parameters:
+                       est.      lower     upper
+cyan_0            101.55265  9.920e+01  103.9059
+log_k_JCZ38        -2.32302 -2.832e+00   -1.8142
+log_k_J9Z38        -5.13082 -5.942e+00   -4.3199
+log_k_JSE76        -3.01756 -4.262e+00   -1.7736
+f_cyan_ilr_1        0.70850  3.657e-01    1.0513
+f_cyan_ilr_2        0.95775  2.612e-01    1.6543
+f_JCZ38_qlogis      3.86105  9.248e-01    6.7973
+f_JSE76_qlogis      7.51583 -1.120e+02  127.0392
+log_alpha          -0.15308 -4.508e-01    0.1446
+log_beta            2.99165  2.711e+00    3.2720
+a.1                 2.04034  1.843e+00    2.2382
+b.1                 0.06924  5.749e-02    0.0810
+SD.log_k_JCZ38      0.50818  1.390e-01    0.8774
+SD.log_k_J9Z38      0.86597  2.652e-01    1.4667
+SD.log_k_JSE76      1.38092  4.864e-01    2.2754
+SD.f_cyan_ilr_1     0.38204  1.354e-01    0.6286
+SD.f_cyan_ilr_2     0.55129  7.198e-02    1.0306
+SD.f_JCZ38_qlogis   1.88457  1.711e-02    3.7520
+SD.f_JSE76_qlogis   2.64018 -2.450e+03 2454.9447
+SD.log_alpha        0.31860  1.047e-01    0.5325
+SD.log_beta         0.24195  1.273e-02    0.4712
+
+Correlation: 
+               cyan_0  l__JCZ3 l__J9Z3 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 f_JSE76
+log_k_JCZ38    -0.0235                                                        
+log_k_J9Z38    -0.0442  0.0047                                                
+log_k_JSE76    -0.0023  0.0966  0.0006                                        
+f_cyan_ilr_1   -0.0032  0.0070 -0.0536 -0.0001                                
+f_cyan_ilr_2   -0.5189  0.0452  0.1152  0.0013 -0.0304                        
+f_JCZ38_qlogis  0.1088 -0.0848 -0.0240  0.0040 -0.0384 -0.2303                
+f_JSE76_qlogis -0.0545  0.1315  0.0195  0.0020  0.0252  0.1737 -0.5939        
+log_alpha      -0.0445  0.0056  0.0261  0.0019 -0.0055  0.0586 -0.0239 -0.0284
+log_beta       -0.2388  0.0163  0.0566  0.0040 -0.0078  0.2183 -0.0714 -0.0332
+               log_lph
+log_k_JCZ38           
+log_k_J9Z38           
+log_k_JSE76           
+f_cyan_ilr_1          
+f_cyan_ilr_2          
+f_JCZ38_qlogis        
+f_JSE76_qlogis        
+log_alpha             
+log_beta        0.2135
+
+Random effects:
+                    est.      lower     upper
+SD.log_k_JCZ38    0.5082  1.390e-01    0.8774
+SD.log_k_J9Z38    0.8660  2.652e-01    1.4667
+SD.log_k_JSE76    1.3809  4.864e-01    2.2754
+SD.f_cyan_ilr_1   0.3820  1.354e-01    0.6286
+SD.f_cyan_ilr_2   0.5513  7.198e-02    1.0306
+SD.f_JCZ38_qlogis 1.8846  1.711e-02    3.7520
+SD.f_JSE76_qlogis 2.6402 -2.450e+03 2454.9447
+SD.log_alpha      0.3186  1.047e-01    0.5325
+SD.log_beta       0.2420  1.273e-02    0.4712
+
+Variance model:
+       est.   lower upper
+a.1 2.04034 1.84252 2.238
+b.1 0.06924 0.05749 0.081
+
+Backtransformed parameters:
+                      est.     lower    upper
+cyan_0           1.016e+02 9.920e+01 103.9059
+k_JCZ38          9.798e-02 5.890e-02   0.1630
+k_J9Z38          5.912e-03 2.627e-03   0.0133
+k_JSE76          4.892e-02 1.410e-02   0.1697
+f_cyan_to_JCZ38  6.432e-01        NA       NA
+f_cyan_to_J9Z38  2.362e-01        NA       NA
+f_JCZ38_to_JSE76 9.794e-01 7.160e-01   0.9989
+f_JSE76_to_JCZ38 9.995e-01 2.268e-49   1.0000
+alpha            8.581e-01 6.371e-01   1.1556
+beta             1.992e+01 1.505e+01  26.3646
+
+Resulting formation fractions:
+                   ff
+cyan_JCZ38  0.6432301
+cyan_J9Z38  0.2361657
+cyan_sink   0.1206042
+JCZ38_JSE76 0.9793879
+JCZ38_sink  0.0206121
+JSE76_JCZ38 0.9994559
+JSE76_sink  0.0005441
+
+Estimated disappearance times:
+         DT50   DT90 DT50back
+cyan   24.759 271.61    81.76
+JCZ38   7.075  23.50       NA
+J9Z38 117.249 389.49       NA
+JSE76  14.169  47.07       NA
+
+
+

+ +Hierarchical DFOP path 2 fit with constant variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:55:32 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 +
+           f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 548.554 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      102.4380        -2.3107        -5.3123        -3.7120         0.6757 
+  f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis         log_k1         log_k2 
+        1.1439        13.1194        12.3492        -1.9317        -4.4557 
+      g_qlogis 
+       -0.5644 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          4.591      0.0000       0.000         0.0       0.0000
+log_k_JCZ38     0.000      0.7966       0.000         0.0       0.0000
+log_k_J9Z38     0.000      0.0000       1.561         0.0       0.0000
+log_k_JSE76     0.000      0.0000       0.000         0.8       0.0000
+f_cyan_ilr_1    0.000      0.0000       0.000         0.0       0.6349
+f_cyan_ilr_2    0.000      0.0000       0.000         0.0       0.0000
+f_JCZ38_qlogis  0.000      0.0000       0.000         0.0       0.0000
+f_JSE76_qlogis  0.000      0.0000       0.000         0.0       0.0000
+log_k1          0.000      0.0000       0.000         0.0       0.0000
+log_k2          0.000      0.0000       0.000         0.0       0.0000
+g_qlogis        0.000      0.0000       0.000         0.0       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2
+cyan_0                0.000           0.00           0.00  0.000 0.0000
+log_k_JCZ38           0.000           0.00           0.00  0.000 0.0000
+log_k_J9Z38           0.000           0.00           0.00  0.000 0.0000
+log_k_JSE76           0.000           0.00           0.00  0.000 0.0000
+f_cyan_ilr_1          0.000           0.00           0.00  0.000 0.0000
+f_cyan_ilr_2          1.797           0.00           0.00  0.000 0.0000
+f_JCZ38_qlogis        0.000          13.86           0.00  0.000 0.0000
+f_JSE76_qlogis        0.000           0.00          13.91  0.000 0.0000
+log_k1                0.000           0.00           0.00  1.106 0.0000
+log_k2                0.000           0.00           0.00  0.000 0.6141
+g_qlogis              0.000           0.00           0.00  0.000 0.0000
+               g_qlogis
+cyan_0            0.000
+log_k_JCZ38       0.000
+log_k_J9Z38       0.000
+log_k_JSE76       0.000
+f_cyan_ilr_1      0.000
+f_cyan_ilr_2      0.000
+f_JCZ38_qlogis    0.000
+f_JSE76_qlogis    0.000
+log_k1            0.000
+log_k2            0.000
+g_qlogis          1.595
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2288 2280  -1122
+
+Optimised parameters:
+                      est.      lower      upper
+cyan_0            102.7204  1.014e+02  1.040e+02
+log_k_JCZ38        -2.8925 -4.044e+00 -1.741e+00
+log_k_J9Z38        -5.1430 -5.828e+00 -4.457e+00
+log_k_JSE76        -3.5577 -4.174e+00 -2.941e+00
+f_cyan_ilr_1        0.6929  3.788e-01  1.007e+00
+f_cyan_ilr_2        0.6066  5.342e-02  1.160e+00
+f_JCZ38_qlogis      9.8071 -2.819e+03  2.838e+03
+f_JSE76_qlogis      2.2229  5.684e-01  3.877e+00
+log_k1             -1.9339 -2.609e+00 -1.258e+00
+log_k2             -4.4709 -4.935e+00 -4.007e+00
+g_qlogis           -0.4987 -1.373e+00  3.757e-01
+a.1                 2.7368  2.545e+00  2.928e+00
+SD.log_k_JCZ38      1.2747  4.577e-01  2.092e+00
+SD.log_k_J9Z38      0.6758  1.418e-01  1.210e+00
+SD.log_k_JSE76      0.5869  1.169e-01  1.057e+00
+SD.f_cyan_ilr_1     0.3392  1.161e-01  5.622e-01
+SD.f_cyan_ilr_2     0.4200  8.501e-02  7.550e-01
+SD.f_JCZ38_qlogis   0.8511 -1.137e+06  1.137e+06
+SD.f_JSE76_qlogis   0.3767 -5.238e-01  1.277e+00
+SD.log_k1           0.7475  2.601e-01  1.235e+00
+SD.log_k2           0.5179  1.837e-01  8.521e-01
+SD.g_qlogis         0.9817  3.553e-01  1.608e+00
+
+Correlation: 
+               cyan_0  l__JCZ3 l__J9Z3 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 f_JSE76
+log_k_JCZ38    -0.0351                                                        
+log_k_J9Z38    -0.0541  0.0043                                                
+log_k_JSE76    -0.0078  0.0900 -0.0014                                        
+f_cyan_ilr_1   -0.0249  0.0268 -0.0962  0.0000                                
+f_cyan_ilr_2   -0.3560  0.0848  0.1545 -0.0022  0.0463                        
+f_JCZ38_qlogis  0.2005 -0.1226 -0.0347  0.0514 -0.1840 -0.5906                
+f_JSE76_qlogis -0.1638  0.1307  0.0266  0.0001  0.1645  0.5181 -0.9297        
+log_k1          0.0881 -0.0071  0.0005 -0.0070 -0.0064 -0.0346  0.0316 -0.0341
+log_k2          0.0238 -0.0003  0.0082 -0.0022 -0.0017 -0.0017 -0.0002 -0.0076
+g_qlogis        0.0198 -0.0002 -0.0109  0.0034  0.0017 -0.0176  0.0044  0.0051
+               log_k1  log_k2 
+log_k_JCZ38                   
+log_k_J9Z38                   
+log_k_JSE76                   
+f_cyan_ilr_1                  
+f_cyan_ilr_2                  
+f_JCZ38_qlogis                
+f_JSE76_qlogis                
+log_k1                        
+log_k2          0.0276        
+g_qlogis       -0.0283 -0.0309
+
+Random effects:
+                    est.      lower     upper
+SD.log_k_JCZ38    1.2747  4.577e-01 2.092e+00
+SD.log_k_J9Z38    0.6758  1.418e-01 1.210e+00
+SD.log_k_JSE76    0.5869  1.169e-01 1.057e+00
+SD.f_cyan_ilr_1   0.3392  1.161e-01 5.622e-01
+SD.f_cyan_ilr_2   0.4200  8.501e-02 7.550e-01
+SD.f_JCZ38_qlogis 0.8511 -1.137e+06 1.137e+06
+SD.f_JSE76_qlogis 0.3767 -5.238e-01 1.277e+00
+SD.log_k1         0.7475  2.601e-01 1.235e+00
+SD.log_k2         0.5179  1.837e-01 8.521e-01
+SD.g_qlogis       0.9817  3.553e-01 1.608e+00
+
+Variance model:
+     est. lower upper
+a.1 2.737 2.545 2.928
+
+Backtransformed parameters:
+                      est.     lower     upper
+cyan_0           102.72037 1.014e+02 104.00464
+k_JCZ38            0.05544 1.752e-02   0.17539
+k_J9Z38            0.00584 2.942e-03   0.01159
+k_JSE76            0.02850 1.539e-02   0.05279
+f_cyan_to_JCZ38    0.59995        NA        NA
+f_cyan_to_J9Z38    0.22519        NA        NA
+f_JCZ38_to_JSE76   0.99994 0.000e+00   1.00000
+f_JSE76_to_JCZ38   0.90229 6.384e-01   0.97971
+k1                 0.14459 7.357e-02   0.28414
+k2                 0.01144 7.192e-03   0.01819
+g                  0.37784 2.021e-01   0.59284
+
+Resulting formation fractions:
+                   ff
+cyan_JCZ38  5.999e-01
+cyan_J9Z38  2.252e-01
+cyan_sink   1.749e-01
+JCZ38_JSE76 9.999e-01
+JCZ38_sink  5.506e-05
+JSE76_JCZ38 9.023e-01
+JSE76_sink  9.771e-02
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_k1 DT50_k2
+cyan   21.93 159.83    48.11   4.794    60.6
+JCZ38  12.50  41.53       NA      NA      NA
+J9Z38 118.69 394.27       NA      NA      NA
+JSE76  24.32  80.78       NA      NA      NA
+
+
+

+ +Hierarchical DFOP path 2 fit with two-component error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:57:56 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 +
+           f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 691.67 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      101.7393        -1.4493        -5.0118        -2.1269         0.6720 
+  f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis         log_k1         log_k2 
+        7.3362        13.4423        13.2659        -2.0061        -4.5527 
+      g_qlogis 
+       -0.5806 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          5.604        0.00       0.000       0.000       0.0000
+log_k_JCZ38     0.000        2.77       0.000       0.000       0.0000
+log_k_J9Z38     0.000        0.00       1.662       0.000       0.0000
+log_k_JSE76     0.000        0.00       0.000       5.021       0.0000
+f_cyan_ilr_1    0.000        0.00       0.000       0.000       0.6519
+f_cyan_ilr_2    0.000        0.00       0.000       0.000       0.0000
+f_JCZ38_qlogis  0.000        0.00       0.000       0.000       0.0000
+f_JSE76_qlogis  0.000        0.00       0.000       0.000       0.0000
+log_k1          0.000        0.00       0.000       0.000       0.0000
+log_k2          0.000        0.00       0.000       0.000       0.0000
+g_qlogis        0.000        0.00       0.000       0.000       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2
+cyan_0                 0.00           0.00           0.00 0.0000 0.0000
+log_k_JCZ38            0.00           0.00           0.00 0.0000 0.0000
+log_k_J9Z38            0.00           0.00           0.00 0.0000 0.0000
+log_k_JSE76            0.00           0.00           0.00 0.0000 0.0000
+f_cyan_ilr_1           0.00           0.00           0.00 0.0000 0.0000
+f_cyan_ilr_2          13.37           0.00           0.00 0.0000 0.0000
+f_JCZ38_qlogis         0.00          14.21           0.00 0.0000 0.0000
+f_JSE76_qlogis         0.00           0.00          14.58 0.0000 0.0000
+log_k1                 0.00           0.00           0.00 0.8453 0.0000
+log_k2                 0.00           0.00           0.00 0.0000 0.5969
+g_qlogis               0.00           0.00           0.00 0.0000 0.0000
+               g_qlogis
+cyan_0             0.00
+log_k_JCZ38        0.00
+log_k_J9Z38        0.00
+log_k_JSE76        0.00
+f_cyan_ilr_1       0.00
+f_cyan_ilr_2       0.00
+f_JCZ38_qlogis     0.00
+f_JSE76_qlogis     0.00
+log_k1             0.00
+log_k2             0.00
+g_qlogis           1.69
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2234 2226  -1095
+
+Optimised parameters:
+                       est.     lower     upper
+cyan_0            101.25496  99.14662 103.36331
+log_k_JCZ38        -2.55593  -3.32972  -1.78215
+log_k_J9Z38        -5.07103  -5.85423  -4.28783
+log_k_JSE76        -3.25468  -4.17577  -2.33360
+f_cyan_ilr_1        0.70139   0.35924   1.04355
+f_cyan_ilr_2        1.07712   0.17789   1.97636
+f_JCZ38_qlogis      3.57483   0.05990   7.08976
+f_JSE76_qlogis      4.54884  -7.25628  16.35395
+log_k1             -2.38201  -2.51639  -2.24763
+log_k2             -4.66741  -4.91865  -4.41617
+g_qlogis           -0.28446  -1.14192   0.57300
+a.1                 2.05925   1.86481   2.25369
+b.1                 0.06172   0.05062   0.07282
+SD.log_k_JCZ38      0.81137   0.25296   1.36977
+SD.log_k_J9Z38      0.83542   0.25395   1.41689
+SD.log_k_JSE76      0.97903   0.30100   1.65707
+SD.f_cyan_ilr_1     0.37878   0.13374   0.62382
+SD.f_cyan_ilr_2     0.67274   0.10102   1.24446
+SD.f_JCZ38_qlogis   1.35327  -0.42359   3.13012
+SD.f_JSE76_qlogis   1.43956 -19.14972  22.02884
+SD.log_k2           0.25329   0.07521   0.43138
+SD.g_qlogis         0.95167   0.35149   1.55184
+
+Correlation: 
+               cyan_0  l__JCZ3 l__J9Z3 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 f_JSE76
+log_k_JCZ38    -0.0265                                                        
+log_k_J9Z38    -0.0392  0.0024                                                
+log_k_JSE76     0.0011  0.1220 -0.0016                                        
+f_cyan_ilr_1   -0.0161  0.0217 -0.0552  0.0034                                
+f_cyan_ilr_2   -0.4718  0.0829  0.1102  0.0042  0.0095                        
+f_JCZ38_qlogis  0.1609 -0.1318 -0.0277  0.0081 -0.1040 -0.4559                
+f_JSE76_qlogis -0.1289  0.1494  0.0219  0.0012  0.1004  0.4309 -0.8543        
+log_k1          0.2618 -0.0739 -0.0167 -0.0148 -0.0444 -0.2768  0.3518 -0.3818
+log_k2          0.0603 -0.0217  0.0174 -0.0058 -0.0197 -0.0533  0.0923 -0.1281
+g_qlogis        0.0362  0.0115 -0.0111  0.0040  0.0095 -0.0116 -0.0439  0.0651
+               log_k1  log_k2 
+log_k_JCZ38                   
+log_k_J9Z38                   
+log_k_JSE76                   
+f_cyan_ilr_1                  
+f_cyan_ilr_2                  
+f_JCZ38_qlogis                
+f_JSE76_qlogis                
+log_k1                        
+log_k2          0.3269        
+g_qlogis       -0.1656 -0.0928
+
+Random effects:
+                    est.     lower   upper
+SD.log_k_JCZ38    0.8114   0.25296  1.3698
+SD.log_k_J9Z38    0.8354   0.25395  1.4169
+SD.log_k_JSE76    0.9790   0.30100  1.6571
+SD.f_cyan_ilr_1   0.3788   0.13374  0.6238
+SD.f_cyan_ilr_2   0.6727   0.10102  1.2445
+SD.f_JCZ38_qlogis 1.3533  -0.42359  3.1301
+SD.f_JSE76_qlogis 1.4396 -19.14972 22.0288
+SD.log_k2         0.2533   0.07521  0.4314
+SD.g_qlogis       0.9517   0.35149  1.5518
+
+Variance model:
+       est.   lower   upper
+a.1 2.05925 1.86481 2.25369
+b.1 0.06172 0.05062 0.07282
+
+Backtransformed parameters:
+                      est.     lower     upper
+cyan_0           1.013e+02 9.915e+01 103.36331
+k_JCZ38          7.762e-02 3.580e-02   0.16828
+k_J9Z38          6.276e-03 2.868e-03   0.01373
+k_JSE76          3.859e-02 1.536e-02   0.09695
+f_cyan_to_JCZ38  6.520e-01        NA        NA
+f_cyan_to_J9Z38  2.418e-01        NA        NA
+f_JCZ38_to_JSE76 9.727e-01 5.150e-01   0.99917
+f_JSE76_to_JCZ38 9.895e-01 7.052e-04   1.00000
+k1               9.236e-02 8.075e-02   0.10565
+k2               9.397e-03 7.309e-03   0.01208
+g                4.294e-01 2.420e-01   0.63945
+
+Resulting formation fractions:
+                 ff
+cyan_JCZ38  0.65203
+cyan_J9Z38  0.24181
+cyan_sink   0.10616
+JCZ38_JSE76 0.97274
+JCZ38_sink  0.02726
+JSE76_JCZ38 0.98953
+JSE76_sink  0.01047
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_k1 DT50_k2
+cyan   24.26 185.34    55.79   7.504   73.77
+JCZ38   8.93  29.66       NA      NA      NA
+J9Z38 110.45 366.89       NA      NA      NA
+JSE76  17.96  59.66       NA      NA      NA
+
+
+

+ +Hierarchical SFORB path 2 fit with constant variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:55:26 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound *
+           cyan_free + k_cyan_bound_free * cyan_bound
+d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free *
+           cyan_bound
+d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38
+           * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38
+           * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 542.162 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+          cyan_free_0       log_k_cyan_free log_k_cyan_free_bound 
+             102.4395               -2.7673               -2.8942 
+log_k_cyan_bound_free           log_k_JCZ38           log_k_J9Z38 
+              -3.6201               -2.3107               -5.3123 
+          log_k_JSE76          f_cyan_ilr_1          f_cyan_ilr_2 
+              -3.7120                0.6754                1.1448 
+       f_JCZ38_qlogis        f_JSE76_qlogis 
+              14.8408               15.4734 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+                      cyan_free_0 log_k_cyan_free log_k_cyan_free_bound
+cyan_free_0                 4.589          0.0000                  0.00
+log_k_cyan_free             0.000          0.4849                  0.00
+log_k_cyan_free_bound       0.000          0.0000                  1.62
+log_k_cyan_bound_free       0.000          0.0000                  0.00
+log_k_JCZ38                 0.000          0.0000                  0.00
+log_k_J9Z38                 0.000          0.0000                  0.00
+log_k_JSE76                 0.000          0.0000                  0.00
+f_cyan_ilr_1                0.000          0.0000                  0.00
+f_cyan_ilr_2                0.000          0.0000                  0.00
+f_JCZ38_qlogis              0.000          0.0000                  0.00
+f_JSE76_qlogis              0.000          0.0000                  0.00
+                      log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76
+cyan_free_0                           0.000      0.0000       0.000         0.0
+log_k_cyan_free                       0.000      0.0000       0.000         0.0
+log_k_cyan_free_bound                 0.000      0.0000       0.000         0.0
+log_k_cyan_bound_free                 1.197      0.0000       0.000         0.0
+log_k_JCZ38                           0.000      0.7966       0.000         0.0
+log_k_J9Z38                           0.000      0.0000       1.561         0.0
+log_k_JSE76                           0.000      0.0000       0.000         0.8
+f_cyan_ilr_1                          0.000      0.0000       0.000         0.0
+f_cyan_ilr_2                          0.000      0.0000       0.000         0.0
+f_JCZ38_qlogis                        0.000      0.0000       0.000         0.0
+f_JSE76_qlogis                        0.000      0.0000       0.000         0.0
+                      f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis
+cyan_free_0                 0.0000        0.000            0.0           0.00
+log_k_cyan_free             0.0000        0.000            0.0           0.00
+log_k_cyan_free_bound       0.0000        0.000            0.0           0.00
+log_k_cyan_bound_free       0.0000        0.000            0.0           0.00
+log_k_JCZ38                 0.0000        0.000            0.0           0.00
+log_k_J9Z38                 0.0000        0.000            0.0           0.00
+log_k_JSE76                 0.0000        0.000            0.0           0.00
+f_cyan_ilr_1                0.6349        0.000            0.0           0.00
+f_cyan_ilr_2                0.0000        1.797            0.0           0.00
+f_JCZ38_qlogis              0.0000        0.000           15.6           0.00
+f_JSE76_qlogis              0.0000        0.000            0.0          17.52
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2283 2275  -1120
+
+Optimised parameters:
+                             est.     lower    upper
+cyan_free_0              102.6517 101.40815 103.8952
+log_k_cyan_free           -2.8729  -3.18649  -2.5593
+log_k_cyan_free_bound     -2.7803  -3.60525  -1.9552
+log_k_cyan_bound_free     -3.5845  -4.16644  -3.0026
+log_k_JCZ38               -2.3411  -2.89698  -1.7852
+log_k_J9Z38               -5.2487  -6.01271  -4.4847
+log_k_JSE76               -3.0259  -4.28274  -1.7690
+f_cyan_ilr_1               0.7289   0.38214   1.0756
+f_cyan_ilr_2               0.6891   0.18277   1.1954
+f_JCZ38_qlogis             4.2162   0.47015   7.9622
+f_JSE76_qlogis             5.8911 -20.19088  31.9730
+a.1                        2.7159   2.52587   2.9060
+SD.log_k_cyan_free         0.3354   0.10979   0.5610
+SD.log_k_cyan_free_bound   0.9061   0.30969   1.5025
+SD.log_k_cyan_bound_free   0.6376   0.21229   1.0628
+SD.log_k_JCZ38             0.5499   0.14533   0.9545
+SD.log_k_J9Z38             0.7457   0.15106   1.3404
+SD.log_k_JSE76             1.3822   0.47329   2.2912
+SD.f_cyan_ilr_1            0.3820   0.13280   0.6313
+SD.f_cyan_ilr_2            0.4317   0.06803   0.7953
+SD.f_JCZ38_qlogis          1.8258  -0.25423   3.9059
+SD.f_JSE76_qlogis          2.2348 -83.33679  87.8065
+
+Correlation: 
+                      cyn_f_0 lg_k_c_ lg_k_cyn_f_ lg_k_cyn_b_ l__JCZ3 l__J9Z3
+log_k_cyan_free        0.1944                                                
+log_k_cyan_free_bound  0.0815  0.0814                                        
+log_k_cyan_bound_free  0.0106  0.0426  0.0585                                
+log_k_JCZ38           -0.0231 -0.0106 -0.0089     -0.0051                    
+log_k_J9Z38           -0.0457 -0.0108  0.0019      0.0129      0.0032        
+log_k_JSE76           -0.0054 -0.0024 -0.0017     -0.0005      0.1108  0.0009
+f_cyan_ilr_1           0.0051 -0.0005 -0.0035     -0.0056      0.0131 -0.0967
+f_cyan_ilr_2          -0.3182 -0.0771 -0.0309     -0.0038      0.0680  0.1643
+f_JCZ38_qlogis         0.0834  0.0369  0.0302      0.0172     -0.1145 -0.0204
+f_JSE76_qlogis        -0.0553 -0.0365 -0.0441     -0.0414      0.1579  0.0175
+                      l__JSE7 f_cy__1 f_cy__2 f_JCZ38
+log_k_cyan_free                                      
+log_k_cyan_free_bound                                
+log_k_cyan_bound_free                                
+log_k_JCZ38                                          
+log_k_J9Z38                                          
+log_k_JSE76                                          
+f_cyan_ilr_1          -0.0002                        
+f_cyan_ilr_2           0.0020 -0.0415                
+f_JCZ38_qlogis         0.0052 -0.0665 -0.3437        
+f_JSE76_qlogis         0.0066  0.0635  0.3491 -0.7487
+
+Random effects:
+                           est.     lower   upper
+SD.log_k_cyan_free       0.3354   0.10979  0.5610
+SD.log_k_cyan_free_bound 0.9061   0.30969  1.5025
+SD.log_k_cyan_bound_free 0.6376   0.21229  1.0628
+SD.log_k_JCZ38           0.5499   0.14533  0.9545
+SD.log_k_J9Z38           0.7457   0.15106  1.3404
+SD.log_k_JSE76           1.3822   0.47329  2.2912
+SD.f_cyan_ilr_1          0.3820   0.13280  0.6313
+SD.f_cyan_ilr_2          0.4317   0.06803  0.7953
+SD.f_JCZ38_qlogis        1.8258  -0.25423  3.9059
+SD.f_JSE76_qlogis        2.2348 -83.33679 87.8065
+
+Variance model:
+     est. lower upper
+a.1 2.716 2.526 2.906
+
+Backtransformed parameters:
+                          est.     lower     upper
+cyan_free_0          1.027e+02 1.014e+02 103.89517
+k_cyan_free          5.654e-02 4.132e-02   0.07736
+k_cyan_free_bound    6.202e-02 2.718e-02   0.14153
+k_cyan_bound_free    2.775e-02 1.551e-02   0.04966
+k_JCZ38              9.622e-02 5.519e-02   0.16777
+k_J9Z38              5.254e-03 2.447e-03   0.01128
+k_JSE76              4.852e-02 1.380e-02   0.17051
+f_cyan_free_to_JCZ38 6.197e-01 5.643e-01   0.84429
+f_cyan_free_to_J9Z38 2.211e-01 5.643e-01   0.84429
+f_JCZ38_to_JSE76     9.855e-01 6.154e-01   0.99965
+f_JSE76_to_JCZ38     9.972e-01 1.703e-09   1.00000
+
+Estimated Eigenvalues of SFORB model(s):
+cyan_b1 cyan_b2  cyan_g 
+0.13466 0.01165 0.36490 
+
+Resulting formation fractions:
+                      ff
+cyan_free_JCZ38 0.619745
+cyan_free_J9Z38 0.221083
+cyan_free_sink  0.159172
+cyan_free       1.000000
+JCZ38_JSE76     0.985460
+JCZ38_sink      0.014540
+JSE76_JCZ38     0.997244
+JSE76_sink      0.002756
+
+Estimated disappearance times:
+         DT50   DT90 DT50back DT50_cyan_b1 DT50_cyan_b2
+cyan   23.293 158.67    47.77        5.147         59.5
+JCZ38   7.203  23.93       NA           NA           NA
+J9Z38 131.918 438.22       NA           NA           NA
+JSE76  14.287  47.46       NA           NA           NA
+
+
+

+ +Hierarchical SFORB path 2 fit with two-component error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 07:58:06 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound *
+           cyan_free + k_cyan_bound_free * cyan_bound
+d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free *
+           cyan_bound
+d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38
+           * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38
+           * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 701.582 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+          cyan_free_0       log_k_cyan_free log_k_cyan_free_bound 
+             101.7511               -2.8370               -3.0162 
+log_k_cyan_bound_free           log_k_JCZ38           log_k_J9Z38 
+              -3.6600               -2.2988               -5.3129 
+          log_k_JSE76          f_cyan_ilr_1          f_cyan_ilr_2 
+              -3.6991                0.6722                4.8596 
+       f_JCZ38_qlogis        f_JSE76_qlogis 
+              13.4678               14.2149 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+                      cyan_free_0 log_k_cyan_free log_k_cyan_free_bound
+cyan_free_0                 5.629           0.000                 0.000
+log_k_cyan_free             0.000           0.446                 0.000
+log_k_cyan_free_bound       0.000           0.000                 1.449
+log_k_cyan_bound_free       0.000           0.000                 0.000
+log_k_JCZ38                 0.000           0.000                 0.000
+log_k_J9Z38                 0.000           0.000                 0.000
+log_k_JSE76                 0.000           0.000                 0.000
+f_cyan_ilr_1                0.000           0.000                 0.000
+f_cyan_ilr_2                0.000           0.000                 0.000
+f_JCZ38_qlogis              0.000           0.000                 0.000
+f_JSE76_qlogis              0.000           0.000                 0.000
+                      log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76
+cyan_free_0                           0.000      0.0000       0.000      0.0000
+log_k_cyan_free                       0.000      0.0000       0.000      0.0000
+log_k_cyan_free_bound                 0.000      0.0000       0.000      0.0000
+log_k_cyan_bound_free                 1.213      0.0000       0.000      0.0000
+log_k_JCZ38                           0.000      0.7801       0.000      0.0000
+log_k_J9Z38                           0.000      0.0000       1.575      0.0000
+log_k_JSE76                           0.000      0.0000       0.000      0.8078
+f_cyan_ilr_1                          0.000      0.0000       0.000      0.0000
+f_cyan_ilr_2                          0.000      0.0000       0.000      0.0000
+f_JCZ38_qlogis                        0.000      0.0000       0.000      0.0000
+f_JSE76_qlogis                        0.000      0.0000       0.000      0.0000
+                      f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis
+cyan_free_0                 0.0000        0.000           0.00           0.00
+log_k_cyan_free             0.0000        0.000           0.00           0.00
+log_k_cyan_free_bound       0.0000        0.000           0.00           0.00
+log_k_cyan_bound_free       0.0000        0.000           0.00           0.00
+log_k_JCZ38                 0.0000        0.000           0.00           0.00
+log_k_J9Z38                 0.0000        0.000           0.00           0.00
+log_k_JSE76                 0.0000        0.000           0.00           0.00
+f_cyan_ilr_1                0.6518        0.000           0.00           0.00
+f_cyan_ilr_2                0.0000        9.981           0.00           0.00
+f_JCZ38_qlogis              0.0000        0.000          14.26           0.00
+f_JSE76_qlogis              0.0000        0.000           0.00          16.17
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2240 2231  -1098
+
+Optimised parameters:
+                              est.      lower      upper
+cyan_free_0              100.73014  9.873e+01  1.027e+02
+log_k_cyan_free           -3.19634 -3.641e+00 -2.752e+00
+log_k_cyan_free_bound     -3.43533 -3.674e+00 -3.197e+00
+log_k_cyan_bound_free     -3.83282 -4.163e+00 -3.503e+00
+log_k_JCZ38               -2.51065 -3.225e+00 -1.796e+00
+log_k_J9Z38               -5.02539 -5.825e+00 -4.226e+00
+log_k_JSE76               -3.24777 -4.163e+00 -2.333e+00
+f_cyan_ilr_1               0.70640  3.562e-01  1.057e+00
+f_cyan_ilr_2               1.42704  3.170e-01  2.537e+00
+f_JCZ38_qlogis             2.84779  1.042e+00  4.654e+00
+f_JSE76_qlogis             8.63674 -6.407e+02  6.580e+02
+a.1                        2.07082  1.877e+00  2.265e+00
+b.1                        0.06227  5.098e-02  7.355e-02
+SD.log_k_cyan_free         0.49674  1.865e-01  8.069e-01
+SD.log_k_cyan_bound_free   0.28537  6.809e-02  5.027e-01
+SD.log_k_JCZ38             0.74846  2.305e-01  1.266e+00
+SD.log_k_J9Z38             0.86077  2.713e-01  1.450e+00
+SD.log_k_JSE76             0.97613  3.030e-01  1.649e+00
+SD.f_cyan_ilr_1            0.38994  1.382e-01  6.417e-01
+SD.f_cyan_ilr_2            0.82869  3.917e-02  1.618e+00
+SD.f_JCZ38_qlogis          1.05000 -2.808e-02  2.128e+00
+SD.f_JSE76_qlogis          0.44681 -3.985e+05  3.985e+05
+
+Correlation: 
+                      cyn_f_0 lg_k_c_ lg_k_cyn_f_ lg_k_cyn_b_ l__JCZ3 l__J9Z3
+log_k_cyan_free        0.0936                                                
+log_k_cyan_free_bound  0.1302  0.1627                                        
+log_k_cyan_bound_free  0.0029  0.0525  0.5181                                
+log_k_JCZ38           -0.0116 -0.0077 -0.0430     -0.0236                    
+log_k_J9Z38           -0.0192 -0.0077 -0.0048      0.0229     -0.0005        
+log_k_JSE76            0.0007 -0.0020 -0.0134     -0.0072      0.1225 -0.0016
+f_cyan_ilr_1          -0.0118 -0.0027 -0.0132     -0.0118      0.0127 -0.0505
+f_cyan_ilr_2          -0.4643 -0.0762 -0.1245      0.0137      0.0497  0.1003
+f_JCZ38_qlogis         0.0710  0.0371  0.1826      0.0925     -0.0869 -0.0130
+f_JSE76_qlogis        -0.0367 -0.0270 -0.2274     -0.1865      0.1244  0.0098
+                      l__JSE7 f_cy__1 f_cy__2 f_JCZ38
+log_k_cyan_free                                      
+log_k_cyan_free_bound                                
+log_k_cyan_bound_free                                
+log_k_JCZ38                                          
+log_k_J9Z38                                          
+log_k_JSE76                                          
+f_cyan_ilr_1           0.0036                        
+f_cyan_ilr_2           0.0050 -0.0201                
+f_JCZ38_qlogis         0.0142 -0.0529 -0.2698        
+f_JSE76_qlogis         0.0064  0.0345  0.2015 -0.7058
+
+Random effects:
+                           est.      lower     upper
+SD.log_k_cyan_free       0.4967  1.865e-01 8.069e-01
+SD.log_k_cyan_bound_free 0.2854  6.809e-02 5.027e-01
+SD.log_k_JCZ38           0.7485  2.305e-01 1.266e+00
+SD.log_k_J9Z38           0.8608  2.713e-01 1.450e+00
+SD.log_k_JSE76           0.9761  3.030e-01 1.649e+00
+SD.f_cyan_ilr_1          0.3899  1.382e-01 6.417e-01
+SD.f_cyan_ilr_2          0.8287  3.917e-02 1.618e+00
+SD.f_JCZ38_qlogis        1.0500 -2.808e-02 2.128e+00
+SD.f_JSE76_qlogis        0.4468 -3.985e+05 3.985e+05
+
+Variance model:
+       est.   lower   upper
+a.1 2.07082 1.87680 2.26483
+b.1 0.06227 0.05098 0.07355
+
+Backtransformed parameters:
+                          est.      lower     upper
+cyan_free_0          1.007e+02  9.873e+01 102.72898
+k_cyan_free          4.091e-02  2.623e-02   0.06382
+k_cyan_free_bound    3.221e-02  2.537e-02   0.04090
+k_cyan_bound_free    2.165e-02  1.557e-02   0.03011
+k_JCZ38              8.122e-02  3.975e-02   0.16594
+k_J9Z38              6.569e-03  2.954e-03   0.01461
+k_JSE76              3.886e-02  1.556e-02   0.09703
+f_cyan_free_to_JCZ38 6.785e-01  6.102e-01   0.97309
+f_cyan_free_to_J9Z38 2.498e-01  6.102e-01   0.97309
+f_JCZ38_to_JSE76     9.452e-01  7.392e-01   0.99056
+f_JSE76_to_JCZ38     9.998e-01 5.580e-279   1.00000
+
+Estimated Eigenvalues of SFORB model(s):
+cyan_b1 cyan_b2  cyan_g 
+0.08426 0.01051 0.41220 
+
+Resulting formation fractions:
+                       ff
+cyan_free_JCZ38 0.6784541
+cyan_free_J9Z38 0.2498405
+cyan_free_sink  0.0717054
+cyan_free       1.0000000
+JCZ38_JSE76     0.9452043
+JCZ38_sink      0.0547957
+JSE76_JCZ38     0.9998226
+JSE76_sink      0.0001774
+
+Estimated disappearance times:
+         DT50   DT90 DT50back DT50_cyan_b1 DT50_cyan_b2
+cyan   25.237 168.51    50.73        8.226        65.95
+JCZ38   8.535  28.35       NA           NA           NA
+J9Z38 105.517 350.52       NA           NA           NA
+JSE76  17.837  59.25       NA           NA           NA
+
+
+

+
+
+

Pathway 2, refined fits +

+ +Hierarchical FOMC path 2 fit with reduced random effects, two-component +error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:11:01 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - (alpha/beta) * 1/((time/beta) + 1) * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * (alpha/beta) * 1/((time/beta) + 1) *
+           cyan - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_to_J9Z38 * (alpha/beta) * 1/((time/beta) + 1) *
+           cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 773.693 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      102.4477        -1.8631        -5.1087        -2.5114         0.6826 
+  f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis      log_alpha       log_beta 
+        4.7944        15.9616        13.1566        -0.1564         2.9781 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          7.701       0.000       0.000       0.000       0.0000
+log_k_JCZ38     0.000       1.448       0.000       0.000       0.0000
+log_k_J9Z38     0.000       0.000       1.724       0.000       0.0000
+log_k_JSE76     0.000       0.000       0.000       3.659       0.0000
+f_cyan_ilr_1    0.000       0.000       0.000       0.000       0.6356
+f_cyan_ilr_2    0.000       0.000       0.000       0.000       0.0000
+f_JCZ38_qlogis  0.000       0.000       0.000       0.000       0.0000
+f_JSE76_qlogis  0.000       0.000       0.000       0.000       0.0000
+log_alpha       0.000       0.000       0.000       0.000       0.0000
+log_beta        0.000       0.000       0.000       0.000       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_alpha log_beta
+cyan_0                 0.00           0.00           0.00    0.0000   0.0000
+log_k_JCZ38            0.00           0.00           0.00    0.0000   0.0000
+log_k_J9Z38            0.00           0.00           0.00    0.0000   0.0000
+log_k_JSE76            0.00           0.00           0.00    0.0000   0.0000
+f_cyan_ilr_1           0.00           0.00           0.00    0.0000   0.0000
+f_cyan_ilr_2          10.32           0.00           0.00    0.0000   0.0000
+f_JCZ38_qlogis         0.00          12.23           0.00    0.0000   0.0000
+f_JSE76_qlogis         0.00           0.00          14.99    0.0000   0.0000
+log_alpha              0.00           0.00           0.00    0.3924   0.0000
+log_beta               0.00           0.00           0.00    0.0000   0.5639
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2249 2242  -1106
+
+Optimised parameters:
+                     est.   lower  upper
+cyan_0          101.24524      NA     NA
+log_k_JCZ38      -2.85375      NA     NA
+log_k_J9Z38      -5.07729      NA     NA
+log_k_JSE76      -3.53511      NA     NA
+f_cyan_ilr_1      0.67478      NA     NA
+f_cyan_ilr_2      0.97152      NA     NA
+f_JCZ38_qlogis  213.48001      NA     NA
+f_JSE76_qlogis    2.02040      NA     NA
+log_alpha        -0.11041      NA     NA
+log_beta          3.06575      NA     NA
+a.1               2.05279 1.85495 2.2506
+b.1               0.07116 0.05912 0.0832
+SD.log_k_JCZ38    1.21713 0.44160 1.9927
+SD.log_k_J9Z38    0.88268 0.27541 1.4900
+SD.log_k_JSE76    0.59452 0.15005 1.0390
+SD.f_cyan_ilr_1   0.35370 0.12409 0.5833
+SD.f_cyan_ilr_2   0.78186 0.18547 1.3782
+SD.log_alpha      0.27781 0.08168 0.4739
+SD.log_beta       0.32608 0.06490 0.5873
+
+Correlation is not available
+
+Random effects:
+                  est.   lower  upper
+SD.log_k_JCZ38  1.2171 0.44160 1.9927
+SD.log_k_J9Z38  0.8827 0.27541 1.4900
+SD.log_k_JSE76  0.5945 0.15005 1.0390
+SD.f_cyan_ilr_1 0.3537 0.12409 0.5833
+SD.f_cyan_ilr_2 0.7819 0.18547 1.3782
+SD.log_alpha    0.2778 0.08168 0.4739
+SD.log_beta     0.3261 0.06490 0.5873
+
+Variance model:
+       est.   lower  upper
+a.1 2.05279 1.85495 2.2506
+b.1 0.07116 0.05912 0.0832
+
+Backtransformed parameters:
+                      est. lower upper
+cyan_0           1.012e+02    NA    NA
+k_JCZ38          5.763e-02    NA    NA
+k_J9Z38          6.237e-03    NA    NA
+k_JSE76          2.916e-02    NA    NA
+f_cyan_to_JCZ38  6.354e-01    NA    NA
+f_cyan_to_J9Z38  2.447e-01    NA    NA
+f_JCZ38_to_JSE76 1.000e+00    NA    NA
+f_JSE76_to_JCZ38 8.829e-01    NA    NA
+alpha            8.955e-01    NA    NA
+beta             2.145e+01    NA    NA
+
+Resulting formation fractions:
+                ff
+cyan_JCZ38  0.6354
+cyan_J9Z38  0.2447
+cyan_sink   0.1200
+JCZ38_JSE76 1.0000
+JCZ38_sink  0.0000
+JSE76_JCZ38 0.8829
+JSE76_sink  0.1171
+
+Estimated disappearance times:
+        DT50   DT90 DT50back
+cyan   25.07 259.21    78.03
+JCZ38  12.03  39.96       NA
+J9Z38 111.14 369.19       NA
+JSE76  23.77  78.98       NA
+
+
+

+ +Hierarchical DFOP path 2 fit with reduced random effects, constant +variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:12:27 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 +
+           f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 859.906 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      102.4380        -2.3107        -5.3123        -3.7120         0.6757 
+  f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis         log_k1         log_k2 
+        1.1439        13.1194        12.3492        -1.9317        -4.4557 
+      g_qlogis 
+       -0.5644 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          4.591      0.0000       0.000         0.0       0.0000
+log_k_JCZ38     0.000      0.7966       0.000         0.0       0.0000
+log_k_J9Z38     0.000      0.0000       1.561         0.0       0.0000
+log_k_JSE76     0.000      0.0000       0.000         0.8       0.0000
+f_cyan_ilr_1    0.000      0.0000       0.000         0.0       0.6349
+f_cyan_ilr_2    0.000      0.0000       0.000         0.0       0.0000
+f_JCZ38_qlogis  0.000      0.0000       0.000         0.0       0.0000
+f_JSE76_qlogis  0.000      0.0000       0.000         0.0       0.0000
+log_k1          0.000      0.0000       0.000         0.0       0.0000
+log_k2          0.000      0.0000       0.000         0.0       0.0000
+g_qlogis        0.000      0.0000       0.000         0.0       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2
+cyan_0                0.000           0.00           0.00  0.000 0.0000
+log_k_JCZ38           0.000           0.00           0.00  0.000 0.0000
+log_k_J9Z38           0.000           0.00           0.00  0.000 0.0000
+log_k_JSE76           0.000           0.00           0.00  0.000 0.0000
+f_cyan_ilr_1          0.000           0.00           0.00  0.000 0.0000
+f_cyan_ilr_2          1.797           0.00           0.00  0.000 0.0000
+f_JCZ38_qlogis        0.000          13.86           0.00  0.000 0.0000
+f_JSE76_qlogis        0.000           0.00          13.91  0.000 0.0000
+log_k1                0.000           0.00           0.00  1.106 0.0000
+log_k2                0.000           0.00           0.00  0.000 0.6141
+g_qlogis              0.000           0.00           0.00  0.000 0.0000
+               g_qlogis
+cyan_0            0.000
+log_k_JCZ38       0.000
+log_k_J9Z38       0.000
+log_k_JSE76       0.000
+f_cyan_ilr_1      0.000
+f_cyan_ilr_2      0.000
+f_JCZ38_qlogis    0.000
+f_JSE76_qlogis    0.000
+log_k1            0.000
+log_k2            0.000
+g_qlogis          1.595
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2282 2274  -1121
+
+Optimised parameters:
+                     est.   lower  upper
+cyan_0           102.6036      NA     NA
+log_k_JCZ38       -2.9348      NA     NA
+log_k_J9Z38       -5.1617      NA     NA
+log_k_JSE76       -3.6396      NA     NA
+f_cyan_ilr_1       0.6991      NA     NA
+f_cyan_ilr_2       0.6341      NA     NA
+f_JCZ38_qlogis  4232.3011      NA     NA
+f_JSE76_qlogis     1.9658      NA     NA
+log_k1            -1.9503      NA     NA
+log_k2            -4.4745      NA     NA
+g_qlogis          -0.4967      NA     NA
+a.1                2.7461 2.59274 2.8994
+SD.log_k_JCZ38     1.3178 0.47602 2.1596
+SD.log_k_J9Z38     0.7022 0.15061 1.2538
+SD.log_k_JSE76     0.6566 0.15613 1.1570
+SD.f_cyan_ilr_1    0.3409 0.11666 0.5652
+SD.f_cyan_ilr_2    0.4385 0.09482 0.7821
+SD.log_k1          0.7381 0.25599 1.2202
+SD.log_k2          0.5133 0.18152 0.8450
+SD.g_qlogis        0.9866 0.35681 1.6164
+
+Correlation is not available
+
+Random effects:
+                  est.   lower  upper
+SD.log_k_JCZ38  1.3178 0.47602 2.1596
+SD.log_k_J9Z38  0.7022 0.15061 1.2538
+SD.log_k_JSE76  0.6566 0.15613 1.1570
+SD.f_cyan_ilr_1 0.3409 0.11666 0.5652
+SD.f_cyan_ilr_2 0.4385 0.09482 0.7821
+SD.log_k1       0.7381 0.25599 1.2202
+SD.log_k2       0.5133 0.18152 0.8450
+SD.g_qlogis     0.9866 0.35681 1.6164
+
+Variance model:
+     est. lower upper
+a.1 2.746 2.593 2.899
+
+Backtransformed parameters:
+                      est. lower upper
+cyan_0           1.026e+02    NA    NA
+k_JCZ38          5.314e-02    NA    NA
+k_J9Z38          5.732e-03    NA    NA
+k_JSE76          2.626e-02    NA    NA
+f_cyan_to_JCZ38  6.051e-01    NA    NA
+f_cyan_to_J9Z38  2.251e-01    NA    NA
+f_JCZ38_to_JSE76 1.000e+00    NA    NA
+f_JSE76_to_JCZ38 8.772e-01    NA    NA
+k1               1.422e-01    NA    NA
+k2               1.140e-02    NA    NA
+g                3.783e-01    NA    NA
+
+Resulting formation fractions:
+                ff
+cyan_JCZ38  0.6051
+cyan_J9Z38  0.2251
+cyan_sink   0.1698
+JCZ38_JSE76 1.0000
+JCZ38_sink  0.0000
+JSE76_JCZ38 0.8772
+JSE76_sink  0.1228
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_k1 DT50_k2
+cyan   22.05 160.35    48.27   4.873   60.83
+JCZ38  13.04  43.33       NA      NA      NA
+J9Z38 120.93 401.73       NA      NA      NA
+JSE76  26.39  87.68       NA      NA      NA
+
+
+

+ +Hierarchical DFOP path 2 fit with reduced random effects, two-component +error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:12:54 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * cyan
+d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 +
+           f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 -
+           g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
+           exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 886.298 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+        cyan_0    log_k_JCZ38    log_k_J9Z38    log_k_JSE76   f_cyan_ilr_1 
+      101.7393        -1.4493        -5.0118        -2.1269         0.6720 
+  f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis         log_k1         log_k2 
+        7.3362        13.4423        13.2659        -2.0061        -4.5527 
+      g_qlogis 
+       -0.5806 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+               cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1
+cyan_0          5.604        0.00       0.000       0.000       0.0000
+log_k_JCZ38     0.000        2.77       0.000       0.000       0.0000
+log_k_J9Z38     0.000        0.00       1.662       0.000       0.0000
+log_k_JSE76     0.000        0.00       0.000       5.021       0.0000
+f_cyan_ilr_1    0.000        0.00       0.000       0.000       0.6519
+f_cyan_ilr_2    0.000        0.00       0.000       0.000       0.0000
+f_JCZ38_qlogis  0.000        0.00       0.000       0.000       0.0000
+f_JSE76_qlogis  0.000        0.00       0.000       0.000       0.0000
+log_k1          0.000        0.00       0.000       0.000       0.0000
+log_k2          0.000        0.00       0.000       0.000       0.0000
+g_qlogis        0.000        0.00       0.000       0.000       0.0000
+               f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2
+cyan_0                 0.00           0.00           0.00 0.0000 0.0000
+log_k_JCZ38            0.00           0.00           0.00 0.0000 0.0000
+log_k_J9Z38            0.00           0.00           0.00 0.0000 0.0000
+log_k_JSE76            0.00           0.00           0.00 0.0000 0.0000
+f_cyan_ilr_1           0.00           0.00           0.00 0.0000 0.0000
+f_cyan_ilr_2          13.37           0.00           0.00 0.0000 0.0000
+f_JCZ38_qlogis         0.00          14.21           0.00 0.0000 0.0000
+f_JSE76_qlogis         0.00           0.00          14.58 0.0000 0.0000
+log_k1                 0.00           0.00           0.00 0.8453 0.0000
+log_k2                 0.00           0.00           0.00 0.0000 0.5969
+g_qlogis               0.00           0.00           0.00 0.0000 0.0000
+               g_qlogis
+cyan_0             0.00
+log_k_JCZ38        0.00
+log_k_J9Z38        0.00
+log_k_JSE76        0.00
+f_cyan_ilr_1       0.00
+f_cyan_ilr_2       0.00
+f_JCZ38_qlogis     0.00
+f_JSE76_qlogis     0.00
+log_k1             0.00
+log_k2             0.00
+g_qlogis           1.69
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2237 2229  -1099
+
+Optimised parameters:
+                     est.   lower   upper
+cyan_0          101.00243      NA      NA
+log_k_JCZ38      -2.80828      NA      NA
+log_k_J9Z38      -5.04449      NA      NA
+log_k_JSE76      -3.66981      NA      NA
+f_cyan_ilr_1      0.72564      NA      NA
+f_cyan_ilr_2      1.37978      NA      NA
+f_JCZ38_qlogis    1.98726      NA      NA
+f_JSE76_qlogis  414.80884      NA      NA
+log_k1           -2.38601      NA      NA
+log_k2           -4.63632      NA      NA
+g_qlogis         -0.33920      NA      NA
+a.1               2.10837 1.91261 2.30413
+b.1               0.06223 0.05085 0.07361
+SD.log_k_JCZ38    1.30902 0.48128 2.13675
+SD.log_k_J9Z38    0.83882 0.25790 1.41974
+SD.log_k_JSE76    0.58104 0.14201 1.02008
+SD.f_cyan_ilr_1   0.35421 0.12398 0.58443
+SD.f_cyan_ilr_2   0.79373 0.12007 1.46739
+SD.log_k2         0.27476 0.08557 0.46394
+SD.g_qlogis       0.96170 0.35463 1.56878
+
+Correlation is not available
+
+Random effects:
+                  est.   lower  upper
+SD.log_k_JCZ38  1.3090 0.48128 2.1367
+SD.log_k_J9Z38  0.8388 0.25790 1.4197
+SD.log_k_JSE76  0.5810 0.14201 1.0201
+SD.f_cyan_ilr_1 0.3542 0.12398 0.5844
+SD.f_cyan_ilr_2 0.7937 0.12007 1.4674
+SD.log_k2       0.2748 0.08557 0.4639
+SD.g_qlogis     0.9617 0.35463 1.5688
+
+Variance model:
+       est.   lower   upper
+a.1 2.10837 1.91261 2.30413
+b.1 0.06223 0.05085 0.07361
+
+Backtransformed parameters:
+                      est. lower upper
+cyan_0           1.010e+02    NA    NA
+k_JCZ38          6.031e-02    NA    NA
+k_J9Z38          6.445e-03    NA    NA
+k_JSE76          2.548e-02    NA    NA
+f_cyan_to_JCZ38  6.808e-01    NA    NA
+f_cyan_to_J9Z38  2.440e-01    NA    NA
+f_JCZ38_to_JSE76 8.795e-01    NA    NA
+f_JSE76_to_JCZ38 1.000e+00    NA    NA
+k1               9.200e-02    NA    NA
+k2               9.693e-03    NA    NA
+g                4.160e-01    NA    NA
+
+Resulting formation fractions:
+                 ff
+cyan_JCZ38  0.68081
+cyan_J9Z38  0.24398
+cyan_sink   0.07521
+JCZ38_JSE76 0.87945
+JCZ38_sink  0.12055
+JSE76_JCZ38 1.00000
+JSE76_sink  0.00000
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_k1 DT50_k2
+cyan   25.00 182.05     54.8   7.535   71.51
+JCZ38  11.49  38.18       NA      NA      NA
+J9Z38 107.55 357.28       NA      NA      NA
+JSE76  27.20  90.36       NA      NA      NA
+
+
+

+ +Hierarchical SFORB path 2 fit with reduced random effects, constant +variance + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:12:32 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound *
+           cyan_free + k_cyan_bound_free * cyan_bound
+d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free *
+           cyan_bound
+d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38
+           * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38
+           * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 865.121 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+          cyan_free_0       log_k_cyan_free log_k_cyan_free_bound 
+             102.4395               -2.7673               -2.8942 
+log_k_cyan_bound_free           log_k_JCZ38           log_k_J9Z38 
+              -3.6201               -2.3107               -5.3123 
+          log_k_JSE76          f_cyan_ilr_1          f_cyan_ilr_2 
+              -3.7120                0.6754                1.1448 
+       f_JCZ38_qlogis        f_JSE76_qlogis 
+              14.8408               15.4734 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+                      cyan_free_0 log_k_cyan_free log_k_cyan_free_bound
+cyan_free_0                 4.589          0.0000                  0.00
+log_k_cyan_free             0.000          0.4849                  0.00
+log_k_cyan_free_bound       0.000          0.0000                  1.62
+log_k_cyan_bound_free       0.000          0.0000                  0.00
+log_k_JCZ38                 0.000          0.0000                  0.00
+log_k_J9Z38                 0.000          0.0000                  0.00
+log_k_JSE76                 0.000          0.0000                  0.00
+f_cyan_ilr_1                0.000          0.0000                  0.00
+f_cyan_ilr_2                0.000          0.0000                  0.00
+f_JCZ38_qlogis              0.000          0.0000                  0.00
+f_JSE76_qlogis              0.000          0.0000                  0.00
+                      log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76
+cyan_free_0                           0.000      0.0000       0.000         0.0
+log_k_cyan_free                       0.000      0.0000       0.000         0.0
+log_k_cyan_free_bound                 0.000      0.0000       0.000         0.0
+log_k_cyan_bound_free                 1.197      0.0000       0.000         0.0
+log_k_JCZ38                           0.000      0.7966       0.000         0.0
+log_k_J9Z38                           0.000      0.0000       1.561         0.0
+log_k_JSE76                           0.000      0.0000       0.000         0.8
+f_cyan_ilr_1                          0.000      0.0000       0.000         0.0
+f_cyan_ilr_2                          0.000      0.0000       0.000         0.0
+f_JCZ38_qlogis                        0.000      0.0000       0.000         0.0
+f_JSE76_qlogis                        0.000      0.0000       0.000         0.0
+                      f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis
+cyan_free_0                 0.0000        0.000            0.0           0.00
+log_k_cyan_free             0.0000        0.000            0.0           0.00
+log_k_cyan_free_bound       0.0000        0.000            0.0           0.00
+log_k_cyan_bound_free       0.0000        0.000            0.0           0.00
+log_k_JCZ38                 0.0000        0.000            0.0           0.00
+log_k_J9Z38                 0.0000        0.000            0.0           0.00
+log_k_JSE76                 0.0000        0.000            0.0           0.00
+f_cyan_ilr_1                0.6349        0.000            0.0           0.00
+f_cyan_ilr_2                0.0000        1.797            0.0           0.00
+f_JCZ38_qlogis              0.0000        0.000           15.6           0.00
+f_JSE76_qlogis              0.0000        0.000            0.0          17.52
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2280 2272  -1120
+
+Optimised parameters:
+                              est.   lower  upper
+cyan_free_0               102.6532      NA     NA
+log_k_cyan_free            -2.8547      NA     NA
+log_k_cyan_free_bound      -2.7004      NA     NA
+log_k_cyan_bound_free      -3.5078      NA     NA
+log_k_JCZ38                -2.9255      NA     NA
+log_k_J9Z38                -5.1089      NA     NA
+log_k_JSE76                -3.6263      NA     NA
+f_cyan_ilr_1                0.6873      NA     NA
+f_cyan_ilr_2                0.6498      NA     NA
+f_JCZ38_qlogis           3624.2149      NA     NA
+f_JSE76_qlogis              1.9991      NA     NA
+a.1                         2.7472 2.55559 2.9388
+SD.log_k_cyan_free          0.3227 0.10296 0.5423
+SD.log_k_cyan_free_bound    0.8757 0.29525 1.4562
+SD.log_k_cyan_bound_free    0.6128 0.20220 1.0233
+SD.log_k_JCZ38              1.3431 0.48474 2.2014
+SD.log_k_J9Z38              0.6881 0.14714 1.2291
+SD.log_k_JSE76              0.6461 0.15321 1.1390
+SD.f_cyan_ilr_1             0.3361 0.11376 0.5585
+SD.f_cyan_ilr_2             0.4286 0.08419 0.7730
+
+Correlation is not available
+
+Random effects:
+                           est.   lower  upper
+SD.log_k_cyan_free       0.3227 0.10296 0.5423
+SD.log_k_cyan_free_bound 0.8757 0.29525 1.4562
+SD.log_k_cyan_bound_free 0.6128 0.20220 1.0233
+SD.log_k_JCZ38           1.3431 0.48474 2.2014
+SD.log_k_J9Z38           0.6881 0.14714 1.2291
+SD.log_k_JSE76           0.6461 0.15321 1.1390
+SD.f_cyan_ilr_1          0.3361 0.11376 0.5585
+SD.f_cyan_ilr_2          0.4286 0.08419 0.7730
+
+Variance model:
+     est. lower upper
+a.1 2.747 2.556 2.939
+
+Backtransformed parameters:
+                          est. lower upper
+cyan_free_0          1.027e+02    NA    NA
+k_cyan_free          5.758e-02    NA    NA
+k_cyan_free_bound    6.718e-02    NA    NA
+k_cyan_bound_free    2.996e-02    NA    NA
+k_JCZ38              5.364e-02    NA    NA
+k_J9Z38              6.042e-03    NA    NA
+k_JSE76              2.662e-02    NA    NA
+f_cyan_free_to_JCZ38 6.039e-01    NA    NA
+f_cyan_free_to_J9Z38 2.285e-01    NA    NA
+f_JCZ38_to_JSE76     1.000e+00    NA    NA
+f_JSE76_to_JCZ38     8.807e-01    NA    NA
+
+Estimated Eigenvalues of SFORB model(s):
+cyan_b1 cyan_b2  cyan_g 
+ 0.1426  0.0121  0.3484 
+
+Resulting formation fractions:
+                    ff
+cyan_free_JCZ38 0.6039
+cyan_free_J9Z38 0.2285
+cyan_free_sink  0.1676
+cyan_free       1.0000
+JCZ38_JSE76     1.0000
+JCZ38_sink      0.0000
+JSE76_JCZ38     0.8807
+JSE76_sink      0.1193
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_cyan_b1 DT50_cyan_b2
+cyan   23.84 154.95    46.65         4.86        57.31
+JCZ38  12.92  42.93       NA           NA           NA
+J9Z38 114.71 381.07       NA           NA           NA
+JSE76  26.04  86.51       NA           NA           NA
+
+
+

+ +Hierarchical SFORB path 2 fit with reduced random effects, two-component +error + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:12:36 2025 
+Date of summary: Fri Feb 14 08:12:55 2025 
+
+Equations:
+d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound *
+           cyan_free + k_cyan_bound_free * cyan_bound
+d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free *
+           cyan_bound
+d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38
+           * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76
+d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38
+           * J9Z38
+d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76
+
+Data:
+433 observations of 4 variable(s) grouped in 5 datasets
+
+Model predictions using solution type deSolve 
+
+Fitted in 868.952 s
+Using 300, 100 iterations and 10 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+          cyan_free_0       log_k_cyan_free log_k_cyan_free_bound 
+             101.7511               -2.8370               -3.0162 
+log_k_cyan_bound_free           log_k_JCZ38           log_k_J9Z38 
+              -3.6600               -2.2988               -5.3129 
+          log_k_JSE76          f_cyan_ilr_1          f_cyan_ilr_2 
+              -3.6991                0.6722                4.8596 
+       f_JCZ38_qlogis        f_JSE76_qlogis 
+              13.4678               14.2149 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+                      cyan_free_0 log_k_cyan_free log_k_cyan_free_bound
+cyan_free_0                 5.629           0.000                 0.000
+log_k_cyan_free             0.000           0.446                 0.000
+log_k_cyan_free_bound       0.000           0.000                 1.449
+log_k_cyan_bound_free       0.000           0.000                 0.000
+log_k_JCZ38                 0.000           0.000                 0.000
+log_k_J9Z38                 0.000           0.000                 0.000
+log_k_JSE76                 0.000           0.000                 0.000
+f_cyan_ilr_1                0.000           0.000                 0.000
+f_cyan_ilr_2                0.000           0.000                 0.000
+f_JCZ38_qlogis              0.000           0.000                 0.000
+f_JSE76_qlogis              0.000           0.000                 0.000
+                      log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76
+cyan_free_0                           0.000      0.0000       0.000      0.0000
+log_k_cyan_free                       0.000      0.0000       0.000      0.0000
+log_k_cyan_free_bound                 0.000      0.0000       0.000      0.0000
+log_k_cyan_bound_free                 1.213      0.0000       0.000      0.0000
+log_k_JCZ38                           0.000      0.7801       0.000      0.0000
+log_k_J9Z38                           0.000      0.0000       1.575      0.0000
+log_k_JSE76                           0.000      0.0000       0.000      0.8078
+f_cyan_ilr_1                          0.000      0.0000       0.000      0.0000
+f_cyan_ilr_2                          0.000      0.0000       0.000      0.0000
+f_JCZ38_qlogis                        0.000      0.0000       0.000      0.0000
+f_JSE76_qlogis                        0.000      0.0000       0.000      0.0000
+                      f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis
+cyan_free_0                 0.0000        0.000           0.00           0.00
+log_k_cyan_free             0.0000        0.000           0.00           0.00
+log_k_cyan_free_bound       0.0000        0.000           0.00           0.00
+log_k_cyan_bound_free       0.0000        0.000           0.00           0.00
+log_k_JCZ38                 0.0000        0.000           0.00           0.00
+log_k_J9Z38                 0.0000        0.000           0.00           0.00
+log_k_JSE76                 0.0000        0.000           0.00           0.00
+f_cyan_ilr_1                0.6518        0.000           0.00           0.00
+f_cyan_ilr_2                0.0000        9.981           0.00           0.00
+f_JCZ38_qlogis              0.0000        0.000          14.26           0.00
+f_JSE76_qlogis              0.0000        0.000           0.00          16.17
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+   AIC  BIC logLik
+  2241 2233  -1101
+
+Optimised parameters:
+                              est.   lower   upper
+cyan_free_0              100.95469      NA      NA
+log_k_cyan_free           -3.18706      NA      NA
+log_k_cyan_free_bound     -3.38455      NA      NA
+log_k_cyan_bound_free     -3.75788      NA      NA
+log_k_JCZ38               -2.77024      NA      NA
+log_k_J9Z38               -5.03665      NA      NA
+log_k_JSE76               -3.60289      NA      NA
+f_cyan_ilr_1               0.72263      NA      NA
+f_cyan_ilr_2               1.45352      NA      NA
+f_JCZ38_qlogis             2.00778      NA      NA
+f_JSE76_qlogis           941.58570      NA      NA
+a.1                        2.11130 1.91479 2.30780
+b.1                        0.06299 0.05152 0.07445
+SD.log_k_cyan_free         0.50098 0.18805 0.81390
+SD.log_k_cyan_bound_free   0.31671 0.08467 0.54875
+SD.log_k_JCZ38             1.25865 0.45932 2.05798
+SD.log_k_J9Z38             0.86833 0.27222 1.46444
+SD.log_k_JSE76             0.59325 0.14711 1.03940
+SD.f_cyan_ilr_1            0.35705 0.12521 0.58890
+SD.f_cyan_ilr_2            0.88541 0.13797 1.63286
+
+Correlation is not available
+
+Random effects:
+                           est.   lower  upper
+SD.log_k_cyan_free       0.5010 0.18805 0.8139
+SD.log_k_cyan_bound_free 0.3167 0.08467 0.5487
+SD.log_k_JCZ38           1.2587 0.45932 2.0580
+SD.log_k_J9Z38           0.8683 0.27222 1.4644
+SD.log_k_JSE76           0.5933 0.14711 1.0394
+SD.f_cyan_ilr_1          0.3571 0.12521 0.5889
+SD.f_cyan_ilr_2          0.8854 0.13797 1.6329
+
+Variance model:
+       est.   lower   upper
+a.1 2.11130 1.91479 2.30780
+b.1 0.06299 0.05152 0.07445
+
+Backtransformed parameters:
+                          est. lower upper
+cyan_free_0          1.010e+02    NA    NA
+k_cyan_free          4.129e-02    NA    NA
+k_cyan_free_bound    3.389e-02    NA    NA
+k_cyan_bound_free    2.333e-02    NA    NA
+k_JCZ38              6.265e-02    NA    NA
+k_J9Z38              6.495e-03    NA    NA
+k_JSE76              2.724e-02    NA    NA
+f_cyan_free_to_JCZ38 6.844e-01    NA    NA
+f_cyan_free_to_J9Z38 2.463e-01    NA    NA
+f_JCZ38_to_JSE76     8.816e-01    NA    NA
+f_JSE76_to_JCZ38     1.000e+00    NA    NA
+
+Estimated Eigenvalues of SFORB model(s):
+cyan_b1 cyan_b2  cyan_g 
+0.08751 0.01101 0.39586 
+
+Resulting formation fractions:
+                     ff
+cyan_free_JCZ38 0.68444
+cyan_free_J9Z38 0.24633
+cyan_free_sink  0.06923
+cyan_free       1.00000
+JCZ38_JSE76     0.88161
+JCZ38_sink      0.11839
+JSE76_JCZ38     1.00000
+JSE76_sink      0.00000
+
+Estimated disappearance times:
+        DT50   DT90 DT50back DT50_cyan_b1 DT50_cyan_b2
+cyan   25.36 163.36    49.18        7.921        62.95
+JCZ38  11.06  36.75       NA           NA           NA
+J9Z38 106.71 354.49       NA           NA           NA
+JSE76  25.44  84.51       NA           NA           NA
+
+
+

+
+
+
+

Session info +

+
R version 4.4.2 (2024-10-31)
+Platform: x86_64-pc-linux-gnu
+Running under: Debian GNU/Linux 12 (bookworm)
+
+Matrix products: default
+BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 
+LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0
+
+locale:
+ [1] LC_CTYPE=de_DE.UTF-8       LC_NUMERIC=C              
+ [3] LC_TIME=de_DE.UTF-8        LC_COLLATE=de_DE.UTF-8    
+ [5] LC_MONETARY=de_DE.UTF-8    LC_MESSAGES=de_DE.UTF-8   
+ [7] LC_PAPER=de_DE.UTF-8       LC_NAME=C                 
+ [9] LC_ADDRESS=C               LC_TELEPHONE=C            
+[11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       
+
+time zone: Europe/Berlin
+tzcode source: system (glibc)
+
+attached base packages:
+[1] parallel  stats     graphics  grDevices utils     datasets  methods  
+[8] base     
+
+other attached packages:
+[1] rmarkdown_2.29  nvimcom_0.9-167 saemix_3.3      npde_3.5       
+[5] knitr_1.49      mkin_1.2.10    
+
+loaded via a namespace (and not attached):
+ [1] sass_0.4.9        utf8_1.2.4        generics_0.1.3    lattice_0.22-6   
+ [5] digest_0.6.37     magrittr_2.0.3    evaluate_1.0.1    grid_4.4.2       
+ [9] fastmap_1.2.0     cellranger_1.1.0  jsonlite_1.8.9    processx_3.8.4   
+[13] pkgbuild_1.4.5    deSolve_1.40      mclust_6.1.1      ps_1.8.1         
+[17] gridExtra_2.3     fansi_1.0.6       scales_1.3.0      codetools_0.2-20 
+[21] textshaping_0.4.1 jquerylib_0.1.4   cli_3.6.3         rlang_1.1.4      
+[25] munsell_0.5.1     cachem_1.1.0      yaml_2.3.10       inline_0.3.20    
+[29] tools_4.4.2       dplyr_1.1.4       colorspace_2.1-1  ggplot2_3.5.1    
+[33] vctrs_0.6.5       R6_2.5.1          zoo_1.8-12        lifecycle_1.0.4  
+[37] fs_1.6.5          htmlwidgets_1.6.4 MASS_7.3-61       ragg_1.3.3       
+[41] callr_3.7.6       pkgconfig_2.0.3   desc_1.4.3        pkgdown_2.1.1    
+[45] pillar_1.9.0      bslib_0.8.0       gtable_0.3.6      glue_1.8.0       
+[49] systemfonts_1.1.0 xfun_0.49         tibble_3.2.1      lmtest_0.9-40    
+[53] tidyselect_1.2.1  htmltools_0.5.8.1 nlme_3.1-166      compiler_4.4.2   
+[57] readxl_1.4.3     
+
+
+

Hardware info +

+
CPU model: AMD Ryzen 9 7950X 16-Core Processor
+
MemTotal:       64927788 kB
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-13-1.png b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-13-1.png new file mode 100644 index 00000000..d2201974 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-13-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-14-1.png b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-14-1.png new file mode 100644 index 00000000..7380ba4c Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-14-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-15-1.png b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-15-1.png new file mode 100644 index 00000000..4de15105 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-15-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-20-1.png b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-20-1.png new file mode 100644 index 00000000..d57badf1 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-20-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-21-1.png b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-21-1.png new file mode 100644 index 00000000..eb629c4d Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-21-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-22-1.png b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-22-1.png new file mode 100644 index 00000000..a2abb2f7 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-22-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-7-1.png b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-7-1.png new file mode 100644 index 00000000..28ec82ba Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-7-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-8-1.png b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-8-1.png new file mode 100644 index 00000000..a2abb2f7 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_cyan_pathway_files/figure-html/unnamed-chunk-8-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent.html b/docs/dev/articles/prebuilt/2022_dmta_parent.html new file mode 100644 index 00000000..d900cf00 --- /dev/null +++ b/docs/dev/articles/prebuilt/2022_dmta_parent.html @@ -0,0 +1,2166 @@ + + + + + + + +Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

Introduction +

+

The purpose of this document is to demonstrate how nonlinear +hierarchical models (NLHM) based on the parent degradation models SFO, +FOMC, DFOP and HS can be fitted with the mkin package.

+

It was assembled in the course of work package 1.1 of Project Number +173340 (Application of nonlinear hierarchical models to the kinetic +evaluation of chemical degradation data) of the German Environment +Agency carried out in 2022 and 2023.

+

The mkin package is used in version 1.2.10. It contains the test data +and the functions used in the evaluations. The saemix +package is used as a backend for fitting the NLHM, but is also loaded to +make the convergence plot function available.

+

This document is processed with the knitr package, which +also provides the kable function that is used to improve +the display of tabular data in R markdown documents. For parallel +processing, the parallel package is used.

+
+library(mkin)
+library(knitr)
+library(saemix)
+library(parallel)
+n_cores <- detectCores()
+if (Sys.info()["sysname"] == "Windows") {
+  cl <- makePSOCKcluster(n_cores)
+} else {
+  cl <- makeForkCluster(n_cores)
+}
+
+
+

Data +

+

The test data are available in the mkin package as an object of class +mkindsg (mkin dataset group) under the identifier +dimethenamid_2018. The following preprocessing steps are +still necessary:

+
    +
  • The data available for the enantiomer dimethenamid-P (DMTAP) are +renamed to have the same substance name as the data for the racemic +mixture dimethenamid (DMTA). The reason for this is that no difference +between their degradation behaviour was identified in the EU risk +assessment.
  • +
  • The data for transformation products and unnecessary columns are +discarded
  • +
  • The observation times of each dataset are multiplied with the +corresponding normalisation factor also available in the dataset, in +order to make it possible to describe all datasets with a single set of +parameters that are independent of temperature
  • +
  • Finally, datasets observed in the same soil (Elliot 1 +and Elliot 2) are combined, resulting in dimethenamid +(DMTA) data from six soils.
  • +
+

The following commented R code performs this preprocessing.

+
+# Apply a function to each of the seven datasets in the mkindsg object to create a list
+dmta_ds <- lapply(1:7, function(i) {
+  ds_i <- dimethenamid_2018$ds[[i]]$data                     # Get a dataset
+  ds_i[ds_i$name == "DMTAP", "name"] <-  "DMTA"              # Rename DMTAP to DMTA
+  ds_i <- subset(ds_i, name == "DMTA", c("name", "time", "value")) # Select data
+  ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i]  # Normalise time
+  ds_i                                                       # Return the dataset
+})
+
+# Use dataset titles as names for the list elements
+names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title)
+
+# Combine data for Elliot soil to obtain a named list with six elements
+dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]]) #
+dmta_ds[["Elliot 1"]] <- NULL
+dmta_ds[["Elliot 2"]] <- NULL
+

The following tables show the 6 datasets.

+
+for (ds_name in names(dmta_ds)) {
+    print(kable(mkin_long_to_wide(dmta_ds[[ds_name]]),
+      caption = paste("Dataset", ds_name),
+      label = paste0("tab:", ds_name), booktabs = TRUE))
+    cat("\n\\clearpage\n")
+}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Calke
timeDMTA
095.8
098.7
1460.5
3039.1
5915.2
1204.8
1204.6
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Borstel
timeDMTA
0.000000100.5
0.00000099.6
1.94129591.9
1.94129591.3
6.79453481.8
6.79453482.1
13.58906769.1
13.58906768.0
27.17813551.4
27.17813551.4
56.29756527.6
56.29756526.8
86.38764315.7
86.38764315.3
115.5070737.9
115.5070738.1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Flaach
timeDMTA
0.000000096.5
0.000000096.8
0.000000097.0
0.623385682.9
0.623385686.7
0.623385687.4
1.870156772.8
1.870156769.9
1.870156771.9
4.363698951.4
4.363698952.9
4.363698948.6
8.727397928.5
8.727397927.3
8.727397927.5
13.091096814.8
13.091096813.4
13.091096814.4
17.45479577.7
17.45479577.3
17.45479578.1
26.18219362.0
26.18219361.5
26.18219361.9
34.90959151.3
34.90959151.0
34.90959151.1
43.63698930.9
43.63698930.7
43.63698930.7
52.36438720.6
52.36438720.4
52.36438720.5
74.80626740.4
74.80626740.3
74.80626740.3
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset BBA 2.2
timeDMTA
0.000000098.09
0.000000098.77
0.767892293.52
0.767892292.03
2.303676588.39
2.303676587.18
5.375245269.38
5.375245271.06
10.750490445.21
10.750490446.81
16.125735530.54
16.125735530.07
21.500980721.60
21.500980720.41
32.25147119.10
32.25147119.70
43.00196146.58
43.00196146.31
53.75245183.47
53.75245183.52
64.50294213.40
64.50294213.67
91.37916801.62
91.37916801.62
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset BBA 2.3
timeDMTA
0.000000099.33
0.000000097.44
0.673393893.73
0.673393893.77
2.020181487.84
2.020181489.82
4.713756571.61
4.713756571.42
9.427513145.60
9.427513145.42
14.141269631.12
14.141269631.68
18.855026223.20
18.855026224.13
28.28253939.43
28.28253939.82
37.71005237.08
37.71005238.64
47.13756544.41
47.13756544.78
56.56507854.92
56.56507855.08
80.13386122.13
80.13386122.23
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Elliot
timeDMTA
0.00000097.5
0.000000100.7
1.22847886.4
1.22847888.5
3.68543569.8
3.68543577.1
8.59934959.0
8.59934954.2
17.19869731.3
17.19869733.5
25.79804619.6
25.79804620.9
34.39739513.3
34.39739515.8
51.5960926.7
51.5960928.7
68.7947898.8
68.7947898.7
103.1921846.0
103.1921844.4
146.1889283.3
146.1889282.8
223.5830661.4
223.5830661.8
0.00000093.4
0.000000103.2
1.22847889.2
1.22847886.6
3.68543578.2
3.68543578.1
8.59934955.6
8.59934953.0
17.19869733.7
17.19869733.2
25.79804620.9
25.79804619.9
34.39739518.2
34.39739512.7
51.5960927.8
51.5960929.0
68.79478911.4
68.7947899.0
103.1921843.9
103.1921844.4
146.1889282.6
146.1889283.4
223.5830662.0
223.5830661.7
+
+
+

Separate evaluations +

+

In order to obtain suitable starting parameters for the NLHM fits, +separate fits of the four models to the data for each soil are generated +using the mmkin function from the mkin +package. In a first step, constant variance is assumed. Convergence is +checked with the status function.

+
+deg_mods <- c("SFO", "FOMC", "DFOP", "HS")
+f_sep_const <- mmkin(
+  deg_mods,
+  dmta_ds,
+  error_model = "const",
+  quiet = TRUE)
+
+status(f_sep_const) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CalkeBorstelFlaachBBA 2.2BBA 2.3Elliot
SFOOKOKOKOKOKOK
FOMCOKOKOKOKOKOK
DFOPOKOKOKOKOKOK
HSOKOKOKCOKOK
+

In the table above, OK indicates convergence, and C indicates failure +to converge. All separate fits with constant variance converged, with +the sole exception of the HS fit to the BBA 2.2 data. To prepare for +fitting NLHM using the two-component error model, the separate fits are +updated assuming two-component error.

+
+f_sep_tc <- update(f_sep_const, error_model = "tc")
+status(f_sep_tc) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CalkeBorstelFlaachBBA 2.2BBA 2.3Elliot
SFOOKOKOKOKOKOK
FOMCOKOKOKOKCOK
DFOPOKOKOKOKCOK
HSOKOKOKOKOKOK
+

Using the two-component error model, the one fit that did not +converge with constant variance did converge, but other non-SFO fits +failed to converge.

+
+
+

Hierarchichal model fits +

+

The following code fits eight versions of hierarchical models to the +data, using SFO, FOMC, DFOP and HS for the parent compound, and using +either constant variance or two-component error for the error model. The +default parameter distribution model in mkin allows for variation of all +degradation parameters across the assumed population of soils. In other +words, each degradation parameter is associated with a random effect as +a first step. The mhmkin function makes it possible to fit +all eight versions in parallel (given a sufficient number of computing +cores being available) to save execution time.

+

Convergence plots and summaries for these fits are shown in the +appendix.

+
+f_saem <- mhmkin(list(f_sep_const, f_sep_tc), transformations = "saemix")
+

The output of the status function shows that all fits +terminated successfully.

+
+status(f_saem) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
SFOOKOK
FOMCOKOK
DFOPOKOK
HSOKOK
+

The AIC and BIC values show that the biphasic models DFOP and HS give +the best fits.

+
+anova(f_saem) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
SFO const5796.3795.3-393.2
SFO tc6798.3797.1-393.2
FOMC const7734.2732.7-360.1
FOMC tc8720.7719.1-352.4
DFOP const9711.8710.0-346.9
HS const9714.0712.1-348.0
DFOP tc10665.7663.6-322.9
HS tc10667.1665.0-323.6
+

The DFOP model is preferred here, as it has a better mechanistic +basis for batch experiments with constant incubation conditions. Also, +it shows the lowest AIC and BIC values in the first set of fits when +combined with the two-component error model. Therefore, the DFOP model +was selected for further refinements of the fits with the aim to make +the model fully identifiable.

+
+

Parameter identifiability based on the Fisher Information +Matrix +

+

Using the illparms function, ill-defined statistical +model parameters such as standard deviations of the degradation +parameters in the population and error model parameters can be +found.

+
+illparms(f_saem) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
SFOb.1
FOMCsd(DMTA_0)
DFOPsd(k2)sd(k2)
HSsd(tb)
+

According to the illparms function, the fitted standard +deviation of the second kinetic rate constant k2 is +ill-defined in both DFOP fits. This suggests that different values would +be obtained for this standard deviation when using different starting +values.

+

The thus identified overparameterisation is addressed by removing the +random effect for k2 from the parameter model.

+
+f_saem_dfop_tc_no_ranef_k2 <- update(f_saem[["DFOP", "tc"]],
+  no_random_effect = "k2")
+

For the resulting fit, it is checked whether there are still +ill-defined parameters,

+
+illparms(f_saem_dfop_tc_no_ranef_k2)
+

which is not the case. Below, the refined model is compared with the +previous best model. The model without random effect for k2 +is a reduced version of the previous model. Therefore, the models are +nested and can be compared using the likelihood ratio test. This is +achieved with the argument test = TRUE to the +anova function.

+
+anova(f_saem[["DFOP", "tc"]], f_saem_dfop_tc_no_ranef_k2, test = TRUE) |>
+  kable(format.args = list(digits = 4))
+ ++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLikChisqDfPr(>Chisq)
f_saem_dfop_tc_no_ranef_k29663.7661.8-322.9NANANA
f_saem[[“DFOP”, “tc”]]10665.7663.6-322.9011
+

The AIC and BIC criteria are lower after removal of the ill-defined +random effect for k2. The p value of the likelihood ratio +test is much greater than 0.05, indicating that the model with the +higher likelihood (here the model with random effects for all +degradation parameters f_saem[["DFOP", "tc"]]) does not fit +significantly better than the model with the lower likelihood (the +reduced model f_saem_dfop_tc_no_ranef_k2).

+

Therefore, AIC, BIC and likelihood ratio test suggest the use of the +reduced model.

+

The convergence of the fit is checked visually.

+
+Convergence plot for the NLHM DFOP fit with two-component error and without a random effect on 'k2'

+Convergence plot for the NLHM DFOP fit with two-component error and +without a random effect on ‘k2’ +

+
+

All parameters appear to have converged to a satisfactory degree. The +final fit is plotted using the plot method from the mkin package.

+
+plot(f_saem_dfop_tc_no_ranef_k2)
+
+Plot of the final NLHM DFOP fit

+Plot of the final NLHM DFOP fit +

+
+

Finally, a summary report of the fit is produced.

+
+summary(f_saem_dfop_tc_no_ranef_k2)
+
saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:19 2025 
+Date of summary: Fri Feb 14 08:13:19 2025 
+
+Equations:
+d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 4.154 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+  DMTA_0       k1       k2        g 
+98.71186  0.08675  0.01374  0.93491 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 k1 k2 g
+DMTA_0  98.71  0  0 0
+k1       0.00  1  0 0
+k2       0.00  0  1 0
+g        0.00  0  0 1
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+    AIC   BIC logLik
+  663.7 661.8 -322.9
+
+Optimised parameters:
+               est.     lower     upper
+DMTA_0    98.256267 96.286112 100.22642
+k1         0.064037  0.033281   0.09479
+k2         0.008469  0.006002   0.01094
+g          0.954167  0.914460   0.99387
+a.1        1.061795  0.878608   1.24498
+b.1        0.029550  0.022593   0.03651
+SD.DMTA_0  2.068581  0.427178   3.70998
+SD.k1      0.598285  0.258235   0.93833
+SD.g       1.016689  0.360061   1.67332
+
+Correlation: 
+   DMTA_0  k1      k2     
+k1  0.0213                
+k2  0.0541  0.0344        
+g  -0.0521 -0.0286 -0.2744
+
+Random effects:
+            est.  lower  upper
+SD.DMTA_0 2.0686 0.4272 3.7100
+SD.k1     0.5983 0.2582 0.9383
+SD.g      1.0167 0.3601 1.6733
+
+Variance model:
+       est.   lower   upper
+a.1 1.06180 0.87861 1.24498
+b.1 0.02955 0.02259 0.03651
+
+Estimated disappearance times:
+      DT50  DT90 DT50back DT50_k1 DT50_k2
+DMTA 11.45 41.32    12.44   10.82   81.85
+
+
+

Alternative check of parameter identifiability +

+

The parameter check used in the illparms function is +based on a quadratic approximation of the likelihood surface near its +optimum, which is calculated using the Fisher Information Matrix (FIM). +An alternative way to check parameter identifiability (Duchesne et al. 2021) based on a multistart +approach has recently been implemented in mkin.

+

The graph below shows boxplots of the parameters obtained in 50 runs +of the saem algorithm with different parameter combinations, sampled +from the range of the parameters obtained for the individual datasets +fitted separately using nonlinear regression.

+
+f_saem_dfop_tc_multi <- multistart(f_saem[["DFOP", "tc"]], n = 50, cores = 15)
+
+par(mar = c(6.1, 4.1, 2.1, 2.1))
+parplot(f_saem_dfop_tc_multi, lpos = "bottomright", ylim = c(0.3, 10), las = 2)
+
+Scaled parameters from the multistart runs, full model

+Scaled parameters from the multistart runs, full model +

+
+

The graph clearly confirms the lack of identifiability of the +variance of k2 in the full model. The overparameterisation +of the model also indicates a lack of identifiability of the variance of +parameter g.

+

The parameter boxplots of the multistart runs with the reduced model +shown below indicate that all runs give similar results, regardless of +the starting parameters.

+
+f_saem_dfop_tc_no_ranef_k2_multi <- multistart(f_saem_dfop_tc_no_ranef_k2,
+  n = 50, cores = 15)
+
+par(mar = c(6.1, 4.1, 2.1, 2.1))
+parplot(f_saem_dfop_tc_no_ranef_k2_multi, ylim = c(0.5, 2), las = 2,
+  lpos = "bottomright")
+
+Scaled parameters from the multistart runs, reduced model

+Scaled parameters from the multistart runs, reduced model +

+
+

When only the parameters of the top 25% of the fits are shown (based +on a feature introduced in mkin 1.2.2 currently under development), the +scatter is even less as shown below.

+
+par(mar = c(6.1, 4.1, 2.1, 2.1))
+parplot(f_saem_dfop_tc_no_ranef_k2_multi, ylim = c(0.5, 2), las = 2, llquant = 0.25,
+  lpos = "bottomright")
+
+Scaled parameters from the multistart runs, reduced model, fits with the top 25\% likelihood values

+Scaled parameters from the multistart runs, reduced model, fits with the +top 25% likelihood values +

+
+
+
+
+

Conclusions +

+

Fitting the four parent degradation models SFO, FOMC, DFOP and HS as +part of hierarchical model fits with two different error models and +normal distributions of the transformed degradation parameters works +without technical problems. The biphasic models DFOP and HS gave the +best fit to the data, but the default parameter distribution model was +not fully identifiable. Removing the random effect for the second +kinetic rate constant of the DFOP model resulted in a reduced model that +was fully identifiable and showed the lowest values for the model +selection criteria AIC and BIC. The reliability of the identification of +all model parameters was confirmed using multiple starting values.

+
+
+

Acknowledgements +

+

The helpful comments by Janina Wöltjen of the German Environment +Agency are gratefully acknowledged.

+
+
+

References +

+
+
+Duchesne, Ronan, Anissa Guillemin, Olivier Gandrillon, and Fabien +Crauste. 2021. “Practical Identifiability in the Frame of +Nonlinear Mixed Effects Models: The Example of the in Vitro +Erythropoiesis.” BMC Bioinformatics 22 (478). https://doi.org/10.1186/s12859-021-04373-4. +
+
+
+
+

Appendix +

+
+

Hierarchical model fit listings +

+ +Hierarchical mkin fit of the SFO model with error model const + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:11 2025 
+Date of summary: Fri Feb 14 08:14:22 2025 
+
+Equations:
+d_DMTA/dt = - k_DMTA * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 0.869 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+ DMTA_0  k_DMTA 
+97.2953  0.0566 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 k_DMTA
+DMTA_0   97.3      0
+k_DMTA    0.0      1
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+    AIC   BIC logLik
+  796.3 795.3 -393.2
+
+Optimised parameters:
+              est.    lower   upper
+DMTA_0    97.28130 95.71113 98.8515
+k_DMTA     0.05665  0.02909  0.0842
+a.1        2.66442  2.35579  2.9731
+SD.DMTA_0  1.54776  0.15447  2.9411
+SD.k_DMTA  0.60690  0.26248  0.9513
+
+Correlation: 
+       DMTA_0
+k_DMTA 0.0168
+
+Random effects:
+            est.  lower  upper
+SD.DMTA_0 1.5478 0.1545 2.9411
+SD.k_DMTA 0.6069 0.2625 0.9513
+
+Variance model:
+     est. lower upper
+a.1 2.664 2.356 2.973
+
+Estimated disappearance times:
+      DT50  DT90
+DMTA 12.24 40.65
+
+
+

+ +Hierarchical mkin fit of the SFO model with error model tc + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:13 2025 
+Date of summary: Fri Feb 14 08:14:22 2025 
+
+Equations:
+d_DMTA/dt = - k_DMTA * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 2.423 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+  DMTA_0   k_DMTA 
+96.99175  0.05603 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 k_DMTA
+DMTA_0  96.99      0
+k_DMTA   0.00      1
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+    AIC   BIC logLik
+  798.3 797.1 -393.2
+
+Optimised parameters:
+               est.    lower    upper
+DMTA_0    97.271822 95.70316 98.84049
+k_DMTA     0.056638  0.02911  0.08417
+a.1        2.660081  2.27492  3.04525
+b.1        0.001665 -0.14451  0.14784
+SD.DMTA_0  1.545520  0.14301  2.94803
+SD.k_DMTA  0.606422  0.26227  0.95057
+
+Correlation: 
+       DMTA_0
+k_DMTA 0.0169
+
+Random effects:
+            est.  lower  upper
+SD.DMTA_0 1.5455 0.1430 2.9480
+SD.k_DMTA 0.6064 0.2623 0.9506
+
+Variance model:
+        est.   lower  upper
+a.1 2.660081  2.2749 3.0452
+b.1 0.001665 -0.1445 0.1478
+
+Estimated disappearance times:
+      DT50  DT90
+DMTA 12.24 40.65
+
+
+

+ +Hierarchical mkin fit of the FOMC model with error model const + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:11 2025 
+Date of summary: Fri Feb 14 08:14:22 2025 
+
+Equations:
+d_DMTA/dt = - (alpha/beta) * 1/((time/beta) + 1) * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 1.228 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+ DMTA_0   alpha    beta 
+ 98.292   9.909 156.341 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 alpha beta
+DMTA_0  98.29     0    0
+alpha    0.00     1    0
+beta     0.00     0    1
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+    AIC   BIC logLik
+  734.2 732.7 -360.1
+
+Optimised parameters:
+              est.   lower   upper
+DMTA_0     98.3435 96.9033  99.784
+alpha       7.2007  2.5889  11.812
+beta      112.8745 34.8816 190.867
+a.1         2.0459  1.8054   2.286
+SD.DMTA_0   1.4795  0.2717   2.687
+SD.alpha    0.6396  0.1509   1.128
+SD.beta     0.6874  0.1587   1.216
+
+Correlation: 
+      DMTA_0  alpha  
+alpha -0.1125        
+beta  -0.1227  0.3632
+
+Random effects:
+            est.  lower upper
+SD.DMTA_0 1.4795 0.2717 2.687
+SD.alpha  0.6396 0.1509 1.128
+SD.beta   0.6874 0.1587 1.216
+
+Variance model:
+     est. lower upper
+a.1 2.046 1.805 2.286
+
+Estimated disappearance times:
+      DT50  DT90 DT50back
+DMTA 11.41 42.53     12.8
+
+
+

+ +Hierarchical mkin fit of the FOMC model with error model tc + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:13 2025 
+Date of summary: Fri Feb 14 08:14:22 2025 
+
+Equations:
+d_DMTA/dt = - (alpha/beta) * 1/((time/beta) + 1) * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 2.87 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+DMTA_0  alpha   beta 
+98.772  4.663 92.597 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 alpha beta
+DMTA_0  98.77     0    0
+alpha    0.00     1    0
+beta     0.00     0    1
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+    AIC   BIC logLik
+  720.7 719.1 -352.4
+
+Optimised parameters:
+              est.    lower     upper
+DMTA_0    99.10577 97.33296 100.87859
+alpha      5.46260  2.52199   8.40321
+beta      81.66080 30.46664 132.85497
+a.1        1.50219  1.25801   1.74636
+b.1        0.02893  0.02048   0.03739
+SD.DMTA_0  1.61887 -0.03843   3.27618
+SD.alpha   0.58145  0.17364   0.98925
+SD.beta    0.68205  0.21108   1.15302
+
+Correlation: 
+      DMTA_0  alpha  
+alpha -0.1321        
+beta  -0.1430  0.2467
+
+Random effects:
+            est.    lower  upper
+SD.DMTA_0 1.6189 -0.03843 3.2762
+SD.alpha  0.5814  0.17364 0.9892
+SD.beta   0.6821  0.21108 1.1530
+
+Variance model:
+       est.   lower   upper
+a.1 1.50219 1.25801 1.74636
+b.1 0.02893 0.02048 0.03739
+
+Estimated disappearance times:
+      DT50  DT90 DT50back
+DMTA 11.05 42.81    12.89
+
+
+

+ +Hierarchical mkin fit of the DFOP model with error model const + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:12 2025 
+Date of summary: Fri Feb 14 08:14:22 2025 
+
+Equations:
+d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 1.843 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+  DMTA_0       k1       k2        g 
+98.64383  0.09211  0.02999  0.76814 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 k1 k2 g
+DMTA_0  98.64  0  0 0
+k1       0.00  1  0 0
+k2       0.00  0  1 0
+g        0.00  0  0 1
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+    AIC BIC logLik
+  711.8 710 -346.9
+
+Optimised parameters:
+               est.     lower    upper
+DMTA_0    98.092481 96.573899 99.61106
+k1         0.062499  0.030336  0.09466
+k2         0.009065 -0.005133  0.02326
+g          0.948967  0.862080  1.03586
+a.1        1.821671  1.604774  2.03857
+SD.DMTA_0  1.677785  0.472066  2.88350
+SD.k1      0.634962  0.270788  0.99914
+SD.k2      1.033498 -0.205994  2.27299
+SD.g       1.710046  0.428642  2.99145
+
+Correlation: 
+   DMTA_0  k1      k2     
+k1  0.0246                
+k2  0.0491  0.0953        
+g  -0.0552 -0.0889 -0.4795
+
+Random effects:
+           est.   lower  upper
+SD.DMTA_0 1.678  0.4721 2.8835
+SD.k1     0.635  0.2708 0.9991
+SD.k2     1.033 -0.2060 2.2730
+SD.g      1.710  0.4286 2.9914
+
+Variance model:
+     est. lower upper
+a.1 1.822 1.605 2.039
+
+Estimated disappearance times:
+      DT50 DT90 DT50back DT50_k1 DT50_k2
+DMTA 11.79 42.8    12.88   11.09   76.46
+
+
+

+ +Hierarchical mkin fit of the DFOP model with error model tc + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:14 2025 
+Date of summary: Fri Feb 14 08:14:22 2025 
+
+Equations:
+d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 3.469 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+  DMTA_0       k1       k2        g 
+98.71186  0.08675  0.01374  0.93491 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 k1 k2 g
+DMTA_0  98.71  0  0 0
+k1       0.00  1  0 0
+k2       0.00  0  1 0
+g        0.00  0  0 1
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+    AIC   BIC logLik
+  665.7 663.6 -322.9
+
+Optimised parameters:
+               est.     lower     upper
+DMTA_0    98.347470 96.380815 100.31413
+k1         0.064524  0.034279   0.09477
+k2         0.008304  0.005843   0.01076
+g          0.952128  0.909578   0.99468
+a.1        1.068907  0.883665   1.25415
+b.1        0.029265  0.022318   0.03621
+SD.DMTA_0  2.065796  0.427951   3.70364
+SD.k1      0.583703  0.251796   0.91561
+SD.k2      0.004167 -7.831228   7.83956
+SD.g       1.064450  0.397479   1.73142
+
+Correlation: 
+   DMTA_0  k1      k2     
+k1  0.0223                
+k2  0.0568  0.0394        
+g  -0.0464 -0.0269 -0.2713
+
+Random effects:
+              est.   lower  upper
+SD.DMTA_0 2.065796  0.4280 3.7036
+SD.k1     0.583703  0.2518 0.9156
+SD.k2     0.004167 -7.8312 7.8396
+SD.g      1.064450  0.3975 1.7314
+
+Variance model:
+       est.   lower   upper
+a.1 1.06891 0.88367 1.25415
+b.1 0.02927 0.02232 0.03621
+
+Estimated disappearance times:
+      DT50  DT90 DT50back DT50_k1 DT50_k2
+DMTA 11.39 41.36    12.45   10.74   83.48
+
+
+

+ +Hierarchical mkin fit of the HS model with error model const + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:12 2025 
+Date of summary: Fri Feb 14 08:14:22 2025 
+
+Equations:
+d_DMTA/dt = - ifelse(time <= tb, k1, k2) * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 1.698 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Constant variance 
+
+Starting values for degradation parameters:
+  DMTA_0       k1       k2       tb 
+97.82176  0.06931  0.02997 11.13945 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 k1 k2 tb
+DMTA_0  97.82  0  0  0
+k1       0.00  1  0  0
+k2       0.00  0  1  0
+tb       0.00  0  0  1
+
+Starting values for error model parameters:
+a.1 
+  1 
+
+Results:
+
+Likelihood computed by importance sampling
+  AIC   BIC logLik
+  714 712.1   -348
+
+Optimised parameters:
+              est.    lower    upper
+DMTA_0    98.16102 96.47747 99.84456
+k1         0.07876  0.05261  0.10491
+k2         0.02227  0.01706  0.02747
+tb        13.99089 -7.40049 35.38228
+a.1        1.82305  1.60700  2.03910
+SD.DMTA_0  1.88413  0.56204  3.20622
+SD.k1      0.34292  0.10482  0.58102
+SD.k2      0.19851  0.01718  0.37985
+SD.tb      1.68168  0.58064  2.78272
+
+Correlation: 
+   DMTA_0  k1      k2     
+k1  0.0142                
+k2  0.0001 -0.0025        
+tb  0.0165 -0.1256 -0.0301
+
+Random effects:
+            est.   lower  upper
+SD.DMTA_0 1.8841 0.56204 3.2062
+SD.k1     0.3429 0.10482 0.5810
+SD.k2     0.1985 0.01718 0.3798
+SD.tb     1.6817 0.58064 2.7827
+
+Variance model:
+     est. lower upper
+a.1 1.823 1.607 2.039
+
+Estimated disappearance times:
+      DT50  DT90 DT50back DT50_k1 DT50_k2
+DMTA 8.801 67.91    20.44   8.801   31.13
+
+
+

+ +Hierarchical mkin fit of the HS model with error model tc + +

+saemix version used for fitting:      3.3 
+mkin version used for pre-fitting:  1.2.10 
+R version used for fitting:         4.4.2 
+Date of fit:     Fri Feb 14 08:13:13 2025 
+Date of summary: Fri Feb 14 08:14:22 2025 
+
+Equations:
+d_DMTA/dt = - ifelse(time <= tb, k1, k2) * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Model predictions using solution type analytical 
+
+Fitted in 3.307 s
+Using 300, 100 iterations and 9 chains
+
+Variance model: Two-component variance function 
+
+Starting values for degradation parameters:
+  DMTA_0       k1       k2       tb 
+98.45190  0.07525  0.02576 19.19375 
+
+Fixed degradation parameter values:
+None
+
+Starting values for random effects (square root of initial entries in omega):
+       DMTA_0 k1 k2 tb
+DMTA_0  98.45  0  0  0
+k1       0.00  1  0  0
+k2       0.00  0  1  0
+tb       0.00  0  0  1
+
+Starting values for error model parameters:
+a.1 b.1 
+  1   1 
+
+Results:
+
+Likelihood computed by importance sampling
+    AIC BIC logLik
+  667.1 665 -323.6
+
+Optimised parameters:
+              est.    lower    upper
+DMTA_0    97.76571 95.81350 99.71791
+k1         0.05855  0.03080  0.08630
+k2         0.02337  0.01664  0.03010
+tb        31.09638 29.38289 32.80987
+a.1        1.08835  0.90059  1.27611
+b.1        0.02964  0.02261  0.03667
+SD.DMTA_0  2.04877  0.42553  3.67200
+SD.k1      0.59166  0.25621  0.92711
+SD.k2      0.30698  0.09561  0.51835
+SD.tb      0.01274 -0.10915  0.13464
+
+Correlation: 
+   DMTA_0  k1      k2     
+k1  0.0160                
+k2 -0.0070 -0.0024        
+tb -0.0668 -0.0103 -0.2013
+
+Random effects:
+             est.    lower  upper
+SD.DMTA_0 2.04877  0.42553 3.6720
+SD.k1     0.59166  0.25621 0.9271
+SD.k2     0.30698  0.09561 0.5183
+SD.tb     0.01274 -0.10915 0.1346
+
+Variance model:
+       est.   lower   upper
+a.1 1.08835 0.90059 1.27611
+b.1 0.02964 0.02261 0.03667
+
+Estimated disappearance times:
+      DT50  DT90 DT50back DT50_k1 DT50_k2
+DMTA 11.84 51.71    15.57   11.84   29.66
+
+
+

+
+
+

Hierarchical model convergence plots +

+
+Convergence plot for the NLHM SFO fit with constant variance

+Convergence plot for the NLHM SFO fit with constant variance +

+
+
+Convergence plot for the NLHM SFO fit with two-component error

+Convergence plot for the NLHM SFO fit with two-component error +

+
+
+Convergence plot for the NLHM FOMC fit with constant variance

+Convergence plot for the NLHM FOMC fit with constant variance +

+
+
+Convergence plot for the NLHM FOMC fit with two-component error

+Convergence plot for the NLHM FOMC fit with two-component error +

+
+
+Convergence plot for the NLHM DFOP fit with constant variance

+Convergence plot for the NLHM DFOP fit with constant variance +

+
+
+Convergence plot for the NLHM DFOP fit with two-component error

+Convergence plot for the NLHM DFOP fit with two-component error +

+
+
+Convergence plot for the NLHM HS fit with constant variance

+Convergence plot for the NLHM HS fit with constant variance +

+
+
+Convergence plot for the NLHM HS fit with two-component error

+Convergence plot for the NLHM HS fit with two-component error +

+
+
+
+

Session info +

+
R version 4.4.2 (2024-10-31)
+Platform: x86_64-pc-linux-gnu
+Running under: Debian GNU/Linux 12 (bookworm)
+
+Matrix products: default
+BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 
+LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0
+
+locale:
+ [1] LC_CTYPE=de_DE.UTF-8       LC_NUMERIC=C              
+ [3] LC_TIME=de_DE.UTF-8        LC_COLLATE=de_DE.UTF-8    
+ [5] LC_MONETARY=de_DE.UTF-8    LC_MESSAGES=de_DE.UTF-8   
+ [7] LC_PAPER=de_DE.UTF-8       LC_NAME=C                 
+ [9] LC_ADDRESS=C               LC_TELEPHONE=C            
+[11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       
+
+time zone: Europe/Berlin
+tzcode source: system (glibc)
+
+attached base packages:
+[1] parallel  stats     graphics  grDevices utils     datasets  methods  
+[8] base     
+
+other attached packages:
+[1] rmarkdown_2.29  nvimcom_0.9-167 saemix_3.3      npde_3.5       
+[5] knitr_1.49      mkin_1.2.10    
+
+loaded via a namespace (and not attached):
+ [1] gtable_0.3.6      jsonlite_1.8.9    dplyr_1.1.4       compiler_4.4.2   
+ [5] tidyselect_1.2.1  gridExtra_2.3     jquerylib_0.1.4   systemfonts_1.1.0
+ [9] scales_1.3.0      textshaping_0.4.1 yaml_2.3.10       fastmap_1.2.0    
+[13] lattice_0.22-6    ggplot2_3.5.1     R6_2.5.1          generics_0.1.3   
+[17] lmtest_0.9-40     MASS_7.3-61       htmlwidgets_1.6.4 tibble_3.2.1     
+[21] desc_1.4.3        munsell_0.5.1     bslib_0.8.0       pillar_1.9.0     
+[25] rlang_1.1.4       utf8_1.2.4        cachem_1.1.0      xfun_0.49        
+[29] fs_1.6.5          sass_0.4.9        cli_3.6.3         pkgdown_2.1.1    
+[33] magrittr_2.0.3    digest_0.6.37     grid_4.4.2        mclust_6.1.1     
+[37] lifecycle_1.0.4   nlme_3.1-166      vctrs_0.6.5       evaluate_1.0.1   
+[41] glue_1.8.0        codetools_0.2-20  ragg_1.3.3        zoo_1.8-12       
+[45] fansi_1.0.6       colorspace_2.1-1  pkgconfig_2.0.3   tools_4.4.2      
+[49] htmltools_0.5.8.1
+
+
+

Hardware info +

+
CPU model: AMD Ryzen 9 7950X 16-Core Processor
+
MemTotal:       64927788 kB
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-const-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-const-1.png new file mode 100644 index 00000000..91c027a5 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-const-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-tc-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-tc-1.png new file mode 100644 index 00000000..678b76e2 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-tc-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-tc-no-ranef-k2-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-tc-no-ranef-k2-1.png new file mode 100644 index 00000000..a3bc320e Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-dfop-tc-no-ranef-k2-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-fomc-const-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-fomc-const-1.png new file mode 100644 index 00000000..da63e191 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-fomc-const-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-fomc-tc-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-fomc-tc-1.png new file mode 100644 index 00000000..00958654 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-fomc-tc-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-hs-const-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-hs-const-1.png new file mode 100644 index 00000000..72a996ac Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-hs-const-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-hs-tc-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-hs-tc-1.png new file mode 100644 index 00000000..46cfa3f8 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-hs-tc-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-sfo-const-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-sfo-const-1.png new file mode 100644 index 00000000..6dc7a6e2 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-sfo-const-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-sfo-tc-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-sfo-tc-1.png new file mode 100644 index 00000000..8df26d78 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/convergence-saem-sfo-tc-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-full-par-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-full-par-1.png new file mode 100644 index 00000000..f90b19e7 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-full-par-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-reduced-par-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-reduced-par-1.png new file mode 100644 index 00000000..f6f1e43d Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-reduced-par-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-reduced-par-llquant-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-reduced-par-llquant-1.png new file mode 100644 index 00000000..ef6bc8bd Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/multistart-reduced-par-llquant-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/plot-saem-dfop-tc-no-ranef-k2-1.png b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/plot-saem-dfop-tc-no-ranef-k2-1.png new file mode 100644 index 00000000..cd506f57 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_parent_files/figure-html/plot-saem-dfop-tc-no-ranef-k2-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_pathway.html b/docs/dev/articles/prebuilt/2022_dmta_pathway.html new file mode 100644 index 00000000..92440f1f --- /dev/null +++ b/docs/dev/articles/prebuilt/2022_dmta_pathway.html @@ -0,0 +1,2002 @@ + + + + + + + +Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

Introduction +

+

The purpose of this document is to test demonstrate how nonlinear +hierarchical models (NLHM) based on the parent degradation models SFO, +FOMC, DFOP and HS, with parallel formation of two or more metabolites +can be fitted with the mkin package.

+

It was assembled in the course of work package 1.2 of Project Number +173340 (Application of nonlinear hierarchical models to the kinetic +evaluation of chemical degradation data) of the German Environment +Agency carried out in 2022 and 2023.

+

The mkin package is used in version 1.2.10, which is currently under +development. It contains the test data, and the functions used in the +evaluations. The saemix package is used as a backend for +fitting the NLHM, but is also loaded to make the convergence plot +function available.

+

This document is processed with the knitr package, which +also provides the kable function that is used to improve +the display of tabular data in R markdown documents. For parallel +processing, the parallel package is used.

+
+library(mkin)
+library(knitr)
+library(saemix)
+library(parallel)
+n_cores <- detectCores()
+
+# We need to start a new cluster after defining a compiled model that is
+# saved as a DLL to the user directory, therefore we define a function
+# This is used again after defining the pathway model
+start_cluster <- function(n_cores) {
+  if (Sys.info()["sysname"] == "Windows") {
+    ret <- makePSOCKcluster(n_cores)
+  } else {
+    ret <- makeForkCluster(n_cores)
+  }
+  return(ret)
+}
+
+
+

Data +

+

The test data are available in the mkin package as an object of class +mkindsg (mkin dataset group) under the identifier +dimethenamid_2018. The following preprocessing steps are +done in this document.

+
    +
  • The data available for the enantiomer dimethenamid-P (DMTAP) are +renamed to have the same substance name as the data for the racemic +mixture dimethenamid (DMTA). The reason for this is that no difference +between their degradation behaviour was identified in the EU risk +assessment.
  • +
  • Unnecessary columns are discarded
  • +
  • The observation times of each dataset are multiplied with the +corresponding normalisation factor also available in the dataset, in +order to make it possible to describe all datasets with a single set of +parameters that are independent of temperature
  • +
  • Finally, datasets observed in the same soil (Elliot 1 +and Elliot 2) are combined, resulting in dimethenamid +(DMTA) data from six soils.
  • +
+

The following commented R code performs this preprocessing.

+
+# Apply a function to each of the seven datasets in the mkindsg object to create a list
+dmta_ds <- lapply(1:7, function(i) {
+  ds_i <- dimethenamid_2018$ds[[i]]$data                     # Get a dataset
+  ds_i[ds_i$name == "DMTAP", "name"] <-  "DMTA"              # Rename DMTAP to DMTA
+  ds_i <- subset(ds_i, select = c("name", "time", "value")) # Select data
+  ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i]  # Normalise time
+  ds_i                                                       # Return the dataset
+})
+
+# Use dataset titles as names for the list elements
+names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title)
+
+# Combine data for Elliot soil to obtain a named list with six elements
+dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]]) #
+dmta_ds[["Elliot 1"]] <- NULL
+dmta_ds[["Elliot 2"]] <- NULL
+

The following tables show the 6 datasets.

+
+for (ds_name in names(dmta_ds)) {
+  print(
+    kable(mkin_long_to_wide(dmta_ds[[ds_name]]),
+      caption = paste("Dataset", ds_name),
+      booktabs = TRUE, row.names = FALSE))
+    cat("\n\\clearpage\n")
+}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Calke
timeDMTAM23M27M31
095.8NANANA
098.7NANANA
1460.54.11.52.0
3039.15.32.42.1
5915.26.03.22.2
1204.84.33.81.8
1204.64.13.72.1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Borstel
timeDMTAM23M27M31
0.000000100.5NANANA
0.00000099.6NANANA
1.94129591.90.4NANA
1.94129591.30.50.30.1
6.79453481.81.20.81.0
6.79453482.11.30.90.9
13.58906769.12.81.42.0
13.58906768.02.01.42.5
27.17813551.42.92.74.3
27.17813551.44.92.63.2
56.29756527.612.24.44.3
56.29756526.812.24.74.8
86.38764315.712.25.45.0
86.38764315.312.05.25.1
115.5070737.910.45.44.3
115.5070738.111.65.44.4
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Flaach
timeDMTAM23M27M31
0.000000096.5NANANA
0.000000096.8NANANA
0.000000097.0NANANA
0.623385682.90.71.10.3
0.623385686.70.71.10.3
0.623385687.40.20.30.1
1.870156772.82.22.60.7
1.870156769.91.82.40.6
1.870156771.91.62.30.7
4.363698951.44.15.01.3
4.363698952.94.25.91.2
4.363698948.64.24.81.4
8.727397928.57.58.52.4
8.727397927.37.18.52.1
8.727397927.57.58.32.3
13.091096814.88.49.33.3
13.091096813.46.88.72.4
13.091096814.48.09.12.6
17.45479577.77.28.64.0
17.45479577.37.28.53.6
17.45479578.16.98.93.3
26.18219362.04.98.12.1
26.18219361.54.37.71.7
26.18219361.94.57.41.8
34.90959151.33.85.91.6
34.90959151.03.16.01.6
34.90959151.13.15.91.4
43.63698930.92.75.61.8
43.63698930.72.35.21.5
43.63698930.72.15.61.3
52.36438720.61.64.31.2
52.36438720.41.13.70.9
52.36438720.51.33.91.1
74.80626740.40.42.50.5
74.80626740.30.42.40.5
74.80626740.30.32.20.3
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset BBA 2.2
timeDMTAM23M27M31
0.000000098.09NANANA
0.000000098.77NANANA
0.767892293.520.360.420.36
0.767892292.030.400.470.33
2.303676588.391.030.710.55
2.303676587.181.070.820.64
5.375245269.383.602.191.94
5.375245271.063.662.281.62
10.750490445.216.975.454.22
10.750490446.817.225.194.37
16.125735530.548.658.816.31
16.125735530.078.387.936.85
21.500980721.609.1010.257.05
21.500980720.418.6310.776.84
32.25147119.107.6310.896.53
32.25147119.708.0110.857.11
43.00196146.586.4010.416.06
43.00196146.316.3510.356.05
53.75245183.475.359.925.50
53.75245183.525.069.425.07
64.50294213.405.149.154.94
64.50294213.675.919.254.39
91.37916801.623.357.143.64
91.37916801.622.877.133.55
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset BBA 2.3
timeDMTAM23M27M31
0.000000099.33NANANA
0.000000097.44NANANA
0.673393893.730.180.500.47
0.673393893.770.180.830.34
2.020181487.840.521.251.00
2.020181489.820.431.090.89
4.713756571.611.193.283.58
4.713756571.421.113.243.41
9.427513145.602.267.178.74
9.427513145.421.997.918.28
14.141269631.122.8110.159.67
14.141269631.682.839.558.95
18.855026223.203.3912.0910.34
18.855026224.133.5611.8910.00
28.28253939.433.4913.327.89
28.28253939.823.2812.058.13
37.71005237.082.8010.045.06
37.71005238.642.9710.785.54
47.13756544.412.429.323.79
47.13756544.782.519.624.11
56.56507854.922.228.003.11
56.56507855.081.958.452.98
80.13386122.131.285.711.78
80.13386122.230.993.331.55
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Elliot
timeDMTAM23M27M31
0.00000097.5NANANA
0.000000100.7NANANA
1.22847886.4NANANA
1.22847888.5NANA1.5
3.68543569.82.82.35.0
3.68543577.11.72.12.4
8.59934959.04.34.04.3
8.59934954.25.83.45.0
17.19869731.38.26.68.0
17.19869733.55.26.97.7
25.79804619.65.18.27.8
25.79804620.96.18.86.5
34.39739513.36.09.78.0
34.39739515.86.08.87.4
51.5960926.75.08.36.9
51.5960928.74.29.29.0
68.7947898.83.99.35.5
68.7947898.72.98.56.1
103.1921846.01.98.66.1
103.1921844.41.56.04.0
146.1889283.32.05.63.1
146.1889282.82.34.52.9
223.5830661.41.24.11.8
223.5830661.81.93.92.6
0.00000093.4NANANA
0.000000103.2NANANA
1.22847889.2NANA1.3
1.22847886.6NANANA
3.68543578.22.61.03.1
3.68543578.12.42.62.3
8.59934955.65.54.53.4
8.59934953.05.64.64.3
17.19869733.77.37.67.8
17.19869733.26.56.78.7
25.79804620.95.88.77.7
25.79804619.97.77.66.5
34.39739518.27.88.06.3
34.39739512.77.38.68.7
51.5960927.87.07.45.7
51.5960929.06.37.24.2
68.79478911.44.310.33.2
68.7947899.03.89.44.2
103.1921843.92.66.53.8
103.1921844.42.86.94.0
146.1889282.61.64.64.5
146.1889283.41.14.54.5
223.5830662.01.44.33.8
223.5830661.71.34.22.3
+
+
+

Separate evaluations +

+

As a first step to obtain suitable starting parameters for the NLHM +fits, we do separate fits of several variants of the pathway model used +previously (Ranke et al. 2021), varying +the kinetic model for the parent compound. Because the SFORB model often +provides faster convergence than the DFOP model, and can sometimes be +fitted where the DFOP model results in errors, it is included in the set +of parent models tested here.

+
+if (!dir.exists("dmta_dlls")) dir.create("dmta_dlls")
+m_sfo_path_1 <- mkinmod(
+  DMTA = mkinsub("SFO", c("M23", "M27", "M31")),
+  M23 = mkinsub("SFO"),
+  M27 = mkinsub("SFO"),
+  M31 = mkinsub("SFO", "M27", sink = FALSE),
+  name = "m_sfo_path", dll_dir = "dmta_dlls",
+  unload = TRUE, overwrite = TRUE,
+  quiet = TRUE
+)
+m_fomc_path_1 <- mkinmod(
+  DMTA = mkinsub("FOMC", c("M23", "M27", "M31")),
+  M23 = mkinsub("SFO"),
+  M27 = mkinsub("SFO"),
+  M31 = mkinsub("SFO", "M27", sink = FALSE),
+  name = "m_fomc_path", dll_dir = "dmta_dlls",
+  unload = TRUE, overwrite = TRUE,
+  quiet = TRUE
+)
+m_dfop_path_1 <- mkinmod(
+  DMTA = mkinsub("DFOP", c("M23", "M27", "M31")),
+  M23 = mkinsub("SFO"),
+  M27 = mkinsub("SFO"),
+  M31 = mkinsub("SFO", "M27", sink = FALSE),
+  name = "m_dfop_path", dll_dir = "dmta_dlls",
+  unload = TRUE, overwrite = TRUE,
+  quiet = TRUE
+)
+m_sforb_path_1 <- mkinmod(
+  DMTA = mkinsub("SFORB", c("M23", "M27", "M31")),
+  M23 = mkinsub("SFO"),
+  M27 = mkinsub("SFO"),
+  M31 = mkinsub("SFO", "M27", sink = FALSE),
+  name = "m_sforb_path", dll_dir = "dmta_dlls",
+  unload = TRUE, overwrite = TRUE,
+  quiet = TRUE
+)
+m_hs_path_1 <- mkinmod(
+  DMTA = mkinsub("HS", c("M23", "M27", "M31")),
+  M23 = mkinsub("SFO"),
+  M27 = mkinsub("SFO"),
+  M31 = mkinsub("SFO", "M27", sink = FALSE),
+  name = "m_hs_path", dll_dir = "dmta_dlls",
+  unload = TRUE, overwrite = TRUE,
+  quiet = TRUE
+)
+cl <- start_cluster(n_cores)
+
+deg_mods_1 <- list(
+  sfo_path_1 = m_sfo_path_1,
+  fomc_path_1 = m_fomc_path_1,
+  dfop_path_1 = m_dfop_path_1,
+  sforb_path_1 = m_sforb_path_1,
+  hs_path_1 = m_hs_path_1)
+
+sep_1_const <- mmkin(
+  deg_mods_1,
+  dmta_ds,
+  error_model = "const",
+  quiet = TRUE)
+
+status(sep_1_const) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CalkeBorstelFlaachBBA 2.2BBA 2.3Elliot
sfo_path_1OKOKOKOKOKOK
fomc_path_1OKOKOKOKOKOK
dfop_path_1OKOKOKOKOKOK
sforb_path_1OKOKCOKOKOK
hs_path_1CCOKCCC
+

All separate pathway fits with SFO or FOMC for the parent and +constant variance converged (status OK). Most fits with DFOP or SFORB +for the parent converged as well. The fits with HS for the parent did +not converge with default settings.

+
+sep_1_tc <- update(sep_1_const, error_model = "tc")
+status(sep_1_tc) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CalkeBorstelFlaachBBA 2.2BBA 2.3Elliot
sfo_path_1OKOKOKOKOKOK
fomc_path_1OKOKOKOKOKOK
dfop_path_1OKCOKCOKOK
sforb_path_1OKOKOKOKOKOK
hs_path_1CCCCCC
+

With the two-component error model, the set of fits with convergence +problems is slightly different, with convergence problems appearing for +different data sets when applying the DFOP and SFORB model and some +additional convergence problems when using the FOMC model for the +parent.

+
+
+

Hierarchichal model fits +

+

The following code fits two sets of the corresponding hierarchical +models to the data, one assuming constant variance, and one assuming +two-component error.

+
+saem_1 <- mhmkin(list(sep_1_const, sep_1_tc))
+

The run time for these fits was around two hours on five year old +hardware. After a recent hardware upgrade these fits complete in less +than twenty minutes.

+
+status(saem_1) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
sfo_path_1OKOK
fomc_path_1OKOK
dfop_path_1OKOK
sforb_path_1OKOK
hs_path_1OKOK
+

According to the status function, all fits terminated +successfully.

+
+anova(saem_1) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
sfo_path_1 const172291.82288.3-1128.9
sfo_path_1 tc182276.42272.7-1120.2
fomc_path_1 const192095.92091.9-1028.9
fomc_path_1 tc201939.01934.8-949.5
dfop_path_1 const212039.72035.3-998.8
sforb_path_1 const212017.72013.4-987.9
hs_path_1 const212023.72019.3-990.9
dfop_path_1 tc221881.71877.1-918.9
sforb_path_1 tc221832.71828.1-894.3
hs_path_1 tc221831.61827.0-893.8
+

When the goodness-of-fit of the models is compared, a warning is +obtained, indicating that the likelihood of the pathway fit with SFORB +for the parent compound and constant variance could not be calculated +with importance sampling (method ‘is’). As this is the default method on +which all AIC and BIC comparisons are based, this variant is not +included in the model comparison table. Comparing the goodness-of-fit of +the remaining models, HS model model with two-component error provides +the best fit. However, for batch experiments performed with constant +conditions such as the experiments evaluated here, there is no reason to +assume a discontinuity, so the SFORB model is preferable from a +mechanistic viewpoint. In addition, the information criteria AIC and BIC +are very similar for HS and SFORB. Therefore, the SFORB model is +selected here for further refinements.

+
+

Parameter identifiability based on the Fisher Information +Matrix +

+

Using the illparms function, ill-defined statistical +model parameters such as standard deviations of the degradation +parameters in the population and error model parameters can be +found.

+
+illparms(saem_1) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
sfo_path_1sd(DMTA_0)
fomc_path_1sd(DMTA_0)
dfop_path_1
sforb_path_1sd(log_k_DMTA_bound_free)sd(log_k_DMTA_bound_free)
hs_path_1sd(log_tb)
+

When using constant variance, no ill-defined variance parameters are +identified with the illparms function in any of the +degradation models. When using the two-component error model, there is +one ill-defined variance parameter in all variants except for the +variant using DFOP for the parent compound.

+

For the selected combination of the SFORB pathway model with +two-component error, the random effect for the rate constant from +reversibly bound DMTA to the free DMTA (k_DMTA_bound_free) +is not well-defined. Therefore, the fit is updated without assuming a +random effect for this parameter.

+
+saem_sforb_path_1_tc_reduced <- update(saem_1[["sforb_path_1", "tc"]],
+  no_random_effect = "log_k_DMTA_bound_free")
+illparms(saem_sforb_path_1_tc_reduced)
+

As expected, no ill-defined parameters remain. The model comparison +below shows that the reduced model is preferable.

+
+anova(saem_1[["sforb_path_1", "tc"]], saem_sforb_path_1_tc_reduced) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
saem_sforb_path_1_tc_reduced211830.41826.0-894.2
saem_1[[“sforb_path_1”, “tc”]]221832.71828.1-894.3
+

The convergence plot of the refined fit is shown below.

+
+plot(saem_sforb_path_1_tc_reduced$so, plot.type = "convergence")
+

+

For some parameters, for example for f_DMTA_ilr_1 and +f_DMTA_ilr_2, i.e. for two of the parameters determining +the formation fractions of the parallel formation of the three +metabolites, some movement of the parameters is still visible in the +second phase of the algorithm. However, the amplitude of this movement +is in the range of the amplitude towards the end of the first phase. +Therefore, it is likely that an increase in iterations would not improve +the parameter estimates very much, and it is proposed that the fit is +acceptable. No numeric convergence criterion is implemented in +saemix.

+
+
+

Alternative check of parameter identifiability +

+

As an alternative check of parameter identifiability (Duchesne et al. 2021), multistart runs were +performed on the basis of the refined fit shown above.

+
+saem_sforb_path_1_tc_reduced_multi <- multistart(saem_sforb_path_1_tc_reduced,
+  n = 32, cores = 10)
+
 
+  (subscript) logical subscript too long
+
+print(saem_sforb_path_1_tc_reduced_multi)
+
<multistart> object with 32 fits:
+ E OK 
+ 7 25 
+OK: Fit terminated successfully
+E: Error
+

Out of the 32 fits that were initiated, only 17 terminated without an +error. The reason for this is that the wide variation of starting +parameters in combination with the parameter variation that is used in +the SAEM algorithm leads to parameter combinations for the degradation +model that the numerical integration routine cannot cope with. Because +of this variation of initial parameters, some of the model fits take up +to two times more time than the original fit.

+
+par(mar = c(12.1, 4.1, 2.1, 2.1))
+parplot(saem_sforb_path_1_tc_reduced_multi, ylim = c(0.5, 2), las = 2)
+
+Parameter boxplots for the multistart runs that succeeded

+Parameter boxplots for the multistart runs that succeeded +

+
+

However, visual analysis of the boxplot of the parameters obtained in +the successful fits confirms that the results are sufficiently +independent of the starting parameters, and there are no remaining +ill-defined parameters.

+
+
+
+

Plots of selected fits +

+

The SFORB pathway fits with full and reduced parameter distribution +model are shown below.

+
+plot(saem_1[["sforb_path_1", "tc"]])
+
+SFORB pathway fit with two-component error

+SFORB pathway fit with two-component error +

+
+
+plot(saem_sforb_path_1_tc_reduced)
+
+SFORB pathway fit with two-component error, reduced parameter model

+SFORB pathway fit with two-component error, reduced parameter model +

+
+

Plots of the remaining fits and listings for all successful fits are +shown in the Appendix.

+ +
+
+

Conclusions +

+

Pathway fits with SFO, FOMC, DFOP, SFORB and HS models for the parent +compound could be successfully performed.

+
+
+

Acknowledgements +

+

The helpful comments by Janina Wöltjen of the German Environment +Agency on earlier versions of this document are gratefully +acknowledged.

+
+
+

References +

+
+
+Duchesne, Ronan, Anissa Guillemin, Olivier Gandrillon, and Fabien +Crauste. 2021. “Practical Identifiability in the Frame of +Nonlinear Mixed Effects Models: The Example of the in Vitro +Erythropoiesis.” BMC Bioinformatics 22 (478). https://doi.org/10.1186/s12859-021-04373-4. +
+
+Ranke, Johannes, Janina Wöltjen, Jana Schmidt, and Emmanuelle Comets. +2021. “Taking Kinetic Evaluations of Degradation Data to the Next +Level with Nonlinear Mixed-Effects Models.” Environments +8 (8). https://doi.org/10.3390/environments8080071. +
+
+
+
+

Appendix +

+
+

Plots of hierarchical fits not selected for refinement +

+
+plot(saem_1[["sfo_path_1", "tc"]])
+
+SFO pathway fit with two-component error

+SFO pathway fit with two-component error +

+
+
+plot(saem_1[["fomc_path_1", "tc"]])
+
+FOMC pathway fit with two-component error

+FOMC pathway fit with two-component error +

+
+
+plot(saem_1[["sforb_path_1", "tc"]])
+
+HS pathway fit with two-component error

+HS pathway fit with two-component error +

+
+
+
+

Hierarchical model fit listings +

+
+

Fits with random effects for all degradation parameters +

+ +
+
+

Improved fit of the SFORB pathway model with two-component +error +

+ +
+
+
+

Session info +

+
R version 4.4.2 (2024-10-31)
+Platform: x86_64-pc-linux-gnu
+Running under: Debian GNU/Linux 12 (bookworm)
+
+Matrix products: default
+BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 
+LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0
+
+locale:
+ [1] LC_CTYPE=de_DE.UTF-8       LC_NUMERIC=C              
+ [3] LC_TIME=de_DE.UTF-8        LC_COLLATE=de_DE.UTF-8    
+ [5] LC_MONETARY=de_DE.UTF-8    LC_MESSAGES=de_DE.UTF-8   
+ [7] LC_PAPER=de_DE.UTF-8       LC_NAME=C                 
+ [9] LC_ADDRESS=C               LC_TELEPHONE=C            
+[11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       
+
+time zone: Europe/Berlin
+tzcode source: system (glibc)
+
+attached base packages:
+[1] parallel  stats     graphics  grDevices utils     datasets  methods  
+[8] base     
+
+other attached packages:
+[1] rmarkdown_2.29  nvimcom_0.9-167 saemix_3.3      npde_3.5       
+[5] knitr_1.49      mkin_1.2.10    
+
+loaded via a namespace (and not attached):
+ [1] sass_0.4.9        utf8_1.2.4        generics_0.1.3    lattice_0.22-6   
+ [5] digest_0.6.37     magrittr_2.0.3    evaluate_1.0.1    grid_4.4.2       
+ [9] fastmap_1.2.0     jsonlite_1.8.9    processx_3.8.4    pkgbuild_1.4.5   
+[13] deSolve_1.40      mclust_6.1.1      ps_1.8.1          gridExtra_2.3    
+[17] fansi_1.0.6       scales_1.3.0      codetools_0.2-20  textshaping_0.4.1
+[21] jquerylib_0.1.4   cli_3.6.3         rlang_1.1.4       munsell_0.5.1    
+[25] cachem_1.1.0      yaml_2.3.10       inline_0.3.20     tools_4.4.2      
+[29] dplyr_1.1.4       colorspace_2.1-1  ggplot2_3.5.1     vctrs_0.6.5      
+[33] R6_2.5.1          zoo_1.8-12        lifecycle_1.0.4   fs_1.6.5         
+[37] htmlwidgets_1.6.4 MASS_7.3-61       ragg_1.3.3        pkgconfig_2.0.3  
+[41] desc_1.4.3        callr_3.7.6       pkgdown_2.1.1     pillar_1.9.0     
+[45] bslib_0.8.0       gtable_0.3.6      glue_1.8.0        systemfonts_1.1.0
+[49] xfun_0.49         tibble_3.2.1      lmtest_0.9-40     tidyselect_1.2.1 
+[53] htmltools_0.5.8.1 nlme_3.1-166      compiler_4.4.2   
+
+
+

Hardware info +

+
CPU model: AMD Ryzen 9 7950X 16-Core Processor
+
MemTotal:       64927788 kB
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/saem-sforb-path-1-tc-reduced-convergence-1.png b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/saem-sforb-path-1-tc-reduced-convergence-1.png new file mode 100644 index 00000000..0facfbe5 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/saem-sforb-path-1-tc-reduced-convergence-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-2-1.png b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-2-1.png new file mode 100644 index 00000000..4e363872 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-2-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-3-1.png b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-3-1.png new file mode 100644 index 00000000..562d8d9d Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-3-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-4-1.png b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-4-1.png new file mode 100644 index 00000000..7bf4aa4a Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-4-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-6-1.png b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-6-1.png new file mode 100644 index 00000000..602c1138 Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-6-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-7-1.png b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-7-1.png new file mode 100644 index 00000000..8db8e11c Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-7-1.png differ diff --git a/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-8-1.png b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-8-1.png new file mode 100644 index 00000000..562d8d9d Binary files /dev/null and b/docs/dev/articles/prebuilt/2022_dmta_pathway_files/figure-html/unnamed-chunk-8-1.png differ diff --git a/docs/dev/articles/prebuilt/2023_mesotrione_parent.html b/docs/dev/articles/prebuilt/2023_mesotrione_parent.html new file mode 100644 index 00000000..86c7c2dd --- /dev/null +++ b/docs/dev/articles/prebuilt/2023_mesotrione_parent.html @@ -0,0 +1,2500 @@ + + + + + + + +Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

Introduction +

+

The purpose of this document is to test demonstrate how nonlinear +hierarchical models (NLHM) based on the parent degradation models SFO, +FOMC, DFOP and HS can be fitted with the mkin package, also considering +the influence of covariates like soil pH on different degradation +parameters. Because in some other case studies, the SFORB +parameterisation of biexponential decline has shown some advantages over +the DFOP parameterisation, SFORB was included in the list of tested +models as well.

+

The mkin package is used in version 1.2.10, which is contains the +functions that were used for the evaluations. The saemix +package is used as a backend for fitting the NLHM, but is also loaded to +make the convergence plot function available.

+

This document is processed with the knitr package, which +also provides the kable function that is used to improve +the display of tabular data in R markdown documents. For parallel +processing, the parallel package is used.

+
+library(mkin)
+library(knitr)
+library(saemix)
+library(parallel)
+n_cores <- detectCores()
+if (Sys.info()["sysname"] == "Windows") {
+  cl <- makePSOCKcluster(n_cores)
+} else {
+  cl <- makeForkCluster(n_cores)
+}
+
+

Test data +

+
+data_file <- system.file(
+  "testdata", "mesotrione_soil_efsa_2016.xlsx", package = "mkin")
+meso_ds <- read_spreadsheet(data_file, parent_only = TRUE)
+

The following tables show the covariate data and the 18 datasets that +were read in from the spreadsheet file.

+
+pH <- attr(meso_ds, "covariates")
+kable(pH, caption = "Covariate data")
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Covariate data
pH
Richmond6.2
Richmond 26.2
ERTC6.4
Toulouse7.7
Picket Piece7.1
7215.6
7225.7
7235.4
7244.8
7255.8
7275.1
7285.9
7295.6
7305.3
7316.1
7325.0
7415.7
7427.2
+
+for (ds_name in names(meso_ds)) {
+  print(
+    kable(mkin_long_to_wide(meso_ds[[ds_name]]),
+      caption = paste("Dataset", ds_name),
+      booktabs = TRUE, row.names = FALSE))
+}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Richmond
timemeso
0.00000091.00
1.17905086.70
3.53714973.60
7.07429961.50
10.61144855.70
15.32764747.70
17.68574739.50
24.76004629.80
35.37149419.60
68.3848895.67
0.00000097.90
1.17905096.40
3.53714989.10
7.07429974.40
10.61144857.40
15.32764746.30
18.86479735.50
27.11814627.20
35.37149419.10
74.2801386.50
108.4725823.40
142.6650272.20
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Richmond 2
timemeso
0.00000096.0
2.42200482.4
5.65134371.2
8.07334853.1
11.30268748.5
16.95403033.4
22.60537324.2
45.21074611.9
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset ERTC
timemeso
0.00000099.9
2.75519380.0
6.42878242.1
9.18397550.1
12.85756528.4
19.28634739.8
25.71513029.9
51.4302592.5
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Toulouse
timemeso
0.00000096.8
2.89798363.3
6.76196022.3
9.65994216.6
13.52391916.1
20.28587917.2
27.0478381.8
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset Picket Piece
timemeso
0.000000102.0
2.84119573.7
6.62945435.5
9.47064931.8
13.25890918.0
19.8883643.7
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 721
timemeso
0.0000086.4
11.2436661.4
22.4873349.8
33.7309941.0
44.9746635.1
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 722
timemeso
0.0000090.3
11.2436652.1
22.4873337.4
33.7309921.2
44.9746614.3
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 723
timemeso
0.0000089.3
11.2436670.8
22.4873351.1
33.7309942.7
44.9746626.7
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 724
timemeso
0.00000089.4
9.00820865.2
18.01641555.8
27.02462346.0
36.03283141.7
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 725
timemeso
0.0000089.0
10.9905835.4
21.9811618.6
32.9717411.6
43.962327.6
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 727
timemeso
0.0000091.3
10.9610463.2
21.9220951.1
32.8831342.0
43.8441740.8
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 728
timemeso
0.0000091.8
11.2436643.6
22.4873322.0
33.7309915.9
44.974668.8
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 729
timemeso
0.0000091.6
11.2436660.5
22.4873343.5
33.7309928.4
44.9746620.5
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 730
timemeso
0.0000092.7
11.0744658.9
22.1489344.0
33.2233946.0
44.2978529.3
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 731
timemeso
0.0000092.1
11.2436664.4
22.4873345.3
33.7309933.6
44.9746623.5
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 732
timemeso
0.0000090.3
11.2436658.2
22.4873340.1
33.7309933.1
44.9746625.8
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 741
timemeso
0.0000090.3
10.8471268.7
21.6942458.0
32.5413652.2
43.3884848.0
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dataset 742
timemeso
0.0000092.0
11.2436660.9
22.4873336.2
33.7309918.3
44.974668.7
+
+
+
+

Separate evaluations +

+

In order to obtain suitable starting parameters for the NLHM fits, +separate fits of the five models to the data for each soil are generated +using the mmkin function from the mkin package. In a first +step, constant variance is assumed. Convergence is checked with the +status function.

+
+deg_mods <- c("SFO", "FOMC", "DFOP", "SFORB", "HS")
+f_sep_const <- mmkin(
+  deg_mods,
+  meso_ds,
+  error_model = "const",
+  cluster = cl,
+  quiet = TRUE)
+
+status(f_sep_const[, 1:5]) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RichmondRichmond 2ERTCToulousePicket Piece
SFOOKOKOKOKOK
FOMCOKOKOKOKC
DFOPOKOKOKOKOK
SFORBOKOKOKOKOK
HSOKOKCOKOK
+
+status(f_sep_const[, 6:18]) |> kable()
+ ++++++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
721722723724725727728729730731732741742
SFOOKOKOKOKOKOKOKOKOKOKOKOKOK
FOMCOKOKCOKOKOKOKOKOKOKOKOKOK
DFOPOKOKOKOKOKOKOKOKOKOKOKOKOK
SFORBOKOKOKOKOKOKOKCOKOKOKOKOK
HSOKOKOKOKOKOKOKOKOKOKOKOKOK
+

In the tables above, OK indicates convergence and C indicates failure +to converge. Most separate fits with constant variance converged, with +the exception of two FOMC fits, one SFORB fit and one HS fit.

+
+f_sep_tc <- update(f_sep_const, error_model = "tc")
+
+status(f_sep_tc[, 1:5]) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RichmondRichmond 2ERTCToulousePicket Piece
SFOOKOKOKOKOK
FOMCOKOKOKOKOK
DFOPCOKOKOKOK
SFORBOKOKOKOKOK
HSOKOKCOKOK
+
+status(f_sep_tc[, 6:18]) |> kable()
+ ++++++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
721722723724725727728729730731732741742
SFOOKOKOKOKOKOKOKOKOKOKOKOKOK
FOMCOKOKCOKCCOKCOKCOKCOK
DFOPCOKOKOKCOKOKOKOKCOKCOK
SFORBCOKOKOKCOKOKCOKOKOKCOK
HSOKOKOKOKOKOKOKOKOKCOKOKOK
+

With the two-component error model, the set of fits that did not +converge is larger, with convergence problems appearing for a number of +non-SFO fits.

+
+
+

Hierarchical model fits without covariate effect +

+

The following code fits hierarchical kinetic models for the ten +combinations of the five different degradation models with the two +different error models in parallel.

+
+f_saem_1 <- mhmkin(list(f_sep_const, f_sep_tc), cluster = cl)
+status(f_saem_1) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
SFOOKOK
FOMCOKOK
DFOPOKOK
SFORBOKOK
HSOKOK
+

All fits terminate without errors (status OK).

+
+anova(f_saem_1) |> kable(digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
SFO const5800.0804.5-395.0
SFO tc6801.9807.2-394.9
FOMC const7787.4793.6-386.7
FOMC tc8788.9796.1-386.5
DFOP const9787.6795.6-384.8
SFORB const9787.4795.4-384.7
HS const9781.9789.9-382.0
DFOP tc10787.4796.3-383.7
SFORB tc10795.8804.7-387.9
HS tc10783.7792.7-381.9
+

The model comparisons show that the fits with constant variance are +consistently preferable to the corresponding fits with two-component +error for these data. This is confirmed by the fact that the parameter +b.1 (the relative standard deviation in the fits obtained +with the saemix package), is ill-defined in all fits.

+
+illparms(f_saem_1) |> kable()
+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
SFOsd(meso_0)sd(meso_0), b.1
FOMCsd(meso_0), sd(log_beta)sd(meso_0), sd(log_beta), b.1
DFOPsd(meso_0), sd(log_k1)sd(meso_0), sd(g_qlogis), b.1
SFORBsd(meso_free_0), sd(log_k_meso_free_bound)sd(meso_free_0), sd(log_k_meso_free_bound), b.1
HSsd(meso_0)sd(meso_0), b.1
+

For obtaining fits with only well-defined random effects, we update +the set of fits, excluding random effects that were ill-defined +according to the illparms function.

+
+f_saem_2 <- update(f_saem_1, no_random_effect = illparms(f_saem_1))
+status(f_saem_2) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
SFOOKOK
FOMCOKOK
DFOPOKOK
SFORBOKOK
HSOKOK
+

The updated fits terminate without errors.

+
+illparms(f_saem_2) |> kable()
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
consttc
SFOb.1
FOMCb.1
DFOPb.1
SFORBb.1
HSb.1
+

No ill-defined errors remain in the fits with constant variance.

+
+
+

Hierarchical model fits with covariate effect +

+

In the following sections, hierarchical fits including a model for +the influence of pH on selected degradation parameters are shown for all +parent models. Constant variance is selected as the error model based on +the fits without covariate effects. Random effects that were ill-defined +in the fits without pH influence are excluded. A potential influence of +the soil pH is only included for parameters with a well-defined random +effect, because experience has shown that only for such parameters a +significant pH effect could be found.

+
+

SFO +

+
+sfo_pH <- saem(f_sep_const["SFO", ], no_random_effect = "meso_0", covariates = pH,
+  covariate_models = list(log_k_meso ~ pH))
+
+summary(sfo_pH)$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_091.3589.2793.43
log_k_meso-6.66-7.97-5.35
beta_pH(log_k_meso)0.590.370.81
a.15.484.716.24
SD.log_k_meso0.350.230.47
+

The parameter showing the pH influence in the above table is +beta_pH(log_k_meso). Its confidence interval does not +include zero, indicating that the influence of soil pH on the log of the +degradation rate constant is significantly greater than zero.

+
+anova(f_saem_2[["SFO", "const"]], sfo_pH, test = TRUE)
+
Data: 116 observations of 1 variable(s) grouped in 18 datasets
+
+                           npar    AIC    BIC     Lik  Chisq Df Pr(>Chisq)    
+f_saem_2[["SFO", "const"]]    4 797.56 801.12 -394.78                         
+sfo_pH                        5 783.09 787.54 -386.54 16.473  1  4.934e-05 ***
+---
+Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+

The comparison with the SFO fit without covariate effect confirms +that considering the soil pH improves the model, both by comparison of +AIC and BIC and by the likelihood ratio test.

+
+plot(sfo_pH)
+

+

Endpoints for a model with covariates are by default calculated for +the median of the covariate values. This quantile can be adapted, or a +specific covariate value can be given as shown below.

+
+endpoints(sfo_pH)
+
$covariates
+      pH
+50% 5.75
+
+$distimes
+         DT50     DT90
+meso 18.52069 61.52441
+
+endpoints(sfo_pH, covariate_quantile = 0.9)
+
$covariates
+      pH
+90% 7.13
+
+$distimes
+         DT50     DT90
+meso 8.237019 27.36278
+
+endpoints(sfo_pH, covariates = c(pH = 7.0))
+
$covariates
+     pH
+User  7
+
+$distimes
+        DT50    DT90
+meso 8.89035 29.5331
+
+
+

FOMC +

+
+fomc_pH <- saem(f_sep_const["FOMC", ], no_random_effect = "meso_0", covariates = pH,
+  covariate_models = list(log_alpha ~ pH))
+
+summary(fomc_pH)$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_092.8490.7594.93
log_alpha-2.21-3.49-0.92
beta_pH(log_alpha)0.580.370.79
log_beta4.213.444.99
a.15.034.325.73
SD.log_alpha0.00-23.7723.78
SD.log_beta0.370.010.74
+

As in the case of SFO, the confidence interval of the slope parameter +(here beta_pH(log_alpha)) quantifying the influence of soil +pH does not include zero, and the model comparison clearly indicates +that the model with covariate influence is preferable. However, the +random effect for alpha is not well-defined any more after +inclusion of the covariate effect (the confidence interval of +SD.log_alpha includes zero).

+
+illparms(fomc_pH)
+
[1] "sd(log_alpha)"
+

Therefore, the model is updated without this random effect, and no +ill-defined parameters remain.

+
+fomc_pH_2 <- update(fomc_pH, no_random_effect = c("meso_0", "log_alpha"))
+illparms(fomc_pH_2)
+
+anova(f_saem_2[["FOMC", "const"]], fomc_pH, fomc_pH_2, test = TRUE)
+
Data: 116 observations of 1 variable(s) grouped in 18 datasets
+
+                            npar    AIC    BIC     Lik  Chisq Df Pr(>Chisq)    
+f_saem_2[["FOMC", "const"]]    5 783.25 787.71 -386.63                         
+fomc_pH_2                      6 767.49 772.83 -377.75 17.762  1  2.503e-05 ***
+fomc_pH                        7 770.07 776.30 -378.04  0.000  1          1    
+---
+Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+

Model comparison indicates that including pH dependence significantly +improves the fit, and that the reduced model with covariate influence +results in the most preferable FOMC fit.

+
+summary(fomc_pH_2)$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_093.0590.9895.13
log_alpha-2.91-4.18-1.63
beta_pH(log_alpha)0.660.440.87
log_beta3.953.294.62
a.14.984.285.68
SD.log_beta0.400.260.54
+
+plot(fomc_pH_2)
+

+
+endpoints(fomc_pH_2)
+
$covariates
+      pH
+50% 5.75
+
+$distimes
+         DT50     DT90 DT50back
+meso 17.30248 82.91343 24.95943
+
+endpoints(fomc_pH_2, covariates = c(pH = 7))
+
$covariates
+     pH
+User  7
+
+$distimes
+         DT50     DT90 DT50back
+meso 6.986239 27.02927 8.136621
+
+
+

DFOP +

+

In the DFOP fits without covariate effects, random effects for two +degradation parameters (k2 and g) were +identifiable.

+
+summary(f_saem_2[["DFOP", "const"]])$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_093.6191.5895.63
log_k1-1.53-2.27-0.79
log_k2-3.42-3.73-3.11
g_qlogis-1.67-2.57-0.77
a.14.744.025.45
SD.log_k20.600.380.81
SD.g_qlogis0.940.331.54
+

A fit with pH dependent degradation parameters was obtained by +excluding the same random effects as in the refined DFOP fit without +covariate influence, and including covariate models for the two +identifiable parameters k2 and g.

+
+dfop_pH <- saem(f_sep_const["DFOP", ], no_random_effect = c("meso_0", "log_k1"),
+  covariates = pH,
+  covariate_models = list(log_k2 ~ pH, g_qlogis ~ pH))
+

The corresponding parameters for the influence of soil pH are +beta_pH(log_k2) for the influence of soil pH on +k2, and beta_pH(g_qlogis) for its influence on +g.

+
+summary(dfop_pH)$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_092.8490.8594.84
log_k1-2.82-3.09-2.54
log_k2-11.48-15.32-7.64
beta_pH(log_k2)1.310.691.92
g_qlogis3.130.475.80
beta_pH(g_qlogis)-0.57-1.04-0.09
a.14.964.265.65
SD.log_k20.760.471.05
SD.g_qlogis0.01-9.969.97
+
+illparms(dfop_pH)
+
[1] "sd(g_qlogis)"
+

Confidence intervals for neither of them include zero, indicating a +significant difference from zero. However, the random effect for +g is now ill-defined. The fit is updated without this +ill-defined random effect.

+
+dfop_pH_2 <- update(dfop_pH,
+  no_random_effect = c("meso_0", "log_k1", "g_qlogis"))
+illparms(dfop_pH_2)
+
[1] "beta_pH(g_qlogis)"
+

Now, the slope parameter for the pH effect on g is +ill-defined. Therefore, another attempt is made without the +corresponding covariate model.

+
+dfop_pH_3 <- saem(f_sep_const["DFOP", ], no_random_effect = c("meso_0", "log_k1"),
+  covariates = pH,
+  covariate_models = list(log_k2 ~ pH))
+illparms(dfop_pH_3)
+
[1] "sd(g_qlogis)"
+

As the random effect for g is again ill-defined, the fit +is repeated without it.

+
+dfop_pH_4 <- update(dfop_pH_3, no_random_effect = c("meso_0", "log_k1", "g_qlogis"))
+illparms(dfop_pH_4)
+

While no ill-defined parameters remain, model comparison suggests +that the previous model dfop_pH_2 with two pH dependent +parameters is preferable, based on information criteria as well as based +on the likelihood ratio test.

+
+anova(f_saem_2[["DFOP", "const"]], dfop_pH, dfop_pH_2, dfop_pH_3, dfop_pH_4)
+
Data: 116 observations of 1 variable(s) grouped in 18 datasets
+
+                            npar    AIC    BIC     Lik
+f_saem_2[["DFOP", "const"]]    7 782.94 789.18 -384.47
+dfop_pH_4                      7 767.35 773.58 -376.68
+dfop_pH_2                      8 765.14 772.26 -374.57
+dfop_pH_3                      8 769.00 776.12 -376.50
+dfop_pH                        9 769.10 777.11 -375.55
+
+anova(dfop_pH_2, dfop_pH_4, test = TRUE)
+
Data: 116 observations of 1 variable(s) grouped in 18 datasets
+
+          npar    AIC    BIC     Lik  Chisq Df Pr(>Chisq)  
+dfop_pH_4    7 767.35 773.58 -376.68                       
+dfop_pH_2    8 765.14 772.26 -374.57 4.2153  1    0.04006 *
+---
+Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+

When focussing on parameter identifiability using the test if the +confidence interval includes zero, dfop_pH_4 would still be +the preferred model. However, it should be kept in mind that parameter +confidence intervals are constructed using a simple linearisation of the +likelihood. As the confidence interval of the random effect for +g only marginally includes zero, it is suggested that this +is acceptable, and that dfop_pH_2 can be considered the +most preferable model.

+
+plot(dfop_pH_2)
+

+
+endpoints(dfop_pH_2)
+
$covariates
+      pH
+50% 5.75
+
+$distimes
+         DT50     DT90 DT50back  DT50_k1  DT50_k2
+meso 18.36876 73.51841 22.13125 4.191901 23.98672
+
+endpoints(dfop_pH_2, covariates = c(pH = 7))
+
$covariates
+     pH
+User  7
+
+$distimes
+         DT50     DT90 DT50back  DT50_k1  DT50_k2
+meso 8.346428 28.34437 8.532507 4.191901 8.753618
+
+
+

SFORB +

+
+sforb_pH <- saem(f_sep_const["SFORB", ], no_random_effect = c("meso_free_0", "log_k_meso_free_bound"),
+  covariates = pH,
+  covariate_models = list(log_k_meso_free ~ pH, log_k_meso_bound_free ~ pH))
+
+summary(sforb_pH)$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_free_093.4291.3295.52
log_k_meso_free-5.37-6.94-3.81
beta_pH(log_k_meso_free)0.420.180.67
log_k_meso_free_bound-3.49-4.92-2.05
log_k_meso_bound_free-9.98-19.22-0.74
beta_pH(log_k_meso_bound_free)1.23-0.212.67
a.14.904.185.63
SD.log_k_meso_free0.350.230.47
SD.log_k_meso_bound_free0.13-1.952.20
+

The confidence interval of +beta_pH(log_k_meso_bound_free) includes zero, indicating +that the influence of soil pH on k_meso_bound_free cannot +reliably be quantified. Also, the confidence interval for the random +effect on this parameter (SD.log_k_meso_bound_free) +includes zero.

+

Using the illparms function, these ill-defined +parameters can be found more conveniently.

+
+illparms(sforb_pH)
+
[1] "sd(log_k_meso_bound_free)"      "beta_pH(log_k_meso_bound_free)"
+

To remove the ill-defined parameters, a second variant of the SFORB +model with pH influence is fitted. No ill-defined parameters remain.

+
+sforb_pH_2 <- update(sforb_pH,
+  no_random_effect = c("meso_free_0", "log_k_meso_free_bound", "log_k_meso_bound_free"),
+  covariate_models = list(log_k_meso_free ~ pH))
+illparms(sforb_pH_2)
+

The model comparison of the SFORB fits includes the refined model +without covariate effect, and both versions of the SFORB fit with +covariate effect.

+
+anova(f_saem_2[["SFORB", "const"]], sforb_pH, sforb_pH_2, test = TRUE)
+
Data: 116 observations of 1 variable(s) grouped in 18 datasets
+
+                             npar    AIC    BIC     Lik   Chisq Df Pr(>Chisq)  
+f_saem_2[["SFORB", "const"]]    7 783.40 789.63 -384.70                        
+sforb_pH_2                      7 770.94 777.17 -378.47 12.4616  0             
+sforb_pH                        9 768.81 776.83 -375.41  6.1258  2    0.04675 *
+---
+Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+

The first model including pH influence is preferable based on +information criteria and the likelihood ratio test. However, as it is +not fully identifiable, the second model is selected.

+
+summary(sforb_pH_2)$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_free_093.3291.1695.48
log_k_meso_free-6.15-7.43-4.86
beta_pH(log_k_meso_free)0.540.330.75
log_k_meso_free_bound-3.80-5.20-2.40
log_k_meso_bound_free-2.95-4.26-1.64
a.15.084.385.79
SD.log_k_meso_free0.330.220.45
+
+plot(sforb_pH_2)
+

+
+endpoints(sforb_pH_2)
+
$covariates
+      pH
+50% 5.75
+
+$ff
+meso_free 
+        1 
+
+$SFORB
+   meso_b1    meso_b2     meso_g 
+0.09735824 0.02631699 0.31602120 
+
+$distimes
+         DT50     DT90 DT50back DT50_meso_b1 DT50_meso_b2
+meso 16.86549 73.15824 22.02282     7.119554     26.33839
+
+endpoints(sforb_pH_2, covariates = c(pH = 7))
+
$covariates
+     pH
+User  7
+
+$ff
+meso_free 
+        1 
+
+$SFORB
+   meso_b1    meso_b2     meso_g 
+0.13315233 0.03795988 0.61186191 
+
+$distimes
+         DT50     DT90 DT50back DT50_meso_b1 DT50_meso_b2
+meso 7.932495 36.93311 11.11797     5.205671        18.26
+
+
+

HS +

+
+hs_pH <- saem(f_sep_const["HS", ], no_random_effect = c("meso_0"),
+  covariates = pH,
+  covariate_models = list(log_k1 ~ pH, log_k2 ~ pH, log_tb ~ pH))
+
+summary(hs_pH)$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_093.3391.4795.19
log_k1-5.81-7.27-4.36
beta_pH(log_k1)0.470.230.72
log_k2-6.80-8.76-4.83
beta_pH(log_k2)0.540.210.87
log_tb3.251.255.25
beta_pH(log_tb)-0.10-0.430.23
a.14.493.785.21
SD.log_k10.370.240.51
SD.log_k20.290.100.48
SD.log_tb0.25-0.070.57
+
+illparms(hs_pH)
+
[1] "sd(log_tb)"      "beta_pH(log_tb)"
+

According to the output of the illparms function, the +random effect on the break time tb cannot reliably be +quantified, neither can the influence of soil pH on tb. The +fit is repeated without the corresponding covariate model, and no +ill-defined parameters remain.

+
+hs_pH_2 <- update(hs_pH, covariate_models = list(log_k1 ~ pH, log_k2 ~ pH))
+illparms(hs_pH_2)
+

Model comparison confirms that this model is preferable to the fit +without covariate influence, and also to the first version with +covariate influence.

+
+anova(f_saem_2[["HS", "const"]], hs_pH, hs_pH_2, test = TRUE)
+
Data: 116 observations of 1 variable(s) grouped in 18 datasets
+
+                          npar    AIC    BIC     Lik  Chisq Df Pr(>Chisq)    
+f_saem_2[["HS", "const"]]    8 780.08 787.20 -382.04                         
+hs_pH_2                     10 766.47 775.37 -373.23 17.606  2  0.0001503 ***
+hs_pH                       11 769.80 779.59 -373.90  0.000  1  1.0000000    
+---
+Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
+
+summary(hs_pH_2)$confint_trans |> kable(digits = 2)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
est.lowerupper
meso_093.3391.5095.15
log_k1-5.68-7.09-4.27
beta_pH(log_k1)0.460.220.69
log_k2-6.61-8.34-4.88
beta_pH(log_k2)0.500.210.79
log_tb2.702.333.08
a.14.453.745.16
SD.log_k10.360.220.49
SD.log_k20.230.020.43
SD.log_tb0.550.250.85
+
+plot(hs_pH_2)
+

+
+endpoints(hs_pH_2)
+
$covariates
+      pH
+50% 5.75
+
+$distimes
+         DT50     DT90 DT50back  DT50_k1  DT50_k2
+meso 14.68725 82.45287 24.82079 14.68725 29.29299
+
+endpoints(hs_pH_2, covariates = c(pH = 7))
+
$covariates
+     pH
+User  7
+
+$distimes
+         DT50     DT90 DT50back  DT50_k1  DT50_k2
+meso 8.298536 38.85371 11.69613 8.298536 15.71561
+
+
+

Comparison across parent models +

+

After model reduction for all models with pH influence, they are +compared with each other.

+
+anova(sfo_pH, fomc_pH_2, dfop_pH_2, dfop_pH_4, sforb_pH_2, hs_pH_2)
+
Data: 116 observations of 1 variable(s) grouped in 18 datasets
+
+           npar    AIC    BIC     Lik
+sfo_pH        5 783.09 787.54 -386.54
+fomc_pH_2     6 767.49 772.83 -377.75
+dfop_pH_4     7 767.35 773.58 -376.68
+sforb_pH_2    7 770.94 777.17 -378.47
+dfop_pH_2     8 765.14 772.26 -374.57
+hs_pH_2      10 766.47 775.37 -373.23
+

The DFOP model with pH influence on k2 and +g and a random effect only on k2 is finally +selected as the best fit.

+

The endpoints resulting from this model are listed below. Please +refer to the Appendix for a detailed listing.

+
+endpoints(dfop_pH_2)
+
$covariates
+      pH
+50% 5.75
+
+$distimes
+         DT50     DT90 DT50back  DT50_k1  DT50_k2
+meso 18.36876 73.51841 22.13125 4.191901 23.98672
+
+endpoints(dfop_pH_2, covariates = c(pH = 7))
+
$covariates
+     pH
+User  7
+
+$distimes
+         DT50     DT90 DT50back  DT50_k1  DT50_k2
+meso 8.346428 28.34437 8.532507 4.191901 8.753618
+
+
+
+

Conclusions +

+

These evaluations demonstrate that covariate effects can be included +for all types of parent degradation models. These models can then be +further refined to make them fully identifiable.

+
+
+

Appendix +

+
+

Hierarchical fit listings +

+
+

Fits without covariate effects +

+ +
+
+

Fits with covariate effects +

+ +
+
+
+

Session info +

+
R version 4.4.2 (2024-10-31)
+Platform: x86_64-pc-linux-gnu
+Running under: Debian GNU/Linux 12 (bookworm)
+
+Matrix products: default
+BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 
+LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0
+
+locale:
+ [1] LC_CTYPE=de_DE.UTF-8       LC_NUMERIC=C              
+ [3] LC_TIME=de_DE.UTF-8        LC_COLLATE=de_DE.UTF-8    
+ [5] LC_MONETARY=de_DE.UTF-8    LC_MESSAGES=de_DE.UTF-8   
+ [7] LC_PAPER=de_DE.UTF-8       LC_NAME=C                 
+ [9] LC_ADDRESS=C               LC_TELEPHONE=C            
+[11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       
+
+time zone: Europe/Berlin
+tzcode source: system (glibc)
+
+attached base packages:
+[1] parallel  stats     graphics  grDevices utils     datasets  methods  
+[8] base     
+
+other attached packages:
+[1] rmarkdown_2.29  nvimcom_0.9-167 saemix_3.3      npde_3.5       
+[5] knitr_1.49      mkin_1.2.10    
+
+loaded via a namespace (and not attached):
+ [1] sass_0.4.9        utf8_1.2.4        generics_0.1.3    lattice_0.22-6   
+ [5] digest_0.6.37     magrittr_2.0.3    evaluate_1.0.1    grid_4.4.2       
+ [9] fastmap_1.2.0     cellranger_1.1.0  jsonlite_1.8.9    mclust_6.1.1     
+[13] gridExtra_2.3     fansi_1.0.6       scales_1.3.0      codetools_0.2-20 
+[17] textshaping_0.4.1 jquerylib_0.1.4   cli_3.6.3         rlang_1.1.4      
+[21] munsell_0.5.1     cachem_1.1.0      yaml_2.3.10       tools_4.4.2      
+[25] dplyr_1.1.4       colorspace_2.1-1  ggplot2_3.5.1     vctrs_0.6.5      
+[29] R6_2.5.1          zoo_1.8-12        lifecycle_1.0.4   fs_1.6.5         
+[33] htmlwidgets_1.6.4 MASS_7.3-61       ragg_1.3.3        pkgconfig_2.0.3  
+[37] desc_1.4.3        pkgdown_2.1.1     pillar_1.9.0      bslib_0.8.0      
+[41] gtable_0.3.6      glue_1.8.0        systemfonts_1.1.0 xfun_0.49        
+[45] tibble_3.2.1      lmtest_0.9-40     tidyselect_1.2.1  htmltools_0.5.8.1
+[49] nlme_3.1-166      compiler_4.4.2    readxl_1.4.3     
+
+
+

Hardware info +

+
CPU model: AMD Ryzen 9 7950X 16-Core Processor
+
MemTotal:       64927788 kB
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-14-1.png b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-14-1.png new file mode 100644 index 00000000..719bf0e9 Binary files /dev/null and b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-14-1.png differ diff --git a/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-19-1.png b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-19-1.png new file mode 100644 index 00000000..6afcac48 Binary files /dev/null and b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-19-1.png differ diff --git a/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-25-1.png b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-25-1.png new file mode 100644 index 00000000..50253fb1 Binary files /dev/null and b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-25-1.png differ diff --git a/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-30-1.png b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-30-1.png new file mode 100644 index 00000000..c8b77724 Binary files /dev/null and b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-30-1.png differ diff --git a/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-8-1.png b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-8-1.png new file mode 100644 index 00000000..8fa204a3 Binary files /dev/null and b/docs/dev/articles/prebuilt/2023_mesotrione_parent_files/figure-html/unnamed-chunk-8-1.png differ diff --git a/docs/dev/articles/twa.html b/docs/dev/articles/twa.html new file mode 100644 index 00000000..1dea5c51 --- /dev/null +++ b/docs/dev/articles/twa.html @@ -0,0 +1,181 @@ + + + + + + + +Calculation of time weighted average concentrations with mkin • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +

Since version 0.9.45.1 of the ‘mkin’ package, a function for +calculating time weighted average concentrations for decline kinetics +(i.e. only for the compound applied in the experiment) is +included. Strictly speaking, they are maximum moving window time +weighted average concentrations, i.e. the maximum time weighted +average concentration that can be found when moving a time window of a +specified width over the decline curve.

+

Time weighted average concentrations for the SFO, FOMC and the DFOP +model are calculated using the formulas given in the FOCUS kinetics +guidance (FOCUS Work Group on Degradation +Kinetics 2014, 251):

+

SFO:

+

ctwa=c0(1ekt)ktc_\textrm{twa} = c_0 \frac{\left( 1 - e^{- k t} \right)}{ k t}

+

FOMC:

+

ctwa=c0βt(1α)((tβ+1)1α1)c_\textrm{twa} = c_0 \frac{\beta}{t (1 - \alpha)} + \left( \left(\frac{t}{\beta} + 1 \right)^{1 - \alpha} - 1 \right)

+

DFOP:

+

ctwa=c0t(gk1(1ek1t)+1gk2(1ek2t))c_\textrm{twa} = \frac{c_0}{t} \left( + \frac{g}{k_1} \left( 1 - e^{- k_1 t} \right) + + \frac{1-g}{k_2} \left( 1 - e^{- k_2 t} \right) \right)

+

HS for +t>tbt > t_b:

+

ctwa=c0t(1k1(1ek1tb)+ek1tbk2(1ek2(ttb)))c_\textrm{twa} = \frac{c_0}{t} \left( + \frac{1}{k_1} \left( 1 - e^{- k_1 t_b} \right) + + \frac{e^{- k_1 t_b}}{k_2} \left( 1 - e^{- k_2 (t - t_b)} \right) \right)

+

Often, the ratio between the time weighted average concentration +ctwac_\textrm{twa} +and the initial concentration +c0c_0

+

ftwa=ctwac0f_\textrm{twa} = \frac{c_\textrm{twa}}{c_0}

+

is needed. This can be calculated from the fitted initial +concentration +c0c_0 +and the time weighted average concentration +ctwac_\textrm{twa}, +or directly from the model parameters using the following formulas:

+

SFO:

+

ftwa=(1ekt)ktf_\textrm{twa} = \frac{\left( 1 - e^{- k t} \right)}{k t}

+

FOMC:

+

ftwa=βt(1α)((tβ+1)1α1)f_\textrm{twa} = \frac{\beta}{t (1 - \alpha)} + \left( \left(\frac{t}{\beta} + 1 \right)^{1 - \alpha} - 1 \right)

+

DFOP:

+

ftwa=1t(gk1(1ek1t)+1gk2(1ek2t))f_\textrm{twa} = \frac{1}{t} \left( + \frac{g}{k_1} \left( 1 - e^{- k_1 t} \right) + + \frac{1-g}{k_2} \left( 1 - e^{- k_2 t} \right) \right)

+

HS for +t>tbt > t_b:

+

ftwa=1t(1k1(1ek1tb)+ek1tbk2(1ek2(ttb)))f_\textrm{twa} = \frac{1}{t} \left( + \frac{1}{k_1} \left( 1 - e^{- k_1 t_b} \right) + + \frac{e^{- k_1 t_b}}{k_2} \left( 1 - e^{- k_2 (t - t_b)} \right) \right)

+

Note that a method for calculating maximum moving window time +weighted average concentrations for a model fitted by ‘mkinfit’ or from +parent decline model parameters is included in the +max_twa_parent() function. If the same is needed for +metabolites, the function pfm::max_twa() from the ‘pfm’ +package can be used.

+
+
+FOCUS Work Group on Degradation Kinetics. 2014. Generic Guidance for +Estimating Persistence and Degradation Kinetics from Environmental Fate +Studies on Pesticides in EU Registration. 1.1 ed. http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics. +
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/web_only/FOCUS_Z.html b/docs/dev/articles/web_only/FOCUS_Z.html new file mode 100644 index 00000000..40ce9e01 --- /dev/null +++ b/docs/dev/articles/web_only/FOCUS_Z.html @@ -0,0 +1,446 @@ + + + + + + + +Example evaluation of FOCUS dataset Z • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +

Wissenschaftlicher Berater, Kronacher +Str. 12, 79639 Grenzach-Wyhlen, Germany
Privatdozent at the +University of Bremen

+
+

The data +

+

The following code defines the example dataset from Appendix 7 to the +FOCUS kinetics report (FOCUS Work Group on +Degradation Kinetics 2014, 354).

+
+library(mkin, quietly = TRUE)
+LOD = 0.5
+FOCUS_2006_Z = data.frame(
+  t = c(0, 0.04, 0.125, 0.29, 0.54, 1, 2, 3, 4, 7, 10, 14, 21,
+        42, 61, 96, 124),
+  Z0 = c(100, 81.7, 70.4, 51.1, 41.2, 6.6, 4.6, 3.9, 4.6, 4.3, 6.8,
+         2.9, 3.5, 5.3, 4.4, 1.2, 0.7),
+  Z1 = c(0, 18.3, 29.6, 46.3, 55.1, 65.7, 39.1, 36, 15.3, 5.6, 1.1,
+         1.6, 0.6, 0.5 * LOD, NA, NA, NA),
+  Z2 = c(0, NA, 0.5 * LOD, 2.6, 3.8, 15.3, 37.2, 31.7, 35.6, 14.5,
+         0.8, 2.1, 1.9, 0.5 * LOD, NA, NA, NA),
+  Z3 = c(0, NA, NA, NA, NA, 0.5 * LOD, 9.2, 13.1, 22.3, 28.4, 32.5,
+         25.2, 17.2, 4.8, 4.5, 2.8, 4.4))
+
+FOCUS_2006_Z_mkin <- mkin_wide_to_long(FOCUS_2006_Z)
+
+
+

Parent and one metabolite +

+

The next step is to set up the models used for the kinetic analysis. +As the simultaneous fit of parent and the first metabolite is usually +straightforward, Step 1 (SFO for parent only) is skipped here. We start +with the model 2a, with formation and decline of metabolite Z1 and the +pathway from parent directly to sink included (default in mkin).

+
+Z.2a <- mkinmod(Z0 = mkinsub("SFO", "Z1"),
+                Z1 = mkinsub("SFO"))
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.2a <- mkinfit(Z.2a, FOCUS_2006_Z_mkin, quiet = TRUE)
+
## Warning in mkinfit(Z.2a, FOCUS_2006_Z_mkin, quiet = TRUE): Observations with
+## value of zero were removed from the data
+
+plot_sep(m.Z.2a)
+

+
+summary(m.Z.2a, data = FALSE)$bpar
+
##            Estimate se_notrans t value     Pr(>t)    Lower    Upper
+## Z0_0       97.01488   3.301084 29.3888 3.2971e-21 91.66556 102.3642
+## k_Z0        2.23601   0.207078 10.7979 3.3309e-11  1.95303   2.5600
+## k_Z1        0.48212   0.063265  7.6207 2.8154e-08  0.40341   0.5762
+## f_Z0_to_Z1  1.00000   0.094764 10.5525 5.3560e-11  0.00000   1.0000
+## sigma       4.80411   0.635638  7.5579 3.2592e-08  3.52677   6.0815
+

As obvious from the parameter summary (the component of the summary), +the kinetic rate constant from parent compound Z to sink is very small +and the t-test for this parameter suggests that it is not significantly +different from zero. This suggests, in agreement with the analysis in +the FOCUS kinetics report, to simplify the model by removing the pathway +to sink.

+

A similar result can be obtained when formation fractions are used in +the model formulation:

+
+Z.2a.ff <- mkinmod(Z0 = mkinsub("SFO", "Z1"),
+                   Z1 = mkinsub("SFO"),
+                   use_of_ff = "max")
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.2a.ff <- mkinfit(Z.2a.ff, FOCUS_2006_Z_mkin, quiet = TRUE)
+
## Warning in mkinfit(Z.2a.ff, FOCUS_2006_Z_mkin, quiet = TRUE): Observations with
+## value of zero were removed from the data
+
+plot_sep(m.Z.2a.ff)
+

+
+summary(m.Z.2a.ff, data = FALSE)$bpar
+
##            Estimate se_notrans t value     Pr(>t)    Lower    Upper
+## Z0_0       97.01488   3.301084 29.3888 3.2971e-21 91.66556 102.3642
+## k_Z0        2.23601   0.207078 10.7979 3.3309e-11  1.95303   2.5600
+## k_Z1        0.48212   0.063265  7.6207 2.8154e-08  0.40341   0.5762
+## f_Z0_to_Z1  1.00000   0.094764 10.5525 5.3560e-11  0.00000   1.0000
+## sigma       4.80411   0.635638  7.5579 3.2592e-08  3.52677   6.0815
+

Here, the ilr transformed formation fraction fitted in the model +takes a very large value, and the backtransformed formation fraction +from parent Z to Z1 is practically unity. Here, the covariance matrix +used for the calculation of confidence intervals is not returned as the +model is overparameterised.

+

A simplified model is obtained by removing the pathway to the sink. +

+

In the following, we use the parameterisation with formation +fractions in order to be able to compare with the results in the FOCUS +guidance, and as it makes it easier to use parameters obtained in a +previous fit when adding a further metabolite.

+
+Z.3 <- mkinmod(Z0 = mkinsub("SFO", "Z1", sink = FALSE),
+               Z1 = mkinsub("SFO"), use_of_ff = "max")
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.3 <- mkinfit(Z.3, FOCUS_2006_Z_mkin, quiet = TRUE)
+
## Warning in mkinfit(Z.3, FOCUS_2006_Z_mkin, quiet = TRUE): Observations with
+## value of zero were removed from the data
+
+plot_sep(m.Z.3)
+

+
+summary(m.Z.3, data = FALSE)$bpar
+
##       Estimate se_notrans t value     Pr(>t)    Lower    Upper
+## Z0_0  97.01488   2.597342  37.352 2.0106e-24 91.67597 102.3538
+## k_Z0   2.23601   0.146904  15.221 9.1477e-15  1.95354   2.5593
+## k_Z1   0.48212   0.041727  11.554 4.8268e-12  0.40355   0.5760
+## sigma  4.80411   0.620208   7.746 1.6110e-08  3.52925   6.0790
+

As there is only one transformation product for Z0 and no pathway to +sink, the formation fraction is internally fixed to unity.

+
+
+

Metabolites Z2 and Z3 +

+

As suggested in the FOCUS report, the pathway to sink was removed for +metabolite Z1 as well in the next step. While this step appears +questionable on the basis of the above results, it is followed here for +the purpose of comparison. Also, in the FOCUS report, it is assumed that +there is additional empirical evidence that Z1 quickly and exclusively +hydrolyses to Z2.

+
+Z.5 <- mkinmod(Z0 = mkinsub("SFO", "Z1", sink = FALSE),
+               Z1 = mkinsub("SFO", "Z2", sink = FALSE),
+               Z2 = mkinsub("SFO"), use_of_ff = "max")
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.5 <- mkinfit(Z.5, FOCUS_2006_Z_mkin, quiet = TRUE)
+
## Warning in mkinfit(Z.5, FOCUS_2006_Z_mkin, quiet = TRUE): Observations with
+## value of zero were removed from the data
+
+plot_sep(m.Z.5)
+

+

Finally, metabolite Z3 is added to the model. We use the optimised +differential equation parameter values from the previous fit in order to +accelerate the optimization.

+
+Z.FOCUS <- mkinmod(Z0 = mkinsub("SFO", "Z1", sink = FALSE),
+                   Z1 = mkinsub("SFO", "Z2", sink = FALSE),
+                   Z2 = mkinsub("SFO", "Z3"),
+                   Z3 = mkinsub("SFO"),
+                   use_of_ff = "max")
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.FOCUS <- mkinfit(Z.FOCUS, FOCUS_2006_Z_mkin,
+                     parms.ini = m.Z.5$bparms.ode,
+                     quiet = TRUE)
+
## Warning in mkinfit(Z.FOCUS, FOCUS_2006_Z_mkin, parms.ini = m.Z.5$bparms.ode, :
+## Observations with value of zero were removed from the data
+
## Warning in mkinfit(Z.FOCUS, FOCUS_2006_Z_mkin, parms.ini = m.Z.5$bparms.ode, : Optimisation did not converge:
+## false convergence (8)
+
+plot_sep(m.Z.FOCUS)
+

+
+summary(m.Z.FOCUS, data = FALSE)$bpar
+
##             Estimate se_notrans t value     Pr(>t)     Lower      Upper
+## Z0_0       96.842440   1.994291 48.5598 4.0226e-42 92.830421 100.854459
+## k_Z0        2.215425   0.118457 18.7023 1.0404e-23  1.989490   2.467019
+## k_Z1        0.478307   0.028257 16.9272 6.2332e-22  0.424709   0.538669
+## k_Z2        0.451642   0.042139 10.7178 1.6304e-14  0.374348   0.544894
+## k_Z3        0.058692   0.015245  3.8499 1.7803e-04  0.034804   0.098975
+## f_Z2_to_Z3  0.471483   0.058348  8.0806 9.6585e-11  0.357720   0.588287
+## sigma       3.984431   0.383402 10.3923 4.5576e-14  3.213126   4.755737
+
+endpoints(m.Z.FOCUS)
+
## $ff
+##   Z2_Z3 Z2_sink 
+## 0.47148 0.52852 
+## 
+## $distimes
+##        DT50    DT90
+## Z0  0.31287  1.0393
+## Z1  1.44917  4.8140
+## Z2  1.53473  5.0983
+## Z3 11.80991 39.2317
+

This fit corresponds to the final result chosen in Appendix 7 of the +FOCUS report. Confidence intervals returned by mkin are based on +internally transformed parameters, however.

+
+
+

Using the SFORB model +

+

As the FOCUS report states, there is a certain tailing of the time +course of metabolite Z3. Also, the time course of the parent compound is +not fitted very well using the SFO model, as residues at a certain low +level remain.

+

Therefore, an additional model is offered here, using the single +first-order reversible binding (SFORB) model for metabolite Z3. As +expected, the +χ2\chi^2 +error level is lower for metabolite Z3 using this model and the +graphical fit for Z3 is improved. However, the covariance matrix is not +returned.

+
+Z.mkin.1 <- mkinmod(Z0 = mkinsub("SFO", "Z1", sink = FALSE),
+                    Z1 = mkinsub("SFO", "Z2", sink = FALSE),
+                    Z2 = mkinsub("SFO", "Z3"),
+                    Z3 = mkinsub("SFORB"))
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.mkin.1 <- mkinfit(Z.mkin.1, FOCUS_2006_Z_mkin, quiet = TRUE)
+
## Warning in mkinfit(Z.mkin.1, FOCUS_2006_Z_mkin, quiet = TRUE): Observations
+## with value of zero were removed from the data
+
+plot_sep(m.Z.mkin.1)
+

+
+summary(m.Z.mkin.1, data = FALSE)$cov.unscaled
+
## NULL
+

Therefore, a further stepwise model building is performed starting +from the stage of parent and two metabolites, starting from the +assumption that the model fit for the parent compound can be improved by +using the SFORB model.

+
+Z.mkin.3 <- mkinmod(Z0 = mkinsub("SFORB", "Z1", sink = FALSE),
+                    Z1 = mkinsub("SFO", "Z2", sink = FALSE),
+                    Z2 = mkinsub("SFO"))
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.mkin.3 <- mkinfit(Z.mkin.3, FOCUS_2006_Z_mkin, quiet = TRUE)
+
## Warning in mkinfit(Z.mkin.3, FOCUS_2006_Z_mkin, quiet = TRUE): Observations
+## with value of zero were removed from the data
+
+plot_sep(m.Z.mkin.3)
+

+

This results in a much better representation of the behaviour of the +parent compound Z0.

+

Finally, Z3 is added as well. These models appear overparameterised +(no covariance matrix returned) if the sink for Z1 is left in the +models.

+
+Z.mkin.4 <- mkinmod(Z0 = mkinsub("SFORB", "Z1", sink = FALSE),
+                    Z1 = mkinsub("SFO", "Z2", sink = FALSE),
+                    Z2 = mkinsub("SFO", "Z3"),
+                    Z3 = mkinsub("SFO"))
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.mkin.4 <- mkinfit(Z.mkin.4, FOCUS_2006_Z_mkin,
+                      parms.ini = m.Z.mkin.3$bparms.ode,
+                      quiet = TRUE)
+
## Warning in mkinfit(Z.mkin.4, FOCUS_2006_Z_mkin, parms.ini =
+## m.Z.mkin.3$bparms.ode, : Observations with value of zero were removed from the
+## data
+
+plot_sep(m.Z.mkin.4)
+

+

The error level of the fit, but especially of metabolite Z3, can be +improved if the SFORB model is chosen for this metabolite, as this model +is capable of representing the tailing of the metabolite decline +phase.

+
+Z.mkin.5 <- mkinmod(Z0 = mkinsub("SFORB", "Z1", sink = FALSE),
+                    Z1 = mkinsub("SFO", "Z2", sink = FALSE),
+                    Z2 = mkinsub("SFO", "Z3"),
+                    Z3 = mkinsub("SFORB"))
+
## Temporary DLL for differentials generated and loaded
+
+m.Z.mkin.5 <- mkinfit(Z.mkin.5, FOCUS_2006_Z_mkin,
+                      parms.ini = m.Z.mkin.4$bparms.ode[1:4],
+                      quiet = TRUE)
+
## Warning in mkinfit(Z.mkin.5, FOCUS_2006_Z_mkin, parms.ini =
+## m.Z.mkin.4$bparms.ode[1:4], : Observations with value of zero were removed from
+## the data
+
+plot_sep(m.Z.mkin.5)
+

+

The summary view of the backtransformed parameters shows that we get +no confidence intervals due to overparameterisation. As the optimized is +excessively small, it seems reasonable to fix it to zero.

+
+m.Z.mkin.5a <- mkinfit(Z.mkin.5, FOCUS_2006_Z_mkin,
+                       parms.ini = c(m.Z.mkin.5$bparms.ode[1:7],
+                                     k_Z3_bound_free = 0),
+                       fixed_parms = "k_Z3_bound_free",
+                       quiet = TRUE)
+
## Warning in mkinfit(Z.mkin.5, FOCUS_2006_Z_mkin, parms.ini =
+## c(m.Z.mkin.5$bparms.ode[1:7], : Observations with value of zero were removed
+## from the data
+
+plot_sep(m.Z.mkin.5a)
+

+

As expected, the residual plots for Z0 and Z3 are more random than in +the case of the all SFO model for which they were shown above. In +conclusion, the model is proposed as the best-fit model for the dataset +from Appendix 7 of the FOCUS report.

+

A graphical representation of the confidence intervals can finally be +obtained.

+
+mkinparplot(m.Z.mkin.5a)
+

+

The endpoints obtained with this model are

+
+endpoints(m.Z.mkin.5a)
+
## $ff
+## Z0_free   Z2_Z3 Z2_sink Z3_free 
+## 1.00000 0.53656 0.46344 1.00000 
+## 
+## $SFORB
+##     Z0_b1     Z0_b2      Z0_g     Z3_b1     Z3_b2      Z3_g 
+## 2.4471342 0.0075124 0.9519866 0.0800071 0.0000000 0.9347816 
+## 
+## $distimes
+##      DT50   DT90 DT50back DT50_Z0_b1 DT50_Z0_b2 DT50_Z3_b1 DT50_Z3_b2
+## Z0 0.3043 1.1848  0.35666    0.28325     92.267         NA         NA
+## Z1 1.5148 5.0320       NA         NA         NA         NA         NA
+## Z2 1.6414 5.4526       NA         NA         NA         NA         NA
+## Z3     NA     NA       NA         NA         NA     8.6636        Inf
+

It is clear the degradation rate of Z3 towards the end of the +experiment is very low as DT50_Z3_b2 (the second Eigenvalue of the +system of two differential equations representing the SFORB system for +Z3, corresponding to the slower rate constant of the DFOP model) is +reported to be infinity. However, this appears to be a feature of the +data.

+
+
+

References +

+ +
+
+FOCUS Work Group on Degradation Kinetics. 2014. Generic Guidance for +Estimating Persistence and Degradation Kinetics from Environmental Fate +Studies on Pesticides in EU Registration. 1.1 ed. http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics. +
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_1-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_1-1.png new file mode 100644 index 00000000..98bc135b Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_1-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_10-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_10-1.png new file mode 100644 index 00000000..c1011a35 Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_10-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11-1.png new file mode 100644 index 00000000..dfd2dd50 Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11a-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11a-1.png new file mode 100644 index 00000000..74173f36 Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11a-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11b-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11b-1.png new file mode 100644 index 00000000..1c5793cc Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_11b-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_2-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_2-1.png new file mode 100644 index 00000000..98bc135b Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_2-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_3-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_3-1.png new file mode 100644 index 00000000..0380ba43 Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_3-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_5-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_5-1.png new file mode 100644 index 00000000..8c594ec9 Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_5-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_6-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_6-1.png new file mode 100644 index 00000000..84d473d6 Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_6-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_7-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_7-1.png new file mode 100644 index 00000000..87af8874 Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_7-1.png differ diff --git a/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_9-1.png b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_9-1.png new file mode 100644 index 00000000..492cdcc8 Binary files /dev/null and b/docs/dev/articles/web_only/FOCUS_Z_files/figure-html/FOCUS_2006_Z_fits_9-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples.html b/docs/dev/articles/web_only/NAFTA_examples.html new file mode 100644 index 00000000..6bf39b2c --- /dev/null +++ b/docs/dev/articles/web_only/NAFTA_examples.html @@ -0,0 +1,1049 @@ + + + + + + + +Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

Introduction +

+

In this document, the example evaluations provided in Attachment 1 to +the SOP of US EPA for using the NAFTA guidance (US EPA 2015) are repeated using mkin. The +original evaluations reported in the attachment were performed using +PestDF in version 0.8.4. Note that PestDF 0.8.13 is the version +distributed at the US EPA website today (2019-02-26).

+

The datasets are now distributed with the mkin package.

+
+
+

Examples where DFOP did not converge with PestDF 0.8.4 +

+

In attachment 1, it is reported that the DFOP model does not converge +for these datasets when PestDF 0.8.4 was used. For all four datasets, +the DFOP model can be fitted with mkin (see below). The negative +half-life given by PestDF 0.8.4 for these fits appears to be the result +of a bug. The results for the other two models (SFO and IORE) are the +same.

+
+

Example on page 5, upper panel +

+
+p5a <- nafta(NAFTA_SOP_Attachment[["p5a"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p5a)
+

+
+print(p5a)
+
## Sums of squares:
+##       SFO      IORE      DFOP 
+## 465.21753  56.27506  32.06401 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 64.4304
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)  Lower   Upper
+## parent_0  95.8401 4.67e-21 92.245 99.4357
+## k_parent   0.0102 3.92e-12  0.009  0.0117
+## sigma      4.8230 3.81e-06  3.214  6.4318
+## 
+## $IORE
+##                Estimate Pr(>t)    Lower    Upper
+## parent_0       1.01e+02     NA 9.91e+01 1.02e+02
+## k__iore_parent 1.54e-05     NA 4.08e-06 5.84e-05
+## N_parent       2.57e+00     NA 2.25e+00 2.89e+00
+## sigma          1.68e+00     NA 1.12e+00 2.24e+00
+## 
+## $DFOP
+##          Estimate   Pr(>t)   Lower    Upper
+## parent_0 9.99e+01 1.41e-26 98.8116 101.0810
+## k1       2.67e-02 5.05e-06  0.0243   0.0295
+## k2       3.41e-12 5.00e-01  0.0000      Inf
+## g        6.47e-01 3.67e-06  0.6248   0.6677
+## sigma    1.27e+00 8.91e-06  0.8395   1.6929
+## 
+## 
+## DTx values:
+##      DT50     DT90 DT50_rep
+## SFO  67.7 2.25e+02 6.77e+01
+## IORE 58.2 1.07e+03 3.22e+02
+## DFOP 55.5 3.70e+11 2.03e+11
+## 
+## Representative half-life:
+## [1] 321.51
+
+
+

Example on page 5, lower panel +

+
+p5b <- nafta(NAFTA_SOP_Attachment[["p5b"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p5b)
+

+
+print(p5b)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 94.81123 10.10936  7.55871 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 11.77879
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0   96.497 2.32e-24 94.85271 98.14155
+## k_parent    0.008 3.42e-14  0.00737  0.00869
+## sigma       2.295 1.22e-05  1.47976  3.11036
+## 
+## $IORE
+##                Estimate   Pr(>t)    Lower    Upper
+## parent_0       9.85e+01 1.17e-28 9.79e+01 9.92e+01
+## k__iore_parent 1.53e-04 6.50e-03 7.21e-05 3.26e-04
+## N_parent       1.94e+00 5.88e-13 1.76e+00 2.12e+00
+## sigma          7.49e-01 1.63e-05 4.82e-01 1.02e+00
+## 
+## $DFOP
+##          Estimate   Pr(>t)   Lower   Upper
+## parent_0 9.84e+01 1.24e-27 97.8078 98.9187
+## k1       1.55e-02 4.10e-04  0.0143  0.0167
+## k2       9.07e-12 5.00e-01  0.0000     Inf
+## g        6.89e-01 2.92e-03  0.6626  0.7142
+## sigma    6.48e-01 2.38e-05  0.4147  0.8813
+## 
+## 
+## DTx values:
+##      DT50     DT90 DT50_rep
+## SFO  86.6 2.88e+02 8.66e+01
+## IORE 85.5 7.17e+02 2.16e+02
+## DFOP 83.6 1.25e+11 7.64e+10
+## 
+## Representative half-life:
+## [1] 215.87
+
+
+

Example on page 6 +

+
+p6 <- nafta(NAFTA_SOP_Attachment[["p6"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p6)
+

+
+print(p6)
+
## Sums of squares:
+##       SFO      IORE      DFOP 
+## 188.45361  51.00699  42.46931 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 58.39888
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)   Lower   Upper
+## parent_0  94.7759 7.29e-24 92.3478 97.2039
+## k_parent   0.0179 8.02e-16  0.0166  0.0194
+## sigma      3.0696 3.81e-06  2.0456  4.0936
+## 
+## $IORE
+##                Estimate   Pr(>t)    Lower    Upper
+## parent_0       97.12446 2.63e-26 95.62461 98.62431
+## k__iore_parent  0.00252 1.95e-03  0.00134  0.00472
+## N_parent        1.49587 4.07e-13  1.33896  1.65279
+## sigma           1.59698 5.05e-06  1.06169  2.13227
+## 
+## $DFOP
+##          Estimate   Pr(>t)   Lower   Upper
+## parent_0 9.66e+01 1.57e-25 95.3476 97.8979
+## k1       2.55e-02 7.33e-06  0.0233  0.0278
+## k2       3.84e-11 5.00e-01  0.0000     Inf
+## g        8.61e-01 7.55e-06  0.8314  0.8867
+## sigma    1.46e+00 6.93e-06  0.9661  1.9483
+## 
+## 
+## DTx values:
+##      DT50     DT90 DT50_rep
+## SFO  38.6 1.28e+02 3.86e+01
+## IORE 34.0 1.77e+02 5.32e+01
+## DFOP 34.1 8.50e+09 1.80e+10
+## 
+## Representative half-life:
+## [1] 53.17
+
+
+

Example on page 7 +

+
+p7 <- nafta(NAFTA_SOP_Attachment[["p7"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p7)
+

+
+print(p7)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 3661.661 3195.030 3174.145 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 3334.194
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 96.41796 4.80e-53 93.32245 99.51347
+## k_parent  0.00735 7.64e-21  0.00641  0.00843
+## sigma     7.94557 1.83e-15  6.46713  9.42401
+## 
+## $IORE
+##                Estimate Pr(>t)    Lower    Upper
+## parent_0       9.92e+01     NA 9.55e+01 1.03e+02
+## k__iore_parent 1.60e-05     NA 1.45e-07 1.77e-03
+## N_parent       2.45e+00     NA 1.35e+00 3.54e+00
+## sigma          7.42e+00     NA 6.04e+00 8.80e+00
+## 
+## $DFOP
+##          Estimate   Pr(>t)   Lower    Upper
+## parent_0 9.89e+01 9.44e-49 95.4640 102.2573
+## k1       1.81e-02 1.75e-01  0.0116   0.0281
+## k2       3.62e-10 5.00e-01  0.0000      Inf
+## g        6.06e-01 2.19e-01  0.4826   0.7178
+## sigma    7.40e+00 2.97e-15  6.0201   8.7754
+## 
+## 
+## DTx values:
+##      DT50     DT90 DT50_rep
+## SFO  94.3 3.13e+02 9.43e+01
+## IORE 96.7 1.51e+03 4.55e+02
+## DFOP 96.4 3.79e+09 1.92e+09
+## 
+## Representative half-life:
+## [1] 454.55
+
+
+
+

Examples where the representative half-life deviates from the +observed DT50 +

+
+

Example on page 8 +

+

For this dataset, the IORE fit does not converge when the default +starting values used by mkin for the IORE model are used. Therefore, a +lower value for the rate constant is used here.

+
+p8 <- nafta(NAFTA_SOP_Attachment[["p8"]], parms.ini = c(k__iore_parent = 1e-3))
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p8)
+

+
+print(p8)
+
## Sums of squares:
+##       SFO      IORE      DFOP 
+## 1996.9408  444.9237  547.5616 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 477.4924
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 88.16549 6.53e-29 83.37344 92.95754
+## k_parent  0.00803 1.67e-13  0.00674  0.00957
+## sigma     7.44786 4.17e-10  5.66209  9.23363
+## 
+## $IORE
+##                Estimate   Pr(>t)    Lower    Upper
+## parent_0       9.77e+01 7.03e-35 9.44e+01 1.01e+02
+## k__iore_parent 6.14e-05 3.20e-02 2.12e-05 1.78e-04
+## N_parent       2.27e+00 4.23e-18 2.00e+00 2.54e+00
+## sigma          3.52e+00 5.36e-10 2.67e+00 4.36e+00
+## 
+## $DFOP
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 95.70619 8.99e-32 91.87941 99.53298
+## k1        0.02500 5.25e-04  0.01422  0.04394
+## k2        0.00273 6.84e-03  0.00125  0.00597
+## g         0.58835 2.84e-06  0.36595  0.77970
+## sigma     3.90001 6.94e-10  2.96260  4.83741
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO  86.3  287     86.3
+## IORE 53.4  668    201.0
+## DFOP 55.6  517    253.0
+## 
+## Representative half-life:
+## [1] 201.03
+
+
+
+

Examples where SFO was not selected for an abiotic study +

+
+

Example on page 9, upper panel +

+
+p9a <- nafta(NAFTA_SOP_Attachment[["p9a"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p9a)
+

+
+print(p9a)
+
## Sums of squares:
+##       SFO      IORE      DFOP 
+## 839.35238  88.57064   9.93363 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 105.5678
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)   Lower   Upper
+## parent_0  88.1933 3.06e-12 79.9447 96.4419
+## k_parent   0.0409 2.07e-07  0.0324  0.0516
+## sigma      7.2429 3.92e-05  4.4768 10.0090
+## 
+## $IORE
+##                Estimate   Pr(>t)    Lower    Upper
+## parent_0       9.89e+01 1.12e-16 9.54e+01 1.02e+02
+## k__iore_parent 1.93e-05 1.13e-01 3.49e-06 1.06e-04
+## N_parent       2.91e+00 1.45e-09 2.50e+00 3.32e+00
+## sigma          2.35e+00 5.31e-05 1.45e+00 3.26e+00
+## 
+## $DFOP
+##          Estimate   Pr(>t)  Lower  Upper
+## parent_0 9.85e+01 2.54e-20 97.390 99.672
+## k1       1.38e-01 3.52e-05  0.131  0.146
+## k2       9.02e-13 5.00e-01  0.000    Inf
+## g        6.52e-01 8.13e-06  0.642  0.661
+## sigma    7.88e-01 6.13e-02  0.481  1.095
+## 
+## 
+## DTx values:
+##      DT50     DT90 DT50_rep
+## SFO  16.9 5.63e+01 1.69e+01
+## IORE 11.6 3.37e+02 1.01e+02
+## DFOP 10.5 1.38e+12 7.68e+11
+## 
+## Representative half-life:
+## [1] 101.43
+

In this example, the residuals of the SFO indicate a lack of fit of +this model, so even if it was an abiotic experiment, the data do not +suggest a simple exponential decline.

+
+
+

Example on page 9, lower panel +

+
+p9b <- nafta(NAFTA_SOP_Attachment[["p9b"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p9b)
+

+
+print(p9b)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 35.64867 23.22334 35.64867 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 28.54188
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)  Lower   Upper
+## parent_0  94.7123 2.15e-19 93.178 96.2464
+## k_parent   0.0389 4.47e-14  0.037  0.0408
+## sigma      1.5957 1.28e-04  0.932  2.2595
+## 
+## $IORE
+##                Estimate   Pr(>t)   Lower  Upper
+## parent_0         93.863 2.32e-18 92.4565 95.269
+## k__iore_parent    0.127 1.85e-02  0.0504  0.321
+## N_parent          0.711 1.88e-05  0.4843  0.937
+## sigma             1.288 1.76e-04  0.7456  1.830
+## 
+## $DFOP
+##          Estimate   Pr(>t)   Lower   Upper
+## parent_0  94.7123 1.61e-16 93.1355 96.2891
+## k1         0.0389 1.08e-04  0.0266  0.0569
+## k2         0.0389 2.24e-04  0.0255  0.0592
+## g          0.5256 5.00e-01  0.0000  1.0000
+## sigma      1.5957 2.50e-04  0.9135  2.2779
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO  17.8 59.2     17.8
+## IORE 18.4 49.2     14.8
+## DFOP 17.8 59.2     17.8
+## 
+## Representative half-life:
+## [1] 14.8
+

Here, mkin gives a longer slow DT50 for the DFOP model (17.8 days) +than PestDF (13.5 days). Presumably, this is related to the fact that +PestDF gives a negative value for the proportion of the fast degradation +which should be between 0 and 1, inclusive. This parameter is called f +in PestDF and g in mkin. In mkin, it is restricted to the interval from +0 to 1.

+
+
+

Example on page 10 +

+
+p10 <- nafta(NAFTA_SOP_Attachment[["p10"]])
+
## Warning in sqrt(diag(covar_notrans)): NaNs produced
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p10)
+

+
+print(p10)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 899.4089 336.4348 899.4089 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 413.4841
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)   Lower    Upper
+## parent_0 101.7315 6.42e-11 91.9259 111.5371
+## k_parent   0.0495 1.70e-07  0.0404   0.0607
+## sigma      8.0152 1.28e-04  4.6813  11.3491
+## 
+## $IORE
+##                Estimate   Pr(>t)  Lower   Upper
+## parent_0          96.86 3.32e-12 90.848 102.863
+## k__iore_parent     2.96 7.91e-02  0.687  12.761
+## N_parent           0.00 5.00e-01 -0.372   0.372
+## sigma              4.90 1.77e-04  2.837   6.968
+## 
+## $DFOP
+##          Estimate   Pr(>t)   Lower   Upper
+## parent_0 101.7315 1.41e-09 91.6534 111.810
+## k1         0.0495 3.04e-03  0.0188   0.131
+## k2         0.0495 4.92e-04  0.0197   0.124
+## g          0.4487      NaN  0.0000   1.000
+## sigma      8.0152 2.50e-04  4.5886  11.442
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO  14.0 46.5    14.00
+## IORE 16.4 29.4     8.86
+## DFOP 14.0 46.5    14.00
+## 
+## Representative half-life:
+## [1] 8.86
+

Here, a value below N is given for the IORE model, because the data +suggests a faster decline towards the end of the experiment, which +appears physically rather unlikely in the case of a photolysis study. It +seems PestDF does not constrain N to values above zero, thus the slight +difference in IORE model parameters between PestDF and mkin.

+
+
+
+

The DT50 was not observed during the study +

+
+

Example on page 11 +

+
+p11 <- nafta(NAFTA_SOP_Attachment[["p11"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p11)
+

+
+print(p11)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 579.6805 204.7932 144.7783 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 251.6944
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 96.15820 4.83e-13 90.24934 1.02e+02
+## k_parent  0.00321 4.71e-05  0.00222 4.64e-03
+## sigma     6.43473 1.28e-04  3.75822 9.11e+00
+## 
+## $IORE
+##                Estimate Pr(>t)    Lower    Upper
+## parent_0       1.05e+02     NA 9.90e+01 1.10e+02
+## k__iore_parent 3.11e-17     NA 1.35e-20 7.18e-14
+## N_parent       8.36e+00     NA 6.62e+00 1.01e+01
+## sigma          3.82e+00     NA 2.21e+00 5.44e+00
+## 
+## $DFOP
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 1.05e+02 9.47e-13  99.9990 109.1224
+## k1       4.41e-02 5.95e-03   0.0296   0.0658
+## k2       9.94e-13 5.00e-01   0.0000      Inf
+## g        3.22e-01 1.45e-03   0.2814   0.3650
+## sigma    3.22e+00 3.52e-04   1.8410   4.5906
+## 
+## 
+## DTx values:
+##          DT50     DT90 DT50_rep
+## SFO  2.16e+02 7.18e+02 2.16e+02
+## IORE 9.73e+02 1.37e+08 4.11e+07
+## DFOP 3.07e+11 1.93e+12 6.98e+11
+## 
+## Representative half-life:
+## [1] 41148169
+

In this case, the DFOP fit reported for PestDF resulted in a negative +value for the slower rate constant, which is not possible in mkin. The +other results are in agreement.

+
+
+
+

N is less than 1 and the DFOP rate constants are like the SFO rate +constant +

+

In the following three examples, the same results are obtained with +mkin as reported for PestDF. As in the case on page 10, the N values +below 1 are deemed unrealistic and appear to be the result of an +overparameterisation.

+
+

Example on page 12, upper panel +

+
+p12a <- nafta(NAFTA_SOP_Attachment[["p12a"]])
+
## Warning in summary.mkinfit(x): Could not calculate correlation; no covariance
+## matrix
+
## Warning in sqrt(diag(covar_notrans)): NaNs produced
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p12a)
+

+
+print(p12a)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 695.4440 220.0685 695.4440 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 270.4679
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)  Lower   Upper
+## parent_0  100.521 8.75e-12 92.461 108.581
+## k_parent    0.124 3.61e-08  0.104   0.148
+## sigma       7.048 1.28e-04  4.116   9.980
+## 
+## $IORE
+##                Estimate Pr(>t) Lower Upper
+## parent_0         96.823     NA    NA    NA
+## k__iore_parent    2.436     NA    NA    NA
+## N_parent          0.263     NA    NA    NA
+## sigma             3.965     NA    NA    NA
+## 
+## $DFOP
+##          Estimate   Pr(>t)   Lower   Upper
+## parent_0  100.521 2.74e-10 92.2366 108.805
+## k1          0.124 2.53e-05  0.0908   0.170
+## k2          0.124 2.52e-02  0.0456   0.339
+## g           0.793      NaN  0.0000   1.000
+## sigma       7.048 2.50e-04  4.0349  10.061
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO  5.58 18.5     5.58
+## IORE 6.49 13.2     3.99
+## DFOP 5.58 18.5     5.58
+## 
+## Representative half-life:
+## [1] 3.99
+
+
+

Example on page 12, lower panel +

+
+p12b <- nafta(NAFTA_SOP_Attachment[["p12b"]])
+
## Warning in sqrt(diag(covar)): NaNs produced
+
## Warning in qt(alpha/2, rdf): NaNs produced
+
## Warning in qt(1 - alpha/2, rdf): NaNs produced
+
## Warning in pt(abs(tval), rdf, lower.tail = FALSE): NaNs produced
+
## Warning in cov2cor(ans$covar): diag(V) had non-positive or NA entries; the
+## non-finite result may be dubious
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p12b)
+

+
+print(p12b)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 58.90242 19.06353 58.90242 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 51.51756
+## 
+## Parameters:
+## $SFO
+##          Estimate  Pr(>t)   Lower    Upper
+## parent_0  97.6840 0.00039 85.9388 109.4292
+## k_parent   0.0589 0.00261  0.0431   0.0805
+## sigma      3.4323 0.04356 -1.2377   8.1023
+## 
+## $IORE
+##                Estimate Pr(>t)     Lower  Upper
+## parent_0         95.523 0.0055 74.539157 116.51
+## k__iore_parent    0.333 0.1433  0.000717 154.57
+## N_parent          0.568 0.0677 -0.989464   2.13
+## sigma             1.953 0.0975 -5.893100   9.80
+## 
+## $DFOP
+##          Estimate Pr(>t) Lower Upper
+## parent_0  97.6840    NaN   NaN   NaN
+## k1         0.0589    NaN    NA    NA
+## k2         0.0589    NaN    NA    NA
+## g          0.6473    NaN    NA    NA
+## sigma      3.4323    NaN   NaN   NaN
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO  11.8 39.1    11.80
+## IORE 12.9 31.4     9.46
+## DFOP 11.8 39.1    11.80
+## 
+## Representative half-life:
+## [1] 9.46
+
+
+

Example on page 13 +

+
+p13 <- nafta(NAFTA_SOP_Attachment[["p13"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p13)
+

+
+print(p13)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 174.5971 142.3951 174.5971 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 172.131
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 92.73500 5.99e-17 89.61936 95.85065
+## k_parent  0.00258 2.42e-09  0.00223  0.00299
+## sigma     3.41172 7.07e-05  2.05455  4.76888
+## 
+## $IORE
+##                Estimate   Pr(>t)    Lower  Upper
+## parent_0        91.6016 6.34e-16 88.53086 94.672
+## k__iore_parent   0.0396 2.36e-01  0.00207  0.759
+## N_parent         0.3541 1.46e-01 -0.35153  1.060
+## sigma            3.0811 9.64e-05  1.84296  4.319
+## 
+## $DFOP
+##          Estimate Pr(>t)    Lower    Upper
+## parent_0 92.73500     NA 8.95e+01 95.92118
+## k1        0.00258     NA 4.18e-04  0.01592
+## k2        0.00258     NA 1.75e-03  0.00381
+## g         0.16452     NA 0.00e+00  1.00000
+## sigma     3.41172     NA 2.02e+00  4.79960
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO   269  892      269
+## IORE  261  560      169
+## DFOP  269  892      269
+## 
+## Representative half-life:
+## [1] 168.51
+
+
+
+

DT50 not observed in the study and DFOP problems in PestDF +

+
+p14 <- nafta(NAFTA_SOP_Attachment[["p14"]])
+
## Warning in sqrt(diag(covar)): NaNs produced
+
## Warning in cov2cor(ans$covar): diag(V) had non-positive or NA entries; the
+## non-finite result may be dubious
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p14)
+

+
+print(p14)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 48.43249 28.67746 27.26248 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 32.83337
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 99.47124 2.06e-30 98.42254 1.01e+02
+## k_parent  0.00279 3.75e-15  0.00256 3.04e-03
+## sigma     1.55616 3.81e-06  1.03704 2.08e+00
+## 
+## $IORE
+##                Estimate Pr(>t) Lower Upper
+## parent_0       1.00e+02     NA   NaN   NaN
+## k__iore_parent 9.44e-08     NA   NaN   NaN
+## N_parent       3.31e+00     NA   NaN   NaN
+## sigma          1.20e+00     NA 0.796   1.6
+## 
+## $DFOP
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 1.00e+02 2.96e-28 99.40280 101.2768
+## k1       9.53e-03 1.20e-01  0.00638   0.0143
+## k2       5.21e-12 5.00e-01  0.00000      Inf
+## g        3.98e-01 2.19e-01  0.30481   0.4998
+## sigma    1.17e+00 7.68e-06  0.77406   1.5610
+## 
+## 
+## DTx values:
+##          DT50     DT90 DT50_rep
+## SFO  2.48e+02 8.25e+02 2.48e+02
+## IORE 4.34e+02 2.22e+04 6.70e+03
+## DFOP 3.55e+10 3.44e+11 1.33e+11
+## 
+## Representative half-life:
+## [1] 6697.44
+

The slower rate constant reported by PestDF is negative, which is not +physically realistic, and not possible in mkin. The other fits give the +same results in mkin and PestDF.

+
+
+

N is less than 1 and DFOP fraction parameter is below zero +

+
+p15a <- nafta(NAFTA_SOP_Attachment[["p15a"]])
+
## Warning in sqrt(diag(covar)): NaNs produced
+
## Warning in cov2cor(ans$covar): diag(V) had non-positive or NA entries; the
+## non-finite result may be dubious
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p15a)
+

+
+print(p15a)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 245.5248 135.0132 245.5248 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 165.9335
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)    Lower   Upper
+## parent_0 97.96751 2.00e-15 94.32049 101.615
+## k_parent  0.00952 4.93e-09  0.00824   0.011
+## sigma     4.18778 1.28e-04  2.44588   5.930
+## 
+## $IORE
+##                Estimate   Pr(>t)  Lower  Upper
+## parent_0         95.874 2.94e-15 92.937 98.811
+## k__iore_parent    0.629 2.11e-01  0.044  8.982
+## N_parent          0.000 5.00e-01 -0.642  0.642
+## sigma             3.105 1.78e-04  1.795  4.416
+## 
+## $DFOP
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 97.96751 2.85e-13 94.21913 101.7159
+## k1        0.00952 6.28e-02  0.00260   0.0349
+## k2        0.00952 1.27e-04  0.00652   0.0139
+## g         0.21241 5.00e-01       NA       NA
+## sigma     4.18778 2.50e-04  2.39747   5.9781
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO  72.8  242     72.8
+## IORE 76.3  137     41.3
+## DFOP 72.8  242     72.8
+## 
+## Representative half-life:
+## [1] 41.33
+
+p15b <- nafta(NAFTA_SOP_Attachment[["p15b"]])
+
## Warning in summary.mkinfit(x): Could not calculate correlation; no covariance
+## matrix
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The half-life obtained from the IORE model may be used
+
+plot(p15b)
+

+
+print(p15b)
+
## Sums of squares:
+##       SFO      IORE      DFOP 
+## 106.91629  68.55574 106.91629 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 84.25618
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)    Lower    Upper
+## parent_0 1.01e+02 3.06e-17 98.31594 1.03e+02
+## k_parent 4.86e-03 2.48e-10  0.00435 5.42e-03
+## sigma    2.76e+00 1.28e-04  1.61402 3.91e+00
+## 
+## $IORE
+##                Estimate   Pr(>t)    Lower  Upper
+## parent_0          99.83 1.81e-16 97.51348 102.14
+## k__iore_parent     0.38 3.22e-01  0.00352  41.05
+## N_parent           0.00 5.00e-01 -1.07696   1.08
+## sigma              2.21 2.57e-04  1.23245   3.19
+## 
+## $DFOP
+##          Estimate Pr(>t) Lower Upper
+## parent_0 1.01e+02     NA    NA    NA
+## k1       4.86e-03     NA    NA    NA
+## k2       4.86e-03     NA    NA    NA
+## g        1.88e-01     NA    NA    NA
+## sigma    2.76e+00     NA    NA    NA
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO   143  474    143.0
+## IORE  131  236     71.2
+## DFOP  143  474    143.0
+## 
+## Representative half-life:
+## [1] 71.18
+

In mkin, only the IORE fit is affected (deemed unrealistic), as the +fraction parameter of the DFOP model is restricted to the interval +between 0 and 1 in mkin. The SFO fits give the same results for both +mkin and PestDF.

+
+
+

The DFOP fraction parameter is greater than 1 +

+
+p16 <- nafta(NAFTA_SOP_Attachment[["p16"]])
+
## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
+
## The representative half-life of the IORE model is longer than the one corresponding
+
## to the terminal degradation rate found with the DFOP model.
+
## The representative half-life obtained from the DFOP model may be used
+
+plot(p16)
+

+
+print(p16)
+
## Sums of squares:
+##      SFO     IORE     DFOP 
+## 3831.804 2062.008 1550.980 
+## 
+## Critical sum of squares for checking the SFO model:
+## [1] 2247.348
+## 
+## Parameters:
+## $SFO
+##          Estimate   Pr(>t)  Lower Upper
+## parent_0   71.953 2.33e-13 60.509 83.40
+## k_parent    0.159 4.86e-05  0.102  0.25
+## sigma      11.302 1.25e-08  8.308 14.30
+## 
+## $IORE
+##                Estimate   Pr(>t)    Lower    Upper
+## parent_0       8.74e+01 2.48e-16 7.72e+01 97.52972
+## k__iore_parent 4.55e-04 2.16e-01 3.48e-05  0.00595
+## N_parent       2.70e+00 1.21e-08 1.99e+00  3.40046
+## sigma          8.29e+00 1.61e-08 6.09e+00 10.49062
+## 
+## $DFOP
+##          Estimate   Pr(>t)   Lower  Upper
+## parent_0  88.5333 7.40e-18 79.9836 97.083
+## k1        18.8461 5.00e-01  0.0000    Inf
+## k2         0.0776 1.41e-05  0.0518  0.116
+## g          0.4733 1.41e-09  0.3674  0.582
+## sigma      7.1902 2.11e-08  5.2785  9.102
+## 
+## 
+## DTx values:
+##      DT50 DT90 DT50_rep
+## SFO  4.35 14.4     4.35
+## IORE 1.48 32.1     9.67
+## DFOP 0.67 21.4     8.93
+## 
+## Representative half-life:
+## [1] 8.93
+

In PestDF, the DFOP fit seems to have stuck in a local minimum, as +mkin finds a solution with a much lower +χ2\chi^2 +error level. As the half-life from the slower rate constant of the DFOP +model is larger than the IORE derived half-life, the NAFTA +recommendation obtained with mkin is to use the DFOP representative +half-life of 8.9 days.

+
+
+

Conclusions +

+

The results obtained with mkin deviate from the results obtained with +PestDF either in cases where one of the interpretive rules would apply, +i.e. the IORE parameter N is less than one or the DFOP k values obtained +with PestDF are equal to the SFO k values, or in cases where the DFOP +model did not converge, which often lead to negative rate constants +returned by PestDF.

+

Therefore, mkin appears to suitable for kinetic evaluations according +to the NAFTA guidance.

+
+
+

References +

+
+
+US EPA. 2015. “Standard Operating Procedure for Using the NAFTA +Guidance to Calculate Representative Half-Life Values and Characterizing +Pesticide Degradation.” https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/standard-operating-procedure-using-nafta-guidance. +
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p10-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p10-1.png new file mode 100644 index 00000000..1d4a25e0 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p10-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p11-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p11-1.png new file mode 100644 index 00000000..71fc4699 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p11-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p12a-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p12a-1.png new file mode 100644 index 00000000..a1d3a084 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p12a-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p12b-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p12b-1.png new file mode 100644 index 00000000..1a6fdd03 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p12b-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p13-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p13-1.png new file mode 100644 index 00000000..f9b9f637 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p13-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p14-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p14-1.png new file mode 100644 index 00000000..9f7b0cc5 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p14-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p15a-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p15a-1.png new file mode 100644 index 00000000..aa55169e Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p15a-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p15b-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p15b-1.png new file mode 100644 index 00000000..d17c7aae Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p15b-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p16-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p16-1.png new file mode 100644 index 00000000..75ac7e5b Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p16-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p5a-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p5a-1.png new file mode 100644 index 00000000..12a62954 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p5a-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p5b-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p5b-1.png new file mode 100644 index 00000000..9e38e696 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p5b-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p6-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p6-1.png new file mode 100644 index 00000000..e6e3abbe Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p6-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p7-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p7-1.png new file mode 100644 index 00000000..7c5d4bab Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p7-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p8-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p8-1.png new file mode 100644 index 00000000..a1e3bf25 Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p8-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p9a-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p9a-1.png new file mode 100644 index 00000000..c247fd4e Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p9a-1.png differ diff --git a/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p9b-1.png b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p9b-1.png new file mode 100644 index 00000000..99d593fc Binary files /dev/null and b/docs/dev/articles/web_only/NAFTA_examples_files/figure-html/p9b-1.png differ diff --git a/docs/dev/articles/web_only/benchmarks.html b/docs/dev/articles/web_only/benchmarks.html new file mode 100644 index 00000000..bd6a443a --- /dev/null +++ b/docs/dev/articles/web_only/benchmarks.html @@ -0,0 +1,1133 @@ + + + + + + + +Benchmark timings for mkin • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +

Each system is characterized by the operating system type, the CPU +type, the mkin version, and, as in June 2022 the current R version lead +to worse performance, the R version. A compiler was available, so if no +analytical solution was available, compiled ODE models are used.

+

Every fit is only performed once, so the accuracy of the benchmarks +is limited.

+

The following wrapper function for mmkin is used because +the way the error model is specified was changed in mkin version +0.9.49.1.

+
+if (packageVersion("mkin") > "0.9.48.1") {
+  mmkin_bench <- function(models, datasets, error_model = "const") {
+    mmkin(models, datasets, error_model = error_model, cores = 1, quiet = TRUE)
+  }
+} else {
+  mmkin_bench <- function(models, datasets, error_model = NULL) {
+    mmkin(models, datasets, reweight.method = error_model, cores = 1, quiet = TRUE)
+  }
+}
+
+

Test cases +

+

Parent only:

+
+FOCUS_C <- FOCUS_2006_C
+FOCUS_D <- subset(FOCUS_2006_D, value != 0)
+parent_datasets <- list(FOCUS_C, FOCUS_D)
+
+
+t1 <- system.time(mmkin_bench(c("SFO", "FOMC", "DFOP", "HS"), parent_datasets))[["elapsed"]]
+t2 <- system.time(mmkin_bench(c("SFO", "FOMC", "DFOP", "HS"), parent_datasets,
+    error_model = "tc"))[["elapsed"]]
+

One metabolite:

+
+SFO_SFO <- mkinmod(
+  parent = mkinsub("SFO", "m1"),
+  m1 = mkinsub("SFO"))
+FOMC_SFO <- mkinmod(
+  parent = mkinsub("FOMC", "m1"),
+  m1 = mkinsub("SFO"))
+DFOP_SFO <- mkinmod(
+  parent = mkinsub("FOMC", "m1"), # erroneously used FOMC twice, not fixed for consistency
+  m1 = mkinsub("SFO"))
+t3 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D)))[["elapsed"]]
+t4 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D),
+    error_model = "tc"))[["elapsed"]]
+t5 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D),
+    error_model = "obs"))[["elapsed"]]
+

Two metabolites, synthetic data:

+
+m_synth_SFO_lin <- mkinmod(parent = mkinsub("SFO", "M1"),
+                           M1 = mkinsub("SFO", "M2"),
+                           M2 = mkinsub("SFO"),
+                           use_of_ff = "max", quiet = TRUE)
+
+m_synth_DFOP_par <- mkinmod(parent = mkinsub("DFOP", c("M1", "M2")),
+                           M1 = mkinsub("SFO"),
+                           M2 = mkinsub("SFO"),
+                           use_of_ff = "max", quiet = TRUE)
+
+SFO_lin_a <- synthetic_data_for_UBA_2014[[1]]$data
+
+DFOP_par_c <- synthetic_data_for_UBA_2014[[12]]$data
+
+t6 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a)))[["elapsed"]]
+t7 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c)))[["elapsed"]]
+
+t8 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a),
+    error_model = "tc"))[["elapsed"]]
+t9 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c),
+    error_model = "tc"))[["elapsed"]]
+
+t10 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a),
+    error_model = "obs"))[["elapsed"]]
+t11 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c),
+    error_model = "obs"))[["elapsed"]]
+
+
+

Results +

+

Benchmarks for all available error models are shown. They are +intended for improving mkin, not for comparing CPUs or operating +systems. All trademarks belong to their respective owners.

+
+

Parent only +

+

Constant variance (t1) and two-component error model (t2) for four +models fitted to two datasets, i.e. eight fits for each test.

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OSCPURmkint1t2
LinuxRyzen 7 1700NA0.9.48.13.61011.019
LinuxRyzen 7 1700NA0.9.49.18.18422.889
LinuxRyzen 7 1700NA0.9.49.27.06412.558
LinuxRyzen 7 1700NA0.9.49.37.29621.239
LinuxRyzen 7 1700NA0.9.49.45.93620.545
LinuxRyzen 7 1700NA0.9.50.21.7143.971
LinuxRyzen 7 1700NA0.9.50.31.7524.156
LinuxRyzen 7 1700NA0.9.50.41.7863.729
LinuxRyzen 7 1700NA1.0.31.8813.504
LinuxRyzen 7 1700NA1.0.41.8673.450
LinuxRyzen 7 17004.1.31.1.01.7913.289
LinuxRyzen 7 17004.2.11.1.01.8423.453
Linuxi7-4710MQ4.2.11.1.01.9594.116
Linuxi7-4710MQ4.1.31.1.01.8773.906
Linuxi7-4710MQ4.2.11.1.11.6443.172
LinuxRyzen 7 17004.2.11.1.11.7703.377
LinuxRyzen 7 17004.2.11.1.21.9573.633
LinuxRyzen 7 17004.2.21.2.02.1403.774
LinuxRyzen 7 17004.2.21.2.22.1873.851
LinuxRyzen 9 7950X4.2.21.2.01.2881.794
LinuxRyzen 9 7950X4.2.21.2.21.2761.804
LinuxRyzen 9 7950X4.2.21.2.31.3701.883
LinuxRyzen 9 7950X4.2.31.2.31.4061.948
LinuxRyzen 9 7950X4.3.01.2.41.3861.960
LinuxIntel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz4.3.11.2.52.3693.632
LinuxIntel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz4.3.11.2.62.8564.960
LinuxRyzen 9 7950X4.3.21.2.61.4082.041
LinuxRyzen 9 7950X4.4.21.2.91.3231.925
LinuxRyzen 9 7950X4.4.21.2.101.3711.980
+
+
+

One metabolite +

+

Constant variance (t3), two-component error model (t4), and variance +by variable (t5) for three models fitted to one dataset, i.e. three fits +for each test.

+ +++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OSCPURmkint3t4t5
LinuxRyzen 7 1700NA0.9.48.13.76414.3479.495
LinuxRyzen 7 1700NA0.9.49.14.64913.7896.395
LinuxRyzen 7 1700NA0.9.49.24.7868.4615.675
LinuxRyzen 7 1700NA0.9.49.34.51013.8057.386
LinuxRyzen 7 1700NA0.9.49.44.44615.3356.002
LinuxRyzen 7 1700NA0.9.50.21.4026.1742.764
LinuxRyzen 7 1700NA0.9.50.31.4306.6152.878
LinuxRyzen 7 1700NA0.9.50.41.3977.2512.810
LinuxRyzen 7 1700NA1.0.31.4306.3442.798
LinuxRyzen 7 1700NA1.0.41.4156.3642.820
LinuxRyzen 7 17004.1.31.1.01.3106.2792.681
LinuxRyzen 7 17004.2.11.1.03.80221.2478.461
Linuxi7-4710MQ4.2.11.1.03.33419.5217.565
Linuxi7-4710MQ4.1.31.1.01.5788.0583.339
Linuxi7-4710MQ4.2.11.1.11.2305.8392.444
LinuxRyzen 7 17004.2.11.1.11.3085.7582.558
LinuxRyzen 7 17004.2.11.1.21.5036.1472.803
LinuxRyzen 7 17004.2.21.2.01.5546.1932.843
LinuxRyzen 7 17004.2.21.2.21.5856.3353.003
LinuxRyzen 9 7950X4.2.21.2.00.7922.3781.245
LinuxRyzen 9 7950X4.2.21.2.20.7842.3551.233
LinuxRyzen 9 7950X4.2.21.2.30.7702.0111.123
LinuxRyzen 9 7950X4.2.31.2.30.7932.1091.178
LinuxRyzen 9 7950X4.3.01.2.40.7792.0801.106
LinuxIntel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz4.3.11.2.51.8235.5552.404
LinuxIntel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz4.3.11.2.61.7615.4052.462
LinuxRyzen 9 7950X4.3.21.2.60.7952.2281.178
LinuxRyzen 9 7950X4.4.21.2.90.7542.1531.139
LinuxRyzen 9 7950X4.4.21.2.100.7622.1791.131
+
+
+

Two metabolites +

+

Constant variance (t6 and t7), two-component error model (t8 and t9), +and variance by variable (t10 and t11) for one model fitted to one +dataset, i.e. one fit for each test.

+ ++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OSCPURmkint6t7t8t9t10t11
LinuxRyzen 7 1700NA0.9.48.12.6234.5877.52516.6218.57631.267
LinuxRyzen 7 1700NA0.9.49.12.5424.1284.6328.1713.6765.636
LinuxRyzen 7 1700NA0.9.49.22.7234.4784.8627.6183.5795.574
LinuxRyzen 7 1700NA0.9.49.32.6434.3747.02011.1245.3887.365
LinuxRyzen 7 1700NA0.9.49.42.6354.2594.7377.7633.4275.626
LinuxRyzen 7 1700NA0.9.50.20.7771.2361.3322.8722.0692.987
LinuxRyzen 7 1700NA0.9.50.30.8581.2641.3332.9842.1133.073
LinuxRyzen 7 1700NA0.9.50.40.7831.2821.4863.8151.9583.105
LinuxRyzen 7 1700NA1.0.30.7631.2441.4573.0541.9232.839
LinuxRyzen 7 1700NA1.0.40.7851.2521.4663.0911.9362.826
LinuxRyzen 7 17004.1.31.1.00.7441.2271.2883.5531.8952.738
LinuxRyzen 7 17004.2.11.1.03.0184.1655.03610.8446.6239.722
Linuxi7-4710MQ4.2.11.1.02.5223.7924.14311.2685.9358.728
Linuxi7-4710MQ4.1.31.1.00.9071.5351.5894.5442.3023.463
Linuxi7-4710MQ4.2.11.1.10.6781.0951.1493.2471.6582.472
LinuxRyzen 7 17004.2.11.1.10.6961.1241.3212.7861.7442.566
LinuxRyzen 7 17004.2.11.1.20.8611.2951.5073.1021.9612.852
LinuxRyzen 7 17004.2.21.2.00.9131.3451.5393.0111.9872.802
LinuxRyzen 7 17004.2.21.2.20.9351.3811.5513.2091.9763.013
LinuxRyzen 9 7950X4.2.21.2.00.4450.5910.6601.1900.8141.100
LinuxRyzen 9 7950X4.2.21.2.20.4430.5860.6611.1760.8031.097
LinuxRyzen 9 7950X4.2.21.2.30.4180.5300.5911.0060.7160.949
LinuxRyzen 9 7950X4.2.31.2.30.4320.5490.6091.0520.7430.989
LinuxRyzen 9 7950X4.3.01.2.40.4100.5260.5531.2490.7120.948
LinuxIntel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz4.3.11.2.50.7981.0961.2173.1731.6342.271
LinuxIntel(R) Xeon(R) Gold 6134 CPU @ 3.20GHz4.3.11.2.60.8131.1361.2203.1141.5982.255
LinuxRyzen 9 7950X4.3.21.2.60.4390.5570.5851.3380.7490.999
LinuxRyzen 9 7950X4.4.21.2.90.4240.5340.5601.2980.7350.981
LinuxRyzen 9 7950X4.4.21.2.100.4260.5330.5651.2960.7280.978
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/web_only/compiled_models.html b/docs/dev/articles/web_only/compiled_models.html new file mode 100644 index 00000000..113f7b67 --- /dev/null +++ b/docs/dev/articles/web_only/compiled_models.html @@ -0,0 +1,231 @@ + + + + + + + +Performance benefit by using compiled model definitions in mkin • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

How to benefit from compiled models +

+

When using an mkin version equal to or greater than 0.9-36 and a C +compiler is available, you will see a message that the model is being +compiled from autogenerated C code when defining a model using mkinmod. +Starting from version 0.9.49.9, the mkinmod() function +checks for presence of a compiler using

+
+pkgbuild::has_compiler()
+

In previous versions, it used Sys.which("gcc") for this +check.

+

On Linux, you need to have the essential build tools like make and +gcc or clang installed. On Debian based linux distributions, these will +be pulled in by installing the build-essential package.

+

On MacOS, which I do not use personally, I have had reports that a +compiler is available by default.

+

On Windows, you need to install Rtools and have the path to its bin +directory in your PATH variable. You do not need to modify the PATH +variable when installing Rtools. Instead, I would recommend to put the +line

+
+Sys.setenv(PATH = paste("C:/Rtools/bin", Sys.getenv("PATH"), sep=";"))
+

into your .Rprofile startup file. This is just a text file with some +R code that is executed when your R session starts. It has to be named +.Rprofile and has to be located in your home directory, which will +generally be your Documents folder. You can check the location of the +home directory used by R by issuing

+
+Sys.getenv("HOME")
+
+
+

Comparison with other solution methods +

+

First, we build a simple degradation model for a parent compound with +one metabolite, and we remove zero values from the dataset.

+
+library("mkin", quietly = TRUE)
+SFO_SFO <- mkinmod(
+  parent = mkinsub("SFO", "m1"),
+  m1 = mkinsub("SFO"))
+
## Temporary DLL for differentials generated and loaded
+
+FOCUS_D <- subset(FOCUS_2006_D, value != 0)
+

We can compare the performance of the Eigenvalue based solution +against the compiled version and the R implementation of the +differential equations using the benchmark package. In the output of +below code, the warnings about zero being removed from the FOCUS D +dataset are suppressed. Since mkin version 0.9.49.11, an analytical +solution is also implemented, which is included in the tests below.

+
+if (require(rbenchmark)) {
+  b.1 <- benchmark(
+    "deSolve, not compiled" = mkinfit(SFO_SFO, FOCUS_D,
+       solution_type = "deSolve",
+       use_compiled = FALSE, quiet = TRUE),
+    "Eigenvalue based" = mkinfit(SFO_SFO, FOCUS_D,
+       solution_type = "eigen", quiet = TRUE),
+    "deSolve, compiled" = mkinfit(SFO_SFO, FOCUS_D,
+       solution_type = "deSolve", quiet = TRUE),
+    "analytical" = mkinfit(SFO_SFO, FOCUS_D,
+       solution_type = "analytical",
+       use_compiled = FALSE, quiet = TRUE),
+    replications = 1, order = "relative",
+    columns = c("test", "replications", "relative", "elapsed"))
+  print(b.1)
+} else {
+  print("R package rbenchmark is not available")
+}
+
##                    test replications relative elapsed
+## 4            analytical            1    1.000   0.102
+## 3     deSolve, compiled            1    1.324   0.135
+## 2      Eigenvalue based            1    1.706   0.174
+## 1 deSolve, not compiled            1   22.627   2.308
+

We see that using the compiled model is by more than a factor of 10 +faster than using deSolve without compiled code.

+
+
+

Model without analytical solution +

+

This evaluation is also taken from the example section of mkinfit. No +analytical solution is available for this system, and now Eigenvalue +based solution is possible, so only deSolve using with or without +compiled code is available.

+
+if (require(rbenchmark)) {
+  FOMC_SFO <- mkinmod(
+    parent = mkinsub("FOMC", "m1"),
+    m1 = mkinsub( "SFO"))
+
+  b.2 <- benchmark(
+    "deSolve, not compiled" = mkinfit(FOMC_SFO, FOCUS_D,
+                                      use_compiled = FALSE, quiet = TRUE),
+    "deSolve, compiled" = mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE),
+    replications = 1, order = "relative",
+    columns = c("test", "replications", "relative", "elapsed"))
+  print(b.2)
+  factor_FOMC_SFO <- round(b.2["1", "relative"])
+} else {
+  factor_FOMC_SFO <- NA
+  print("R package benchmark is not available")
+}
+
## Temporary DLL for differentials generated and loaded
+
##                    test replications relative elapsed
+## 2     deSolve, compiled            1    1.000   0.170
+## 1 deSolve, not compiled            1   23.865   4.057
+

Here we get a performance benefit of a factor of 24 using the version +of the differential equation model compiled from C code!

+

This vignette was built with mkin 1.2.10 on

+
## R version 4.4.2 (2024-10-31)
+## Platform: x86_64-pc-linux-gnu
+## Running under: Debian GNU/Linux 12 (bookworm)
+
## CPU model: AMD Ryzen 9 7950X 16-Core Processor
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/web_only/dimethenamid_2018.html b/docs/dev/articles/web_only/dimethenamid_2018.html new file mode 100644 index 00000000..572f253d --- /dev/null +++ b/docs/dev/articles/web_only/dimethenamid_2018.html @@ -0,0 +1,651 @@ + + + + + + + +Example evaluations of the dimethenamid data from 2018 • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +

Wissenschaftlicher Berater, Kronacher +Str. 12, 79639 Grenzach-Wyhlen, Germany

+
+

Introduction +

+

A first analysis of the data analysed here was presented in a recent +journal article on nonlinear mixed-effects models in degradation +kinetics (Ranke et al. 2021). That +analysis was based on the nlme package and a development +version of the saemix package that was unpublished at the +time. Meanwhile, version 3.0 of the saemix package is +available from the CRAN repository. Also, it turned out that there was +an error in the handling of the Borstel data in the mkin package at the +time, leading to the duplication of a few data points from that soil. +The dataset in the mkin package has been corrected, and the interface to +saemix in the mkin package has been updated to use the +released version.

+

This vignette is intended to present an up to date analysis of the +data, using the corrected dataset and released versions of +mkin and saemix.

+
+
+

Data +

+

Residue data forming the basis for the endpoints derived in the +conclusion on the peer review of the pesticide risk assessment of +dimethenamid-P published by the European Food Safety Authority (EFSA) in +2018 (EFSA 2018) were transcribed from the +risk assessment report (Rapporteur Member State +Germany, Co-Rapporteur Member State Bulgaria 2018) which can be +downloaded from the Open EFSA repository https://open.efsa.europa.eu/study-inventory/EFSA-Q-2014-00716.

+

The data are available +in the mkin package. The following code (hidden by default, please +use the button to the right to show it) treats the data available for +the racemic mixture dimethenamid (DMTA) and its enantiomer +dimethenamid-P (DMTAP) in the same way, as no difference between their +degradation behaviour was identified in the EU risk assessment. The +observation times of each dataset are multiplied with the corresponding +normalisation factor also available in the dataset, in order to make it +possible to describe all datasets with a single set of parameters.

+

Also, datasets observed in the same soil are merged, resulting in +dimethenamid (DMTA) data from six soils.

+
+library(mkin, quietly = TRUE)
+dmta_ds <- lapply(1:7, function(i) {
+  ds_i <- dimethenamid_2018$ds[[i]]$data
+  ds_i[ds_i$name == "DMTAP", "name"] <-  "DMTA"
+  ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i]
+  ds_i
+})
+names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title)
+dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]])
+dmta_ds[["Elliot 1"]] <- NULL
+dmta_ds[["Elliot 2"]] <- NULL
+
+
+

Parent degradation +

+

We evaluate the observed degradation of the parent compound using +simple exponential decline (SFO) and biexponential decline (DFOP), using +constant variance (const) and a two-component variance (tc) as error +models.

+
+

Separate evaluations +

+

As a first step, to get a visual impression of the fit of the +different models, we do separate evaluations for each soil using the +mmkin function from the mkin package:

+
+f_parent_mkin_const <- mmkin(c("SFO", "DFOP"), dmta_ds,
+  error_model = "const", quiet = TRUE)
+f_parent_mkin_tc <- mmkin(c("SFO", "DFOP"), dmta_ds,
+  error_model = "tc", quiet = TRUE)
+

The plot of the individual SFO fits shown below suggests that at +least in some datasets the degradation slows down towards later time +points, and that the scatter of the residuals error is smaller for +smaller values (panel to the right):

+
+plot(mixed(f_parent_mkin_const["SFO", ]))
+

+

Using biexponential decline (DFOP) results in a slightly more random +scatter of the residuals:

+
+plot(mixed(f_parent_mkin_const["DFOP", ]))
+

+

The population curve (bold line) in the above plot results from +taking the mean of the individual transformed parameters, i.e. of log k1 +and log k2, as well as of the logit of the g parameter of the DFOP +model). Here, this procedure does not result in parameters that +represent the degradation well, because in some datasets the fitted +value for k2 is extremely close to zero, leading to a log k2 value that +dominates the average. This is alleviated if only rate constants that +pass the t-test for significant difference from zero (on the +untransformed scale) are considered in the averaging:

+
+plot(mixed(f_parent_mkin_const["DFOP", ]), test_log_parms = TRUE)
+

+

While this is visually much more satisfactory, such an average +procedure could introduce a bias, as not all results from the individual +fits enter the population curve with the same weight. This is where +nonlinear mixed-effects models can help out by treating all datasets +with equally by fitting a parameter distribution model together with the +degradation model and the error model (see below).

+

The remaining trend of the residuals to be higher for higher +predicted residues is reduced by using the two-component error +model:

+
+plot(mixed(f_parent_mkin_tc["DFOP", ]), test_log_parms = TRUE)
+

+

However, note that in the case of using this error model, the fits to +the Flaach and BBA 2.3 datasets appear to be ill-defined, indicated by +the fact that they did not converge:

+
+print(f_parent_mkin_tc["DFOP", ])
+
<mmkin> object
+Status of individual fits:
+
+      dataset
+model  Calke Borstel Flaach BBA 2.2 BBA 2.3 Elliot
+  DFOP OK    OK      OK     OK      C       OK    
+
+C: Optimisation did not converge:
+iteration limit reached without convergence (10)
+OK: No warnings
+
+
+

Nonlinear mixed-effects models +

+

Instead of taking a model selection decision for each of the +individual fits, we fit nonlinear mixed-effects models (using different +fitting algorithms as implemented in different packages) and do model +selection using all available data at the same time. In order to make +sure that these decisions are not unduly influenced by the type of +algorithm used, by implementation details or by the use of wrong control +parameters, we compare the model selection results obtained with +different R packages, with different algorithms and checking control +parameters.

+
+

nlme +

+

The nlme package was the first R extension providing facilities to +fit nonlinear mixed-effects models. We would like to do model selection +from all four combinations of degradation models and error models based +on the AIC. However, fitting the DFOP model with constant variance and +using default control parameters results in an error, signalling that +the maximum number of 50 iterations was reached, potentially indicating +overparameterisation. Nevertheless, the algorithm converges when the +two-component error model is used in combination with the DFOP model. +This can be explained by the fact that the smaller residues observed at +later sampling times get more weight when using the two-component error +model which will counteract the tendency of the algorithm to try +parameter combinations unsuitable for fitting these data.

+
+library(nlme)
+f_parent_nlme_sfo_const <- nlme(f_parent_mkin_const["SFO", ])
+# f_parent_nlme_dfop_const <- nlme(f_parent_mkin_const["DFOP", ])
+f_parent_nlme_sfo_tc <- nlme(f_parent_mkin_tc["SFO", ])
+f_parent_nlme_dfop_tc <- nlme(f_parent_mkin_tc["DFOP", ])
+

Note that a certain degree of overparameterisation is also indicated +by a warning obtained when fitting DFOP with the two-component error +model (‘false convergence’ in the ‘LME step’ in iteration 3). However, +as this warning does not occur in later iterations, and specifically not +in the last of the 5 iterations, we can ignore this warning.

+

The model comparison function of the nlme package can directly be +applied to these fits showing a much lower AIC for the DFOP model fitted +with the two-component error model. Also, the likelihood ratio test +indicates that this difference is significant as the p-value is below +0.0001.

+
+anova(
+  f_parent_nlme_sfo_const, f_parent_nlme_sfo_tc, f_parent_nlme_dfop_tc
+)
+
                        Model df    AIC    BIC  logLik   Test L.Ratio p-value
+f_parent_nlme_sfo_const     1  5 796.60 811.82 -393.30                       
+f_parent_nlme_sfo_tc        2  6 798.60 816.86 -393.30 1 vs 2    0.00   0.998
+f_parent_nlme_dfop_tc       3 10 671.91 702.34 -325.95 2 vs 3  134.69  <.0001
+

In addition to these fits, attempts were also made to include +correlations between random effects by using the log Cholesky +parameterisation of the matrix specifying them. The code used for these +attempts can be made visible below.

+
+f_parent_nlme_sfo_const_logchol <- nlme(f_parent_mkin_const["SFO", ],
+  random = nlme::pdLogChol(list(DMTA_0 ~ 1, log_k_DMTA ~ 1)))
+anova(f_parent_nlme_sfo_const, f_parent_nlme_sfo_const_logchol)
+f_parent_nlme_sfo_tc_logchol <- nlme(f_parent_mkin_tc["SFO", ],
+  random = nlme::pdLogChol(list(DMTA_0 ~ 1, log_k_DMTA ~ 1)))
+anova(f_parent_nlme_sfo_tc, f_parent_nlme_sfo_tc_logchol)
+f_parent_nlme_dfop_tc_logchol <- nlme(f_parent_mkin_const["DFOP", ],
+  random = nlme::pdLogChol(list(DMTA_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1)))
+anova(f_parent_nlme_dfop_tc, f_parent_nlme_dfop_tc_logchol)
+

While the SFO variants converge fast, the additional parameters +introduced by this lead to convergence warnings for the DFOP model. The +model comparison clearly show that adding correlations between random +effects does not improve the fits.

+

The selected model (DFOP with two-component error) fitted to the data +assuming no correlations between random effects is shown below.

+
+plot(f_parent_nlme_dfop_tc)
+

+
+
+

saemix +

+

The saemix package provided the first Open Source implementation of +the Stochastic Approximation to the Expectation Maximisation (SAEM) +algorithm. SAEM fits of degradation models can be conveniently performed +using an interface to the saemix package available in current +development versions of the mkin package.

+

The corresponding SAEM fits of the four combinations of degradation +and error models are fitted below. As there is no convergence criterion +implemented in the saemix package, the convergence plots need to be +manually checked for every fit. We define control settings that work +well for all the parent data fits shown in this vignette.

+
+library(saemix)
+saemix_control <- saemixControl(nbiter.saemix = c(800, 300), nb.chains = 15,
+    print = FALSE, save = FALSE, save.graphs = FALSE, displayProgress = FALSE)
+saemix_control_moreiter <- saemixControl(nbiter.saemix = c(1600, 300), nb.chains = 15,
+    print = FALSE, save = FALSE, save.graphs = FALSE, displayProgress = FALSE)
+saemix_control_10k <- saemixControl(nbiter.saemix = c(10000, 300), nb.chains = 15,
+    print = FALSE, save = FALSE, save.graphs = FALSE, displayProgress = FALSE)
+

The convergence plot for the SFO model using constant variance is +shown below.

+
+f_parent_saemix_sfo_const <- mkin::saem(f_parent_mkin_const["SFO", ], quiet = TRUE,
+  control = saemix_control, transformations = "saemix")
+plot(f_parent_saemix_sfo_const$so, plot.type = "convergence")
+

+

Obviously the selected number of iterations is sufficient to reach +convergence. This can also be said for the SFO fit using the +two-component error model.

+
+f_parent_saemix_sfo_tc <- mkin::saem(f_parent_mkin_tc["SFO", ], quiet = TRUE,
+  control = saemix_control, transformations = "saemix")
+plot(f_parent_saemix_sfo_tc$so, plot.type = "convergence")
+

+

When fitting the DFOP model with constant variance (see below), +parameter convergence is not as unambiguous.

+
+f_parent_saemix_dfop_const <- mkin::saem(f_parent_mkin_const["DFOP", ], quiet = TRUE,
+  control = saemix_control, transformations = "saemix")
+plot(f_parent_saemix_dfop_const$so, plot.type = "convergence")
+

+
+print(f_parent_saemix_dfop_const)
+
Kinetic nonlinear mixed-effects model fit by SAEM
+Structural model:
+d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Likelihood computed by importance sampling
+  AIC BIC logLik
+  706 704   -344
+
+Fitted parameters:
+          estimate    lower   upper
+DMTA_0    97.99583 96.50079 99.4909
+k1         0.06377  0.03432  0.0932
+k2         0.00848  0.00444  0.0125
+g          0.95701  0.91313  1.0009
+a.1        1.82141  1.60516  2.0377
+SD.DMTA_0  1.64787  0.45729  2.8384
+SD.k1      0.57439  0.24731  0.9015
+SD.k2      0.03296 -2.50524  2.5712
+SD.g       1.10266  0.32354  1.8818
+

While the other parameters converge to credible values, the variance +of k2 (omega2.k2) converges to a very small value. The +printout of the saem.mmkin model shows that the estimated +standard deviation of k2 across the population of soils +(SD.k2) is ill-defined, indicating overparameterisation of +this model.

+

When the DFOP model is fitted with the two-component error model, we +also observe that the estimated variance of k2 becomes very small, while +being ill-defined, as illustrated by the excessive confidence interval +of SD.k2.

+
+f_parent_saemix_dfop_tc <- mkin::saem(f_parent_mkin_tc["DFOP", ], quiet = TRUE,
+  control = saemix_control, transformations = "saemix")
+f_parent_saemix_dfop_tc_moreiter <- mkin::saem(f_parent_mkin_tc["DFOP", ], quiet = TRUE,
+  control = saemix_control_moreiter, transformations = "saemix")
+plot(f_parent_saemix_dfop_tc$so, plot.type = "convergence")
+

+
+print(f_parent_saemix_dfop_tc)
+
Kinetic nonlinear mixed-effects model fit by SAEM
+Structural model:
+d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
+           time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
+           * DMTA
+
+Data:
+155 observations of 1 variable(s) grouped in 6 datasets
+
+Likelihood computed by importance sampling
+  AIC BIC logLik
+  666 664   -323
+
+Fitted parameters:
+          estimate     lower    upper
+DMTA_0    98.24165  96.29190 100.1914
+k1         0.06421   0.03352   0.0949
+k2         0.00866   0.00617   0.0111
+g          0.95340   0.91218   0.9946
+a.1        1.06463   0.87979   1.2495
+b.1        0.02964   0.02266   0.0366
+SD.DMTA_0  2.03611   0.40361   3.6686
+SD.k1      0.59534   0.25692   0.9338
+SD.k2      0.00042 -73.00540  73.0062
+SD.g       1.04234   0.37189   1.7128
+

Doubling the number of iterations in the first phase of the algorithm +leads to a slightly lower likelihood, and therefore to slightly higher +AIC and BIC values. With even more iterations, the algorithm stops with +an error message. This is related to the variance of k2 approximating +zero and has been submitted as a bug +to the saemix package, as the algorithm does not converge in this +case.

+

An alternative way to fit DFOP in combination with the two-component +error model is to use the model formulation with transformed parameters +as used per default in mkin. When using this option, convergence is +slower, but eventually the algorithm stops as well with the same error +message.

+

The four combinations (SFO/const, SFO/tc, DFOP/const and DFOP/tc) and +the version with increased iterations can be compared using the model +comparison function of the saemix package:

+
+AIC_parent_saemix <- saemix::compare.saemix(
+  f_parent_saemix_sfo_const$so,
+  f_parent_saemix_sfo_tc$so,
+  f_parent_saemix_dfop_const$so,
+  f_parent_saemix_dfop_tc$so,
+  f_parent_saemix_dfop_tc_moreiter$so)
+
Likelihoods calculated by importance sampling
+
+rownames(AIC_parent_saemix) <- c(
+  "SFO const", "SFO tc", "DFOP const", "DFOP tc", "DFOP tc more iterations")
+print(AIC_parent_saemix)
+
                           AIC    BIC
+SFO const               796.38 795.34
+SFO tc                  798.38 797.13
+DFOP const              705.75 703.88
+DFOP tc                 665.67 663.59
+DFOP tc more iterations 665.85 663.76
+

In order to check the influence of the likelihood calculation +algorithms implemented in saemix, the likelihood from Gaussian +quadrature is added to the best fit, and the AIC values obtained from +the three methods are compared.

+
+f_parent_saemix_dfop_tc$so <-
+  saemix::llgq.saemix(f_parent_saemix_dfop_tc$so)
+AIC_parent_saemix_methods <- c(
+  is = AIC(f_parent_saemix_dfop_tc$so, method = "is"),
+  gq = AIC(f_parent_saemix_dfop_tc$so, method = "gq"),
+  lin = AIC(f_parent_saemix_dfop_tc$so, method = "lin")
+)
+print(AIC_parent_saemix_methods)
+
    is     gq    lin 
+665.67 665.74 665.13 
+

The AIC values based on importance sampling and Gaussian quadrature +are very similar. Using linearisation is known to be less accurate, but +still gives a similar value.

+

In order to illustrate that the comparison of the three method +depends on the degree of convergence obtained in the fit, the same +comparison is shown below for the fit using the defaults for the number +of iterations and the number of MCMC chains.

+

When using OpenBlas for linear algebra, there is a large difference +in the values obtained with Gaussian quadrature, so the larger number of +iterations makes a lot of difference. When using the LAPACK version +coming with Debian Bullseye, the AIC based on Gaussian quadrature is +almost the same as the one obtained with the other methods, also when +using defaults for the fit.

+
+f_parent_saemix_dfop_tc_defaults <- mkin::saem(f_parent_mkin_tc["DFOP", ])
+f_parent_saemix_dfop_tc_defaults$so <-
+  saemix::llgq.saemix(f_parent_saemix_dfop_tc_defaults$so)
+AIC_parent_saemix_methods_defaults <- c(
+  is = AIC(f_parent_saemix_dfop_tc_defaults$so, method = "is"),
+  gq = AIC(f_parent_saemix_dfop_tc_defaults$so, method = "gq"),
+  lin = AIC(f_parent_saemix_dfop_tc_defaults$so, method = "lin")
+)
+print(AIC_parent_saemix_methods_defaults)
+
    is     gq    lin 
+670.09 669.37 671.29 
+
+
+
+

Comparison +

+

The following table gives the AIC values obtained with both backend +packages using the same control parameters (800 iterations burn-in, 300 +iterations second phase, 15 chains).

+
+AIC_all <- data.frame(
+  check.names = FALSE,
+  "Degradation model" = c("SFO", "SFO", "DFOP", "DFOP"),
+  "Error model" = c("const", "tc", "const", "tc"),
+  nlme = c(AIC(f_parent_nlme_sfo_const), AIC(f_parent_nlme_sfo_tc), NA, AIC(f_parent_nlme_dfop_tc)),
+  saemix_lin = sapply(list(f_parent_saemix_sfo_const$so, f_parent_saemix_sfo_tc$so,
+    f_parent_saemix_dfop_const$so, f_parent_saemix_dfop_tc$so), AIC, method = "lin"),
+  saemix_is = sapply(list(f_parent_saemix_sfo_const$so, f_parent_saemix_sfo_tc$so,
+    f_parent_saemix_dfop_const$so, f_parent_saemix_dfop_tc$so), AIC, method = "is")
+)
+kable(AIC_all)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Degradation modelError modelnlmesaemix_linsaemix_is
SFOconst796.60796.60796.38
SFOtc798.60798.60798.38
DFOPconstNA704.95705.75
DFOPtc671.91665.13665.67
+
+
+
+

Conclusion +

+

A more detailed analysis of the dimethenamid dataset confirmed that +the DFOP model provides the most appropriate description of the decline +of the parent compound in these data. On the other hand, closer +inspection of the results revealed that the variability of the k2 +parameter across the population of soils is ill-defined. This coincides +with the observation that this parameter cannot robustly be quantified +for some of the soils.

+

Regarding the regulatory use of these data, it is claimed that an +improved characterisation of the mean parameter values across the +population is obtained using the nonlinear mixed-effects models +presented here. However, attempts to quantify the variability of the +slower rate constant of the biphasic decline of dimethenamid indicate +that the data are not sufficient to characterise this variability to a +satisfactory precision.

+
+
+

Session Info +

+ +
R version 4.4.2 (2024-10-31)
+Platform: x86_64-pc-linux-gnu
+Running under: Debian GNU/Linux 12 (bookworm)
+
+Matrix products: default
+BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 
+LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0
+
+locale:
+ [1] LC_CTYPE=de_DE.UTF-8       LC_NUMERIC=C              
+ [3] LC_TIME=C                  LC_COLLATE=de_DE.UTF-8    
+ [5] LC_MONETARY=de_DE.UTF-8    LC_MESSAGES=de_DE.UTF-8   
+ [7] LC_PAPER=de_DE.UTF-8       LC_NAME=C                 
+ [9] LC_ADDRESS=C               LC_TELEPHONE=C            
+[11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       
+
+time zone: Europe/Berlin
+tzcode source: system (glibc)
+
+attached base packages:
+[1] stats     graphics  grDevices utils     datasets  methods   base     
+
+other attached packages:
+[1] saemix_3.3   npde_3.5     nlme_3.1-166 mkin_1.2.10  knitr_1.49  
+
+loaded via a namespace (and not attached):
+ [1] gtable_0.3.6      jsonlite_1.8.9    dplyr_1.1.4       compiler_4.4.2   
+ [5] tidyselect_1.2.1  parallel_4.4.2    gridExtra_2.3     jquerylib_0.1.4  
+ [9] systemfonts_1.1.0 scales_1.3.0      textshaping_0.4.1 yaml_2.3.10      
+[13] fastmap_1.2.0     lattice_0.22-6    ggplot2_3.5.1     R6_2.5.1         
+[17] generics_0.1.3    lmtest_0.9-40     MASS_7.3-61       htmlwidgets_1.6.4
+[21] tibble_3.2.1      desc_1.4.3        munsell_0.5.1     bslib_0.8.0      
+[25] pillar_1.9.0      rlang_1.1.4       utf8_1.2.4        cachem_1.1.0     
+[29] xfun_0.49         fs_1.6.5          sass_0.4.9        cli_3.6.3        
+[33] pkgdown_2.1.1     magrittr_2.0.3    digest_0.6.37     grid_4.4.2       
+[37] mclust_6.1.1      lifecycle_1.0.4   vctrs_0.6.5       evaluate_1.0.1   
+[41] glue_1.8.0        codetools_0.2-20  ragg_1.3.3        zoo_1.8-12       
+[45] fansi_1.0.6       colorspace_2.1-1  rmarkdown_2.29    pkgconfig_2.0.3  
+[49] tools_4.4.2       htmltools_0.5.8.1
+
+
+

References +

+ +
+
+EFSA. 2018. “Peer Review of the Pesticide Risk Assessment of the +Active Substance Dimethenamid-p.” EFSA Journal 16: 5211. +
+
+Ranke, Johannes, Janina Wöltjen, Jana Schmidt, and Emmanuelle Comets. +2021. “Taking Kinetic Evaluations of Degradation Data to the Next +Level with Nonlinear Mixed-Effects Models.” Environments +8 (8). https://doi.org/10.3390/environments8080071. +
+
+Rapporteur Member State Germany, Co-Rapporteur Member State Bulgaria. +2018. Renewal Assessment Report +Dimethenamid-P Volume 3 - B.8 Environmental fate and behaviour, Rev. 2 - +November 2017.” https://open.efsa.europa.eu/study-inventory/EFSA-Q-2014-00716. +
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_const-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_const-1.png new file mode 100644 index 00000000..627e5c95 Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_const-1.png differ diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_const_test-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_const_test-1.png new file mode 100644 index 00000000..627e5c95 Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_const_test-1.png differ diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_tc_test-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_tc_test-1.png new file mode 100644 index 00000000..9f40fc35 Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_dfop_tc_test-1.png differ diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_sfo_const-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_sfo_const-1.png new file mode 100644 index 00000000..0ed7448d Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_mkin_sfo_const-1.png differ diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_dfop_const-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_dfop_const-1.png new file mode 100644 index 00000000..84a6fc92 Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_dfop_const-1.png differ diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_dfop_tc-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_dfop_tc-1.png new file mode 100644 index 00000000..fa5d34f0 Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_dfop_tc-1.png differ diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_sfo_const-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_sfo_const-1.png new file mode 100644 index 00000000..7862fc65 Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_sfo_const-1.png differ diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_sfo_tc-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_sfo_tc-1.png new file mode 100644 index 00000000..d941f3e6 Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/f_parent_saemix_sfo_tc-1.png differ diff --git a/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/plot_parent_nlme-1.png b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/plot_parent_nlme-1.png new file mode 100644 index 00000000..6bcf3434 Binary files /dev/null and b/docs/dev/articles/web_only/dimethenamid_2018_files/figure-html/plot_parent_nlme-1.png differ diff --git a/docs/dev/articles/web_only/multistart.html b/docs/dev/articles/web_only/multistart.html new file mode 100644 index 00000000..83073979 --- /dev/null +++ b/docs/dev/articles/web_only/multistart.html @@ -0,0 +1,179 @@ + + + + + + + +Short demo of the multistart method • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +

The dimethenamid data from 2018 from seven soils is used as example +data in this vignette.

+
+library(mkin)
+dmta_ds <- lapply(1:7, function(i) {
+  ds_i <- dimethenamid_2018$ds[[i]]$data
+  ds_i[ds_i$name == "DMTAP", "name"] <-  "DMTA"
+  ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i]
+  ds_i
+})
+names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title)
+dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]])
+dmta_ds[["Elliot 1"]] <- dmta_ds[["Elliot 2"]] <- NULL
+

First, we check the DFOP model with the two-component error model and +random effects for all degradation parameters.

+
+f_mmkin <- mmkin("DFOP", dmta_ds, error_model = "tc", cores = 7, quiet = TRUE)
+f_saem_full <- saem(f_mmkin)
+illparms(f_saem_full)
+
## [1] "sd(log_k2)"
+

We see that not all variability parameters are identifiable. The +illparms function tells us that the confidence interval for +the standard deviation of ‘log_k2’ includes zero. We check this +assessment using multiple runs with different starting values.

+
+f_saem_full_multi <- multistart(f_saem_full, n = 16, cores = 16)
+parplot(f_saem_full_multi, lpos = "topleft")
+

+

This confirms that the variance of k2 is the most problematic +parameter, so we reduce the parameter distribution model by removing the +intersoil variability for k2.

+
+f_saem_reduced <- stats::update(f_saem_full, no_random_effect = "log_k2")
+illparms(f_saem_reduced)
+f_saem_reduced_multi <- multistart(f_saem_reduced, n = 16, cores = 16)
+parplot(f_saem_reduced_multi, lpos = "topright", ylim = c(0.5, 2))
+

+

The results confirm that all remaining parameters can be determined +with sufficient certainty.

+

We can also analyse the log-likelihoods obtained in the multiple +runs:

+
+llhist(f_saem_reduced_multi)
+

+

We can use the anova method to compare the models.

+
+anova(f_saem_full, best(f_saem_full_multi),
+  f_saem_reduced, best(f_saem_reduced_multi), test = TRUE)
+
## Data: 155 observations of 1 variable(s) grouped in 6 datasets
+## 
+##                            npar    AIC    BIC     Lik  Chisq Df Pr(>Chisq)
+## f_saem_reduced                9 663.67 661.80 -322.84                     
+## best(f_saem_reduced_multi)    9 663.65 661.78 -322.82 0.0219  0           
+## f_saem_full                  10 670.09 668.01 -325.05 0.0000  1          1
+## best(f_saem_full_multi)      10 665.61 663.52 -322.80 4.4870  0
+

The reduced model results in lower AIC and BIC values, so it is +clearly preferable. Using multiple starting values gives a large +improvement in case of the full model, because it is less well-defined, +which impedes convergence. For the reduced model, using multiple +starting values only results in a small improvement of the model +fit.

+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-3-1.png b/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-3-1.png new file mode 100644 index 00000000..19b68cfe Binary files /dev/null and b/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-3-1.png differ diff --git a/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-4-1.png b/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-4-1.png new file mode 100644 index 00000000..034b170c Binary files /dev/null and b/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-4-1.png differ diff --git a/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-5-1.png b/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-5-1.png new file mode 100644 index 00000000..c8e918cd Binary files /dev/null and b/docs/dev/articles/web_only/multistart_files/figure-html/unnamed-chunk-5-1.png differ diff --git a/docs/dev/articles/web_only/saem_benchmarks.html b/docs/dev/articles/web_only/saem_benchmarks.html new file mode 100644 index 00000000..d4cd0d6f --- /dev/null +++ b/docs/dev/articles/web_only/saem_benchmarks.html @@ -0,0 +1,789 @@ + + + + + + + +Benchmark timings for saem.mmkin • mkin + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +

Each system is characterized by operating system type, CPU type, mkin +version, saemix version and R version. A compiler was available, so if +no analytical solution was available, compiled ODE models are used.

+

Every fit is only performed once, so the accuracy of the benchmarks +is limited.

+

For the initial mmkin fits, we use all available cores.

+
+n_cores <- parallel::detectCores()
+
+

Test data +

+

Please refer to the vignette dimethenamid_2018 for an +explanation of the following preprocessing.

+
+dmta_ds <- lapply(1:7, function(i) {
+  ds_i <- dimethenamid_2018$ds[[i]]$data
+  ds_i[ds_i$name == "DMTAP", "name"] <-  "DMTA"
+  ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i]
+  ds_i
+})
+names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title)
+dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]])
+dmta_ds[["Elliot 1"]] <- NULL
+dmta_ds[["Elliot 2"]] <- NULL
+
+
+

Test cases +

+
+

Parent only +

+
+parent_mods <- c("SFO", "DFOP", "SFORB", "HS")
+parent_sep_const <- mmkin(parent_mods, dmta_ds, quiet = TRUE, cores = n_cores)
+parent_sep_tc <- update(parent_sep_const, error_model = "tc")
+
+t1 <- system.time(sfo_const <- saem(parent_sep_const["SFO", ]))[["elapsed"]]
+t2 <- system.time(dfop_const <- saem(parent_sep_const["DFOP", ]))[["elapsed"]]
+t3 <- system.time(sforb_const <- saem(parent_sep_const["SFORB", ]))[["elapsed"]]
+t4 <- system.time(hs_const <- saem(parent_sep_const["HS", ]))[["elapsed"]]
+t5 <- system.time(sfo_tc <- saem(parent_sep_tc["SFO", ]))[["elapsed"]]
+t6 <- system.time(dfop_tc <- saem(parent_sep_tc["DFOP", ]))[["elapsed"]]
+t7 <- system.time(sforb_tc <- saem(parent_sep_tc["SFORB", ]))[["elapsed"]]
+t8 <- system.time(hs_tc <- saem(parent_sep_tc["HS", ]))[["elapsed"]]
+
+anova(
+  sfo_const, dfop_const, sforb_const, hs_const,
+  sfo_tc, dfop_tc, sforb_tc, hs_tc) |> kable(, digits = 1)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nparAICBICLik
sfo_const5796.3795.3-393.2
sfo_tc6798.3797.1-393.2
dfop_const9709.4707.5-345.7
sforb_const9710.0708.1-346.0
hs_const9713.7711.8-347.8
dfop_tc10670.1668.0-325.0
sforb_tc10662.9660.8-321.4
hs_tc10667.2665.1-323.6
+

The above model comparison suggests to use the SFORB model with +two-component error. For comparison, we keep the DFOP model with +two-component error, as it competes with SFORB for biphasic curves.

+
+illparms(dfop_tc)
+
## [1] "sd(log_k2)"
+
+illparms(sforb_tc)
+
## [1] "sd(log_k_DMTA_bound_free)"
+

For these two models, random effects for the transformed parameters +k2 and k_DMTA_bound_free could not be +quantified.

+
+
+

One metabolite +

+

We remove parameters that were found to be ill-defined in the parent +only fits.

+
+one_met_mods <- list(
+  DFOP_SFO = mkinmod(
+    DMTA = mkinsub("DFOP", "M23"),
+    M23 = mkinsub("SFO")),
+  SFORB_SFO = mkinmod(
+    DMTA = mkinsub("SFORB", "M23"),
+    M23 = mkinsub("SFO")))
+
+one_met_sep_const <- mmkin(one_met_mods, dmta_ds, error_model = "const",
+  cores = n_cores, quiet = TRUE)
+one_met_sep_tc <- mmkin(one_met_mods, dmta_ds, error_model = "tc",
+  cores = n_cores, quiet = TRUE)
+
+t9 <- system.time(dfop_sfo_tc <- saem(one_met_sep_tc["DFOP_SFO", ],
+    no_random_effect = "log_k2"))[["elapsed"]]
+t10 <- system.time(sforb_sfo_tc <- saem(one_met_sep_tc["SFORB_SFO", ],
+    no_random_effect = "log_k_DMTA_bound_free"))[["elapsed"]]
+
+
+

Three metabolites +

+

For the case of three metabolites, we only keep the SFORB model in +order to limit the time for compiling this vignette, and as fitting in +parallel may disturb the benchmark. Again, we do not include random +effects that were ill-defined in previous fits of subsets of the +degradation model.

+
+illparms(sforb_sfo_tc)
+
+three_met_mods <- list(
+  SFORB_SFO3_plus = mkinmod(
+    DMTA = mkinsub("SFORB", c("M23", "M27", "M31")),
+    M23 = mkinsub("SFO"),
+    M27 = mkinsub("SFO"),
+    M31 = mkinsub("SFO", "M27", sink = FALSE)))
+
+three_met_sep_tc <- mmkin(three_met_mods, dmta_ds, error_model = "tc",
+  cores = n_cores, quiet = TRUE)
+
+t11 <- system.time(sforb_sfo3_plus_const <- saem(three_met_sep_tc["SFORB_SFO3_plus", ],
+    no_random_effect = "log_k_DMTA_bound_free"))[["elapsed"]]
+
+
+
+

Results +

+

Benchmarks for all available error models are shown. They are +intended for improving mkin, not for comparing CPUs or operating +systems. All trademarks belong to their respective owners.

+
+

Parent only +

+

Constant variance for SFO, DFOP, SFORB and HS.

+ ++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPUOSmkinsaemixt1t2t3t4
Ryzen 7 1700Linux1.2.03.22.1404.6264.3284.998
Ryzen 7 1700Linux1.2.23.22.4274.5504.2174.851
Ryzen 9 7950XLinux1.2.13.21.3522.8132.4012.074
Ryzen 9 7950XLinux1.2.23.21.3282.7382.3362.023
Ryzen 9 7950XLinux1.2.33.21.1182.0362.0102.088
Ryzen 9 7950XLinux1.2.33.21.4192.3741.9262.398
Ryzen 9 7950XLinux1.2.43.20.9722.5501.9872.055
Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHzLinux1.2.63.22.9986.5236.1264.721
Ryzen 9 7950XLinux1.2.63.21.1352.0252.4062.478
Ryzen 9 7950XLinux1.2.93.31.0861.9911.9492.411
Ryzen 9 7950XLinux1.2.103.31.1152.2771.9452.134
+

Two-component error fits for SFO, DFOP, SFORB and HS.

+ ++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPUOSmkinsaemixt5t6t7t8
Ryzen 7 1700Linux1.2.03.25.6787.4418.0007.980
Ryzen 7 1700Linux1.2.23.25.3527.2018.1748.401
Ryzen 9 7950XLinux1.2.13.22.3883.0333.5323.310
Ryzen 9 7950XLinux1.2.23.22.3412.9683.4653.341
Ryzen 9 7950XLinux1.2.33.22.1593.5843.3073.460
Ryzen 9 7950XLinux1.2.33.22.3483.1343.2533.530
Ryzen 9 7950XLinux1.2.43.22.1273.5873.4333.595
Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHzLinux1.2.63.25.0708.4648.5257.599
Ryzen 9 7950XLinux1.2.63.22.1613.3253.6693.153
Ryzen 9 7950XLinux1.2.93.32.4263.1963.2563.322
Ryzen 9 7950XLinux1.2.103.32.3723.1373.1003.281
+
+
+

One metabolite +

+

Two-component error for DFOP-SFO and SFORB-SFO.

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPUOSmkinsaemixt9t10
Ryzen 7 1700Linux1.2.03.224.465800.266
Ryzen 7 1700Linux1.2.23.225.193798.580
Ryzen 9 7950XLinux1.2.13.211.247285.216
Ryzen 9 7950XLinux1.2.23.211.242284.258
Ryzen 9 7950XLinux1.2.33.211.796216.012
Ryzen 9 7950XLinux1.2.33.212.841292.688
Ryzen 9 7950XLinux1.2.43.212.160265.934
Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHzLinux1.2.63.230.168748.675
Ryzen 9 7950XLinux1.2.63.212.007286.757
Ryzen 9 7950XLinux1.2.93.312.420289.338
Ryzen 9 7950XLinux1.2.103.311.590279.782
+
+
+

Three metabolites +

+

Two-component error for SFORB-SFO3-plus

+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CPUOSmkinsaemixt11
Ryzen 7 1700Linux1.2.03.21289.198
Ryzen 7 1700Linux1.2.23.21312.445
Ryzen 9 7950XLinux1.2.13.2489.939
Ryzen 9 7950XLinux1.2.23.2482.970
Ryzen 9 7950XLinux1.2.33.2392.364
Ryzen 9 7950XLinux1.2.33.2483.027
Ryzen 9 7950XLinux1.2.43.2456.252
Intel(R) Xeon(R) Gold 6134 CPU @ 3.20GHzLinux1.2.63.21235.028
Ryzen 9 7950XLinux1.2.63.2480.577
Ryzen 9 7950XLinux1.2.93.3485.836
Ryzen 9 7950XLinux1.2.103.3469.036
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/dev/authors.html b/docs/dev/authors.html new file mode 100644 index 00000000..15680365 --- /dev/null +++ b/docs/dev/authors.html @@ -0,0 +1,118 @@ + +Authors and Citation • mkin + Skip to contents + + +
+
+
+ +
+

Authors

+ +
  • +

    Johannes Ranke. Author, maintainer, copyright holder. +

    +
  • +
  • +

    Katrin Lindenberger. Contributor. +
    contributed to mkinresplot()

    +
  • +
  • +

    René Lehmann. Contributor. +
    ilr() and invilr()

    +
  • +
  • +

    Eurofins Regulatory AG. Copyright holder. +
    copyright for some of the contributions of JR 2012-2014

    +
  • +
+ +
+

Citation

+

Source: DESCRIPTION

+ +

Ranke J (2025). +mkin: Kinetic Evaluation of Chemical Degradation Data. +R package version 1.2.10, https://pkgdown.jrwb.de/mkin/. +

+
@Manual{,
+  title = {mkin: Kinetic Evaluation of Chemical Degradation Data},
+  author = {Johannes Ranke},
+  year = {2025},
+  note = {R package version 1.2.10},
+  url = {https://pkgdown.jrwb.de/mkin/},
+}
+
+ +
+ + +
+ + + +
+ + + + + + + diff --git a/docs/dev/deps/bootstrap-5.3.1/bootstrap.bundle.min.js b/docs/dev/deps/bootstrap-5.3.1/bootstrap.bundle.min.js new file mode 100644 index 00000000..e8f21f70 --- /dev/null +++ b/docs/dev/deps/bootstrap-5.3.1/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/dev/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map b/docs/dev/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map new file mode 100644 index 00000000..3863da8b --- /dev/null +++ b/docs/dev/deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map @@ -0,0 +1 @@ +{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","forEach","styles","assign","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","round","getUAString","uaData","userAgentData","brands","isArray","item","brand","version","userAgent","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","computeStyles$1","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","display","popperConfig","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_resetElementAttributes","isOverflowing","_saveInitialAttribute","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","sel","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","initialOverflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","Offcanvas","blur","completeCallback","DefaultAllowlist","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","attributeRegex","regex","allowList","content","extraClass","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","scrollTo","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","activeNodes","spy","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","HOME_KEY","END_KEY","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.1'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null\n }\n\n return parseSelector(selector)\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute, executeAfterTransition, getElement, reflow } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport { defineJQueryPlugin, isRTL, isVisible, reflow } from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport { defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' +\n '
' +\n '
' +\n '
',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' +\n '
' +\n '

' +\n '
' +\n '
',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
    and
')},createChildNavList:function(e){var t=this.createNavList();return e.append(t),t},generateNavEl:function(e,t){var n=a('
');n.attr("href","#"+e),n.text(t);var r=a("
  • ");return r.append(n),r},generateNavItem:function(e){var t=this.generateAnchor(e),n=a(e),r=n.data("toc-text")||n.text();return this.generateNavEl(t,r)},getTopLevel:function(e){for(var t=1;t<=6;t++){if(1 + + + + + + + + + + + + diff --git a/docs/dev/deps/font-awesome-6.5.2/css/all.css b/docs/dev/deps/font-awesome-6.5.2/css/all.css new file mode 100644 index 00000000..151dd57c --- /dev/null +++ b/docs/dev/deps/font-awesome-6.5.2/css/all.css @@ -0,0 +1,8028 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa { + font-family: var(--fa-style-family, "Font Awesome 6 Free"); + font-weight: var(--fa-style, 900); } + +.fa, +.fa-classic, +.fa-sharp, +.fas, +.fa-solid, +.far, +.fa-regular, +.fab, +.fa-brands { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; } + +.fas, +.fa-classic, +.fa-solid, +.far, +.fa-regular { + font-family: 'Font Awesome 6 Free'; } + +.fab, +.fa-brands { + font-family: 'Font Awesome 6 Brands'; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; } + +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; } + +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; } + +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; } + +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; } + +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: calc(var(--fa-li-width, 2em) * -1); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; } + +.fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } + +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); } + +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); } + +.fa-beat { + -webkit-animation-name: fa-beat; + animation-name: fa-beat; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-bounce { + -webkit-animation-name: fa-bounce; + animation-name: fa-bounce; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } + +.fa-fade { + -webkit-animation-name: fa-fade; + animation-name: fa-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-beat-fade { + -webkit-animation-name: fa-beat-fade; + animation-name: fa-beat-fade; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-flip { + -webkit-animation-name: fa-flip; + animation-name: fa-flip; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-shake { + -webkit-animation-name: fa-shake; + animation-name: fa-shake; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-delay: var(--fa-animation-delay, 0s); + animation-delay: var(--fa-animation-delay, 0s); + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 2s); + animation-duration: var(--fa-animation-duration, 2s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, linear); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin-reverse { + --fa-animation-direction: reverse; } + +.fa-pulse, +.fa-spin-pulse { + -webkit-animation-name: fa-spin; + animation-name: fa-spin; + -webkit-animation-direction: var(--fa-animation-direction, normal); + animation-direction: var(--fa-animation-direction, normal); + -webkit-animation-duration: var(--fa-animation-duration, 1s); + animation-duration: var(--fa-animation-duration, 1s); + -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + -webkit-animation-timing-function: var(--fa-animation-timing, steps(8)); + animation-timing-function: var(--fa-animation-timing, steps(8)); } + +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + -webkit-animation-delay: -1ms; + animation-delay: -1ms; + -webkit-animation-duration: 1ms; + animation-duration: 1ms; + -webkit-animation-iteration-count: 1; + animation-iteration-count: 1; + -webkit-transition-delay: 0s; + transition-delay: 0s; + -webkit-transition-duration: 0s; + transition-duration: 0s; } } + +@-webkit-keyframes fa-beat { + 0%, 90% { + -webkit-transform: scale(1); + transform: scale(1); } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@keyframes fa-beat { + 0%, 90% { + -webkit-transform: scale(1); + transform: scale(1); } + 45% { + -webkit-transform: scale(var(--fa-beat-scale, 1.25)); + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@-webkit-keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 10% { + -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } } + +@keyframes fa-bounce { + 0% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 10% { + -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } + 100% { + -webkit-transform: scale(1, 1) translateY(0); + transform: scale(1, 1) translateY(0); } } + +@-webkit-keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@-webkit-keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + -webkit-transform: scale(1); + transform: scale(1); } + 50% { + opacity: 1; + -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125)); + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@-webkit-keyframes fa-flip { + 50% { + -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@keyframes fa-flip { + 50% { + -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@-webkit-keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); } + 8%, 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); } + 12%, 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); } + 40%, 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } } + +@keyframes fa-shake { + 0% { + -webkit-transform: rotate(-15deg); + transform: rotate(-15deg); } + 4% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); } + 8%, 24% { + -webkit-transform: rotate(-18deg); + transform: rotate(-18deg); } + 12%, 28% { + -webkit-transform: rotate(18deg); + transform: rotate(18deg); } + 16% { + -webkit-transform: rotate(-22deg); + transform: rotate(-22deg); } + 20% { + -webkit-transform: rotate(22deg); + transform: rotate(22deg); } + 32% { + -webkit-transform: rotate(-12deg); + transform: rotate(-12deg); } + 36% { + -webkit-transform: rotate(12deg); + transform: rotate(12deg); } + 40%, 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } } + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } } + +.fa-rotate-90 { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } + +.fa-rotate-180 { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + +.fa-rotate-270 { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); } + +.fa-flip-horizontal { + -webkit-transform: scale(-1, 1); + transform: scale(-1, 1); } + +.fa-flip-vertical { + -webkit-transform: scale(1, -1); + transform: scale(1, -1); } + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + -webkit-transform: scale(-1, -1); + transform: scale(-1, -1); } + +.fa-rotate-by { + -webkit-transform: rotate(var(--fa-rotate-angle, 0)); + transform: rotate(var(--fa-rotate-angle, 0)); } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--fa-stack-z-index, auto); } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: var(--fa-inverse, #fff); } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ + +.fa-0::before { + content: "\30"; } + +.fa-1::before { + content: "\31"; } + +.fa-2::before { + content: "\32"; } + +.fa-3::before { + content: "\33"; } + +.fa-4::before { + content: "\34"; } + +.fa-5::before { + content: "\35"; } + +.fa-6::before { + content: "\36"; } + +.fa-7::before { + content: "\37"; } + +.fa-8::before { + content: "\38"; } + +.fa-9::before { + content: "\39"; } + +.fa-fill-drip::before { + content: "\f576"; } + +.fa-arrows-to-circle::before { + content: "\e4bd"; } + +.fa-circle-chevron-right::before { + content: "\f138"; } + +.fa-chevron-circle-right::before { + content: "\f138"; } + +.fa-at::before { + content: "\40"; } + +.fa-trash-can::before { + content: "\f2ed"; } + +.fa-trash-alt::before { + content: "\f2ed"; } + +.fa-text-height::before { + content: "\f034"; } + +.fa-user-xmark::before { + content: "\f235"; } + +.fa-user-times::before { + content: "\f235"; } + +.fa-stethoscope::before { + content: "\f0f1"; } + +.fa-message::before { + content: "\f27a"; } + +.fa-comment-alt::before { + content: "\f27a"; } + +.fa-info::before { + content: "\f129"; } + +.fa-down-left-and-up-right-to-center::before { + content: "\f422"; } + +.fa-compress-alt::before { + content: "\f422"; } + +.fa-explosion::before { + content: "\e4e9"; } + +.fa-file-lines::before { + content: "\f15c"; } + +.fa-file-alt::before { + content: "\f15c"; } + +.fa-file-text::before { + content: "\f15c"; } + +.fa-wave-square::before { + content: "\f83e"; } + +.fa-ring::before { + content: "\f70b"; } + +.fa-building-un::before { + content: "\e4d9"; } + +.fa-dice-three::before { + content: "\f527"; } + +.fa-calendar-days::before { + content: "\f073"; } + +.fa-calendar-alt::before { + content: "\f073"; } + +.fa-anchor-circle-check::before { + content: "\e4aa"; } + +.fa-building-circle-arrow-right::before { + content: "\e4d1"; } + +.fa-volleyball::before { + content: "\f45f"; } + +.fa-volleyball-ball::before { + content: "\f45f"; } + +.fa-arrows-up-to-line::before { + content: "\e4c2"; } + +.fa-sort-down::before { + content: "\f0dd"; } + +.fa-sort-desc::before { + content: "\f0dd"; } + +.fa-circle-minus::before { + content: "\f056"; } + +.fa-minus-circle::before { + content: "\f056"; } + +.fa-door-open::before { + content: "\f52b"; } + +.fa-right-from-bracket::before { + content: "\f2f5"; } + +.fa-sign-out-alt::before { + content: "\f2f5"; } + +.fa-atom::before { + content: "\f5d2"; } + +.fa-soap::before { + content: "\e06e"; } + +.fa-icons::before { + content: "\f86d"; } + +.fa-heart-music-camera-bolt::before { + content: "\f86d"; } + +.fa-microphone-lines-slash::before { + content: "\f539"; } + +.fa-microphone-alt-slash::before { + content: "\f539"; } + +.fa-bridge-circle-check::before { + content: "\e4c9"; } + +.fa-pump-medical::before { + content: "\e06a"; } + +.fa-fingerprint::before { + content: "\f577"; } + +.fa-hand-point-right::before { + content: "\f0a4"; } + +.fa-magnifying-glass-location::before { + content: "\f689"; } + +.fa-search-location::before { + content: "\f689"; } + +.fa-forward-step::before { + content: "\f051"; } + +.fa-step-forward::before { + content: "\f051"; } + +.fa-face-smile-beam::before { + content: "\f5b8"; } + +.fa-smile-beam::before { + content: "\f5b8"; } + +.fa-flag-checkered::before { + content: "\f11e"; } + +.fa-football::before { + content: "\f44e"; } + +.fa-football-ball::before { + content: "\f44e"; } + +.fa-school-circle-exclamation::before { + content: "\e56c"; } + +.fa-crop::before { + content: "\f125"; } + +.fa-angles-down::before { + content: "\f103"; } + +.fa-angle-double-down::before { + content: "\f103"; } + +.fa-users-rectangle::before { + content: "\e594"; } + +.fa-people-roof::before { + content: "\e537"; } + +.fa-people-line::before { + content: "\e534"; } + +.fa-beer-mug-empty::before { + content: "\f0fc"; } + +.fa-beer::before { + content: "\f0fc"; } + +.fa-diagram-predecessor::before { + content: "\e477"; } + +.fa-arrow-up-long::before { + content: "\f176"; } + +.fa-long-arrow-up::before { + content: "\f176"; } + +.fa-fire-flame-simple::before { + content: "\f46a"; } + +.fa-burn::before { + content: "\f46a"; } + +.fa-person::before { + content: "\f183"; } + +.fa-male::before { + content: "\f183"; } + +.fa-laptop::before { + content: "\f109"; } + +.fa-file-csv::before { + content: "\f6dd"; } + +.fa-menorah::before { + content: "\f676"; } + +.fa-truck-plane::before { + content: "\e58f"; } + +.fa-record-vinyl::before { + content: "\f8d9"; } + +.fa-face-grin-stars::before { + content: "\f587"; } + +.fa-grin-stars::before { + content: "\f587"; } + +.fa-bong::before { + content: "\f55c"; } + +.fa-spaghetti-monster-flying::before { + content: "\f67b"; } + +.fa-pastafarianism::before { + content: "\f67b"; } + +.fa-arrow-down-up-across-line::before { + content: "\e4af"; } + +.fa-spoon::before { + content: "\f2e5"; } + +.fa-utensil-spoon::before { + content: "\f2e5"; } + +.fa-jar-wheat::before { + content: "\e517"; } + +.fa-envelopes-bulk::before { + content: "\f674"; } + +.fa-mail-bulk::before { + content: "\f674"; } + +.fa-file-circle-exclamation::before { + content: "\e4eb"; } + +.fa-circle-h::before { + content: "\f47e"; } + +.fa-hospital-symbol::before { + content: "\f47e"; } + +.fa-pager::before { + content: "\f815"; } + +.fa-address-book::before { + content: "\f2b9"; } + +.fa-contact-book::before { + content: "\f2b9"; } + +.fa-strikethrough::before { + content: "\f0cc"; } + +.fa-k::before { + content: "\4b"; } + +.fa-landmark-flag::before { + content: "\e51c"; } + +.fa-pencil::before { + content: "\f303"; } + +.fa-pencil-alt::before { + content: "\f303"; } + +.fa-backward::before { + content: "\f04a"; } + +.fa-caret-right::before { + content: "\f0da"; } + +.fa-comments::before { + content: "\f086"; } + +.fa-paste::before { + content: "\f0ea"; } + +.fa-file-clipboard::before { + content: "\f0ea"; } + +.fa-code-pull-request::before { + content: "\e13c"; } + +.fa-clipboard-list::before { + content: "\f46d"; } + +.fa-truck-ramp-box::before { + content: "\f4de"; } + +.fa-truck-loading::before { + content: "\f4de"; } + +.fa-user-check::before { + content: "\f4fc"; } + +.fa-vial-virus::before { + content: "\e597"; } + +.fa-sheet-plastic::before { + content: "\e571"; } + +.fa-blog::before { + content: "\f781"; } + +.fa-user-ninja::before { + content: "\f504"; } + +.fa-person-arrow-up-from-line::before { + content: "\e539"; } + +.fa-scroll-torah::before { + content: "\f6a0"; } + +.fa-torah::before { + content: "\f6a0"; } + +.fa-broom-ball::before { + content: "\f458"; } + +.fa-quidditch::before { + content: "\f458"; } + +.fa-quidditch-broom-ball::before { + content: "\f458"; } + +.fa-toggle-off::before { + content: "\f204"; } + +.fa-box-archive::before { + content: "\f187"; } + +.fa-archive::before { + content: "\f187"; } + +.fa-person-drowning::before { + content: "\e545"; } + +.fa-arrow-down-9-1::before { + content: "\f886"; } + +.fa-sort-numeric-desc::before { + content: "\f886"; } + +.fa-sort-numeric-down-alt::before { + content: "\f886"; } + +.fa-face-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-grin-tongue-squint::before { + content: "\f58a"; } + +.fa-spray-can::before { + content: "\f5bd"; } + +.fa-truck-monster::before { + content: "\f63b"; } + +.fa-w::before { + content: "\57"; } + +.fa-earth-africa::before { + content: "\f57c"; } + +.fa-globe-africa::before { + content: "\f57c"; } + +.fa-rainbow::before { + content: "\f75b"; } + +.fa-circle-notch::before { + content: "\f1ce"; } + +.fa-tablet-screen-button::before { + content: "\f3fa"; } + +.fa-tablet-alt::before { + content: "\f3fa"; } + +.fa-paw::before { + content: "\f1b0"; } + +.fa-cloud::before { + content: "\f0c2"; } + +.fa-trowel-bricks::before { + content: "\e58a"; } + +.fa-face-flushed::before { + content: "\f579"; } + +.fa-flushed::before { + content: "\f579"; } + +.fa-hospital-user::before { + content: "\f80d"; } + +.fa-tent-arrow-left-right::before { + content: "\e57f"; } + +.fa-gavel::before { + content: "\f0e3"; } + +.fa-legal::before { + content: "\f0e3"; } + +.fa-binoculars::before { + content: "\f1e5"; } + +.fa-microphone-slash::before { + content: "\f131"; } + +.fa-box-tissue::before { + content: "\e05b"; } + +.fa-motorcycle::before { + content: "\f21c"; } + +.fa-bell-concierge::before { + content: "\f562"; } + +.fa-concierge-bell::before { + content: "\f562"; } + +.fa-pen-ruler::before { + content: "\f5ae"; } + +.fa-pencil-ruler::before { + content: "\f5ae"; } + +.fa-people-arrows::before { + content: "\e068"; } + +.fa-people-arrows-left-right::before { + content: "\e068"; } + +.fa-mars-and-venus-burst::before { + content: "\e523"; } + +.fa-square-caret-right::before { + content: "\f152"; } + +.fa-caret-square-right::before { + content: "\f152"; } + +.fa-scissors::before { + content: "\f0c4"; } + +.fa-cut::before { + content: "\f0c4"; } + +.fa-sun-plant-wilt::before { + content: "\e57a"; } + +.fa-toilets-portable::before { + content: "\e584"; } + +.fa-hockey-puck::before { + content: "\f453"; } + +.fa-table::before { + content: "\f0ce"; } + +.fa-magnifying-glass-arrow-right::before { + content: "\e521"; } + +.fa-tachograph-digital::before { + content: "\f566"; } + +.fa-digital-tachograph::before { + content: "\f566"; } + +.fa-users-slash::before { + content: "\e073"; } + +.fa-clover::before { + content: "\e139"; } + +.fa-reply::before { + content: "\f3e5"; } + +.fa-mail-reply::before { + content: "\f3e5"; } + +.fa-star-and-crescent::before { + content: "\f699"; } + +.fa-house-fire::before { + content: "\e50c"; } + +.fa-square-minus::before { + content: "\f146"; } + +.fa-minus-square::before { + content: "\f146"; } + +.fa-helicopter::before { + content: "\f533"; } + +.fa-compass::before { + content: "\f14e"; } + +.fa-square-caret-down::before { + content: "\f150"; } + +.fa-caret-square-down::before { + content: "\f150"; } + +.fa-file-circle-question::before { + content: "\e4ef"; } + +.fa-laptop-code::before { + content: "\f5fc"; } + +.fa-swatchbook::before { + content: "\f5c3"; } + +.fa-prescription-bottle::before { + content: "\f485"; } + +.fa-bars::before { + content: "\f0c9"; } + +.fa-navicon::before { + content: "\f0c9"; } + +.fa-people-group::before { + content: "\e533"; } + +.fa-hourglass-end::before { + content: "\f253"; } + +.fa-hourglass-3::before { + content: "\f253"; } + +.fa-heart-crack::before { + content: "\f7a9"; } + +.fa-heart-broken::before { + content: "\f7a9"; } + +.fa-square-up-right::before { + content: "\f360"; } + +.fa-external-link-square-alt::before { + content: "\f360"; } + +.fa-face-kiss-beam::before { + content: "\f597"; } + +.fa-kiss-beam::before { + content: "\f597"; } + +.fa-film::before { + content: "\f008"; } + +.fa-ruler-horizontal::before { + content: "\f547"; } + +.fa-people-robbery::before { + content: "\e536"; } + +.fa-lightbulb::before { + content: "\f0eb"; } + +.fa-caret-left::before { + content: "\f0d9"; } + +.fa-circle-exclamation::before { + content: "\f06a"; } + +.fa-exclamation-circle::before { + content: "\f06a"; } + +.fa-school-circle-xmark::before { + content: "\e56d"; } + +.fa-arrow-right-from-bracket::before { + content: "\f08b"; } + +.fa-sign-out::before { + content: "\f08b"; } + +.fa-circle-chevron-down::before { + content: "\f13a"; } + +.fa-chevron-circle-down::before { + content: "\f13a"; } + +.fa-unlock-keyhole::before { + content: "\f13e"; } + +.fa-unlock-alt::before { + content: "\f13e"; } + +.fa-cloud-showers-heavy::before { + content: "\f740"; } + +.fa-headphones-simple::before { + content: "\f58f"; } + +.fa-headphones-alt::before { + content: "\f58f"; } + +.fa-sitemap::before { + content: "\f0e8"; } + +.fa-circle-dollar-to-slot::before { + content: "\f4b9"; } + +.fa-donate::before { + content: "\f4b9"; } + +.fa-memory::before { + content: "\f538"; } + +.fa-road-spikes::before { + content: "\e568"; } + +.fa-fire-burner::before { + content: "\e4f1"; } + +.fa-flag::before { + content: "\f024"; } + +.fa-hanukiah::before { + content: "\f6e6"; } + +.fa-feather::before { + content: "\f52d"; } + +.fa-volume-low::before { + content: "\f027"; } + +.fa-volume-down::before { + content: "\f027"; } + +.fa-comment-slash::before { + content: "\f4b3"; } + +.fa-cloud-sun-rain::before { + content: "\f743"; } + +.fa-compress::before { + content: "\f066"; } + +.fa-wheat-awn::before { + content: "\e2cd"; } + +.fa-wheat-alt::before { + content: "\e2cd"; } + +.fa-ankh::before { + content: "\f644"; } + +.fa-hands-holding-child::before { + content: "\e4fa"; } + +.fa-asterisk::before { + content: "\2a"; } + +.fa-square-check::before { + content: "\f14a"; } + +.fa-check-square::before { + content: "\f14a"; } + +.fa-peseta-sign::before { + content: "\e221"; } + +.fa-heading::before { + content: "\f1dc"; } + +.fa-header::before { + content: "\f1dc"; } + +.fa-ghost::before { + content: "\f6e2"; } + +.fa-list::before { + content: "\f03a"; } + +.fa-list-squares::before { + content: "\f03a"; } + +.fa-square-phone-flip::before { + content: "\f87b"; } + +.fa-phone-square-alt::before { + content: "\f87b"; } + +.fa-cart-plus::before { + content: "\f217"; } + +.fa-gamepad::before { + content: "\f11b"; } + +.fa-circle-dot::before { + content: "\f192"; } + +.fa-dot-circle::before { + content: "\f192"; } + +.fa-face-dizzy::before { + content: "\f567"; } + +.fa-dizzy::before { + content: "\f567"; } + +.fa-egg::before { + content: "\f7fb"; } + +.fa-house-medical-circle-xmark::before { + content: "\e513"; } + +.fa-campground::before { + content: "\f6bb"; } + +.fa-folder-plus::before { + content: "\f65e"; } + +.fa-futbol::before { + content: "\f1e3"; } + +.fa-futbol-ball::before { + content: "\f1e3"; } + +.fa-soccer-ball::before { + content: "\f1e3"; } + +.fa-paintbrush::before { + content: "\f1fc"; } + +.fa-paint-brush::before { + content: "\f1fc"; } + +.fa-lock::before { + content: "\f023"; } + +.fa-gas-pump::before { + content: "\f52f"; } + +.fa-hot-tub-person::before { + content: "\f593"; } + +.fa-hot-tub::before { + content: "\f593"; } + +.fa-map-location::before { + content: "\f59f"; } + +.fa-map-marked::before { + content: "\f59f"; } + +.fa-house-flood-water::before { + content: "\e50e"; } + +.fa-tree::before { + content: "\f1bb"; } + +.fa-bridge-lock::before { + content: "\e4cc"; } + +.fa-sack-dollar::before { + content: "\f81d"; } + +.fa-pen-to-square::before { + content: "\f044"; } + +.fa-edit::before { + content: "\f044"; } + +.fa-car-side::before { + content: "\f5e4"; } + +.fa-share-nodes::before { + content: "\f1e0"; } + +.fa-share-alt::before { + content: "\f1e0"; } + +.fa-heart-circle-minus::before { + content: "\e4ff"; } + +.fa-hourglass-half::before { + content: "\f252"; } + +.fa-hourglass-2::before { + content: "\f252"; } + +.fa-microscope::before { + content: "\f610"; } + +.fa-sink::before { + content: "\e06d"; } + +.fa-bag-shopping::before { + content: "\f290"; } + +.fa-shopping-bag::before { + content: "\f290"; } + +.fa-arrow-down-z-a::before { + content: "\f881"; } + +.fa-sort-alpha-desc::before { + content: "\f881"; } + +.fa-sort-alpha-down-alt::before { + content: "\f881"; } + +.fa-mitten::before { + content: "\f7b5"; } + +.fa-person-rays::before { + content: "\e54d"; } + +.fa-users::before { + content: "\f0c0"; } + +.fa-eye-slash::before { + content: "\f070"; } + +.fa-flask-vial::before { + content: "\e4f3"; } + +.fa-hand::before { + content: "\f256"; } + +.fa-hand-paper::before { + content: "\f256"; } + +.fa-om::before { + content: "\f679"; } + +.fa-worm::before { + content: "\e599"; } + +.fa-house-circle-xmark::before { + content: "\e50b"; } + +.fa-plug::before { + content: "\f1e6"; } + +.fa-chevron-up::before { + content: "\f077"; } + +.fa-hand-spock::before { + content: "\f259"; } + +.fa-stopwatch::before { + content: "\f2f2"; } + +.fa-face-kiss::before { + content: "\f596"; } + +.fa-kiss::before { + content: "\f596"; } + +.fa-bridge-circle-xmark::before { + content: "\e4cb"; } + +.fa-face-grin-tongue::before { + content: "\f589"; } + +.fa-grin-tongue::before { + content: "\f589"; } + +.fa-chess-bishop::before { + content: "\f43a"; } + +.fa-face-grin-wink::before { + content: "\f58c"; } + +.fa-grin-wink::before { + content: "\f58c"; } + +.fa-ear-deaf::before { + content: "\f2a4"; } + +.fa-deaf::before { + content: "\f2a4"; } + +.fa-deafness::before { + content: "\f2a4"; } + +.fa-hard-of-hearing::before { + content: "\f2a4"; } + +.fa-road-circle-check::before { + content: "\e564"; } + +.fa-dice-five::before { + content: "\f523"; } + +.fa-square-rss::before { + content: "\f143"; } + +.fa-rss-square::before { + content: "\f143"; } + +.fa-land-mine-on::before { + content: "\e51b"; } + +.fa-i-cursor::before { + content: "\f246"; } + +.fa-stamp::before { + content: "\f5bf"; } + +.fa-stairs::before { + content: "\e289"; } + +.fa-i::before { + content: "\49"; } + +.fa-hryvnia-sign::before { + content: "\f6f2"; } + +.fa-hryvnia::before { + content: "\f6f2"; } + +.fa-pills::before { + content: "\f484"; } + +.fa-face-grin-wide::before { + content: "\f581"; } + +.fa-grin-alt::before { + content: "\f581"; } + +.fa-tooth::before { + content: "\f5c9"; } + +.fa-v::before { + content: "\56"; } + +.fa-bangladeshi-taka-sign::before { + content: "\e2e6"; } + +.fa-bicycle::before { + content: "\f206"; } + +.fa-staff-snake::before { + content: "\e579"; } + +.fa-rod-asclepius::before { + content: "\e579"; } + +.fa-rod-snake::before { + content: "\e579"; } + +.fa-staff-aesculapius::before { + content: "\e579"; } + +.fa-head-side-cough-slash::before { + content: "\e062"; } + +.fa-truck-medical::before { + content: "\f0f9"; } + +.fa-ambulance::before { + content: "\f0f9"; } + +.fa-wheat-awn-circle-exclamation::before { + content: "\e598"; } + +.fa-snowman::before { + content: "\f7d0"; } + +.fa-mortar-pestle::before { + content: "\f5a7"; } + +.fa-road-barrier::before { + content: "\e562"; } + +.fa-school::before { + content: "\f549"; } + +.fa-igloo::before { + content: "\f7ae"; } + +.fa-joint::before { + content: "\f595"; } + +.fa-angle-right::before { + content: "\f105"; } + +.fa-horse::before { + content: "\f6f0"; } + +.fa-q::before { + content: "\51"; } + +.fa-g::before { + content: "\47"; } + +.fa-notes-medical::before { + content: "\f481"; } + +.fa-temperature-half::before { + content: "\f2c9"; } + +.fa-temperature-2::before { + content: "\f2c9"; } + +.fa-thermometer-2::before { + content: "\f2c9"; } + +.fa-thermometer-half::before { + content: "\f2c9"; } + +.fa-dong-sign::before { + content: "\e169"; } + +.fa-capsules::before { + content: "\f46b"; } + +.fa-poo-storm::before { + content: "\f75a"; } + +.fa-poo-bolt::before { + content: "\f75a"; } + +.fa-face-frown-open::before { + content: "\f57a"; } + +.fa-frown-open::before { + content: "\f57a"; } + +.fa-hand-point-up::before { + content: "\f0a6"; } + +.fa-money-bill::before { + content: "\f0d6"; } + +.fa-bookmark::before { + content: "\f02e"; } + +.fa-align-justify::before { + content: "\f039"; } + +.fa-umbrella-beach::before { + content: "\f5ca"; } + +.fa-helmet-un::before { + content: "\e503"; } + +.fa-bullseye::before { + content: "\f140"; } + +.fa-bacon::before { + content: "\f7e5"; } + +.fa-hand-point-down::before { + content: "\f0a7"; } + +.fa-arrow-up-from-bracket::before { + content: "\e09a"; } + +.fa-folder::before { + content: "\f07b"; } + +.fa-folder-blank::before { + content: "\f07b"; } + +.fa-file-waveform::before { + content: "\f478"; } + +.fa-file-medical-alt::before { + content: "\f478"; } + +.fa-radiation::before { + content: "\f7b9"; } + +.fa-chart-simple::before { + content: "\e473"; } + +.fa-mars-stroke::before { + content: "\f229"; } + +.fa-vial::before { + content: "\f492"; } + +.fa-gauge::before { + content: "\f624"; } + +.fa-dashboard::before { + content: "\f624"; } + +.fa-gauge-med::before { + content: "\f624"; } + +.fa-tachometer-alt-average::before { + content: "\f624"; } + +.fa-wand-magic-sparkles::before { + content: "\e2ca"; } + +.fa-magic-wand-sparkles::before { + content: "\e2ca"; } + +.fa-e::before { + content: "\45"; } + +.fa-pen-clip::before { + content: "\f305"; } + +.fa-pen-alt::before { + content: "\f305"; } + +.fa-bridge-circle-exclamation::before { + content: "\e4ca"; } + +.fa-user::before { + content: "\f007"; } + +.fa-school-circle-check::before { + content: "\e56b"; } + +.fa-dumpster::before { + content: "\f793"; } + +.fa-van-shuttle::before { + content: "\f5b6"; } + +.fa-shuttle-van::before { + content: "\f5b6"; } + +.fa-building-user::before { + content: "\e4da"; } + +.fa-square-caret-left::before { + content: "\f191"; } + +.fa-caret-square-left::before { + content: "\f191"; } + +.fa-highlighter::before { + content: "\f591"; } + +.fa-key::before { + content: "\f084"; } + +.fa-bullhorn::before { + content: "\f0a1"; } + +.fa-globe::before { + content: "\f0ac"; } + +.fa-synagogue::before { + content: "\f69b"; } + +.fa-person-half-dress::before { + content: "\e548"; } + +.fa-road-bridge::before { + content: "\e563"; } + +.fa-location-arrow::before { + content: "\f124"; } + +.fa-c::before { + content: "\43"; } + +.fa-tablet-button::before { + content: "\f10a"; } + +.fa-building-lock::before { + content: "\e4d6"; } + +.fa-pizza-slice::before { + content: "\f818"; } + +.fa-money-bill-wave::before { + content: "\f53a"; } + +.fa-chart-area::before { + content: "\f1fe"; } + +.fa-area-chart::before { + content: "\f1fe"; } + +.fa-house-flag::before { + content: "\e50d"; } + +.fa-person-circle-minus::before { + content: "\e540"; } + +.fa-ban::before { + content: "\f05e"; } + +.fa-cancel::before { + content: "\f05e"; } + +.fa-camera-rotate::before { + content: "\e0d8"; } + +.fa-spray-can-sparkles::before { + content: "\f5d0"; } + +.fa-air-freshener::before { + content: "\f5d0"; } + +.fa-star::before { + content: "\f005"; } + +.fa-repeat::before { + content: "\f363"; } + +.fa-cross::before { + content: "\f654"; } + +.fa-box::before { + content: "\f466"; } + +.fa-venus-mars::before { + content: "\f228"; } + +.fa-arrow-pointer::before { + content: "\f245"; } + +.fa-mouse-pointer::before { + content: "\f245"; } + +.fa-maximize::before { + content: "\f31e"; } + +.fa-expand-arrows-alt::before { + content: "\f31e"; } + +.fa-charging-station::before { + content: "\f5e7"; } + +.fa-shapes::before { + content: "\f61f"; } + +.fa-triangle-circle-square::before { + content: "\f61f"; } + +.fa-shuffle::before { + content: "\f074"; } + +.fa-random::before { + content: "\f074"; } + +.fa-person-running::before { + content: "\f70c"; } + +.fa-running::before { + content: "\f70c"; } + +.fa-mobile-retro::before { + content: "\e527"; } + +.fa-grip-lines-vertical::before { + content: "\f7a5"; } + +.fa-spider::before { + content: "\f717"; } + +.fa-hands-bound::before { + content: "\e4f9"; } + +.fa-file-invoice-dollar::before { + content: "\f571"; } + +.fa-plane-circle-exclamation::before { + content: "\e556"; } + +.fa-x-ray::before { + content: "\f497"; } + +.fa-spell-check::before { + content: "\f891"; } + +.fa-slash::before { + content: "\f715"; } + +.fa-computer-mouse::before { + content: "\f8cc"; } + +.fa-mouse::before { + content: "\f8cc"; } + +.fa-arrow-right-to-bracket::before { + content: "\f090"; } + +.fa-sign-in::before { + content: "\f090"; } + +.fa-shop-slash::before { + content: "\e070"; } + +.fa-store-alt-slash::before { + content: "\e070"; } + +.fa-server::before { + content: "\f233"; } + +.fa-virus-covid-slash::before { + content: "\e4a9"; } + +.fa-shop-lock::before { + content: "\e4a5"; } + +.fa-hourglass-start::before { + content: "\f251"; } + +.fa-hourglass-1::before { + content: "\f251"; } + +.fa-blender-phone::before { + content: "\f6b6"; } + +.fa-building-wheat::before { + content: "\e4db"; } + +.fa-person-breastfeeding::before { + content: "\e53a"; } + +.fa-right-to-bracket::before { + content: "\f2f6"; } + +.fa-sign-in-alt::before { + content: "\f2f6"; } + +.fa-venus::before { + content: "\f221"; } + +.fa-passport::before { + content: "\f5ab"; } + +.fa-heart-pulse::before { + content: "\f21e"; } + +.fa-heartbeat::before { + content: "\f21e"; } + +.fa-people-carry-box::before { + content: "\f4ce"; } + +.fa-people-carry::before { + content: "\f4ce"; } + +.fa-temperature-high::before { + content: "\f769"; } + +.fa-microchip::before { + content: "\f2db"; } + +.fa-crown::before { + content: "\f521"; } + +.fa-weight-hanging::before { + content: "\f5cd"; } + +.fa-xmarks-lines::before { + content: "\e59a"; } + +.fa-file-prescription::before { + content: "\f572"; } + +.fa-weight-scale::before { + content: "\f496"; } + +.fa-weight::before { + content: "\f496"; } + +.fa-user-group::before { + content: "\f500"; } + +.fa-user-friends::before { + content: "\f500"; } + +.fa-arrow-up-a-z::before { + content: "\f15e"; } + +.fa-sort-alpha-up::before { + content: "\f15e"; } + +.fa-chess-knight::before { + content: "\f441"; } + +.fa-face-laugh-squint::before { + content: "\f59b"; } + +.fa-laugh-squint::before { + content: "\f59b"; } + +.fa-wheelchair::before { + content: "\f193"; } + +.fa-circle-arrow-up::before { + content: "\f0aa"; } + +.fa-arrow-circle-up::before { + content: "\f0aa"; } + +.fa-toggle-on::before { + content: "\f205"; } + +.fa-person-walking::before { + content: "\f554"; } + +.fa-walking::before { + content: "\f554"; } + +.fa-l::before { + content: "\4c"; } + +.fa-fire::before { + content: "\f06d"; } + +.fa-bed-pulse::before { + content: "\f487"; } + +.fa-procedures::before { + content: "\f487"; } + +.fa-shuttle-space::before { + content: "\f197"; } + +.fa-space-shuttle::before { + content: "\f197"; } + +.fa-face-laugh::before { + content: "\f599"; } + +.fa-laugh::before { + content: "\f599"; } + +.fa-folder-open::before { + content: "\f07c"; } + +.fa-heart-circle-plus::before { + content: "\e500"; } + +.fa-code-fork::before { + content: "\e13b"; } + +.fa-city::before { + content: "\f64f"; } + +.fa-microphone-lines::before { + content: "\f3c9"; } + +.fa-microphone-alt::before { + content: "\f3c9"; } + +.fa-pepper-hot::before { + content: "\f816"; } + +.fa-unlock::before { + content: "\f09c"; } + +.fa-colon-sign::before { + content: "\e140"; } + +.fa-headset::before { + content: "\f590"; } + +.fa-store-slash::before { + content: "\e071"; } + +.fa-road-circle-xmark::before { + content: "\e566"; } + +.fa-user-minus::before { + content: "\f503"; } + +.fa-mars-stroke-up::before { + content: "\f22a"; } + +.fa-mars-stroke-v::before { + content: "\f22a"; } + +.fa-champagne-glasses::before { + content: "\f79f"; } + +.fa-glass-cheers::before { + content: "\f79f"; } + +.fa-clipboard::before { + content: "\f328"; } + +.fa-house-circle-exclamation::before { + content: "\e50a"; } + +.fa-file-arrow-up::before { + content: "\f574"; } + +.fa-file-upload::before { + content: "\f574"; } + +.fa-wifi::before { + content: "\f1eb"; } + +.fa-wifi-3::before { + content: "\f1eb"; } + +.fa-wifi-strong::before { + content: "\f1eb"; } + +.fa-bath::before { + content: "\f2cd"; } + +.fa-bathtub::before { + content: "\f2cd"; } + +.fa-underline::before { + content: "\f0cd"; } + +.fa-user-pen::before { + content: "\f4ff"; } + +.fa-user-edit::before { + content: "\f4ff"; } + +.fa-signature::before { + content: "\f5b7"; } + +.fa-stroopwafel::before { + content: "\f551"; } + +.fa-bold::before { + content: "\f032"; } + +.fa-anchor-lock::before { + content: "\e4ad"; } + +.fa-building-ngo::before { + content: "\e4d7"; } + +.fa-manat-sign::before { + content: "\e1d5"; } + +.fa-not-equal::before { + content: "\f53e"; } + +.fa-border-top-left::before { + content: "\f853"; } + +.fa-border-style::before { + content: "\f853"; } + +.fa-map-location-dot::before { + content: "\f5a0"; } + +.fa-map-marked-alt::before { + content: "\f5a0"; } + +.fa-jedi::before { + content: "\f669"; } + +.fa-square-poll-vertical::before { + content: "\f681"; } + +.fa-poll::before { + content: "\f681"; } + +.fa-mug-hot::before { + content: "\f7b6"; } + +.fa-car-battery::before { + content: "\f5df"; } + +.fa-battery-car::before { + content: "\f5df"; } + +.fa-gift::before { + content: "\f06b"; } + +.fa-dice-two::before { + content: "\f528"; } + +.fa-chess-queen::before { + content: "\f445"; } + +.fa-glasses::before { + content: "\f530"; } + +.fa-chess-board::before { + content: "\f43c"; } + +.fa-building-circle-check::before { + content: "\e4d2"; } + +.fa-person-chalkboard::before { + content: "\e53d"; } + +.fa-mars-stroke-right::before { + content: "\f22b"; } + +.fa-mars-stroke-h::before { + content: "\f22b"; } + +.fa-hand-back-fist::before { + content: "\f255"; } + +.fa-hand-rock::before { + content: "\f255"; } + +.fa-square-caret-up::before { + content: "\f151"; } + +.fa-caret-square-up::before { + content: "\f151"; } + +.fa-cloud-showers-water::before { + content: "\e4e4"; } + +.fa-chart-bar::before { + content: "\f080"; } + +.fa-bar-chart::before { + content: "\f080"; } + +.fa-hands-bubbles::before { + content: "\e05e"; } + +.fa-hands-wash::before { + content: "\e05e"; } + +.fa-less-than-equal::before { + content: "\f537"; } + +.fa-train::before { + content: "\f238"; } + +.fa-eye-low-vision::before { + content: "\f2a8"; } + +.fa-low-vision::before { + content: "\f2a8"; } + +.fa-crow::before { + content: "\f520"; } + +.fa-sailboat::before { + content: "\e445"; } + +.fa-window-restore::before { + content: "\f2d2"; } + +.fa-square-plus::before { + content: "\f0fe"; } + +.fa-plus-square::before { + content: "\f0fe"; } + +.fa-torii-gate::before { + content: "\f6a1"; } + +.fa-frog::before { + content: "\f52e"; } + +.fa-bucket::before { + content: "\e4cf"; } + +.fa-image::before { + content: "\f03e"; } + +.fa-microphone::before { + content: "\f130"; } + +.fa-cow::before { + content: "\f6c8"; } + +.fa-caret-up::before { + content: "\f0d8"; } + +.fa-screwdriver::before { + content: "\f54a"; } + +.fa-folder-closed::before { + content: "\e185"; } + +.fa-house-tsunami::before { + content: "\e515"; } + +.fa-square-nfi::before { + content: "\e576"; } + +.fa-arrow-up-from-ground-water::before { + content: "\e4b5"; } + +.fa-martini-glass::before { + content: "\f57b"; } + +.fa-glass-martini-alt::before { + content: "\f57b"; } + +.fa-rotate-left::before { + content: "\f2ea"; } + +.fa-rotate-back::before { + content: "\f2ea"; } + +.fa-rotate-backward::before { + content: "\f2ea"; } + +.fa-undo-alt::before { + content: "\f2ea"; } + +.fa-table-columns::before { + content: "\f0db"; } + +.fa-columns::before { + content: "\f0db"; } + +.fa-lemon::before { + content: "\f094"; } + +.fa-head-side-mask::before { + content: "\e063"; } + +.fa-handshake::before { + content: "\f2b5"; } + +.fa-gem::before { + content: "\f3a5"; } + +.fa-dolly::before { + content: "\f472"; } + +.fa-dolly-box::before { + content: "\f472"; } + +.fa-smoking::before { + content: "\f48d"; } + +.fa-minimize::before { + content: "\f78c"; } + +.fa-compress-arrows-alt::before { + content: "\f78c"; } + +.fa-monument::before { + content: "\f5a6"; } + +.fa-snowplow::before { + content: "\f7d2"; } + +.fa-angles-right::before { + content: "\f101"; } + +.fa-angle-double-right::before { + content: "\f101"; } + +.fa-cannabis::before { + content: "\f55f"; } + +.fa-circle-play::before { + content: "\f144"; } + +.fa-play-circle::before { + content: "\f144"; } + +.fa-tablets::before { + content: "\f490"; } + +.fa-ethernet::before { + content: "\f796"; } + +.fa-euro-sign::before { + content: "\f153"; } + +.fa-eur::before { + content: "\f153"; } + +.fa-euro::before { + content: "\f153"; } + +.fa-chair::before { + content: "\f6c0"; } + +.fa-circle-check::before { + content: "\f058"; } + +.fa-check-circle::before { + content: "\f058"; } + +.fa-circle-stop::before { + content: "\f28d"; } + +.fa-stop-circle::before { + content: "\f28d"; } + +.fa-compass-drafting::before { + content: "\f568"; } + +.fa-drafting-compass::before { + content: "\f568"; } + +.fa-plate-wheat::before { + content: "\e55a"; } + +.fa-icicles::before { + content: "\f7ad"; } + +.fa-person-shelter::before { + content: "\e54f"; } + +.fa-neuter::before { + content: "\f22c"; } + +.fa-id-badge::before { + content: "\f2c1"; } + +.fa-marker::before { + content: "\f5a1"; } + +.fa-face-laugh-beam::before { + content: "\f59a"; } + +.fa-laugh-beam::before { + content: "\f59a"; } + +.fa-helicopter-symbol::before { + content: "\e502"; } + +.fa-universal-access::before { + content: "\f29a"; } + +.fa-circle-chevron-up::before { + content: "\f139"; } + +.fa-chevron-circle-up::before { + content: "\f139"; } + +.fa-lari-sign::before { + content: "\e1c8"; } + +.fa-volcano::before { + content: "\f770"; } + +.fa-person-walking-dashed-line-arrow-right::before { + content: "\e553"; } + +.fa-sterling-sign::before { + content: "\f154"; } + +.fa-gbp::before { + content: "\f154"; } + +.fa-pound-sign::before { + content: "\f154"; } + +.fa-viruses::before { + content: "\e076"; } + +.fa-square-person-confined::before { + content: "\e577"; } + +.fa-user-tie::before { + content: "\f508"; } + +.fa-arrow-down-long::before { + content: "\f175"; } + +.fa-long-arrow-down::before { + content: "\f175"; } + +.fa-tent-arrow-down-to-line::before { + content: "\e57e"; } + +.fa-certificate::before { + content: "\f0a3"; } + +.fa-reply-all::before { + content: "\f122"; } + +.fa-mail-reply-all::before { + content: "\f122"; } + +.fa-suitcase::before { + content: "\f0f2"; } + +.fa-person-skating::before { + content: "\f7c5"; } + +.fa-skating::before { + content: "\f7c5"; } + +.fa-filter-circle-dollar::before { + content: "\f662"; } + +.fa-funnel-dollar::before { + content: "\f662"; } + +.fa-camera-retro::before { + content: "\f083"; } + +.fa-circle-arrow-down::before { + content: "\f0ab"; } + +.fa-arrow-circle-down::before { + content: "\f0ab"; } + +.fa-file-import::before { + content: "\f56f"; } + +.fa-arrow-right-to-file::before { + content: "\f56f"; } + +.fa-square-arrow-up-right::before { + content: "\f14c"; } + +.fa-external-link-square::before { + content: "\f14c"; } + +.fa-box-open::before { + content: "\f49e"; } + +.fa-scroll::before { + content: "\f70e"; } + +.fa-spa::before { + content: "\f5bb"; } + +.fa-location-pin-lock::before { + content: "\e51f"; } + +.fa-pause::before { + content: "\f04c"; } + +.fa-hill-avalanche::before { + content: "\e507"; } + +.fa-temperature-empty::before { + content: "\f2cb"; } + +.fa-temperature-0::before { + content: "\f2cb"; } + +.fa-thermometer-0::before { + content: "\f2cb"; } + +.fa-thermometer-empty::before { + content: "\f2cb"; } + +.fa-bomb::before { + content: "\f1e2"; } + +.fa-registered::before { + content: "\f25d"; } + +.fa-address-card::before { + content: "\f2bb"; } + +.fa-contact-card::before { + content: "\f2bb"; } + +.fa-vcard::before { + content: "\f2bb"; } + +.fa-scale-unbalanced-flip::before { + content: "\f516"; } + +.fa-balance-scale-right::before { + content: "\f516"; } + +.fa-subscript::before { + content: "\f12c"; } + +.fa-diamond-turn-right::before { + content: "\f5eb"; } + +.fa-directions::before { + content: "\f5eb"; } + +.fa-burst::before { + content: "\e4dc"; } + +.fa-house-laptop::before { + content: "\e066"; } + +.fa-laptop-house::before { + content: "\e066"; } + +.fa-face-tired::before { + content: "\f5c8"; } + +.fa-tired::before { + content: "\f5c8"; } + +.fa-money-bills::before { + content: "\e1f3"; } + +.fa-smog::before { + content: "\f75f"; } + +.fa-crutch::before { + content: "\f7f7"; } + +.fa-cloud-arrow-up::before { + content: "\f0ee"; } + +.fa-cloud-upload::before { + content: "\f0ee"; } + +.fa-cloud-upload-alt::before { + content: "\f0ee"; } + +.fa-palette::before { + content: "\f53f"; } + +.fa-arrows-turn-right::before { + content: "\e4c0"; } + +.fa-vest::before { + content: "\e085"; } + +.fa-ferry::before { + content: "\e4ea"; } + +.fa-arrows-down-to-people::before { + content: "\e4b9"; } + +.fa-seedling::before { + content: "\f4d8"; } + +.fa-sprout::before { + content: "\f4d8"; } + +.fa-left-right::before { + content: "\f337"; } + +.fa-arrows-alt-h::before { + content: "\f337"; } + +.fa-boxes-packing::before { + content: "\e4c7"; } + +.fa-circle-arrow-left::before { + content: "\f0a8"; } + +.fa-arrow-circle-left::before { + content: "\f0a8"; } + +.fa-group-arrows-rotate::before { + content: "\e4f6"; } + +.fa-bowl-food::before { + content: "\e4c6"; } + +.fa-candy-cane::before { + content: "\f786"; } + +.fa-arrow-down-wide-short::before { + content: "\f160"; } + +.fa-sort-amount-asc::before { + content: "\f160"; } + +.fa-sort-amount-down::before { + content: "\f160"; } + +.fa-cloud-bolt::before { + content: "\f76c"; } + +.fa-thunderstorm::before { + content: "\f76c"; } + +.fa-text-slash::before { + content: "\f87d"; } + +.fa-remove-format::before { + content: "\f87d"; } + +.fa-face-smile-wink::before { + content: "\f4da"; } + +.fa-smile-wink::before { + content: "\f4da"; } + +.fa-file-word::before { + content: "\f1c2"; } + +.fa-file-powerpoint::before { + content: "\f1c4"; } + +.fa-arrows-left-right::before { + content: "\f07e"; } + +.fa-arrows-h::before { + content: "\f07e"; } + +.fa-house-lock::before { + content: "\e510"; } + +.fa-cloud-arrow-down::before { + content: "\f0ed"; } + +.fa-cloud-download::before { + content: "\f0ed"; } + +.fa-cloud-download-alt::before { + content: "\f0ed"; } + +.fa-children::before { + content: "\e4e1"; } + +.fa-chalkboard::before { + content: "\f51b"; } + +.fa-blackboard::before { + content: "\f51b"; } + +.fa-user-large-slash::before { + content: "\f4fa"; } + +.fa-user-alt-slash::before { + content: "\f4fa"; } + +.fa-envelope-open::before { + content: "\f2b6"; } + +.fa-handshake-simple-slash::before { + content: "\e05f"; } + +.fa-handshake-alt-slash::before { + content: "\e05f"; } + +.fa-mattress-pillow::before { + content: "\e525"; } + +.fa-guarani-sign::before { + content: "\e19a"; } + +.fa-arrows-rotate::before { + content: "\f021"; } + +.fa-refresh::before { + content: "\f021"; } + +.fa-sync::before { + content: "\f021"; } + +.fa-fire-extinguisher::before { + content: "\f134"; } + +.fa-cruzeiro-sign::before { + content: "\e152"; } + +.fa-greater-than-equal::before { + content: "\f532"; } + +.fa-shield-halved::before { + content: "\f3ed"; } + +.fa-shield-alt::before { + content: "\f3ed"; } + +.fa-book-atlas::before { + content: "\f558"; } + +.fa-atlas::before { + content: "\f558"; } + +.fa-virus::before { + content: "\e074"; } + +.fa-envelope-circle-check::before { + content: "\e4e8"; } + +.fa-layer-group::before { + content: "\f5fd"; } + +.fa-arrows-to-dot::before { + content: "\e4be"; } + +.fa-archway::before { + content: "\f557"; } + +.fa-heart-circle-check::before { + content: "\e4fd"; } + +.fa-house-chimney-crack::before { + content: "\f6f1"; } + +.fa-house-damage::before { + content: "\f6f1"; } + +.fa-file-zipper::before { + content: "\f1c6"; } + +.fa-file-archive::before { + content: "\f1c6"; } + +.fa-square::before { + content: "\f0c8"; } + +.fa-martini-glass-empty::before { + content: "\f000"; } + +.fa-glass-martini::before { + content: "\f000"; } + +.fa-couch::before { + content: "\f4b8"; } + +.fa-cedi-sign::before { + content: "\e0df"; } + +.fa-italic::before { + content: "\f033"; } + +.fa-table-cells-column-lock::before { + content: "\e678"; } + +.fa-church::before { + content: "\f51d"; } + +.fa-comments-dollar::before { + content: "\f653"; } + +.fa-democrat::before { + content: "\f747"; } + +.fa-z::before { + content: "\5a"; } + +.fa-person-skiing::before { + content: "\f7c9"; } + +.fa-skiing::before { + content: "\f7c9"; } + +.fa-road-lock::before { + content: "\e567"; } + +.fa-a::before { + content: "\41"; } + +.fa-temperature-arrow-down::before { + content: "\e03f"; } + +.fa-temperature-down::before { + content: "\e03f"; } + +.fa-feather-pointed::before { + content: "\f56b"; } + +.fa-feather-alt::before { + content: "\f56b"; } + +.fa-p::before { + content: "\50"; } + +.fa-snowflake::before { + content: "\f2dc"; } + +.fa-newspaper::before { + content: "\f1ea"; } + +.fa-rectangle-ad::before { + content: "\f641"; } + +.fa-ad::before { + content: "\f641"; } + +.fa-circle-arrow-right::before { + content: "\f0a9"; } + +.fa-arrow-circle-right::before { + content: "\f0a9"; } + +.fa-filter-circle-xmark::before { + content: "\e17b"; } + +.fa-locust::before { + content: "\e520"; } + +.fa-sort::before { + content: "\f0dc"; } + +.fa-unsorted::before { + content: "\f0dc"; } + +.fa-list-ol::before { + content: "\f0cb"; } + +.fa-list-1-2::before { + content: "\f0cb"; } + +.fa-list-numeric::before { + content: "\f0cb"; } + +.fa-person-dress-burst::before { + content: "\e544"; } + +.fa-money-check-dollar::before { + content: "\f53d"; } + +.fa-money-check-alt::before { + content: "\f53d"; } + +.fa-vector-square::before { + content: "\f5cb"; } + +.fa-bread-slice::before { + content: "\f7ec"; } + +.fa-language::before { + content: "\f1ab"; } + +.fa-face-kiss-wink-heart::before { + content: "\f598"; } + +.fa-kiss-wink-heart::before { + content: "\f598"; } + +.fa-filter::before { + content: "\f0b0"; } + +.fa-question::before { + content: "\3f"; } + +.fa-file-signature::before { + content: "\f573"; } + +.fa-up-down-left-right::before { + content: "\f0b2"; } + +.fa-arrows-alt::before { + content: "\f0b2"; } + +.fa-house-chimney-user::before { + content: "\e065"; } + +.fa-hand-holding-heart::before { + content: "\f4be"; } + +.fa-puzzle-piece::before { + content: "\f12e"; } + +.fa-money-check::before { + content: "\f53c"; } + +.fa-star-half-stroke::before { + content: "\f5c0"; } + +.fa-star-half-alt::before { + content: "\f5c0"; } + +.fa-code::before { + content: "\f121"; } + +.fa-whiskey-glass::before { + content: "\f7a0"; } + +.fa-glass-whiskey::before { + content: "\f7a0"; } + +.fa-building-circle-exclamation::before { + content: "\e4d3"; } + +.fa-magnifying-glass-chart::before { + content: "\e522"; } + +.fa-arrow-up-right-from-square::before { + content: "\f08e"; } + +.fa-external-link::before { + content: "\f08e"; } + +.fa-cubes-stacked::before { + content: "\e4e6"; } + +.fa-won-sign::before { + content: "\f159"; } + +.fa-krw::before { + content: "\f159"; } + +.fa-won::before { + content: "\f159"; } + +.fa-virus-covid::before { + content: "\e4a8"; } + +.fa-austral-sign::before { + content: "\e0a9"; } + +.fa-f::before { + content: "\46"; } + +.fa-leaf::before { + content: "\f06c"; } + +.fa-road::before { + content: "\f018"; } + +.fa-taxi::before { + content: "\f1ba"; } + +.fa-cab::before { + content: "\f1ba"; } + +.fa-person-circle-plus::before { + content: "\e541"; } + +.fa-chart-pie::before { + content: "\f200"; } + +.fa-pie-chart::before { + content: "\f200"; } + +.fa-bolt-lightning::before { + content: "\e0b7"; } + +.fa-sack-xmark::before { + content: "\e56a"; } + +.fa-file-excel::before { + content: "\f1c3"; } + +.fa-file-contract::before { + content: "\f56c"; } + +.fa-fish-fins::before { + content: "\e4f2"; } + +.fa-building-flag::before { + content: "\e4d5"; } + +.fa-face-grin-beam::before { + content: "\f582"; } + +.fa-grin-beam::before { + content: "\f582"; } + +.fa-object-ungroup::before { + content: "\f248"; } + +.fa-poop::before { + content: "\f619"; } + +.fa-location-pin::before { + content: "\f041"; } + +.fa-map-marker::before { + content: "\f041"; } + +.fa-kaaba::before { + content: "\f66b"; } + +.fa-toilet-paper::before { + content: "\f71e"; } + +.fa-helmet-safety::before { + content: "\f807"; } + +.fa-hard-hat::before { + content: "\f807"; } + +.fa-hat-hard::before { + content: "\f807"; } + +.fa-eject::before { + content: "\f052"; } + +.fa-circle-right::before { + content: "\f35a"; } + +.fa-arrow-alt-circle-right::before { + content: "\f35a"; } + +.fa-plane-circle-check::before { + content: "\e555"; } + +.fa-face-rolling-eyes::before { + content: "\f5a5"; } + +.fa-meh-rolling-eyes::before { + content: "\f5a5"; } + +.fa-object-group::before { + content: "\f247"; } + +.fa-chart-line::before { + content: "\f201"; } + +.fa-line-chart::before { + content: "\f201"; } + +.fa-mask-ventilator::before { + content: "\e524"; } + +.fa-arrow-right::before { + content: "\f061"; } + +.fa-signs-post::before { + content: "\f277"; } + +.fa-map-signs::before { + content: "\f277"; } + +.fa-cash-register::before { + content: "\f788"; } + +.fa-person-circle-question::before { + content: "\e542"; } + +.fa-h::before { + content: "\48"; } + +.fa-tarp::before { + content: "\e57b"; } + +.fa-screwdriver-wrench::before { + content: "\f7d9"; } + +.fa-tools::before { + content: "\f7d9"; } + +.fa-arrows-to-eye::before { + content: "\e4bf"; } + +.fa-plug-circle-bolt::before { + content: "\e55b"; } + +.fa-heart::before { + content: "\f004"; } + +.fa-mars-and-venus::before { + content: "\f224"; } + +.fa-house-user::before { + content: "\e1b0"; } + +.fa-home-user::before { + content: "\e1b0"; } + +.fa-dumpster-fire::before { + content: "\f794"; } + +.fa-house-crack::before { + content: "\e3b1"; } + +.fa-martini-glass-citrus::before { + content: "\f561"; } + +.fa-cocktail::before { + content: "\f561"; } + +.fa-face-surprise::before { + content: "\f5c2"; } + +.fa-surprise::before { + content: "\f5c2"; } + +.fa-bottle-water::before { + content: "\e4c5"; } + +.fa-circle-pause::before { + content: "\f28b"; } + +.fa-pause-circle::before { + content: "\f28b"; } + +.fa-toilet-paper-slash::before { + content: "\e072"; } + +.fa-apple-whole::before { + content: "\f5d1"; } + +.fa-apple-alt::before { + content: "\f5d1"; } + +.fa-kitchen-set::before { + content: "\e51a"; } + +.fa-r::before { + content: "\52"; } + +.fa-temperature-quarter::before { + content: "\f2ca"; } + +.fa-temperature-1::before { + content: "\f2ca"; } + +.fa-thermometer-1::before { + content: "\f2ca"; } + +.fa-thermometer-quarter::before { + content: "\f2ca"; } + +.fa-cube::before { + content: "\f1b2"; } + +.fa-bitcoin-sign::before { + content: "\e0b4"; } + +.fa-shield-dog::before { + content: "\e573"; } + +.fa-solar-panel::before { + content: "\f5ba"; } + +.fa-lock-open::before { + content: "\f3c1"; } + +.fa-elevator::before { + content: "\e16d"; } + +.fa-money-bill-transfer::before { + content: "\e528"; } + +.fa-money-bill-trend-up::before { + content: "\e529"; } + +.fa-house-flood-water-circle-arrow-right::before { + content: "\e50f"; } + +.fa-square-poll-horizontal::before { + content: "\f682"; } + +.fa-poll-h::before { + content: "\f682"; } + +.fa-circle::before { + content: "\f111"; } + +.fa-backward-fast::before { + content: "\f049"; } + +.fa-fast-backward::before { + content: "\f049"; } + +.fa-recycle::before { + content: "\f1b8"; } + +.fa-user-astronaut::before { + content: "\f4fb"; } + +.fa-plane-slash::before { + content: "\e069"; } + +.fa-trademark::before { + content: "\f25c"; } + +.fa-basketball::before { + content: "\f434"; } + +.fa-basketball-ball::before { + content: "\f434"; } + +.fa-satellite-dish::before { + content: "\f7c0"; } + +.fa-circle-up::before { + content: "\f35b"; } + +.fa-arrow-alt-circle-up::before { + content: "\f35b"; } + +.fa-mobile-screen-button::before { + content: "\f3cd"; } + +.fa-mobile-alt::before { + content: "\f3cd"; } + +.fa-volume-high::before { + content: "\f028"; } + +.fa-volume-up::before { + content: "\f028"; } + +.fa-users-rays::before { + content: "\e593"; } + +.fa-wallet::before { + content: "\f555"; } + +.fa-clipboard-check::before { + content: "\f46c"; } + +.fa-file-audio::before { + content: "\f1c7"; } + +.fa-burger::before { + content: "\f805"; } + +.fa-hamburger::before { + content: "\f805"; } + +.fa-wrench::before { + content: "\f0ad"; } + +.fa-bugs::before { + content: "\e4d0"; } + +.fa-rupee-sign::before { + content: "\f156"; } + +.fa-rupee::before { + content: "\f156"; } + +.fa-file-image::before { + content: "\f1c5"; } + +.fa-circle-question::before { + content: "\f059"; } + +.fa-question-circle::before { + content: "\f059"; } + +.fa-plane-departure::before { + content: "\f5b0"; } + +.fa-handshake-slash::before { + content: "\e060"; } + +.fa-book-bookmark::before { + content: "\e0bb"; } + +.fa-code-branch::before { + content: "\f126"; } + +.fa-hat-cowboy::before { + content: "\f8c0"; } + +.fa-bridge::before { + content: "\e4c8"; } + +.fa-phone-flip::before { + content: "\f879"; } + +.fa-phone-alt::before { + content: "\f879"; } + +.fa-truck-front::before { + content: "\e2b7"; } + +.fa-cat::before { + content: "\f6be"; } + +.fa-anchor-circle-exclamation::before { + content: "\e4ab"; } + +.fa-truck-field::before { + content: "\e58d"; } + +.fa-route::before { + content: "\f4d7"; } + +.fa-clipboard-question::before { + content: "\e4e3"; } + +.fa-panorama::before { + content: "\e209"; } + +.fa-comment-medical::before { + content: "\f7f5"; } + +.fa-teeth-open::before { + content: "\f62f"; } + +.fa-file-circle-minus::before { + content: "\e4ed"; } + +.fa-tags::before { + content: "\f02c"; } + +.fa-wine-glass::before { + content: "\f4e3"; } + +.fa-forward-fast::before { + content: "\f050"; } + +.fa-fast-forward::before { + content: "\f050"; } + +.fa-face-meh-blank::before { + content: "\f5a4"; } + +.fa-meh-blank::before { + content: "\f5a4"; } + +.fa-square-parking::before { + content: "\f540"; } + +.fa-parking::before { + content: "\f540"; } + +.fa-house-signal::before { + content: "\e012"; } + +.fa-bars-progress::before { + content: "\f828"; } + +.fa-tasks-alt::before { + content: "\f828"; } + +.fa-faucet-drip::before { + content: "\e006"; } + +.fa-cart-flatbed::before { + content: "\f474"; } + +.fa-dolly-flatbed::before { + content: "\f474"; } + +.fa-ban-smoking::before { + content: "\f54d"; } + +.fa-smoking-ban::before { + content: "\f54d"; } + +.fa-terminal::before { + content: "\f120"; } + +.fa-mobile-button::before { + content: "\f10b"; } + +.fa-house-medical-flag::before { + content: "\e514"; } + +.fa-basket-shopping::before { + content: "\f291"; } + +.fa-shopping-basket::before { + content: "\f291"; } + +.fa-tape::before { + content: "\f4db"; } + +.fa-bus-simple::before { + content: "\f55e"; } + +.fa-bus-alt::before { + content: "\f55e"; } + +.fa-eye::before { + content: "\f06e"; } + +.fa-face-sad-cry::before { + content: "\f5b3"; } + +.fa-sad-cry::before { + content: "\f5b3"; } + +.fa-audio-description::before { + content: "\f29e"; } + +.fa-person-military-to-person::before { + content: "\e54c"; } + +.fa-file-shield::before { + content: "\e4f0"; } + +.fa-user-slash::before { + content: "\f506"; } + +.fa-pen::before { + content: "\f304"; } + +.fa-tower-observation::before { + content: "\e586"; } + +.fa-file-code::before { + content: "\f1c9"; } + +.fa-signal::before { + content: "\f012"; } + +.fa-signal-5::before { + content: "\f012"; } + +.fa-signal-perfect::before { + content: "\f012"; } + +.fa-bus::before { + content: "\f207"; } + +.fa-heart-circle-xmark::before { + content: "\e501"; } + +.fa-house-chimney::before { + content: "\e3af"; } + +.fa-home-lg::before { + content: "\e3af"; } + +.fa-window-maximize::before { + content: "\f2d0"; } + +.fa-face-frown::before { + content: "\f119"; } + +.fa-frown::before { + content: "\f119"; } + +.fa-prescription::before { + content: "\f5b1"; } + +.fa-shop::before { + content: "\f54f"; } + +.fa-store-alt::before { + content: "\f54f"; } + +.fa-floppy-disk::before { + content: "\f0c7"; } + +.fa-save::before { + content: "\f0c7"; } + +.fa-vihara::before { + content: "\f6a7"; } + +.fa-scale-unbalanced::before { + content: "\f515"; } + +.fa-balance-scale-left::before { + content: "\f515"; } + +.fa-sort-up::before { + content: "\f0de"; } + +.fa-sort-asc::before { + content: "\f0de"; } + +.fa-comment-dots::before { + content: "\f4ad"; } + +.fa-commenting::before { + content: "\f4ad"; } + +.fa-plant-wilt::before { + content: "\e5aa"; } + +.fa-diamond::before { + content: "\f219"; } + +.fa-face-grin-squint::before { + content: "\f585"; } + +.fa-grin-squint::before { + content: "\f585"; } + +.fa-hand-holding-dollar::before { + content: "\f4c0"; } + +.fa-hand-holding-usd::before { + content: "\f4c0"; } + +.fa-bacterium::before { + content: "\e05a"; } + +.fa-hand-pointer::before { + content: "\f25a"; } + +.fa-drum-steelpan::before { + content: "\f56a"; } + +.fa-hand-scissors::before { + content: "\f257"; } + +.fa-hands-praying::before { + content: "\f684"; } + +.fa-praying-hands::before { + content: "\f684"; } + +.fa-arrow-rotate-right::before { + content: "\f01e"; } + +.fa-arrow-right-rotate::before { + content: "\f01e"; } + +.fa-arrow-rotate-forward::before { + content: "\f01e"; } + +.fa-redo::before { + content: "\f01e"; } + +.fa-biohazard::before { + content: "\f780"; } + +.fa-location-crosshairs::before { + content: "\f601"; } + +.fa-location::before { + content: "\f601"; } + +.fa-mars-double::before { + content: "\f227"; } + +.fa-child-dress::before { + content: "\e59c"; } + +.fa-users-between-lines::before { + content: "\e591"; } + +.fa-lungs-virus::before { + content: "\e067"; } + +.fa-face-grin-tears::before { + content: "\f588"; } + +.fa-grin-tears::before { + content: "\f588"; } + +.fa-phone::before { + content: "\f095"; } + +.fa-calendar-xmark::before { + content: "\f273"; } + +.fa-calendar-times::before { + content: "\f273"; } + +.fa-child-reaching::before { + content: "\e59d"; } + +.fa-head-side-virus::before { + content: "\e064"; } + +.fa-user-gear::before { + content: "\f4fe"; } + +.fa-user-cog::before { + content: "\f4fe"; } + +.fa-arrow-up-1-9::before { + content: "\f163"; } + +.fa-sort-numeric-up::before { + content: "\f163"; } + +.fa-door-closed::before { + content: "\f52a"; } + +.fa-shield-virus::before { + content: "\e06c"; } + +.fa-dice-six::before { + content: "\f526"; } + +.fa-mosquito-net::before { + content: "\e52c"; } + +.fa-bridge-water::before { + content: "\e4ce"; } + +.fa-person-booth::before { + content: "\f756"; } + +.fa-text-width::before { + content: "\f035"; } + +.fa-hat-wizard::before { + content: "\f6e8"; } + +.fa-pen-fancy::before { + content: "\f5ac"; } + +.fa-person-digging::before { + content: "\f85e"; } + +.fa-digging::before { + content: "\f85e"; } + +.fa-trash::before { + content: "\f1f8"; } + +.fa-gauge-simple::before { + content: "\f629"; } + +.fa-gauge-simple-med::before { + content: "\f629"; } + +.fa-tachometer-average::before { + content: "\f629"; } + +.fa-book-medical::before { + content: "\f7e6"; } + +.fa-poo::before { + content: "\f2fe"; } + +.fa-quote-right::before { + content: "\f10e"; } + +.fa-quote-right-alt::before { + content: "\f10e"; } + +.fa-shirt::before { + content: "\f553"; } + +.fa-t-shirt::before { + content: "\f553"; } + +.fa-tshirt::before { + content: "\f553"; } + +.fa-cubes::before { + content: "\f1b3"; } + +.fa-divide::before { + content: "\f529"; } + +.fa-tenge-sign::before { + content: "\f7d7"; } + +.fa-tenge::before { + content: "\f7d7"; } + +.fa-headphones::before { + content: "\f025"; } + +.fa-hands-holding::before { + content: "\f4c2"; } + +.fa-hands-clapping::before { + content: "\e1a8"; } + +.fa-republican::before { + content: "\f75e"; } + +.fa-arrow-left::before { + content: "\f060"; } + +.fa-person-circle-xmark::before { + content: "\e543"; } + +.fa-ruler::before { + content: "\f545"; } + +.fa-align-left::before { + content: "\f036"; } + +.fa-dice-d6::before { + content: "\f6d1"; } + +.fa-restroom::before { + content: "\f7bd"; } + +.fa-j::before { + content: "\4a"; } + +.fa-users-viewfinder::before { + content: "\e595"; } + +.fa-file-video::before { + content: "\f1c8"; } + +.fa-up-right-from-square::before { + content: "\f35d"; } + +.fa-external-link-alt::before { + content: "\f35d"; } + +.fa-table-cells::before { + content: "\f00a"; } + +.fa-th::before { + content: "\f00a"; } + +.fa-file-pdf::before { + content: "\f1c1"; } + +.fa-book-bible::before { + content: "\f647"; } + +.fa-bible::before { + content: "\f647"; } + +.fa-o::before { + content: "\4f"; } + +.fa-suitcase-medical::before { + content: "\f0fa"; } + +.fa-medkit::before { + content: "\f0fa"; } + +.fa-user-secret::before { + content: "\f21b"; } + +.fa-otter::before { + content: "\f700"; } + +.fa-person-dress::before { + content: "\f182"; } + +.fa-female::before { + content: "\f182"; } + +.fa-comment-dollar::before { + content: "\f651"; } + +.fa-business-time::before { + content: "\f64a"; } + +.fa-briefcase-clock::before { + content: "\f64a"; } + +.fa-table-cells-large::before { + content: "\f009"; } + +.fa-th-large::before { + content: "\f009"; } + +.fa-book-tanakh::before { + content: "\f827"; } + +.fa-tanakh::before { + content: "\f827"; } + +.fa-phone-volume::before { + content: "\f2a0"; } + +.fa-volume-control-phone::before { + content: "\f2a0"; } + +.fa-hat-cowboy-side::before { + content: "\f8c1"; } + +.fa-clipboard-user::before { + content: "\f7f3"; } + +.fa-child::before { + content: "\f1ae"; } + +.fa-lira-sign::before { + content: "\f195"; } + +.fa-satellite::before { + content: "\f7bf"; } + +.fa-plane-lock::before { + content: "\e558"; } + +.fa-tag::before { + content: "\f02b"; } + +.fa-comment::before { + content: "\f075"; } + +.fa-cake-candles::before { + content: "\f1fd"; } + +.fa-birthday-cake::before { + content: "\f1fd"; } + +.fa-cake::before { + content: "\f1fd"; } + +.fa-envelope::before { + content: "\f0e0"; } + +.fa-angles-up::before { + content: "\f102"; } + +.fa-angle-double-up::before { + content: "\f102"; } + +.fa-paperclip::before { + content: "\f0c6"; } + +.fa-arrow-right-to-city::before { + content: "\e4b3"; } + +.fa-ribbon::before { + content: "\f4d6"; } + +.fa-lungs::before { + content: "\f604"; } + +.fa-arrow-up-9-1::before { + content: "\f887"; } + +.fa-sort-numeric-up-alt::before { + content: "\f887"; } + +.fa-litecoin-sign::before { + content: "\e1d3"; } + +.fa-border-none::before { + content: "\f850"; } + +.fa-circle-nodes::before { + content: "\e4e2"; } + +.fa-parachute-box::before { + content: "\f4cd"; } + +.fa-indent::before { + content: "\f03c"; } + +.fa-truck-field-un::before { + content: "\e58e"; } + +.fa-hourglass::before { + content: "\f254"; } + +.fa-hourglass-empty::before { + content: "\f254"; } + +.fa-mountain::before { + content: "\f6fc"; } + +.fa-user-doctor::before { + content: "\f0f0"; } + +.fa-user-md::before { + content: "\f0f0"; } + +.fa-circle-info::before { + content: "\f05a"; } + +.fa-info-circle::before { + content: "\f05a"; } + +.fa-cloud-meatball::before { + content: "\f73b"; } + +.fa-camera::before { + content: "\f030"; } + +.fa-camera-alt::before { + content: "\f030"; } + +.fa-square-virus::before { + content: "\e578"; } + +.fa-meteor::before { + content: "\f753"; } + +.fa-car-on::before { + content: "\e4dd"; } + +.fa-sleigh::before { + content: "\f7cc"; } + +.fa-arrow-down-1-9::before { + content: "\f162"; } + +.fa-sort-numeric-asc::before { + content: "\f162"; } + +.fa-sort-numeric-down::before { + content: "\f162"; } + +.fa-hand-holding-droplet::before { + content: "\f4c1"; } + +.fa-hand-holding-water::before { + content: "\f4c1"; } + +.fa-water::before { + content: "\f773"; } + +.fa-calendar-check::before { + content: "\f274"; } + +.fa-braille::before { + content: "\f2a1"; } + +.fa-prescription-bottle-medical::before { + content: "\f486"; } + +.fa-prescription-bottle-alt::before { + content: "\f486"; } + +.fa-landmark::before { + content: "\f66f"; } + +.fa-truck::before { + content: "\f0d1"; } + +.fa-crosshairs::before { + content: "\f05b"; } + +.fa-person-cane::before { + content: "\e53c"; } + +.fa-tent::before { + content: "\e57d"; } + +.fa-vest-patches::before { + content: "\e086"; } + +.fa-check-double::before { + content: "\f560"; } + +.fa-arrow-down-a-z::before { + content: "\f15d"; } + +.fa-sort-alpha-asc::before { + content: "\f15d"; } + +.fa-sort-alpha-down::before { + content: "\f15d"; } + +.fa-money-bill-wheat::before { + content: "\e52a"; } + +.fa-cookie::before { + content: "\f563"; } + +.fa-arrow-rotate-left::before { + content: "\f0e2"; } + +.fa-arrow-left-rotate::before { + content: "\f0e2"; } + +.fa-arrow-rotate-back::before { + content: "\f0e2"; } + +.fa-arrow-rotate-backward::before { + content: "\f0e2"; } + +.fa-undo::before { + content: "\f0e2"; } + +.fa-hard-drive::before { + content: "\f0a0"; } + +.fa-hdd::before { + content: "\f0a0"; } + +.fa-face-grin-squint-tears::before { + content: "\f586"; } + +.fa-grin-squint-tears::before { + content: "\f586"; } + +.fa-dumbbell::before { + content: "\f44b"; } + +.fa-rectangle-list::before { + content: "\f022"; } + +.fa-list-alt::before { + content: "\f022"; } + +.fa-tarp-droplet::before { + content: "\e57c"; } + +.fa-house-medical-circle-check::before { + content: "\e511"; } + +.fa-person-skiing-nordic::before { + content: "\f7ca"; } + +.fa-skiing-nordic::before { + content: "\f7ca"; } + +.fa-calendar-plus::before { + content: "\f271"; } + +.fa-plane-arrival::before { + content: "\f5af"; } + +.fa-circle-left::before { + content: "\f359"; } + +.fa-arrow-alt-circle-left::before { + content: "\f359"; } + +.fa-train-subway::before { + content: "\f239"; } + +.fa-subway::before { + content: "\f239"; } + +.fa-chart-gantt::before { + content: "\e0e4"; } + +.fa-indian-rupee-sign::before { + content: "\e1bc"; } + +.fa-indian-rupee::before { + content: "\e1bc"; } + +.fa-inr::before { + content: "\e1bc"; } + +.fa-crop-simple::before { + content: "\f565"; } + +.fa-crop-alt::before { + content: "\f565"; } + +.fa-money-bill-1::before { + content: "\f3d1"; } + +.fa-money-bill-alt::before { + content: "\f3d1"; } + +.fa-left-long::before { + content: "\f30a"; } + +.fa-long-arrow-alt-left::before { + content: "\f30a"; } + +.fa-dna::before { + content: "\f471"; } + +.fa-virus-slash::before { + content: "\e075"; } + +.fa-minus::before { + content: "\f068"; } + +.fa-subtract::before { + content: "\f068"; } + +.fa-chess::before { + content: "\f439"; } + +.fa-arrow-left-long::before { + content: "\f177"; } + +.fa-long-arrow-left::before { + content: "\f177"; } + +.fa-plug-circle-check::before { + content: "\e55c"; } + +.fa-street-view::before { + content: "\f21d"; } + +.fa-franc-sign::before { + content: "\e18f"; } + +.fa-volume-off::before { + content: "\f026"; } + +.fa-hands-asl-interpreting::before { + content: "\f2a3"; } + +.fa-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-asl-interpreting::before { + content: "\f2a3"; } + +.fa-hands-american-sign-language-interpreting::before { + content: "\f2a3"; } + +.fa-gear::before { + content: "\f013"; } + +.fa-cog::before { + content: "\f013"; } + +.fa-droplet-slash::before { + content: "\f5c7"; } + +.fa-tint-slash::before { + content: "\f5c7"; } + +.fa-mosque::before { + content: "\f678"; } + +.fa-mosquito::before { + content: "\e52b"; } + +.fa-star-of-david::before { + content: "\f69a"; } + +.fa-person-military-rifle::before { + content: "\e54b"; } + +.fa-cart-shopping::before { + content: "\f07a"; } + +.fa-shopping-cart::before { + content: "\f07a"; } + +.fa-vials::before { + content: "\f493"; } + +.fa-plug-circle-plus::before { + content: "\e55f"; } + +.fa-place-of-worship::before { + content: "\f67f"; } + +.fa-grip-vertical::before { + content: "\f58e"; } + +.fa-arrow-turn-up::before { + content: "\f148"; } + +.fa-level-up::before { + content: "\f148"; } + +.fa-u::before { + content: "\55"; } + +.fa-square-root-variable::before { + content: "\f698"; } + +.fa-square-root-alt::before { + content: "\f698"; } + +.fa-clock::before { + content: "\f017"; } + +.fa-clock-four::before { + content: "\f017"; } + +.fa-backward-step::before { + content: "\f048"; } + +.fa-step-backward::before { + content: "\f048"; } + +.fa-pallet::before { + content: "\f482"; } + +.fa-faucet::before { + content: "\e005"; } + +.fa-baseball-bat-ball::before { + content: "\f432"; } + +.fa-s::before { + content: "\53"; } + +.fa-timeline::before { + content: "\e29c"; } + +.fa-keyboard::before { + content: "\f11c"; } + +.fa-caret-down::before { + content: "\f0d7"; } + +.fa-house-chimney-medical::before { + content: "\f7f2"; } + +.fa-clinic-medical::before { + content: "\f7f2"; } + +.fa-temperature-three-quarters::before { + content: "\f2c8"; } + +.fa-temperature-3::before { + content: "\f2c8"; } + +.fa-thermometer-3::before { + content: "\f2c8"; } + +.fa-thermometer-three-quarters::before { + content: "\f2c8"; } + +.fa-mobile-screen::before { + content: "\f3cf"; } + +.fa-mobile-android-alt::before { + content: "\f3cf"; } + +.fa-plane-up::before { + content: "\e22d"; } + +.fa-piggy-bank::before { + content: "\f4d3"; } + +.fa-battery-half::before { + content: "\f242"; } + +.fa-battery-3::before { + content: "\f242"; } + +.fa-mountain-city::before { + content: "\e52e"; } + +.fa-coins::before { + content: "\f51e"; } + +.fa-khanda::before { + content: "\f66d"; } + +.fa-sliders::before { + content: "\f1de"; } + +.fa-sliders-h::before { + content: "\f1de"; } + +.fa-folder-tree::before { + content: "\f802"; } + +.fa-network-wired::before { + content: "\f6ff"; } + +.fa-map-pin::before { + content: "\f276"; } + +.fa-hamsa::before { + content: "\f665"; } + +.fa-cent-sign::before { + content: "\e3f5"; } + +.fa-flask::before { + content: "\f0c3"; } + +.fa-person-pregnant::before { + content: "\e31e"; } + +.fa-wand-sparkles::before { + content: "\f72b"; } + +.fa-ellipsis-vertical::before { + content: "\f142"; } + +.fa-ellipsis-v::before { + content: "\f142"; } + +.fa-ticket::before { + content: "\f145"; } + +.fa-power-off::before { + content: "\f011"; } + +.fa-right-long::before { + content: "\f30b"; } + +.fa-long-arrow-alt-right::before { + content: "\f30b"; } + +.fa-flag-usa::before { + content: "\f74d"; } + +.fa-laptop-file::before { + content: "\e51d"; } + +.fa-tty::before { + content: "\f1e4"; } + +.fa-teletype::before { + content: "\f1e4"; } + +.fa-diagram-next::before { + content: "\e476"; } + +.fa-person-rifle::before { + content: "\e54e"; } + +.fa-house-medical-circle-exclamation::before { + content: "\e512"; } + +.fa-closed-captioning::before { + content: "\f20a"; } + +.fa-person-hiking::before { + content: "\f6ec"; } + +.fa-hiking::before { + content: "\f6ec"; } + +.fa-venus-double::before { + content: "\f226"; } + +.fa-images::before { + content: "\f302"; } + +.fa-calculator::before { + content: "\f1ec"; } + +.fa-people-pulling::before { + content: "\e535"; } + +.fa-n::before { + content: "\4e"; } + +.fa-cable-car::before { + content: "\f7da"; } + +.fa-tram::before { + content: "\f7da"; } + +.fa-cloud-rain::before { + content: "\f73d"; } + +.fa-building-circle-xmark::before { + content: "\e4d4"; } + +.fa-ship::before { + content: "\f21a"; } + +.fa-arrows-down-to-line::before { + content: "\e4b8"; } + +.fa-download::before { + content: "\f019"; } + +.fa-face-grin::before { + content: "\f580"; } + +.fa-grin::before { + content: "\f580"; } + +.fa-delete-left::before { + content: "\f55a"; } + +.fa-backspace::before { + content: "\f55a"; } + +.fa-eye-dropper::before { + content: "\f1fb"; } + +.fa-eye-dropper-empty::before { + content: "\f1fb"; } + +.fa-eyedropper::before { + content: "\f1fb"; } + +.fa-file-circle-check::before { + content: "\e5a0"; } + +.fa-forward::before { + content: "\f04e"; } + +.fa-mobile::before { + content: "\f3ce"; } + +.fa-mobile-android::before { + content: "\f3ce"; } + +.fa-mobile-phone::before { + content: "\f3ce"; } + +.fa-face-meh::before { + content: "\f11a"; } + +.fa-meh::before { + content: "\f11a"; } + +.fa-align-center::before { + content: "\f037"; } + +.fa-book-skull::before { + content: "\f6b7"; } + +.fa-book-dead::before { + content: "\f6b7"; } + +.fa-id-card::before { + content: "\f2c2"; } + +.fa-drivers-license::before { + content: "\f2c2"; } + +.fa-outdent::before { + content: "\f03b"; } + +.fa-dedent::before { + content: "\f03b"; } + +.fa-heart-circle-exclamation::before { + content: "\e4fe"; } + +.fa-house::before { + content: "\f015"; } + +.fa-home::before { + content: "\f015"; } + +.fa-home-alt::before { + content: "\f015"; } + +.fa-home-lg-alt::before { + content: "\f015"; } + +.fa-calendar-week::before { + content: "\f784"; } + +.fa-laptop-medical::before { + content: "\f812"; } + +.fa-b::before { + content: "\42"; } + +.fa-file-medical::before { + content: "\f477"; } + +.fa-dice-one::before { + content: "\f525"; } + +.fa-kiwi-bird::before { + content: "\f535"; } + +.fa-arrow-right-arrow-left::before { + content: "\f0ec"; } + +.fa-exchange::before { + content: "\f0ec"; } + +.fa-rotate-right::before { + content: "\f2f9"; } + +.fa-redo-alt::before { + content: "\f2f9"; } + +.fa-rotate-forward::before { + content: "\f2f9"; } + +.fa-utensils::before { + content: "\f2e7"; } + +.fa-cutlery::before { + content: "\f2e7"; } + +.fa-arrow-up-wide-short::before { + content: "\f161"; } + +.fa-sort-amount-up::before { + content: "\f161"; } + +.fa-mill-sign::before { + content: "\e1ed"; } + +.fa-bowl-rice::before { + content: "\e2eb"; } + +.fa-skull::before { + content: "\f54c"; } + +.fa-tower-broadcast::before { + content: "\f519"; } + +.fa-broadcast-tower::before { + content: "\f519"; } + +.fa-truck-pickup::before { + content: "\f63c"; } + +.fa-up-long::before { + content: "\f30c"; } + +.fa-long-arrow-alt-up::before { + content: "\f30c"; } + +.fa-stop::before { + content: "\f04d"; } + +.fa-code-merge::before { + content: "\f387"; } + +.fa-upload::before { + content: "\f093"; } + +.fa-hurricane::before { + content: "\f751"; } + +.fa-mound::before { + content: "\e52d"; } + +.fa-toilet-portable::before { + content: "\e583"; } + +.fa-compact-disc::before { + content: "\f51f"; } + +.fa-file-arrow-down::before { + content: "\f56d"; } + +.fa-file-download::before { + content: "\f56d"; } + +.fa-caravan::before { + content: "\f8ff"; } + +.fa-shield-cat::before { + content: "\e572"; } + +.fa-bolt::before { + content: "\f0e7"; } + +.fa-zap::before { + content: "\f0e7"; } + +.fa-glass-water::before { + content: "\e4f4"; } + +.fa-oil-well::before { + content: "\e532"; } + +.fa-vault::before { + content: "\e2c5"; } + +.fa-mars::before { + content: "\f222"; } + +.fa-toilet::before { + content: "\f7d8"; } + +.fa-plane-circle-xmark::before { + content: "\e557"; } + +.fa-yen-sign::before { + content: "\f157"; } + +.fa-cny::before { + content: "\f157"; } + +.fa-jpy::before { + content: "\f157"; } + +.fa-rmb::before { + content: "\f157"; } + +.fa-yen::before { + content: "\f157"; } + +.fa-ruble-sign::before { + content: "\f158"; } + +.fa-rouble::before { + content: "\f158"; } + +.fa-rub::before { + content: "\f158"; } + +.fa-ruble::before { + content: "\f158"; } + +.fa-sun::before { + content: "\f185"; } + +.fa-guitar::before { + content: "\f7a6"; } + +.fa-face-laugh-wink::before { + content: "\f59c"; } + +.fa-laugh-wink::before { + content: "\f59c"; } + +.fa-horse-head::before { + content: "\f7ab"; } + +.fa-bore-hole::before { + content: "\e4c3"; } + +.fa-industry::before { + content: "\f275"; } + +.fa-circle-down::before { + content: "\f358"; } + +.fa-arrow-alt-circle-down::before { + content: "\f358"; } + +.fa-arrows-turn-to-dots::before { + content: "\e4c1"; } + +.fa-florin-sign::before { + content: "\e184"; } + +.fa-arrow-down-short-wide::before { + content: "\f884"; } + +.fa-sort-amount-desc::before { + content: "\f884"; } + +.fa-sort-amount-down-alt::before { + content: "\f884"; } + +.fa-less-than::before { + content: "\3c"; } + +.fa-angle-down::before { + content: "\f107"; } + +.fa-car-tunnel::before { + content: "\e4de"; } + +.fa-head-side-cough::before { + content: "\e061"; } + +.fa-grip-lines::before { + content: "\f7a4"; } + +.fa-thumbs-down::before { + content: "\f165"; } + +.fa-user-lock::before { + content: "\f502"; } + +.fa-arrow-right-long::before { + content: "\f178"; } + +.fa-long-arrow-right::before { + content: "\f178"; } + +.fa-anchor-circle-xmark::before { + content: "\e4ac"; } + +.fa-ellipsis::before { + content: "\f141"; } + +.fa-ellipsis-h::before { + content: "\f141"; } + +.fa-chess-pawn::before { + content: "\f443"; } + +.fa-kit-medical::before { + content: "\f479"; } + +.fa-first-aid::before { + content: "\f479"; } + +.fa-person-through-window::before { + content: "\e5a9"; } + +.fa-toolbox::before { + content: "\f552"; } + +.fa-hands-holding-circle::before { + content: "\e4fb"; } + +.fa-bug::before { + content: "\f188"; } + +.fa-credit-card::before { + content: "\f09d"; } + +.fa-credit-card-alt::before { + content: "\f09d"; } + +.fa-car::before { + content: "\f1b9"; } + +.fa-automobile::before { + content: "\f1b9"; } + +.fa-hand-holding-hand::before { + content: "\e4f7"; } + +.fa-book-open-reader::before { + content: "\f5da"; } + +.fa-book-reader::before { + content: "\f5da"; } + +.fa-mountain-sun::before { + content: "\e52f"; } + +.fa-arrows-left-right-to-line::before { + content: "\e4ba"; } + +.fa-dice-d20::before { + content: "\f6cf"; } + +.fa-truck-droplet::before { + content: "\e58c"; } + +.fa-file-circle-xmark::before { + content: "\e5a1"; } + +.fa-temperature-arrow-up::before { + content: "\e040"; } + +.fa-temperature-up::before { + content: "\e040"; } + +.fa-medal::before { + content: "\f5a2"; } + +.fa-bed::before { + content: "\f236"; } + +.fa-square-h::before { + content: "\f0fd"; } + +.fa-h-square::before { + content: "\f0fd"; } + +.fa-podcast::before { + content: "\f2ce"; } + +.fa-temperature-full::before { + content: "\f2c7"; } + +.fa-temperature-4::before { + content: "\f2c7"; } + +.fa-thermometer-4::before { + content: "\f2c7"; } + +.fa-thermometer-full::before { + content: "\f2c7"; } + +.fa-bell::before { + content: "\f0f3"; } + +.fa-superscript::before { + content: "\f12b"; } + +.fa-plug-circle-xmark::before { + content: "\e560"; } + +.fa-star-of-life::before { + content: "\f621"; } + +.fa-phone-slash::before { + content: "\f3dd"; } + +.fa-paint-roller::before { + content: "\f5aa"; } + +.fa-handshake-angle::before { + content: "\f4c4"; } + +.fa-hands-helping::before { + content: "\f4c4"; } + +.fa-location-dot::before { + content: "\f3c5"; } + +.fa-map-marker-alt::before { + content: "\f3c5"; } + +.fa-file::before { + content: "\f15b"; } + +.fa-greater-than::before { + content: "\3e"; } + +.fa-person-swimming::before { + content: "\f5c4"; } + +.fa-swimmer::before { + content: "\f5c4"; } + +.fa-arrow-down::before { + content: "\f063"; } + +.fa-droplet::before { + content: "\f043"; } + +.fa-tint::before { + content: "\f043"; } + +.fa-eraser::before { + content: "\f12d"; } + +.fa-earth-americas::before { + content: "\f57d"; } + +.fa-earth::before { + content: "\f57d"; } + +.fa-earth-america::before { + content: "\f57d"; } + +.fa-globe-americas::before { + content: "\f57d"; } + +.fa-person-burst::before { + content: "\e53b"; } + +.fa-dove::before { + content: "\f4ba"; } + +.fa-battery-empty::before { + content: "\f244"; } + +.fa-battery-0::before { + content: "\f244"; } + +.fa-socks::before { + content: "\f696"; } + +.fa-inbox::before { + content: "\f01c"; } + +.fa-section::before { + content: "\e447"; } + +.fa-gauge-high::before { + content: "\f625"; } + +.fa-tachometer-alt::before { + content: "\f625"; } + +.fa-tachometer-alt-fast::before { + content: "\f625"; } + +.fa-envelope-open-text::before { + content: "\f658"; } + +.fa-hospital::before { + content: "\f0f8"; } + +.fa-hospital-alt::before { + content: "\f0f8"; } + +.fa-hospital-wide::before { + content: "\f0f8"; } + +.fa-wine-bottle::before { + content: "\f72f"; } + +.fa-chess-rook::before { + content: "\f447"; } + +.fa-bars-staggered::before { + content: "\f550"; } + +.fa-reorder::before { + content: "\f550"; } + +.fa-stream::before { + content: "\f550"; } + +.fa-dharmachakra::before { + content: "\f655"; } + +.fa-hotdog::before { + content: "\f80f"; } + +.fa-person-walking-with-cane::before { + content: "\f29d"; } + +.fa-blind::before { + content: "\f29d"; } + +.fa-drum::before { + content: "\f569"; } + +.fa-ice-cream::before { + content: "\f810"; } + +.fa-heart-circle-bolt::before { + content: "\e4fc"; } + +.fa-fax::before { + content: "\f1ac"; } + +.fa-paragraph::before { + content: "\f1dd"; } + +.fa-check-to-slot::before { + content: "\f772"; } + +.fa-vote-yea::before { + content: "\f772"; } + +.fa-star-half::before { + content: "\f089"; } + +.fa-boxes-stacked::before { + content: "\f468"; } + +.fa-boxes::before { + content: "\f468"; } + +.fa-boxes-alt::before { + content: "\f468"; } + +.fa-link::before { + content: "\f0c1"; } + +.fa-chain::before { + content: "\f0c1"; } + +.fa-ear-listen::before { + content: "\f2a2"; } + +.fa-assistive-listening-systems::before { + content: "\f2a2"; } + +.fa-tree-city::before { + content: "\e587"; } + +.fa-play::before { + content: "\f04b"; } + +.fa-font::before { + content: "\f031"; } + +.fa-table-cells-row-lock::before { + content: "\e67a"; } + +.fa-rupiah-sign::before { + content: "\e23d"; } + +.fa-magnifying-glass::before { + content: "\f002"; } + +.fa-search::before { + content: "\f002"; } + +.fa-table-tennis-paddle-ball::before { + content: "\f45d"; } + +.fa-ping-pong-paddle-ball::before { + content: "\f45d"; } + +.fa-table-tennis::before { + content: "\f45d"; } + +.fa-person-dots-from-line::before { + content: "\f470"; } + +.fa-diagnoses::before { + content: "\f470"; } + +.fa-trash-can-arrow-up::before { + content: "\f82a"; } + +.fa-trash-restore-alt::before { + content: "\f82a"; } + +.fa-naira-sign::before { + content: "\e1f6"; } + +.fa-cart-arrow-down::before { + content: "\f218"; } + +.fa-walkie-talkie::before { + content: "\f8ef"; } + +.fa-file-pen::before { + content: "\f31c"; } + +.fa-file-edit::before { + content: "\f31c"; } + +.fa-receipt::before { + content: "\f543"; } + +.fa-square-pen::before { + content: "\f14b"; } + +.fa-pen-square::before { + content: "\f14b"; } + +.fa-pencil-square::before { + content: "\f14b"; } + +.fa-suitcase-rolling::before { + content: "\f5c1"; } + +.fa-person-circle-exclamation::before { + content: "\e53f"; } + +.fa-chevron-down::before { + content: "\f078"; } + +.fa-battery-full::before { + content: "\f240"; } + +.fa-battery::before { + content: "\f240"; } + +.fa-battery-5::before { + content: "\f240"; } + +.fa-skull-crossbones::before { + content: "\f714"; } + +.fa-code-compare::before { + content: "\e13a"; } + +.fa-list-ul::before { + content: "\f0ca"; } + +.fa-list-dots::before { + content: "\f0ca"; } + +.fa-school-lock::before { + content: "\e56f"; } + +.fa-tower-cell::before { + content: "\e585"; } + +.fa-down-long::before { + content: "\f309"; } + +.fa-long-arrow-alt-down::before { + content: "\f309"; } + +.fa-ranking-star::before { + content: "\e561"; } + +.fa-chess-king::before { + content: "\f43f"; } + +.fa-person-harassing::before { + content: "\e549"; } + +.fa-brazilian-real-sign::before { + content: "\e46c"; } + +.fa-landmark-dome::before { + content: "\f752"; } + +.fa-landmark-alt::before { + content: "\f752"; } + +.fa-arrow-up::before { + content: "\f062"; } + +.fa-tv::before { + content: "\f26c"; } + +.fa-television::before { + content: "\f26c"; } + +.fa-tv-alt::before { + content: "\f26c"; } + +.fa-shrimp::before { + content: "\e448"; } + +.fa-list-check::before { + content: "\f0ae"; } + +.fa-tasks::before { + content: "\f0ae"; } + +.fa-jug-detergent::before { + content: "\e519"; } + +.fa-circle-user::before { + content: "\f2bd"; } + +.fa-user-circle::before { + content: "\f2bd"; } + +.fa-user-shield::before { + content: "\f505"; } + +.fa-wind::before { + content: "\f72e"; } + +.fa-car-burst::before { + content: "\f5e1"; } + +.fa-car-crash::before { + content: "\f5e1"; } + +.fa-y::before { + content: "\59"; } + +.fa-person-snowboarding::before { + content: "\f7ce"; } + +.fa-snowboarding::before { + content: "\f7ce"; } + +.fa-truck-fast::before { + content: "\f48b"; } + +.fa-shipping-fast::before { + content: "\f48b"; } + +.fa-fish::before { + content: "\f578"; } + +.fa-user-graduate::before { + content: "\f501"; } + +.fa-circle-half-stroke::before { + content: "\f042"; } + +.fa-adjust::before { + content: "\f042"; } + +.fa-clapperboard::before { + content: "\e131"; } + +.fa-circle-radiation::before { + content: "\f7ba"; } + +.fa-radiation-alt::before { + content: "\f7ba"; } + +.fa-baseball::before { + content: "\f433"; } + +.fa-baseball-ball::before { + content: "\f433"; } + +.fa-jet-fighter-up::before { + content: "\e518"; } + +.fa-diagram-project::before { + content: "\f542"; } + +.fa-project-diagram::before { + content: "\f542"; } + +.fa-copy::before { + content: "\f0c5"; } + +.fa-volume-xmark::before { + content: "\f6a9"; } + +.fa-volume-mute::before { + content: "\f6a9"; } + +.fa-volume-times::before { + content: "\f6a9"; } + +.fa-hand-sparkles::before { + content: "\e05d"; } + +.fa-grip::before { + content: "\f58d"; } + +.fa-grip-horizontal::before { + content: "\f58d"; } + +.fa-share-from-square::before { + content: "\f14d"; } + +.fa-share-square::before { + content: "\f14d"; } + +.fa-child-combatant::before { + content: "\e4e0"; } + +.fa-child-rifle::before { + content: "\e4e0"; } + +.fa-gun::before { + content: "\e19b"; } + +.fa-square-phone::before { + content: "\f098"; } + +.fa-phone-square::before { + content: "\f098"; } + +.fa-plus::before { + content: "\2b"; } + +.fa-add::before { + content: "\2b"; } + +.fa-expand::before { + content: "\f065"; } + +.fa-computer::before { + content: "\e4e5"; } + +.fa-xmark::before { + content: "\f00d"; } + +.fa-close::before { + content: "\f00d"; } + +.fa-multiply::before { + content: "\f00d"; } + +.fa-remove::before { + content: "\f00d"; } + +.fa-times::before { + content: "\f00d"; } + +.fa-arrows-up-down-left-right::before { + content: "\f047"; } + +.fa-arrows::before { + content: "\f047"; } + +.fa-chalkboard-user::before { + content: "\f51c"; } + +.fa-chalkboard-teacher::before { + content: "\f51c"; } + +.fa-peso-sign::before { + content: "\e222"; } + +.fa-building-shield::before { + content: "\e4d8"; } + +.fa-baby::before { + content: "\f77c"; } + +.fa-users-line::before { + content: "\e592"; } + +.fa-quote-left::before { + content: "\f10d"; } + +.fa-quote-left-alt::before { + content: "\f10d"; } + +.fa-tractor::before { + content: "\f722"; } + +.fa-trash-arrow-up::before { + content: "\f829"; } + +.fa-trash-restore::before { + content: "\f829"; } + +.fa-arrow-down-up-lock::before { + content: "\e4b0"; } + +.fa-lines-leaning::before { + content: "\e51e"; } + +.fa-ruler-combined::before { + content: "\f546"; } + +.fa-copyright::before { + content: "\f1f9"; } + +.fa-equals::before { + content: "\3d"; } + +.fa-blender::before { + content: "\f517"; } + +.fa-teeth::before { + content: "\f62e"; } + +.fa-shekel-sign::before { + content: "\f20b"; } + +.fa-ils::before { + content: "\f20b"; } + +.fa-shekel::before { + content: "\f20b"; } + +.fa-sheqel::before { + content: "\f20b"; } + +.fa-sheqel-sign::before { + content: "\f20b"; } + +.fa-map::before { + content: "\f279"; } + +.fa-rocket::before { + content: "\f135"; } + +.fa-photo-film::before { + content: "\f87c"; } + +.fa-photo-video::before { + content: "\f87c"; } + +.fa-folder-minus::before { + content: "\f65d"; } + +.fa-store::before { + content: "\f54e"; } + +.fa-arrow-trend-up::before { + content: "\e098"; } + +.fa-plug-circle-minus::before { + content: "\e55e"; } + +.fa-sign-hanging::before { + content: "\f4d9"; } + +.fa-sign::before { + content: "\f4d9"; } + +.fa-bezier-curve::before { + content: "\f55b"; } + +.fa-bell-slash::before { + content: "\f1f6"; } + +.fa-tablet::before { + content: "\f3fb"; } + +.fa-tablet-android::before { + content: "\f3fb"; } + +.fa-school-flag::before { + content: "\e56e"; } + +.fa-fill::before { + content: "\f575"; } + +.fa-angle-up::before { + content: "\f106"; } + +.fa-drumstick-bite::before { + content: "\f6d7"; } + +.fa-holly-berry::before { + content: "\f7aa"; } + +.fa-chevron-left::before { + content: "\f053"; } + +.fa-bacteria::before { + content: "\e059"; } + +.fa-hand-lizard::before { + content: "\f258"; } + +.fa-notdef::before { + content: "\e1fe"; } + +.fa-disease::before { + content: "\f7fa"; } + +.fa-briefcase-medical::before { + content: "\f469"; } + +.fa-genderless::before { + content: "\f22d"; } + +.fa-chevron-right::before { + content: "\f054"; } + +.fa-retweet::before { + content: "\f079"; } + +.fa-car-rear::before { + content: "\f5de"; } + +.fa-car-alt::before { + content: "\f5de"; } + +.fa-pump-soap::before { + content: "\e06b"; } + +.fa-video-slash::before { + content: "\f4e2"; } + +.fa-battery-quarter::before { + content: "\f243"; } + +.fa-battery-2::before { + content: "\f243"; } + +.fa-radio::before { + content: "\f8d7"; } + +.fa-baby-carriage::before { + content: "\f77d"; } + +.fa-carriage-baby::before { + content: "\f77d"; } + +.fa-traffic-light::before { + content: "\f637"; } + +.fa-thermometer::before { + content: "\f491"; } + +.fa-vr-cardboard::before { + content: "\f729"; } + +.fa-hand-middle-finger::before { + content: "\f806"; } + +.fa-percent::before { + content: "\25"; } + +.fa-percentage::before { + content: "\25"; } + +.fa-truck-moving::before { + content: "\f4df"; } + +.fa-glass-water-droplet::before { + content: "\e4f5"; } + +.fa-display::before { + content: "\e163"; } + +.fa-face-smile::before { + content: "\f118"; } + +.fa-smile::before { + content: "\f118"; } + +.fa-thumbtack::before { + content: "\f08d"; } + +.fa-thumb-tack::before { + content: "\f08d"; } + +.fa-trophy::before { + content: "\f091"; } + +.fa-person-praying::before { + content: "\f683"; } + +.fa-pray::before { + content: "\f683"; } + +.fa-hammer::before { + content: "\f6e3"; } + +.fa-hand-peace::before { + content: "\f25b"; } + +.fa-rotate::before { + content: "\f2f1"; } + +.fa-sync-alt::before { + content: "\f2f1"; } + +.fa-spinner::before { + content: "\f110"; } + +.fa-robot::before { + content: "\f544"; } + +.fa-peace::before { + content: "\f67c"; } + +.fa-gears::before { + content: "\f085"; } + +.fa-cogs::before { + content: "\f085"; } + +.fa-warehouse::before { + content: "\f494"; } + +.fa-arrow-up-right-dots::before { + content: "\e4b7"; } + +.fa-splotch::before { + content: "\f5bc"; } + +.fa-face-grin-hearts::before { + content: "\f584"; } + +.fa-grin-hearts::before { + content: "\f584"; } + +.fa-dice-four::before { + content: "\f524"; } + +.fa-sim-card::before { + content: "\f7c4"; } + +.fa-transgender::before { + content: "\f225"; } + +.fa-transgender-alt::before { + content: "\f225"; } + +.fa-mercury::before { + content: "\f223"; } + +.fa-arrow-turn-down::before { + content: "\f149"; } + +.fa-level-down::before { + content: "\f149"; } + +.fa-person-falling-burst::before { + content: "\e547"; } + +.fa-award::before { + content: "\f559"; } + +.fa-ticket-simple::before { + content: "\f3ff"; } + +.fa-ticket-alt::before { + content: "\f3ff"; } + +.fa-building::before { + content: "\f1ad"; } + +.fa-angles-left::before { + content: "\f100"; } + +.fa-angle-double-left::before { + content: "\f100"; } + +.fa-qrcode::before { + content: "\f029"; } + +.fa-clock-rotate-left::before { + content: "\f1da"; } + +.fa-history::before { + content: "\f1da"; } + +.fa-face-grin-beam-sweat::before { + content: "\f583"; } + +.fa-grin-beam-sweat::before { + content: "\f583"; } + +.fa-file-export::before { + content: "\f56e"; } + +.fa-arrow-right-from-file::before { + content: "\f56e"; } + +.fa-shield::before { + content: "\f132"; } + +.fa-shield-blank::before { + content: "\f132"; } + +.fa-arrow-up-short-wide::before { + content: "\f885"; } + +.fa-sort-amount-up-alt::before { + content: "\f885"; } + +.fa-house-medical::before { + content: "\e3b2"; } + +.fa-golf-ball-tee::before { + content: "\f450"; } + +.fa-golf-ball::before { + content: "\f450"; } + +.fa-circle-chevron-left::before { + content: "\f137"; } + +.fa-chevron-circle-left::before { + content: "\f137"; } + +.fa-house-chimney-window::before { + content: "\e00d"; } + +.fa-pen-nib::before { + content: "\f5ad"; } + +.fa-tent-arrow-turn-left::before { + content: "\e580"; } + +.fa-tents::before { + content: "\e582"; } + +.fa-wand-magic::before { + content: "\f0d0"; } + +.fa-magic::before { + content: "\f0d0"; } + +.fa-dog::before { + content: "\f6d3"; } + +.fa-carrot::before { + content: "\f787"; } + +.fa-moon::before { + content: "\f186"; } + +.fa-wine-glass-empty::before { + content: "\f5ce"; } + +.fa-wine-glass-alt::before { + content: "\f5ce"; } + +.fa-cheese::before { + content: "\f7ef"; } + +.fa-yin-yang::before { + content: "\f6ad"; } + +.fa-music::before { + content: "\f001"; } + +.fa-code-commit::before { + content: "\f386"; } + +.fa-temperature-low::before { + content: "\f76b"; } + +.fa-person-biking::before { + content: "\f84a"; } + +.fa-biking::before { + content: "\f84a"; } + +.fa-broom::before { + content: "\f51a"; } + +.fa-shield-heart::before { + content: "\e574"; } + +.fa-gopuram::before { + content: "\f664"; } + +.fa-earth-oceania::before { + content: "\e47b"; } + +.fa-globe-oceania::before { + content: "\e47b"; } + +.fa-square-xmark::before { + content: "\f2d3"; } + +.fa-times-square::before { + content: "\f2d3"; } + +.fa-xmark-square::before { + content: "\f2d3"; } + +.fa-hashtag::before { + content: "\23"; } + +.fa-up-right-and-down-left-from-center::before { + content: "\f424"; } + +.fa-expand-alt::before { + content: "\f424"; } + +.fa-oil-can::before { + content: "\f613"; } + +.fa-t::before { + content: "\54"; } + +.fa-hippo::before { + content: "\f6ed"; } + +.fa-chart-column::before { + content: "\e0e3"; } + +.fa-infinity::before { + content: "\f534"; } + +.fa-vial-circle-check::before { + content: "\e596"; } + +.fa-person-arrow-down-to-line::before { + content: "\e538"; } + +.fa-voicemail::before { + content: "\f897"; } + +.fa-fan::before { + content: "\f863"; } + +.fa-person-walking-luggage::before { + content: "\e554"; } + +.fa-up-down::before { + content: "\f338"; } + +.fa-arrows-alt-v::before { + content: "\f338"; } + +.fa-cloud-moon-rain::before { + content: "\f73c"; } + +.fa-calendar::before { + content: "\f133"; } + +.fa-trailer::before { + content: "\e041"; } + +.fa-bahai::before { + content: "\f666"; } + +.fa-haykal::before { + content: "\f666"; } + +.fa-sd-card::before { + content: "\f7c2"; } + +.fa-dragon::before { + content: "\f6d5"; } + +.fa-shoe-prints::before { + content: "\f54b"; } + +.fa-circle-plus::before { + content: "\f055"; } + +.fa-plus-circle::before { + content: "\f055"; } + +.fa-face-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-grin-tongue-wink::before { + content: "\f58b"; } + +.fa-hand-holding::before { + content: "\f4bd"; } + +.fa-plug-circle-exclamation::before { + content: "\e55d"; } + +.fa-link-slash::before { + content: "\f127"; } + +.fa-chain-broken::before { + content: "\f127"; } + +.fa-chain-slash::before { + content: "\f127"; } + +.fa-unlink::before { + content: "\f127"; } + +.fa-clone::before { + content: "\f24d"; } + +.fa-person-walking-arrow-loop-left::before { + content: "\e551"; } + +.fa-arrow-up-z-a::before { + content: "\f882"; } + +.fa-sort-alpha-up-alt::before { + content: "\f882"; } + +.fa-fire-flame-curved::before { + content: "\f7e4"; } + +.fa-fire-alt::before { + content: "\f7e4"; } + +.fa-tornado::before { + content: "\f76f"; } + +.fa-file-circle-plus::before { + content: "\e494"; } + +.fa-book-quran::before { + content: "\f687"; } + +.fa-quran::before { + content: "\f687"; } + +.fa-anchor::before { + content: "\f13d"; } + +.fa-border-all::before { + content: "\f84c"; } + +.fa-face-angry::before { + content: "\f556"; } + +.fa-angry::before { + content: "\f556"; } + +.fa-cookie-bite::before { + content: "\f564"; } + +.fa-arrow-trend-down::before { + content: "\e097"; } + +.fa-rss::before { + content: "\f09e"; } + +.fa-feed::before { + content: "\f09e"; } + +.fa-draw-polygon::before { + content: "\f5ee"; } + +.fa-scale-balanced::before { + content: "\f24e"; } + +.fa-balance-scale::before { + content: "\f24e"; } + +.fa-gauge-simple-high::before { + content: "\f62a"; } + +.fa-tachometer::before { + content: "\f62a"; } + +.fa-tachometer-fast::before { + content: "\f62a"; } + +.fa-shower::before { + content: "\f2cc"; } + +.fa-desktop::before { + content: "\f390"; } + +.fa-desktop-alt::before { + content: "\f390"; } + +.fa-m::before { + content: "\4d"; } + +.fa-table-list::before { + content: "\f00b"; } + +.fa-th-list::before { + content: "\f00b"; } + +.fa-comment-sms::before { + content: "\f7cd"; } + +.fa-sms::before { + content: "\f7cd"; } + +.fa-book::before { + content: "\f02d"; } + +.fa-user-plus::before { + content: "\f234"; } + +.fa-check::before { + content: "\f00c"; } + +.fa-battery-three-quarters::before { + content: "\f241"; } + +.fa-battery-4::before { + content: "\f241"; } + +.fa-house-circle-check::before { + content: "\e509"; } + +.fa-angle-left::before { + content: "\f104"; } + +.fa-diagram-successor::before { + content: "\e47a"; } + +.fa-truck-arrow-right::before { + content: "\e58b"; } + +.fa-arrows-split-up-and-left::before { + content: "\e4bc"; } + +.fa-hand-fist::before { + content: "\f6de"; } + +.fa-fist-raised::before { + content: "\f6de"; } + +.fa-cloud-moon::before { + content: "\f6c3"; } + +.fa-briefcase::before { + content: "\f0b1"; } + +.fa-person-falling::before { + content: "\e546"; } + +.fa-image-portrait::before { + content: "\f3e0"; } + +.fa-portrait::before { + content: "\f3e0"; } + +.fa-user-tag::before { + content: "\f507"; } + +.fa-rug::before { + content: "\e569"; } + +.fa-earth-europe::before { + content: "\f7a2"; } + +.fa-globe-europe::before { + content: "\f7a2"; } + +.fa-cart-flatbed-suitcase::before { + content: "\f59d"; } + +.fa-luggage-cart::before { + content: "\f59d"; } + +.fa-rectangle-xmark::before { + content: "\f410"; } + +.fa-rectangle-times::before { + content: "\f410"; } + +.fa-times-rectangle::before { + content: "\f410"; } + +.fa-window-close::before { + content: "\f410"; } + +.fa-baht-sign::before { + content: "\e0ac"; } + +.fa-book-open::before { + content: "\f518"; } + +.fa-book-journal-whills::before { + content: "\f66a"; } + +.fa-journal-whills::before { + content: "\f66a"; } + +.fa-handcuffs::before { + content: "\e4f8"; } + +.fa-triangle-exclamation::before { + content: "\f071"; } + +.fa-exclamation-triangle::before { + content: "\f071"; } + +.fa-warning::before { + content: "\f071"; } + +.fa-database::before { + content: "\f1c0"; } + +.fa-share::before { + content: "\f064"; } + +.fa-mail-forward::before { + content: "\f064"; } + +.fa-bottle-droplet::before { + content: "\e4c4"; } + +.fa-mask-face::before { + content: "\e1d7"; } + +.fa-hill-rockslide::before { + content: "\e508"; } + +.fa-right-left::before { + content: "\f362"; } + +.fa-exchange-alt::before { + content: "\f362"; } + +.fa-paper-plane::before { + content: "\f1d8"; } + +.fa-road-circle-exclamation::before { + content: "\e565"; } + +.fa-dungeon::before { + content: "\f6d9"; } + +.fa-align-right::before { + content: "\f038"; } + +.fa-money-bill-1-wave::before { + content: "\f53b"; } + +.fa-money-bill-wave-alt::before { + content: "\f53b"; } + +.fa-life-ring::before { + content: "\f1cd"; } + +.fa-hands::before { + content: "\f2a7"; } + +.fa-sign-language::before { + content: "\f2a7"; } + +.fa-signing::before { + content: "\f2a7"; } + +.fa-calendar-day::before { + content: "\f783"; } + +.fa-water-ladder::before { + content: "\f5c5"; } + +.fa-ladder-water::before { + content: "\f5c5"; } + +.fa-swimming-pool::before { + content: "\f5c5"; } + +.fa-arrows-up-down::before { + content: "\f07d"; } + +.fa-arrows-v::before { + content: "\f07d"; } + +.fa-face-grimace::before { + content: "\f57f"; } + +.fa-grimace::before { + content: "\f57f"; } + +.fa-wheelchair-move::before { + content: "\e2ce"; } + +.fa-wheelchair-alt::before { + content: "\e2ce"; } + +.fa-turn-down::before { + content: "\f3be"; } + +.fa-level-down-alt::before { + content: "\f3be"; } + +.fa-person-walking-arrow-right::before { + content: "\e552"; } + +.fa-square-envelope::before { + content: "\f199"; } + +.fa-envelope-square::before { + content: "\f199"; } + +.fa-dice::before { + content: "\f522"; } + +.fa-bowling-ball::before { + content: "\f436"; } + +.fa-brain::before { + content: "\f5dc"; } + +.fa-bandage::before { + content: "\f462"; } + +.fa-band-aid::before { + content: "\f462"; } + +.fa-calendar-minus::before { + content: "\f272"; } + +.fa-circle-xmark::before { + content: "\f057"; } + +.fa-times-circle::before { + content: "\f057"; } + +.fa-xmark-circle::before { + content: "\f057"; } + +.fa-gifts::before { + content: "\f79c"; } + +.fa-hotel::before { + content: "\f594"; } + +.fa-earth-asia::before { + content: "\f57e"; } + +.fa-globe-asia::before { + content: "\f57e"; } + +.fa-id-card-clip::before { + content: "\f47f"; } + +.fa-id-card-alt::before { + content: "\f47f"; } + +.fa-magnifying-glass-plus::before { + content: "\f00e"; } + +.fa-search-plus::before { + content: "\f00e"; } + +.fa-thumbs-up::before { + content: "\f164"; } + +.fa-user-clock::before { + content: "\f4fd"; } + +.fa-hand-dots::before { + content: "\f461"; } + +.fa-allergies::before { + content: "\f461"; } + +.fa-file-invoice::before { + content: "\f570"; } + +.fa-window-minimize::before { + content: "\f2d1"; } + +.fa-mug-saucer::before { + content: "\f0f4"; } + +.fa-coffee::before { + content: "\f0f4"; } + +.fa-brush::before { + content: "\f55d"; } + +.fa-mask::before { + content: "\f6fa"; } + +.fa-magnifying-glass-minus::before { + content: "\f010"; } + +.fa-search-minus::before { + content: "\f010"; } + +.fa-ruler-vertical::before { + content: "\f548"; } + +.fa-user-large::before { + content: "\f406"; } + +.fa-user-alt::before { + content: "\f406"; } + +.fa-train-tram::before { + content: "\e5b4"; } + +.fa-user-nurse::before { + content: "\f82f"; } + +.fa-syringe::before { + content: "\f48e"; } + +.fa-cloud-sun::before { + content: "\f6c4"; } + +.fa-stopwatch-20::before { + content: "\e06f"; } + +.fa-square-full::before { + content: "\f45c"; } + +.fa-magnet::before { + content: "\f076"; } + +.fa-jar::before { + content: "\e516"; } + +.fa-note-sticky::before { + content: "\f249"; } + +.fa-sticky-note::before { + content: "\f249"; } + +.fa-bug-slash::before { + content: "\e490"; } + +.fa-arrow-up-from-water-pump::before { + content: "\e4b6"; } + +.fa-bone::before { + content: "\f5d7"; } + +.fa-user-injured::before { + content: "\f728"; } + +.fa-face-sad-tear::before { + content: "\f5b4"; } + +.fa-sad-tear::before { + content: "\f5b4"; } + +.fa-plane::before { + content: "\f072"; } + +.fa-tent-arrows-down::before { + content: "\e581"; } + +.fa-exclamation::before { + content: "\21"; } + +.fa-arrows-spin::before { + content: "\e4bb"; } + +.fa-print::before { + content: "\f02f"; } + +.fa-turkish-lira-sign::before { + content: "\e2bb"; } + +.fa-try::before { + content: "\e2bb"; } + +.fa-turkish-lira::before { + content: "\e2bb"; } + +.fa-dollar-sign::before { + content: "\24"; } + +.fa-dollar::before { + content: "\24"; } + +.fa-usd::before { + content: "\24"; } + +.fa-x::before { + content: "\58"; } + +.fa-magnifying-glass-dollar::before { + content: "\f688"; } + +.fa-search-dollar::before { + content: "\f688"; } + +.fa-users-gear::before { + content: "\f509"; } + +.fa-users-cog::before { + content: "\f509"; } + +.fa-person-military-pointing::before { + content: "\e54a"; } + +.fa-building-columns::before { + content: "\f19c"; } + +.fa-bank::before { + content: "\f19c"; } + +.fa-institution::before { + content: "\f19c"; } + +.fa-museum::before { + content: "\f19c"; } + +.fa-university::before { + content: "\f19c"; } + +.fa-umbrella::before { + content: "\f0e9"; } + +.fa-trowel::before { + content: "\e589"; } + +.fa-d::before { + content: "\44"; } + +.fa-stapler::before { + content: "\e5af"; } + +.fa-masks-theater::before { + content: "\f630"; } + +.fa-theater-masks::before { + content: "\f630"; } + +.fa-kip-sign::before { + content: "\e1c4"; } + +.fa-hand-point-left::before { + content: "\f0a5"; } + +.fa-handshake-simple::before { + content: "\f4c6"; } + +.fa-handshake-alt::before { + content: "\f4c6"; } + +.fa-jet-fighter::before { + content: "\f0fb"; } + +.fa-fighter-jet::before { + content: "\f0fb"; } + +.fa-square-share-nodes::before { + content: "\f1e1"; } + +.fa-share-alt-square::before { + content: "\f1e1"; } + +.fa-barcode::before { + content: "\f02a"; } + +.fa-plus-minus::before { + content: "\e43c"; } + +.fa-video::before { + content: "\f03d"; } + +.fa-video-camera::before { + content: "\f03d"; } + +.fa-graduation-cap::before { + content: "\f19d"; } + +.fa-mortar-board::before { + content: "\f19d"; } + +.fa-hand-holding-medical::before { + content: "\e05c"; } + +.fa-person-circle-check::before { + content: "\e53e"; } + +.fa-turn-up::before { + content: "\f3bf"; } + +.fa-level-up-alt::before { + content: "\f3bf"; } + +.sr-only, +.fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +.sr-only-focusable:not(:focus), +.fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } +:root, :host { + --fa-style-family-brands: 'Font Awesome 6 Brands'; + --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } + +@font-face { + font-family: 'Font Awesome 6 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +.fab, +.fa-brands { + font-weight: 400; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-cloudflare:before { + content: "\e07d"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-pixiv:before { + content: "\e640"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-guilded:before { + content: "\e07e"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-square-js:before { + content: "\f3b9"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-jxl:before { + content: "\e67b"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-unity:before { + content: "\e049"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-square-reddit:before { + content: "\f1a2"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-square-font-awesome:before { + content: "\e5ad"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-brave:before { + content: "\e63c"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-square-instagram:before { + content: "\e055"; } + +.fa-instagram-square:before { + content: "\e055"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-square-hacker-news:before { + content: "\f3af"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-threads:before { + content: "\e618"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-square-snapchat:before { + content: "\f2ad"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-square-font-awesome-stroke:before { + content: "\f35c"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-watchman-monitoring:before { + content: "\e087"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-square-viadeo:before { + content: "\f2aa"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-opensuse:before { + content: "\e62b"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-square-dribbble:before { + content: "\f397"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-node:before { + content: "\f419"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-debian:before { + content: "\e60b"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-instalod:before { + content: "\e081"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-square-twitter:before { + content: "\f081"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-golang:before { + content: "\e40f"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-square-kickstarter:before { + content: "\f3bb"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-uncharted:before { + content: "\e084"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-square-youtube:before { + content: "\f431"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-nfc-directional:before { + content: "\e530"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-meta:before { + content: "\e49b"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-square-letterboxd:before { + content: "\e62e"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-shoelace:before { + content: "\e60c"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-unsplash:before { + content: "\e07c"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-square-steam:before { + content: "\f1b7"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-500px:before { + content: "\f26e"; } + +.fa-square-vimeo:before { + content: "\f194"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-flag:before { + content: "\f2b4"; } + +.fa-font-awesome-logo-full:before { + content: "\f2b4"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-hive:before { + content: "\e07f"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-padlet:before { + content: "\e4a0"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-square-github:before { + content: "\f092"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-shopify:before { + content: "\e057"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-square-threads:before { + content: "\e619"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-google-scholar:before { + content: "\e63b"; } + +.fa-square-gitlab:before { + content: "\e5ae"; } + +.fa-gitlab-square:before { + content: "\e5ae"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-square-odnoklassniki:before { + content: "\f264"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-hashnode:before { + content: "\e499"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-square-pinterest:before { + content: "\f0d3"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-signal-messenger:before { + content: "\e663"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-dailymotion:before { + content: "\e052"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-nfc-symbol:before { + content: "\e531"; } + +.fa-mintbit:before { + content: "\e62f"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-brave-reverse:before { + content: "\e63d"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-square-google-plus:before { + content: "\f0d4"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-web-awesome:before { + content: "\e682"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-square-xing:before { + content: "\f169"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-letterboxd:before { + content: "\e62d"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-bilibili:before { + content: "\e3d9"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-x-twitter:before { + content: "\e61b"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-42-group:before { + content: "\e080"; } + +.fa-innosoft:before { + content: "\e080"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-square-pied-piper:before { + content: "\e01e"; } + +.fa-pied-piper-square:before { + content: "\e01e"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-square-web-awesome-stroke:before { + content: "\e684"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-tiktok:before { + content: "\e07b"; } + +.fa-square-facebook:before { + content: "\f082"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-mixer:before { + content: "\e056"; } + +.fa-square-lastfm:before { + content: "\f203"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-cmplid:before { + content: "\e360"; } + +.fa-upwork:before { + content: "\e641"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-square-upwork:before { + content: "\e67c"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-deezer:before { + content: "\e077"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-screenpal:before { + content: "\e570"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-microblog:before { + content: "\e01a"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-square-web-awesome:before { + content: "\e683"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-wirsindhandwerk:before { + content: "\e2d0"; } + +.fa-wsh:before { + content: "\e2d0"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-octopus-deploy:before { + content: "\e082"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-bluesky:before { + content: "\e671"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-rust:before { + content: "\e07a"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-square-behance:before { + content: "\f1b5"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-webflow:before { + content: "\e65c"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-space-awesome:before { + content: "\e5ac"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-square-git:before { + content: "\f1d2"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-square-tumblr:before { + content: "\f174"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-perbyte:before { + content: "\e083"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-bots:before { + content: "\e340"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-ideal:before { + content: "\e013"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-php:before { + content: "\f457"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-firefox-browser:before { + content: "\e007"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-stubber:before { + content: "\e5c7"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f2c6"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-odysee:before { + content: "\e5c6"; } + +.fa-square-whatsapp:before { + content: "\f40c"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-edge-legacy:before { + content: "\e078"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f198"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-square-x-twitter:before { + content: "\e61a"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f23a"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-sitrox:before { + content: "\e44a"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-wodu:before { + content: "\e088"; } + +.fa-google-pay:before { + content: "\e079"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-pix:before { + content: "\e43a"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } + +.far, +.fa-regular { + font-weight: 400; } +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +.fas, +.fa-solid { + font-weight: 900; } +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 900; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); } diff --git a/docs/dev/deps/font-awesome-6.5.2/css/all.min.css b/docs/dev/deps/font-awesome-6.5.2/css/all.min.css new file mode 100644 index 00000000..269bceea --- /dev/null +++ b/docs/dev/deps/font-awesome-6.5.2/css/all.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-table-cells-column-lock:before{content:"\e678"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-table-cells-row-lock:before{content:"\e67a"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }@font-face{font-family:"FontAwesome";font-display:block;src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); } \ No newline at end of file diff --git a/docs/dev/deps/font-awesome-6.5.2/css/v4-shims.css b/docs/dev/deps/font-awesome-6.5.2/css/v4-shims.css new file mode 100644 index 00000000..ea60ea4d --- /dev/null +++ b/docs/dev/deps/font-awesome-6.5.2/css/v4-shims.css @@ -0,0 +1,2194 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa.fa-glass:before { + content: "\f000"; } + +.fa.fa-envelope-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-envelope-o:before { + content: "\f0e0"; } + +.fa.fa-star-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-o:before { + content: "\f005"; } + +.fa.fa-remove:before { + content: "\f00d"; } + +.fa.fa-close:before { + content: "\f00d"; } + +.fa.fa-gear:before { + content: "\f013"; } + +.fa.fa-trash-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-trash-o:before { + content: "\f2ed"; } + +.fa.fa-home:before { + content: "\f015"; } + +.fa.fa-file-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-o:before { + content: "\f15b"; } + +.fa.fa-clock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-clock-o:before { + content: "\f017"; } + +.fa.fa-arrow-circle-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-down:before { + content: "\f358"; } + +.fa.fa-arrow-circle-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-up:before { + content: "\f35b"; } + +.fa.fa-play-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-play-circle-o:before { + content: "\f144"; } + +.fa.fa-repeat:before { + content: "\f01e"; } + +.fa.fa-rotate-right:before { + content: "\f01e"; } + +.fa.fa-refresh:before { + content: "\f021"; } + +.fa.fa-list-alt { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-list-alt:before { + content: "\f022"; } + +.fa.fa-dedent:before { + content: "\f03b"; } + +.fa.fa-video-camera:before { + content: "\f03d"; } + +.fa.fa-picture-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-picture-o:before { + content: "\f03e"; } + +.fa.fa-photo { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-photo:before { + content: "\f03e"; } + +.fa.fa-image { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-image:before { + content: "\f03e"; } + +.fa.fa-map-marker:before { + content: "\f3c5"; } + +.fa.fa-pencil-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-pencil-square-o:before { + content: "\f044"; } + +.fa.fa-edit { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-edit:before { + content: "\f044"; } + +.fa.fa-share-square-o:before { + content: "\f14d"; } + +.fa.fa-check-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-check-square-o:before { + content: "\f14a"; } + +.fa.fa-arrows:before { + content: "\f0b2"; } + +.fa.fa-times-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-circle-o:before { + content: "\f057"; } + +.fa.fa-check-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-check-circle-o:before { + content: "\f058"; } + +.fa.fa-mail-forward:before { + content: "\f064"; } + +.fa.fa-expand:before { + content: "\f424"; } + +.fa.fa-compress:before { + content: "\f422"; } + +.fa.fa-eye { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-eye-slash { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-warning:before { + content: "\f071"; } + +.fa.fa-calendar:before { + content: "\f073"; } + +.fa.fa-arrows-v:before { + content: "\f338"; } + +.fa.fa-arrows-h:before { + content: "\f337"; } + +.fa.fa-bar-chart:before { + content: "\e0e3"; } + +.fa.fa-bar-chart-o:before { + content: "\e0e3"; } + +.fa.fa-twitter-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-twitter-square:before { + content: "\f081"; } + +.fa.fa-facebook-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-square:before { + content: "\f082"; } + +.fa.fa-gears:before { + content: "\f085"; } + +.fa.fa-thumbs-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-up:before { + content: "\f164"; } + +.fa.fa-thumbs-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-down:before { + content: "\f165"; } + +.fa.fa-heart-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-heart-o:before { + content: "\f004"; } + +.fa.fa-sign-out:before { + content: "\f2f5"; } + +.fa.fa-linkedin-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linkedin-square:before { + content: "\f08c"; } + +.fa.fa-thumb-tack:before { + content: "\f08d"; } + +.fa.fa-external-link:before { + content: "\f35d"; } + +.fa.fa-sign-in:before { + content: "\f2f6"; } + +.fa.fa-github-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-github-square:before { + content: "\f092"; } + +.fa.fa-lemon-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-lemon-o:before { + content: "\f094"; } + +.fa.fa-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-square-o:before { + content: "\f0c8"; } + +.fa.fa-bookmark-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bookmark-o:before { + content: "\f02e"; } + +.fa.fa-twitter { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook:before { + content: "\f39e"; } + +.fa.fa-facebook-f { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-f:before { + content: "\f39e"; } + +.fa.fa-github { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-credit-card { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-feed:before { + content: "\f09e"; } + +.fa.fa-hdd-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hdd-o:before { + content: "\f0a0"; } + +.fa.fa-hand-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-right:before { + content: "\f0a4"; } + +.fa.fa-hand-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-left:before { + content: "\f0a5"; } + +.fa.fa-hand-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-up:before { + content: "\f0a6"; } + +.fa.fa-hand-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-down:before { + content: "\f0a7"; } + +.fa.fa-globe:before { + content: "\f57d"; } + +.fa.fa-tasks:before { + content: "\f828"; } + +.fa.fa-arrows-alt:before { + content: "\f31e"; } + +.fa.fa-group:before { + content: "\f0c0"; } + +.fa.fa-chain:before { + content: "\f0c1"; } + +.fa.fa-cut:before { + content: "\f0c4"; } + +.fa.fa-files-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-files-o:before { + content: "\f0c5"; } + +.fa.fa-floppy-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-floppy-o:before { + content: "\f0c7"; } + +.fa.fa-save { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-save:before { + content: "\f0c7"; } + +.fa.fa-navicon:before { + content: "\f0c9"; } + +.fa.fa-reorder:before { + content: "\f0c9"; } + +.fa.fa-magic:before { + content: "\e2ca"; } + +.fa.fa-pinterest { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa.fa-google-plus-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa.fa-google-plus { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus:before { + content: "\f0d5"; } + +.fa.fa-money:before { + content: "\f3d1"; } + +.fa.fa-unsorted:before { + content: "\f0dc"; } + +.fa.fa-sort-desc:before { + content: "\f0dd"; } + +.fa.fa-sort-asc:before { + content: "\f0de"; } + +.fa.fa-linkedin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linkedin:before { + content: "\f0e1"; } + +.fa.fa-rotate-left:before { + content: "\f0e2"; } + +.fa.fa-legal:before { + content: "\f0e3"; } + +.fa.fa-tachometer:before { + content: "\f625"; } + +.fa.fa-dashboard:before { + content: "\f625"; } + +.fa.fa-comment-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-comment-o:before { + content: "\f075"; } + +.fa.fa-comments-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-comments-o:before { + content: "\f086"; } + +.fa.fa-flash:before { + content: "\f0e7"; } + +.fa.fa-clipboard:before { + content: "\f0ea"; } + +.fa.fa-lightbulb-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-lightbulb-o:before { + content: "\f0eb"; } + +.fa.fa-exchange:before { + content: "\f362"; } + +.fa.fa-cloud-download:before { + content: "\f0ed"; } + +.fa.fa-cloud-upload:before { + content: "\f0ee"; } + +.fa.fa-bell-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bell-o:before { + content: "\f0f3"; } + +.fa.fa-cutlery:before { + content: "\f2e7"; } + +.fa.fa-file-text-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-text-o:before { + content: "\f15c"; } + +.fa.fa-building-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-building-o:before { + content: "\f1ad"; } + +.fa.fa-hospital-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hospital-o:before { + content: "\f0f8"; } + +.fa.fa-tablet:before { + content: "\f3fa"; } + +.fa.fa-mobile:before { + content: "\f3cd"; } + +.fa.fa-mobile-phone:before { + content: "\f3cd"; } + +.fa.fa-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-circle-o:before { + content: "\f111"; } + +.fa.fa-mail-reply:before { + content: "\f3e5"; } + +.fa.fa-github-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-folder-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-folder-o:before { + content: "\f07b"; } + +.fa.fa-folder-open-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-folder-open-o:before { + content: "\f07c"; } + +.fa.fa-smile-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-smile-o:before { + content: "\f118"; } + +.fa.fa-frown-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-frown-o:before { + content: "\f119"; } + +.fa.fa-meh-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-meh-o:before { + content: "\f11a"; } + +.fa.fa-keyboard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-keyboard-o:before { + content: "\f11c"; } + +.fa.fa-flag-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-flag-o:before { + content: "\f024"; } + +.fa.fa-mail-reply-all:before { + content: "\f122"; } + +.fa.fa-star-half-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-o:before { + content: "\f5c0"; } + +.fa.fa-star-half-empty { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-empty:before { + content: "\f5c0"; } + +.fa.fa-star-half-full { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-full:before { + content: "\f5c0"; } + +.fa.fa-code-fork:before { + content: "\f126"; } + +.fa.fa-chain-broken:before { + content: "\f127"; } + +.fa.fa-unlink:before { + content: "\f127"; } + +.fa.fa-calendar-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-o:before { + content: "\f133"; } + +.fa.fa-maxcdn { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-html5 { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-css3 { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-unlock-alt:before { + content: "\f09c"; } + +.fa.fa-minus-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-minus-square-o:before { + content: "\f146"; } + +.fa.fa-level-up:before { + content: "\f3bf"; } + +.fa.fa-level-down:before { + content: "\f3be"; } + +.fa.fa-pencil-square:before { + content: "\f14b"; } + +.fa.fa-external-link-square:before { + content: "\f360"; } + +.fa.fa-compass { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down:before { + content: "\f150"; } + +.fa.fa-toggle-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-down:before { + content: "\f150"; } + +.fa.fa-caret-square-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-up:before { + content: "\f151"; } + +.fa.fa-toggle-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-up:before { + content: "\f151"; } + +.fa.fa-caret-square-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-right:before { + content: "\f152"; } + +.fa.fa-toggle-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-right:before { + content: "\f152"; } + +.fa.fa-eur:before { + content: "\f153"; } + +.fa.fa-euro:before { + content: "\f153"; } + +.fa.fa-gbp:before { + content: "\f154"; } + +.fa.fa-usd:before { + content: "\24"; } + +.fa.fa-dollar:before { + content: "\24"; } + +.fa.fa-inr:before { + content: "\e1bc"; } + +.fa.fa-rupee:before { + content: "\e1bc"; } + +.fa.fa-jpy:before { + content: "\f157"; } + +.fa.fa-cny:before { + content: "\f157"; } + +.fa.fa-rmb:before { + content: "\f157"; } + +.fa.fa-yen:before { + content: "\f157"; } + +.fa.fa-rub:before { + content: "\f158"; } + +.fa.fa-ruble:before { + content: "\f158"; } + +.fa.fa-rouble:before { + content: "\f158"; } + +.fa.fa-krw:before { + content: "\f159"; } + +.fa.fa-won:before { + content: "\f159"; } + +.fa.fa-btc { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin:before { + content: "\f15a"; } + +.fa.fa-file-text:before { + content: "\f15c"; } + +.fa.fa-sort-alpha-asc:before { + content: "\f15d"; } + +.fa.fa-sort-alpha-desc:before { + content: "\f881"; } + +.fa.fa-sort-amount-asc:before { + content: "\f884"; } + +.fa.fa-sort-amount-desc:before { + content: "\f160"; } + +.fa.fa-sort-numeric-asc:before { + content: "\f162"; } + +.fa.fa-sort-numeric-desc:before { + content: "\f886"; } + +.fa.fa-youtube-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-youtube-square:before { + content: "\f431"; } + +.fa.fa-youtube { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing-square:before { + content: "\f169"; } + +.fa.fa-youtube-play { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-youtube-play:before { + content: "\f167"; } + +.fa.fa-dropbox { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stack-overflow { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-instagram { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-flickr { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-adn { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square:before { + content: "\f171"; } + +.fa.fa-tumblr { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square:before { + content: "\f174"; } + +.fa.fa-long-arrow-down:before { + content: "\f309"; } + +.fa.fa-long-arrow-up:before { + content: "\f30c"; } + +.fa.fa-long-arrow-left:before { + content: "\f30a"; } + +.fa.fa-long-arrow-right:before { + content: "\f30b"; } + +.fa.fa-apple { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-windows { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-android { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linux { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-dribbble { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-skype { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-foursquare { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-trello { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gratipay { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gittip { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gittip:before { + content: "\f184"; } + +.fa.fa-sun-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sun-o:before { + content: "\f185"; } + +.fa.fa-moon-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-moon-o:before { + content: "\f186"; } + +.fa.fa-vk { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-weibo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-renren { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pagelines { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stack-exchange { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right:before { + content: "\f35a"; } + +.fa.fa-arrow-circle-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-left:before { + content: "\f359"; } + +.fa.fa-caret-square-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-left:before { + content: "\f191"; } + +.fa.fa-toggle-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-left:before { + content: "\f191"; } + +.fa.fa-dot-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-dot-circle-o:before { + content: "\f192"; } + +.fa.fa-vimeo-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo-square:before { + content: "\f194"; } + +.fa.fa-try:before { + content: "\e2bb"; } + +.fa.fa-turkish-lira:before { + content: "\e2bb"; } + +.fa.fa-plus-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-plus-square-o:before { + content: "\f0fe"; } + +.fa.fa-slack { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wordpress { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-openid { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-institution:before { + content: "\f19c"; } + +.fa.fa-bank:before { + content: "\f19c"; } + +.fa.fa-mortar-board:before { + content: "\f19d"; } + +.fa.fa-yahoo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square:before { + content: "\f1a2"; } + +.fa.fa-stumbleupon-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stumbleupon { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-delicious { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-digg { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-pp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-drupal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-joomla { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance-square:before { + content: "\f1b5"; } + +.fa.fa-steam { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-steam-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-steam-square:before { + content: "\f1b7"; } + +.fa.fa-automobile:before { + content: "\f1b9"; } + +.fa.fa-cab:before { + content: "\f1ba"; } + +.fa.fa-spotify { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-deviantart { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-soundcloud { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-file-pdf-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-pdf-o:before { + content: "\f1c1"; } + +.fa.fa-file-word-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-word-o:before { + content: "\f1c2"; } + +.fa.fa-file-excel-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-excel-o:before { + content: "\f1c3"; } + +.fa.fa-file-powerpoint-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-powerpoint-o:before { + content: "\f1c4"; } + +.fa.fa-file-image-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-image-o:before { + content: "\f1c5"; } + +.fa.fa-file-photo-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-photo-o:before { + content: "\f1c5"; } + +.fa.fa-file-picture-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-picture-o:before { + content: "\f1c5"; } + +.fa.fa-file-archive-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-archive-o:before { + content: "\f1c6"; } + +.fa.fa-file-zip-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-zip-o:before { + content: "\f1c6"; } + +.fa.fa-file-audio-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-audio-o:before { + content: "\f1c7"; } + +.fa.fa-file-sound-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-sound-o:before { + content: "\f1c7"; } + +.fa.fa-file-video-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-video-o:before { + content: "\f1c8"; } + +.fa.fa-file-movie-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-movie-o:before { + content: "\f1c8"; } + +.fa.fa-file-code-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-code-o:before { + content: "\f1c9"; } + +.fa.fa-vine { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-codepen { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-jsfiddle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-life-bouy:before { + content: "\f1cd"; } + +.fa.fa-life-buoy:before { + content: "\f1cd"; } + +.fa.fa-life-saver:before { + content: "\f1cd"; } + +.fa.fa-support:before { + content: "\f1cd"; } + +.fa.fa-circle-o-notch:before { + content: "\f1ce"; } + +.fa.fa-rebel { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ra { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ra:before { + content: "\f1d0"; } + +.fa.fa-resistance { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-resistance:before { + content: "\f1d0"; } + +.fa.fa-empire { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ge { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ge:before { + content: "\f1d1"; } + +.fa.fa-git-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-git-square:before { + content: "\f1d2"; } + +.fa.fa-git { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-hacker-news { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square:before { + content: "\f1d4"; } + +.fa.fa-yc-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc-square:before { + content: "\f1d4"; } + +.fa.fa-tencent-weibo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-qq { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-weixin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wechat { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wechat:before { + content: "\f1d7"; } + +.fa.fa-send:before { + content: "\f1d8"; } + +.fa.fa-paper-plane-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-paper-plane-o:before { + content: "\f1d8"; } + +.fa.fa-send-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-send-o:before { + content: "\f1d8"; } + +.fa.fa-circle-thin { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-circle-thin:before { + content: "\f111"; } + +.fa.fa-header:before { + content: "\f1dc"; } + +.fa.fa-futbol-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-futbol-o:before { + content: "\f1e3"; } + +.fa.fa-soccer-ball-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-soccer-ball-o:before { + content: "\f1e3"; } + +.fa.fa-slideshare { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-twitch { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yelp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-newspaper-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-newspaper-o:before { + content: "\f1ea"; } + +.fa.fa-paypal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-wallet { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-visa { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-mastercard { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-discover { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-amex { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-paypal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-stripe { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bell-slash-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bell-slash-o:before { + content: "\f1f6"; } + +.fa.fa-trash:before { + content: "\f2ed"; } + +.fa.fa-copyright { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-eyedropper:before { + content: "\f1fb"; } + +.fa.fa-area-chart:before { + content: "\f1fe"; } + +.fa.fa-pie-chart:before { + content: "\f200"; } + +.fa.fa-line-chart:before { + content: "\f201"; } + +.fa.fa-lastfm { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square:before { + content: "\f203"; } + +.fa.fa-ioxhost { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-angellist { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-cc:before { + content: "\f20a"; } + +.fa.fa-ils:before { + content: "\f20b"; } + +.fa.fa-shekel:before { + content: "\f20b"; } + +.fa.fa-sheqel:before { + content: "\f20b"; } + +.fa.fa-buysellads { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-connectdevelop { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-dashcube { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-forumbee { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-leanpub { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-sellsy { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-shirtsinbulk { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-simplybuilt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-skyatlas { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-diamond { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-diamond:before { + content: "\f3a5"; } + +.fa.fa-transgender:before { + content: "\f224"; } + +.fa.fa-intersex:before { + content: "\f224"; } + +.fa.fa-transgender-alt:before { + content: "\f225"; } + +.fa.fa-facebook-official { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-official:before { + content: "\f09a"; } + +.fa.fa-pinterest-p { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-whatsapp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-hotel:before { + content: "\f236"; } + +.fa.fa-viacoin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-medium { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc:before { + content: "\f23b"; } + +.fa.fa-optin-monster { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-opencart { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-expeditedssl { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-battery-4:before { + content: "\f240"; } + +.fa.fa-battery:before { + content: "\f240"; } + +.fa.fa-battery-3:before { + content: "\f241"; } + +.fa.fa-battery-2:before { + content: "\f242"; } + +.fa.fa-battery-1:before { + content: "\f243"; } + +.fa.fa-battery-0:before { + content: "\f244"; } + +.fa.fa-object-group { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-object-ungroup { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o:before { + content: "\f249"; } + +.fa.fa-cc-jcb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-diners-club { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-clone { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hourglass-o:before { + content: "\f254"; } + +.fa.fa-hourglass-1:before { + content: "\f251"; } + +.fa.fa-hourglass-2:before { + content: "\f252"; } + +.fa.fa-hourglass-3:before { + content: "\f253"; } + +.fa.fa-hand-rock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-rock-o:before { + content: "\f255"; } + +.fa.fa-hand-grab-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-grab-o:before { + content: "\f255"; } + +.fa.fa-hand-paper-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-paper-o:before { + content: "\f256"; } + +.fa.fa-hand-stop-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-stop-o:before { + content: "\f256"; } + +.fa.fa-hand-scissors-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-scissors-o:before { + content: "\f257"; } + +.fa.fa-hand-lizard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-lizard-o:before { + content: "\f258"; } + +.fa.fa-hand-spock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-spock-o:before { + content: "\f259"; } + +.fa.fa-hand-pointer-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-pointer-o:before { + content: "\f25a"; } + +.fa.fa-hand-peace-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-peace-o:before { + content: "\f25b"; } + +.fa.fa-registered { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-creative-commons { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gg { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gg-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa.fa-get-pocket { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wikipedia-w { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-safari { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-chrome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-firefox { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-opera { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-internet-explorer { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-television:before { + content: "\f26c"; } + +.fa.fa-contao { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-500px { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-amazon { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-calendar-plus-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-plus-o:before { + content: "\f271"; } + +.fa.fa-calendar-minus-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-minus-o:before { + content: "\f272"; } + +.fa.fa-calendar-times-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-times-o:before { + content: "\f273"; } + +.fa.fa-calendar-check-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-check-o:before { + content: "\f274"; } + +.fa.fa-map-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-map-o:before { + content: "\f279"; } + +.fa.fa-commenting:before { + content: "\f4ad"; } + +.fa.fa-commenting-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-commenting-o:before { + content: "\f4ad"; } + +.fa.fa-houzz { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo:before { + content: "\f27d"; } + +.fa.fa-black-tie { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fonticons { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-alien { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-edge { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-credit-card-alt:before { + content: "\f09d"; } + +.fa.fa-codiepie { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-modx { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fort-awesome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-usb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-product-hunt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-mixcloud { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-scribd { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pause-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-pause-circle-o:before { + content: "\f28b"; } + +.fa.fa-stop-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-stop-circle-o:before { + content: "\f28d"; } + +.fa.fa-bluetooth { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bluetooth-b { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gitlab { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpbeginner { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpforms { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-envira { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt:before { + content: "\f368"; } + +.fa.fa-question-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-question-circle-o:before { + content: "\f059"; } + +.fa.fa-volume-control-phone:before { + content: "\f2a0"; } + +.fa.fa-asl-interpreting:before { + content: "\f2a3"; } + +.fa.fa-deafness:before { + content: "\f2a4"; } + +.fa.fa-hard-of-hearing:before { + content: "\f2a4"; } + +.fa.fa-glide { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-glide-g { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-signing:before { + content: "\f2a7"; } + +.fa.fa-viadeo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa.fa-snapchat { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa.fa-snapchat-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa.fa-pied-piper { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-first-order { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yoast { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-themeisle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official:before { + content: "\f2b3"; } + +.fa.fa-google-plus-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-circle:before { + content: "\f2b3"; } + +.fa.fa-font-awesome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fa { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fa:before { + content: "\f2b4"; } + +.fa.fa-handshake-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-handshake-o:before { + content: "\f2b5"; } + +.fa.fa-envelope-open-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-envelope-open-o:before { + content: "\f2b6"; } + +.fa.fa-linode { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-address-book-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-address-book-o:before { + content: "\f2b9"; } + +.fa.fa-vcard:before { + content: "\f2bb"; } + +.fa.fa-address-card-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-address-card-o:before { + content: "\f2bb"; } + +.fa.fa-vcard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-vcard-o:before { + content: "\f2bb"; } + +.fa.fa-user-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-user-circle-o:before { + content: "\f2bd"; } + +.fa.fa-user-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-user-o:before { + content: "\f007"; } + +.fa.fa-id-badge { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-drivers-license:before { + content: "\f2c2"; } + +.fa.fa-id-card-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-id-card-o:before { + content: "\f2c2"; } + +.fa.fa-drivers-license-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-drivers-license-o:before { + content: "\f2c2"; } + +.fa.fa-quora { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-free-code-camp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-telegram { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-thermometer-4:before { + content: "\f2c7"; } + +.fa.fa-thermometer:before { + content: "\f2c7"; } + +.fa.fa-thermometer-3:before { + content: "\f2c8"; } + +.fa.fa-thermometer-2:before { + content: "\f2c9"; } + +.fa.fa-thermometer-1:before { + content: "\f2ca"; } + +.fa.fa-thermometer-0:before { + content: "\f2cb"; } + +.fa.fa-bathtub:before { + content: "\f2cd"; } + +.fa.fa-s15:before { + content: "\f2cd"; } + +.fa.fa-window-maximize { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-window-restore { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle:before { + content: "\f410"; } + +.fa.fa-window-close-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-window-close-o:before { + content: "\f410"; } + +.fa.fa-times-rectangle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle-o:before { + content: "\f410"; } + +.fa.fa-bandcamp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-grav { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-etsy { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-imdb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ravelry { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-eercast { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-eercast:before { + content: "\f2da"; } + +.fa.fa-snowflake-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-snowflake-o:before { + content: "\f2dc"; } + +.fa.fa-superpowers { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpexplorer { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-meetup { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } diff --git a/docs/dev/deps/font-awesome-6.5.2/css/v4-shims.min.css b/docs/dev/deps/font-awesome-6.5.2/css/v4-shims.min.css new file mode 100644 index 00000000..09baf5fc --- /dev/null +++ b/docs/dev/deps/font-awesome-6.5.2/css/v4-shims.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa.fa-glass:before{content:"\f000"}.fa.fa-envelope-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-star-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-home:before{content:"\f015"}.fa.fa-file-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-list-alt:before{content:"\f022"}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-edit{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-edit:before{content:"\f044"}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart-o:before,.fa.fa-bar-chart:before{content:"\e0e3"}.fa.fa-twitter-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-twitter-square:before{content:"\f081"}.fa.fa-facebook-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-square:before{content:"\f082"}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-github-square:before{content:"\f092"}.fa.fa-lemon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-globe:before{content:"\f57d"}.fa.fa-tasks:before{content:"\f828"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-cut:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-save:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-magic:before{content:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pinterest-square:before{content:"\f0d3"}.fa.fa-google-plus-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-square:before{content:"\f0d4"}.fa.fa-google-plus{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f625"}.fa.fa-comment-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard:before{content:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f0ed"}.fa.fa-cloud-upload:before{content:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f5c0"}.fa.fa-star-half-empty{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f5c0"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before,.fa.fa-unlink:before{content:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-unlock-alt:before{content:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\24"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\e1bc"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f884"}.fa.fa-sort-amount-desc:before{content:"\f160"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-youtube-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-square:before{content:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-xing-square:before{content:"\f169"}.fa.fa-youtube-play{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-tumblr-square:before{content:"\f174"}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo-square:before{content:"\f194"}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-reddit-square:before{content:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-behance-square:before{content:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-steam-square:before{content:"\f1b7"}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-life-bouy:before,.fa.fa-life-buoy:before,.fa.fa-life-saver:before,.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-git-square:before{content:"\f1d2"}.fa.fa-git,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-futbol-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-lastfm-square:before{content:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before,.fa.fa-transgender:before{content:"\f224"}.fa.fa-transgender-alt:before{content:"\f225"}.fa.fa-facebook-official{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-odnoklassniki-square:before{content:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-viadeo-square:before{content:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-ghost:before{content:"\f2ab"}.fa.fa-snapchat-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-square:before{content:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 6 Brands";font-weight:400} \ No newline at end of file diff --git a/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..1fbb1f7c Binary files /dev/null and b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf differ diff --git a/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..5d280216 Binary files /dev/null and b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 differ diff --git a/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..549d68dc Binary files /dev/null and b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf differ diff --git a/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..18400d7f Binary files /dev/null and b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 differ diff --git a/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..bb2a8695 Binary files /dev/null and b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf differ diff --git a/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..758dd4f6 Binary files /dev/null and b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 differ diff --git a/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf new file mode 100644 index 00000000..8c5864c4 Binary files /dev/null and b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf differ diff --git a/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 00000000..f94bec22 Binary files /dev/null and b/docs/dev/deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 differ diff --git a/docs/dev/deps/headroom-0.11.0/headroom.min.js b/docs/dev/deps/headroom-0.11.0/headroom.min.js new file mode 100644 index 00000000..433069fd --- /dev/null +++ b/docs/dev/deps/headroom-0.11.0/headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.11.0 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=ls.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t,n){n=n||{},Object.assign(this,o.options,n),this.classes=Object.assign({},o.options.classes,n.classes),this.elem=t,this.tolerance=function(t){return t===Object(t)?t:{down:t,up:t}}(this.tolerance),this.initialised=!1,this.frozen=!1}return o.prototype={constructor:o,init:function(){return o.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},o.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},o.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),o}); \ No newline at end of file diff --git a/docs/dev/deps/headroom-0.11.0/jQuery.headroom.min.js b/docs/dev/deps/headroom-0.11.0/jQuery.headroom.min.js new file mode 100644 index 00000000..17f70c9e --- /dev/null +++ b/docs/dev/deps/headroom-0.11.0/jQuery.headroom.min.js @@ -0,0 +1,7 @@ +/*! + * headroom.js v0.9.4 - Give your page some headroom. Hide your header until you need it + * Copyright (c) 2017 Nick Williams - http://wicky.nillia.ms/headroom.js + * License: MIT + */ + +!function(a){a&&(a.fn.headroom=function(b){return this.each(function(){var c=a(this),d=c.data("headroom"),e="object"==typeof b&&b;e=a.extend(!0,{},Headroom.options,e),d||(d=new Headroom(this,e),d.init(),c.data("headroom",d)),"string"==typeof b&&(d[b](),"destroy"===b&&c.removeData("headroom"))})},a("[data-headroom]").each(function(){var b=a(this);b.headroom(b.data())}))}(window.Zepto||window.jQuery); \ No newline at end of file diff --git a/docs/dev/deps/jquery-3.6.0/jquery-3.6.0.js b/docs/dev/deps/jquery-3.6.0/jquery-3.6.0.js new file mode 100644 index 00000000..fc6c299b --- /dev/null +++ b/docs/dev/deps/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 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 = "" + + ""; + + // 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 = "" + + ""; + + // 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: ) 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 = ""; + 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 = ""; + 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 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+ + // 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 = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + 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 or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _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, "" ]; +} + + +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 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 = /\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( " + + + + + + + + + + Skip to contents + + +
    +
    +
    + + + +

    The R package mkin provides calculation routines for the analysis of chemical degradation data, including multicompartment kinetics as needed for modelling the formation and decline of transformation products, or if several degradation compartments are involved. It provides stable functionality for kinetic evaluations according to the FOCUS guidance (see below for details). In addition, it provides functionality to do hierarchical kinetics based on nonlinear mixed-effects models.

    +
    +

    Installation +

    +

    You can install the latest released version from CRAN from within R:

    + +
    +
    +

    Background +

    +

    In the regulatory evaluation of chemical substances like plant protection products (pesticides), biocides and other chemicals, degradation data play an important role. For the evaluation of pesticide degradation experiments, detailed guidance and various helpful tools have been developed as detailed in ‘Credits and historical remarks’ below. This package aims to provide a one stop solution for degradation kinetics, addressing modellers that are willing to, or even prefer to work with R.

    +
    +
    +

    Basic usage +

    +

    For a start, have a look at the code examples provided for plot.mkinfit and plot.mmkin, and at the package vignettes FOCUS L and FOCUS D.

    +
    +
    +

    Documentation +

    +

    The HTML documentation of the latest version released to CRAN is available at jrwb.de and github.

    +

    Documentation of the development version is found in the ‘dev’ subdirectory. In the articles section of this documentation, you can also find demonstrations of the application of nonlinear hierarchical models, also known as nonlinear mixed-effects models, to more complex data, including transformation products and covariates.

    +
    +
    +

    Features +

    +
    +

    General +

    +
      +
    • Highly flexible model specification using mkinmod, including equilibrium reactions and using the single first-order reversible binding (SFORB) model, which will automatically create two state variables for the observed variable.
    • +
    • Model solution (forward modelling) in the function mkinpredict is performed either using the analytical solution for the case of parent only degradation or some simple models involving a single transformation product, , an eigenvalue based solution if only simple first-order (SFO) or SFORB kinetics are used in the model, or using a numeric solver from the deSolve package (default is lsoda).
    • +
    • The usual one-sided t-test for significant difference from zero is shown based on estimators for the untransformed parameters.
    • +
    • Summary and plotting functions. The summary of an mkinfit object is in fact a full report that should give enough information to be able to approximately reproduce the fit with other tools.
    • +
    • The chi-squared error level as defined in the FOCUS kinetics guidance (see below) is calculated for each observed variable.
    • +
    • The ‘variance by variable’ error model which is often fitted using Iteratively Reweighted Least Squares (IRLS) can be specified as error_model = "obs".
    • +
    +
    +
    +

    Unique in mkin +

    +
      +
    • Three different error models can be selected using the argument error_model to the mkinfit function. A two-component error model similar to the one proposed by Rocke and Lorenzato can be selected using the argument error_model = "tc".
    • +
    • Model comparisons using the Akaike Information Criterion (AIC) are supported which can also be used for non-constant variance. In such cases the FOCUS chi-squared error level is not meaningful.
    • +
    • By default, kinetic rate constants and kinetic formation fractions are transformed internally using transform_odeparms so their estimators can more reasonably be expected to follow a normal distribution.
    • +
    • When parameter estimates are backtransformed to match the model definition, confidence intervals calculated from standard errors are also backtransformed to the correct scale, and will not include meaningless values like negative rate constants or formation fractions adding up to more than 1, which cannot occur in a single experiment with a single defined radiolabel position.
    • +
    • When a metabolite decline phase is not described well by SFO kinetics, SFORB kinetics can be used for the metabolite. Mathematically, the SFORB model is equivalent to the DFOP model. However, the SFORB model has the advantage that there is a mechanistic interpretation of the model parameters.
    • +
    • Nonlinear mixed-effects models (hierarchical models) can be created from fits of the same degradation model to different datasets for the same compound by using the nlme.mmkin and saem.mmkin methods. Note that the convergence of the nlme fits depends on the quality of the data. Convergence is better for simple models and data for many groups (e.g. soils). The saem method uses the saemix package as a backend. Analytical solutions suitable for use with this package have been implemented for parent only models and the most important models including one metabolite (SFO-SFO and DFOP-SFO). Fitting other models with saem.mmkin, while it makes use of the compiled ODE models that mkin provides, has longer run times (from a couple of minutes to more than an hour).
    • +
    +
    +
    +

    Performance +

    +
      +
    • Parallel fitting of several models to several datasets is supported, see for example plot.mmkin.
    • +
    • If a C compiler is installed, the kinetic models are compiled from automatically generated C code, see vignette compiled_models. The autogeneration of C code was inspired by the ccSolve package. Thanks to Karline Soetaert for her work on that.
    • +
    • Even if no compiler is installed, many degradation models still give very good performance, as current versions of mkin also have analytical solutions for some models with one metabolite, and if SFO or SFORB are used for the parent compound, Eigenvalue based solutions of the degradation model are available.
    • +
    +
    +
    +
    +

    GUI +

    +

    There is a graphical user interface that may be useful. Please refer to its documentation page for installation instructions and a manual. It only supports evaluations using (generalised) nonlinear regression, but not simultaneous fits using nonlinear mixed-effects models.

    +
    +
    +

    News +

    +

    There is a list of changes for the latest CRAN release and one for each github branch, e.g. the main branch.

    +
    +
    +

    Credits and historical remarks +

    +

    mkin would not be possible without the underlying software stack consisting of, among others, R and the package deSolve. In previous version, mkin was also using the functionality of the FME package. Please refer to the package page on CRAN for the full list of imported and suggested R packages. Also, Debian Linux, the vim editor and the Nvim-R plugin have been invaluable in its development.

    +

    mkin could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories Ltd (formerly RCC Ltd). mkin greatly profits from and largely follows the work done by the FOCUS Degradation Kinetics Workgroup, as detailed in their guidance document from 2006, slightly updated in 2011 and in 2014.

    +

    Also, it was inspired by the first version of KinGUI developed by BayerCropScience, which is based on the MatLab runtime environment.

    +

    The companion package kinfit (now deprecated) was started in 2008 and first published on CRAN on 01 May 2010.

    +

    The first mkin code was published on 11 May 2010 and the first CRAN version on 18 May 2010.

    +

    In 2011, Bayer Crop Science started to distribute an R based successor to KinGUI named KinGUII whose R code is based on mkin, but which added, among other refinements, a closed source graphical user interface (GUI), iteratively reweighted least squares (IRLS) optimisation of the variance for each of the observed variables, and Markov Chain Monte Carlo (MCMC) simulation functionality, similar to what is available e.g. in the FME package.

    +

    Somewhat in parallel, Syngenta has sponsored the development of an mkin and KinGUII based GUI application called CAKE, which also adds IRLS and MCMC, is more limited in the model formulation, but puts more weight on usability. CAKE is available for download from the CAKE website, where you can also find a zip archive of the R scripts derived from mkin, published under the GPL license.

    +

    Finally, there is KineticEval, which contains some further development of the scripts used for KinGUII.

    +

    Thanks to René Lehmann, formerly working at the Umweltbundesamt, for the nice cooperation on parameter transformations, especially the isometric log-ratio transformation that is now used for formation fractions in case there are more than two transformation targets.

    +

    Many inspirations for improvements of mkin resulted from doing kinetic evaluations of degradation data for my clients while working at Harlan Laboratories and at Eurofins Regulatory AG, and now as an independent consultant.

    +

    Funding was received from the Umweltbundesamt in the course of the projects

    +
      +
    • Project Number 27452 (Testing and validation of modelling software as an alternative to ModelMaker 4.0, 2014-2015)
    • +
    • Project Number 56703 (Optimization of gmkin for routine use in the Umweltbundesamt, 2015)
    • +
    • Project Number 92570 (Update of Project Number 27452, 2017-2018)
    • +
    • Project Number 112407 (Testing the feasibility of using an error model according to Rocke and Lorenzato for more realistic parameter estimates in the kinetic evaluation of degradation data, 2018-2019)
    • +
    • Project Number 120667 (Development of objective criteria for the evaluation of the visual fit in the kinetic evaluation of degradation data, 2019-2020)
    • +
    • Project Number 146839 (Checking the feasibility of using mixed-effects models for the derivation of kinetic modelling parameters from degradation studies, 2020-2021)
    • +
    • Project Number 173340 (Application of nonlinear hierarchical models to the kinetic evaluation of chemical degradation data)
    • +
    +

    Thanks to everyone involved for collaboration and support!

    +

    Thanks are due also to Emmanuelle Comets, maintainer of the saemix package, for her interest and support for using the SAEM algorithm and its implementation in saemix for the evaluation of chemical degradation data.

    +

    Regarding the application of nonlinear mixed-effects models to degradation data, von Götz et al (1999) have already proposed to use this technique in the context of environmental risk assessments of pesticides. However, this work was apparently not followed up, which is why we had to independently arrive at the idea and missed to cite this previous work on the topic in our first publications.

    +
    +
    +

    References +

    + + + + + + + + + + + + + + + + +
    +Ranke J (2023) Application of nonlinear hierarchical models to the kinetic evaluation of chemical degradation data - Guidance for the use of an R markdown template file. Umweltbundesamt TEXTE 151/2023 +
    +Ranke J, Wöltjen J, Schmidt J, and Comets E (2021) Taking kinetic evaluations of degradation data to the next level with nonlinear mixed-effects models. Environments 8 (8) 71 doi:10.3390/environments8080071 +
    +Ranke J, Meinecke S (2019) Error Models for the Kinetic Evaluation of Chemical Degradation Data Environments 6 (12) 124 doi:10.3390/environments6120124 +
    +Ranke J, Wöltjen J, Meinecke S (2018) Comparison of software tools for kinetic evaluation of chemical degradation data Environmental Sciences Europe 30 17 doi:10.1186/s12302-018-0145-1 +
    +Von Götz N, Nörtersheuser P, Richter O (1999) Population based analysis of pesticide kinetics Chemosphere 38 7 doi:10.1016/S0045-6535(98)00388-9 +
    +
    +
    +

    Development +

    +

    Contributions are welcome!

    +
    +
    +
    +
    + + +
    + + + +
    +
    + + + + + + + diff --git a/docs/dev/katex-auto.js b/docs/dev/katex-auto.js new file mode 100644 index 00000000..20651d9f --- /dev/null +++ b/docs/dev/katex-auto.js @@ -0,0 +1,14 @@ +// https://github.com/jgm/pandoc/blob/29fa97ab96b8e2d62d48326e1b949a71dc41f47a/src/Text/Pandoc/Writers/HTML.hs#L332-L345 +document.addEventListener("DOMContentLoaded", function () { + var mathElements = document.getElementsByClassName("math"); + var macros = []; + for (var i = 0; i < mathElements.length; i++) { + var texText = mathElements[i].firstChild; + if (mathElements[i].tagName == "SPAN") { + katex.render(texText.data, mathElements[i], { + displayMode: mathElements[i].classList.contains("display"), + throwOnError: false, + macros: macros, + fleqn: false + }); + }}}); diff --git a/docs/dev/lightswitch.js b/docs/dev/lightswitch.js new file mode 100644 index 00000000..9467125a --- /dev/null +++ b/docs/dev/lightswitch.js @@ -0,0 +1,85 @@ + +/*! + * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under the Creative Commons Attribution 3.0 Unported License. + * Updates for {pkgdown} by the {bslib} authors, also licensed under CC-BY-3.0. + */ + +const getStoredTheme = () => localStorage.getItem('theme') +const setStoredTheme = theme => localStorage.setItem('theme', theme) + +const getPreferredTheme = () => { + const storedTheme = getStoredTheme() + if (storedTheme) { + return storedTheme + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' +} + +const setTheme = theme => { + if (theme === 'auto') { + document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')) + } else { + document.documentElement.setAttribute('data-bs-theme', theme) + } +} + +function bsSetupThemeToggle () { + 'use strict' + + const showActiveTheme = (theme, focus = false) => { + var activeLabel, activeIcon; + + document.querySelectorAll('[data-bs-theme-value]').forEach(element => { + const buttonTheme = element.getAttribute('data-bs-theme-value') + const isActive = buttonTheme == theme + + element.classList.toggle('active', isActive) + element.setAttribute('aria-pressed', isActive) + + if (isActive) { + activeLabel = element.textContent; + activeIcon = element.querySelector('span').classList.value; + } + }) + + const themeSwitcher = document.querySelector('#dropdown-lightswitch') + if (!themeSwitcher) { + return + } + + themeSwitcher.setAttribute('aria-label', activeLabel) + themeSwitcher.querySelector('span').classList.value = activeIcon; + + if (focus) { + themeSwitcher.focus() + } + } + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { + const storedTheme = getStoredTheme() + if (storedTheme !== 'light' && storedTheme !== 'dark') { + setTheme(getPreferredTheme()) + } + }) + + window.addEventListener('DOMContentLoaded', () => { + showActiveTheme(getPreferredTheme()) + + document + .querySelectorAll('[data-bs-theme-value]') + .forEach(toggle => { + toggle.addEventListener('click', () => { + const theme = toggle.getAttribute('data-bs-theme-value') + setTheme(theme) + setStoredTheme(theme) + showActiveTheme(theme, true) + }) + }) + }) +} + +setTheme(getPreferredTheme()); +bsSetupThemeToggle(); diff --git a/docs/dev/link.svg b/docs/dev/link.svg new file mode 100644 index 00000000..88ad8276 --- /dev/null +++ b/docs/dev/link.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/docs/dev/news/index.html b/docs/dev/news/index.html new file mode 100644 index 00000000..5e420fb4 --- /dev/null +++ b/docs/dev/news/index.html @@ -0,0 +1,675 @@ + +Changelog • mkin + Skip to contents + + +
    +
    +
    + +
    +

    mkin 1.2.9.9000 (unreleased)

    +
    +
    +

    mkin 1.2.9 (2024-02-13)

    +
    • ‘R/plot.mixed.R’: Support more than 25 datasets

    • +
    • ‘R/mkinfit.R’: Support passing the observed data as a ‘tibble’

    • +
    • ‘R/parplot.R’: Support multistart objects with covariate models and filter negative values of scaled parameters (with a warning) for plotting.

    • +
    • ’R/create_deg_func.R: Make sure that no reversible reactions are specified in the case of two observed variables, as this is not supported

    • +
    +
    +

    mkin 1.2.8 (unreleased)

    +
    • ‘R/{mhmkin,status}.R’: Deal with ‘saem’ fits that fail when updating an ‘mhmkin’ object
    • +
    +
    +

    mkin 1.2.7 (unreleased)

    +
    • ‘R/illparms.R’: Fix a bug that prevented an ill-defined random effect to be found if there was only one random effect in the model. Also add a test for this.
    • +
    +
    +

    mkin 1.2.6 (2023-10-14)

    +
    • ‘inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd’: Fix an erroneous call to the ‘endpoints()’ function
    • +
    +
    +

    mkin 1.2.5 (2023-08-09)

    +
    • ‘vignettes/mesotrione_parent_2023.rnw’: Prebuilt vignette showing how covariate modelling can be done for all relevant parent degradation models.

    • +
    • ‘inst/testdata/mesotrione_soil_efsa_2016}.xlsx’: Another example spreadsheets for use with ‘read_spreadsheet()’, featuring pH dependent degradation

    • +
    • R/illparms.R: Fix the detection of ill-defined slope or error model parameters for the case that the estimate is negative

    • +
    +
    +

    mkin 1.2.4 (2023-05-19)

    +
    • R/endpoints.R: Fix the calculation of endpoints for user specified covariate values
    • +
    +
    +

    mkin 1.2.3.1 (unreleased)

    +
    • Small fixes to get the online docs right (example code in R/hierarchical_kinetics, cluster setup in cyantraniliprole and dmta pathway vignettes, graphics and model comparison in multistart vignette), rebuild online docs
    • +
    +
    +

    mkin 1.2.3 (2023-04-17)

    +
    • ‘R/{endpoints,parms,plot.mixed.mmkin,summary.saem.mmkin}.R’: Calculate parameters and endpoints and plot population curves for specific covariate values, or specific percentiles of covariate values used in saem fits.

    • +
    • Depend on current deSolve version with the possibility to avoid resolving symbols in a shared library (compiled models) over and over, thanks to Thomas Petzoldt.

    • +
    • ‘inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd’: Start a new cluster after creating a model stored in the user specified location, because otherwise symbols are not found by the worker processes.

    • +
    • ‘tests/testthat/test_compiled_symbols.R’: Some new tests to control problems that may have been introduced by the possibility to use pre-resolved symbols.

    • +
    • ‘R/mkinerrmin.R’: Fix typo in subset (use of = instead of ==), thanks to Sebastian Meyer for spotting this during his work on R 4.3.0.

    • +
    +
    +

    mkin 1.2.2 (unreleased)

    +
    • ‘inst/rmarkdown/templates/hierarchical_kinetics’: R markdown template to facilitate the application of hierarchical kinetic models.

    • +
    • ‘inst/testdata/{cyantraniliprole_soil_efsa_2014,lambda-cyhalothrin_soil_efsa_2014}.xlsx’: Example spreadsheets for use with ‘read_spreadsheet()’.

    • +
    • ‘R/mhmkin.R’: Allow an ‘illparms.mhmkin’ object or a list with suitable dimensions as value of the argument ‘no_random_effects’, making it possible to exclude random effects that were ill-defined in simpler variants of the set of degradation models. Remove the possibility to exclude random effects based on separate fits, as it did not work well.

    • +
    • ‘R/summary.saem.mmkin.R’: List all initial parameter values in the summary, including random effects and error model parameters. Avoid redundant warnings that occurred in the calculation of correlations of the fixed effects in the case that the Fisher information matrix could not be inverted. List correlations of random effects if specified by the user in the covariance model.

    • +
    • ‘R/parplot.R’: Possibility to select the top ‘llquant’ fraction of the fits for the parameter plots, and improved legend text.

    • +
    • ‘R/illparms.R’: Also check if confidence intervals for slope parameters in covariate models include zero. Only implemented for fits obtained with the saemix backend.

    • +
    • ‘R/parplot.R’: Make the function work also in the case that some of the multistart runs failed.

    • +
    • ‘R/intervals.R’: Include correlations of random effects in the model in case there are any.

    • +
    +
    +

    mkin 1.2.1 (2022-11-19)

    +
    • ‘{data,R}/ds_mixed.rda’: Include the test data in the package instead of generating it in ‘tests/testthat/setup_script.R’. Refactor the generating code to make it consistent and update tests.

    • +
    • ‘tests/testthat/setup_script.R’: Excluded another ill-defined random effect for the DFOP fit with ‘saem’, in an attempt to avoid a platform dependence that surfaced on Fedora systems on the CRAN check farm

    • +
    • ‘tests/testthat/test_mixed.R’: Round parameters found by saemix to two significant digits before printing, to also help to avoid platform dependence of tests

    • +
    • ‘R/saem.R’: Fix a bug that prevented that ‘error.ini’ is passed to ‘saemix_model’, and set default to c(1, 1) to avoid changing test results

    • +
    • ‘R/parplot.R’: Show initial values for error model parameters

    • +
    • ‘R/loglik.mkinfit.R’: Add ‘nobs’ attribute to the resulting ‘logLik’ object, in order to make test_AIC.R succeed on current R-devel

    • +
    +
    +

    mkin 1.2.0 (2022-11-17)

    +
    • ‘R/saem.R’: ‘logLik’, ‘update’ and ‘anova’ methods for ‘saem.mmkin’ objects.

    • +
    • ‘R/saem.R’: Automatic estimation of start parameters for random effects for the case of mkin transformations, nicely improving convergence and reducing problems with iterative ODE solutions.

    • +
    • ‘R/status.R’: New generic to show status information for fit array objects with methods for ‘mmkin’, ‘mhmkin’ and ‘multistart’ objects.

    • +
    • ‘R/mhmkin.R’: New method for performing multiple hierarchical mkin fits in one function call, optionally in parallel.

    • +
    • ‘R/mhmkin.R’: ‘anova.mhmkin’ for conveniently comparing the resulting fits.

    • +
    • ‘R/illparms.R’: New generic to show ill-defined parameters with methods for ‘mkinfit’, ‘mmkin’, ‘saem.mmkin’ and ‘mhmkin’ objects.

    • +
    • ‘R/multistart.R’: New method for testing multiple start parameters for hierarchical model fits, with function ‘llhist’ and new generic ‘parplot’ for diagnostics, and new generics ‘which.best’ and ‘best’ for extracting the fit with the highest likelihood

    • +
    • ‘R/summary.mmkin.R’: Summary method for mmkin objects.

    • +
    • ‘R/saem.R’: Implement and test saemix transformations for FOMC and HS. Also, error out if saemix transformations are requested but not supported.

    • +
    • ‘R/read_spreadsheet.R’: Conveniently read in data from a spreadsheet file.

    • +
    • ‘R/tex_listings.R’: Conveniently include summaries of fit objects in R markdown documents that are compiled to LaTeX.

    • +
    +
    +

    mkin 1.1.1 (2022-07-12)

    +
    • ’R/{mkinmod,mkinpredict}.R: Store DLL information in mkinmod objects and use that information in mkinpredict to avoid a performance regression brought by a bugfix in R 4.2.x. Thanks to Tomas Kalibera for his analysis of the problem on the r-package-devel list and his suggestion on how to fix it.

    • +
    • ‘vignettes/FOCUS_L.rmd’: Remove an outdated note referring to a failure to calculate the covariance matrix for DFOP with the L2 dataset. Since 0.9.45.5 the covariance matrix is available

    • +
    • ‘vignettes/web_only/benchmarks.rmd’: Add the first benchmark data using my laptop system, therefore add the CPU when showing the benchmark results.

    • +
    • ‘dimethenamid_2018’: Update example code to use saemix

    • +
    • ‘CAKE_export’: Check for validity of the map argument, updates

    • +
    • ‘saem()’: Slightly improve speed in the case that no analytical solution for saemix is implemented, activate a test of the respective code

    • +
    • ‘mean_degparms’: New argument ‘default_log_parms’ that makes it possible to supply a surrogate value (default) for log parameters that fail the t-test

    • +
    • ‘plot.mixed.mmkin’: Pass the frame argument also to residual plots, take the ‘default_log_parms’ argument for ‘mean_degparms’ used for constructing approximate population curves, plot population curve last to avoid that it is covered by data

    • +
    • ‘plot.mkinfit’: Respect argument ‘maxabs’ for residual plots, and make it possible to give ylim as a list, for row layouts

    • +
    +
    +

    mkin 1.1.0 (2022-03-14)

    +
    +

    Mixed-effects models

    +
    • Reintroduce the interface to saemix version 3.0 (now on CRAN), in particular the generic function ‘saem’ with a generator ‘saem.mmkin’, currently using ‘saemix_model’ and ‘saemix_data’, summary and plot methods

    • +
    • ‘mean_degparms’: New argument ‘test_log_parms’ that makes the function only consider log-transformed parameters where the untransformed parameters pass the t-test for a certain confidence level. This can be used to obtain more plausible starting parameters for the different mixed-effects model backends

    • +
    • ‘plot.mixed.mmkin’: Gains arguments ‘test_log_parms’ and ‘conf.level’

    • +
    • ‘vignettes/web_only/dimethenamid_2018.rmd’: Example evaluations of the dimethenamid data.

    • +
    • ‘intervals’: Provide a method of this nlme function for ‘saem.mmkin’ objects.

    • +
    +
    +
    +

    mkin 1.0.5 (2021-09-15)

    +
    • ‘dimethenamid_2018’: Correct the data for the Borstel soil. The five observations from Staudenmaier (2013) that were previously stored as “Borstel 2” are actually just a subset of the 16 observations in “Borstel 1” which is now simply “Borstel”
    • +
    +
    +

    mkin 1.0.4 (2021-04-20)

    +
    • All plotting functions setting graphical parameters: Use on.exit() for resetting graphical parameters

    • +
    • ‘plot.mkinfit’: Use xlab and xlim for the residual plot if show_residuals is TRUE

    • +
    • ‘mmkin’: Use cores = 1 per default on Windows to make it easier for first time users

    • +
    +
    +

    mkin 1.0.3 (2021-02-15)

    +
    • Review and update README, the ‘Introduction to mkin’ vignette and some of the help pages
    • +
    +
    +

    mkin 1.0.2 (Unreleased)

    +
    • ‘mkinfit’: Keep model names stored in ‘mkinmod’ objects, avoiding their loss in ‘gmkin’
    • +
    +
    +

    mkin 1.0.1 (2021-02-10)

    +
    • ‘confint.mmkin’, ‘nlme.mmkin’, ‘transform_odeparms’: Fix example code in dontrun sections that failed with current defaults

    • +
    • ‘logLik.mkinfit’: Improve example code to avoid warnings and show convenient syntax

    • +
    • ‘mkinresplot’: Re-add Katrin Lindenberger as coauthor who was accidentally removed long ago

    • +
    • Remove tests relying on non-convergence of the FOMC fit to the FOCUS A dataset as this is platform dependent (revealed by the new additional tests on CRAN, thanks!)

    • +
    • Increase test tolerance for some parameter comparisons that also proved to be platform dependent

    • +
    +
    +

    mkin 1.0.0 (2021-02-03)

    +
    +

    General

    +
    • ‘mkinmod’ models gain arguments ‘name’ and ‘dll_dir’ which, in conjunction with a current version of the ‘inline’ package, make it possible to still use the DLL used for fast ODE solutions with ‘deSolve’ after saving and restoring the ‘mkinmod’ object.

    • +
    • ‘mkindsg’ R6 class for groups of ‘mkinds’ datasets with metadata

    • +
    • ‘f_norm_temp_focus’ generic function to normalise time intervals using the FOCUS method, with methods for numeric vectors and ‘mkindsg’ objects

    • +
    • ‘D24_2014’ and ‘dimethenamid_2018’ datasets

    • +
    • ‘focus_soil_moisture’ FOCUS default soil moisture data

    • +
    • ‘update’ method for ‘mmkin’ objects

    • +
    • ‘transform_odeparms’, ‘backtransform_odeparms’: Use logit transformation for solitary fractions like the g parameter of the DFOP model, or formation fractions for a pathway to only one target variable

    • +
    • ‘plot.mmkin’: Add a ylab argument, making it possible to customize the y axis label of the panels on the left without affecting the residual plots. Reduce legend size and vertical distance between panels

    • +
    • ‘plot.mkinfit’: Change default ylab from “Observed” to “Residue”. Pass xlab to residual plot if show_residuals is TRUE.

    • +
    +
    +

    Mixed-effects models

    +
    • ‘mixed.mmkin’ New container for mmkin objects for plotting with the ‘plot.mixed.mmkin’ method

    • +
    • ‘plot.mixed.mmkin’ method used for ‘nlme.mmkin’ inheriting from ‘mixed.mmkin’ (currently virtual)

    • +
    • ‘plot’, ‘summary’ and ‘print’ methods for ‘nlme.mmkin’ objects

    • +
    +
    +
    +

    mkin 0.9.50.3 (2020-10-08)

    +
    • ‘parms’: Add a method for mmkin objects

    • +
    • ‘mmkin’ and ‘confint(method = ’profile’): Use all cores detected by parallel::detectCores() per default

    • +
    • ‘confint(method = ’profile’): Choose accuracy based on ‘rel_tol’ argument, relative to the bounds obtained by the quadratic approximation

    • +
    • ‘mkinfit’: Make ‘use_of_ff’ = “max” also the default for models specified using short names like “SFO” or “FOMC”

    • +
    • ‘mkinfit’: Run ‘stats::shapiro.test()’ on standardized residuals and warn if p < 0.05

    • +
    • ‘mkinfit’: ‘error_model_algorithm’ = ‘d_3’ does not fail if direct fitting fails, but reports that the results for the threestep algorithm are returned

    • +
    • ‘mmkin’: Do not fail any more if one of the fits fails, but assign the try-error to the respective position in the mmkin object

    • +
    • ‘mkinfit’: Ignore components of state.ini that do not correspond to state variables in the model

    • +
    • ‘endpoints’: Back-calculate DT50 value from DT90 also for the biphasic models DFOP, HS and SFORB

    • +
    +
    +

    mkin 0.9.50.2 (2020-05-12)

    +
    • Increase tolerance for a platform specific test results on the Solaris test machine on CRAN

    • +
    • Updates and corrections (using the spelling package) to the documentation

    • +
    +
    +

    mkin 0.9.50.1 (2020-05-11)

    +
    • Support SFORB with formation fractions

    • +
    • ‘mkinmod’: Make ‘use_of_ff’ = “max” the default

    • +
    • Improve performance by a) avoiding expensive calls in the cost function like merge() and data.frame(), and b) by implementing analytical solutions for SFO-SFO and DFOP-SFO

    • +
    +
    +

    mkin 0.9.49.11 (2020-04-20)

    +
    • Increase a test tolerance to make it pass on all CRAN check machines
    • +
    +
    +

    mkin 0.9.49.10 (2020-04-18)

    +
    • ‘nlme.mmkin’: An nlme method for mmkin row objects and an associated S3 class with print, plot, anova and endpoint methods

    • +
    • ‘mean_degparms, nlme_data, nlme_function’: Three new functions to facilitate building nlme models from mmkin row objects

    • +
    • ‘endpoints’: Don’t return the SFORB list component if it’s empty. This reduces distraction and complies with the documentation

    • +
    • Article in compiled models: Add some platform specific code and suppress warnings about zero values being removed from the FOCUS D dataset

    • +
    • ‘plot.mmkin’: Add the argument ‘standardized’ to avoid warnings that occurred when it was passed as part of the additional arguments captured by the dots (…)

    • +
    • ‘summary.mkinfit’: Add AIC, BIC and log likelihood to the summary

    • +
    +
    +

    mkin 0.9.49.9 (2020-03-31)

    +
    • ‘mkinmod’: Use pkgbuild::has_compiler instead of Sys.which(‘gcc’), as the latter will often fail even if Rtools are installed

    • +
    • ‘mkinds’: Use roxygen for documenting fields and methods of this R6 class

    • +
    +
    +

    mkin 0.9.49.8 (2020-01-09)

    +
    • ‘aw’: Generic function for calculating Akaike weights, methods for mkinfit objects and mmkin columns

    • +
    • ‘loftest’: Add a lack-of-fit test

    • +
    • ‘plot_res’, ‘plot_sep’ and ‘mkinerrplot’: Add the possibility to show standardized residuals and make it the default for fits with error models other than ‘const’

    • +
    • ‘lrtest.mkinfit’: Improve naming of the compared fits in the case of fixed parameters

    • +
    • ‘confint.mkinfit’: Make the quadratic approximation the default, as the likelihood profiling takes a lot of time, especially if the fit has more than three parameters

    • +
    +
    +

    mkin 0.9.49.7 (2019-11-01)

    +
    • Fix a bug introduced in 0.9.49.6 that occurred if the direct optimisation yielded a higher likelihood than the three-step optimisation in the d_3 algorithm, which caused the fitted parameters of the three-step optimisation to be returned instead of the parameters of the direct optimisation

    • +
    • Add a ‘nobs’ method for mkinfit objects, enabling the default ‘BIC’ method from the stats package. Also, add a ‘BIC’ method for mmkin column objects.

    • +
    +
    +

    mkin 0.9.49.6 (2019-10-31)

    +
    • Implement a likelihood ratio test as a method for ‘lrtest’ from the lmtest package

    • +
    • Add an ‘update’ method for mkinfit objects which remembers fitted parameters if appropriate

    • +
    • Add a ‘residuals’ method for mkinfit objects that supports scaling based on the error model

    • +
    • Fix a bug in ‘mkinfit’ that prevented summaries of objects fitted with fixed parameters to be generated

    • +
    • Add ‘parms’ and ‘confint’ methods for mkinfit objects. Confidence intervals based on the quadratic approximation as in the summary, and based on the profile likelihood

    • +
    • Move long-running tests to tests/testthat/slow with a separate test log. They currently take around 7 minutes on my system

    • +
    • ‘mkinfit’: Clean the code and return functions to calculate the log-likelihood and the sum of squared residuals

    • +
    • Vignette ‘twa.html’: Add the maximum time weighted average formulas for the hockey stick model

    • +
    • Support frameless plots (‘frame = FALSE’)

    • +
    • Support to suppress the chi2 error level (‘show_errmin = FALSE’) in ‘plot.mmkin’

    • +
    • Update README and the introductory vignette

    • +
    • Report ‘OLS’ as error_model_algorithm in the summary in the case that the default error_model (‘const’) is used

    • +
    • Support summarizing ‘mkinfit’ objects generated with versions < 0.9.49.5

    • +
    +
    +

    mkin 0.9.49.5 (2019-07-04)

    +
    • Several algorithms for minimization of the negative log-likelihood for non-constant error models (two-component and variance by variable). In the case the error model is constant variance, least squares is used as this is more stable. The default algorithm ‘d_3’ tries direct minimization and a three-step procedure, and returns the model with the highest likelihood.

    • +
    • The argument ‘reweight.method’ to mkinfit and mmkin is now obsolete, use ‘error_model’ and ‘error_model_algorithm’ instead

    • +
    • Add a test that checks if we get the best known AIC for parent only fits to 12 test datasets. Add these test datasets for this purpose.

    • +
    • New function ‘mkinerrplot’. This function is also used for residual plots in ‘plot.mmkin’ if the argument ‘resplot = “errmod”’ is given, and in ‘plot.mkinfit’ if ‘show_errplot’ is set to TRUE.

    • +
    • Remove dependency on FME, only use nlminb for optimisation (‘Port’ algorithm). I cannot remember cases where one of the other optimisation algorithms was preferable, except that I sometime used Levenberg-Marquardt for speed in cases where I did not expect to get trapped in a local minimum.

    • +
    • Use the numDeriv package to calculate hessians. This results in slightly different confidence intervals, takes a bit longer, but is apparently more robust

    • +
    • Add a simple benchmark vignette to document the impact on performance.

    • +
    • The code for manual weighting was removed. This functionality might get added again at a later time. For the time being, please use an earlier version, e.g. 0.9.48.1 if you want to do manual weighting.

    • +
    • The fitting time reported in the summary now includes the time used for calculation of the hessians

    • +
    • Adapt tests

    • +
    • Fix an error in the FOCUS chi2 error level calculations that occurred if parameters were specified in parms.ini that were not in the model. A warning was already issued, but when fitting in parallel via mmkin this could go unnoticed.

    • +
    • Add example datasets obtained from risk assessment reports published by the European Food Safety Agency.

    • +
    +
    +

    mkin 0.9.48.1 (2019-03-04)

    +
    • Add the function ‘logLik.mkinfit’ which makes it possible to calculate an AIC for mkinfit objects

    • +
    • Add the function ‘AIC.mmkin’ to make it easy to compare columns of mmkin objects

    • +
    • ‘add_err’: Respect the argument giving the number of replicates in the synthetic dataset

    • +
    • ‘max_twa_parent’: Support maximum time weighted average concentration calculations for the hockey stick (HS) model

    • +
    • ‘mkinpredict’: Make the function generic and create a method for mkinfit objects

    • +
    • ‘mkinfit’: Improve the correctness of the fitted two component error model by fitting the mean absolute deviance at each observation against the observed values, weighting with the current two-component error model

    • +
    • ‘tests/testthat/test_irls.R’: Test if the components of the error model used to generate the data can be reproduced with moderate accuracy

    • +
    • Add the function ‘CAKE_export’ to facilitate cross-checking of results

    • +
    • Implement the logistic model (only tested for parent fits)

    • +
    • ‘nafta’: Add evaluations according to the NAFTA guidance

    • +
    +
    +

    mkin 0.9.47.5 (2018-09-14)

    +
    • Make the two-component error model stop in cases where it is inadequate to avoid nls crashes on windows

    • +
    • Move two vignettes to a location where they will not be built on CRAN (to avoid more NOTES from long execution times)

    • +
    • Exclude more example code from testing on CRAN to avoid NOTES from long execution times

    • +
    +
    +

    mkin 0.9.47.3

    +
    • ‘mkinfit’: Improve fitting the error model for reweight.method = ‘tc’. Add ‘manual’ to possible arguments for ‘weight’

    • +
    • Test that FOCUS_2006_C can be evaluated with DFOP and reweight.method = ‘tc’

    • +
    +
    +

    mkin 0.9.47.2 (2018-07-19)

    +
    • ‘sigma_twocomp’: Rename ‘sigma_rl’ to ‘sigma_twocomp’ as the Rocke and Lorenzato model assumes lognormal distribution for large y. Correct references to the Rocke and Lorenzato model accordingly.

    • +
    • ‘mkinfit’: Use 1.1 as starting value for N parameter of IORE models to obtain convergence in more difficult cases. Show parameter names when ‘trace_parms’ is ‘TRUE’.

    • +
    +
    +

    mkin 0.9.47.1 (2018-02-06)

    +
    • Skip some tests on CRAN and winbuilder to avoid timeouts

    • +
    • ‘test_data_from_UBA_2014’: Added this list of datasets containing experimental data used in the expertise from 2014

    • +
    • ‘mkinfit’: Added the iterative reweighting method ‘tc’ using the two-component error model from Rocke and Lorenzato. NA values in the data are not returned any more.

    • +
    • ‘mkinfit’: Work around a bug in the current FME version that prevented the convergence message to be returned in the case of non-convergence.

    • +
    • ‘summary.mkinfit’: Improved output regarding weighting method. No predictions are returned for NA values in the model (see above).

    • +
    • ‘summary.mkinfit’: Show versions of mkin and R used for fitting (not the ones used for the summary) if the fit was generated with mkin >= 0.9.47.1

    • +
    +
    +

    mkin 0.9.46.3 (2017-11-16)

    +
    • README.md, vignettes/mkin.Rmd: URLs were updated

    • +
    • synthetic_data_for_UBA: Add the code used to generate the data in the interest of reproducibility

    • +
    +
    +

    mkin 0.9.46.2 (2017-10-10)

    +
    • Converted the vignette FOCUS_Z from tex/pdf to markdown/html

    • +
    • DESCRIPTION: Add ORCID

    • +
    +
    +

    mkin 0.9.46.1 (2017-09-14)

    +
    • plot.mkinfit: Fix scaling of residual plots for the case of separate plots for each observed variable

    • +
    • plot.mkinfit: Use all data points of the fitted curve for y axis scaling for the case of separate plots for each observed variable

    • +
    • Documentation updates

    • +
    +
    +

    mkin 0.9.46 (2017-07-24)

    +
    • Remove test_FOMC_ill-defined.R as it is too platform dependent
    • +
    +
    +

    mkin 0.9.45.2 (2017-07-24)

    +
    • Rename twa to max_twa_parent to avoid conflict with twa from my pfm package

    • +
    • Update URLs in documentation

    • +
    • Limit test code to one core to pass on windows

    • +
    • Switch from microbenchmark to rbenchmark as the former is not supported on all platforms

    • +
    +
    +

    mkin 0.9.45.1 (2016-12-20)

    +
    +

    New features

    +
    • A twa function, calculating maximum time weighted average concentrations for the parent (SFO, FOMC and DFOP).
    • +
    +
    +
    +

    mkin 0.9.45 (2016-12-08)

    +
    +

    Minor changes

    +
    • plot.mkinfit and plot.mmkin: If the plotting device is tikz, LaTeX markup is being used for the chi2 error in the graphs.

    • +
    • Use pkgdown, the successor of staticdocs for generating static HTML documentation. Include example output and graphs also for dontrun sections.

    • +
    • plot.mkinfit: Plotting does not fail any more when the compiled model is not available, e.g. because it was removed from the temporary directory. In this case, the uncompiled model is now used for plotting

    • +
    +
    +
    +

    mkin 0.9.44 (2016-06-29)

    +
    +

    Bug fixes

    +
    • The test test_FOMC_ill-defined failed on several architectures, so the test is now skipped
    • +
    +
    +
    +

    mkin 0.9.43 (2016-06-28)

    +
    +

    Major changes

    +
    • The title was changed to Kinetic evaluations of chemical degradation data

    • +
    • plot.mkinfit: Add the possibility to show fits (and residual plots if requested) separately for the observed variables

    • +
    • plot.mkinfit: Add the possibility to show the chi2 error levels in the plot, similar to the way they are shown in plot.mmkin

    • +
    • plot_sep: Add this function as a convenience wrapper for plotting observed variables of mkinfit objects separately, with chi2 error values and residual plots.

    • +
    • Vignettes: The main vignette mkin was converted to R markdown and updated. The other vignettes were also updated to show current improved functionality.

    • +
    • The function add_err was added to the package, making it easy to generate simulated data using an error model based on the normal distribution

    • +
    +
    +

    Minor changes

    +
    • Remove an outdated reference to the inline package in the compiled_models vignette

    • +
    • mkinfit: Do not error out in cases where the fit converges, but the Jacobian for the untransformed model cost can not be estimated. Give a warning instead and return NA for the t-test results.

    • +
    • summary.mkinfit: Give a warning message when the covariance matrix can not be obtained.

    • +
    • A test has been added to containing a corresponding edge case to check that the warnings are correctly issued and the fit does not terminate.

    • +
    • plot.mmkin: Round the chi2 error value to three significant digits, instead of two decimal digits.

    • +
    • mkinfit: Return the err values used on weighted fits as a column named err. Also include these inverse weights when the column value in the observed data is used, which is returned as observed in the data component of the mkinfit object.

    • +
    +
    +

    Bug fixes

    +
    • endpoints: When the name of a substance degrading to a metabolite (e.g. a parent compound) used in the model formulation ended in the letter f, some rate parameters could be listed as formation fractions with mixed up names. These would also appear in the summary.

    • +
    • mkinfit: Check for all observed variables when checking if the user tried to fix formation fractions when fitting them using ilr transformation.

    • +
    • plot.mmkin: Set the plot margins correctly, also in the case of a single fit to be plotted, so the main title is placed in a reasonable way.

    • +
    • plot.mkinfit: Correct default values for col_obs, pch_obs and lty_obs for the case that obs_vars is specified.

    • +
    +
    +
    +

    mkin 0.9.42 (2016-03-25)

    +
    +

    Major changes

    +
    • Add the argument from_max_mean to mkinfit, for fitting only the decline from the maximum observed value for models with a single observed variable
    • +
    +
    +

    Minor changes

    +
    • Add plots to compiled_models vignette

    • +
    • Give an explanatory error message when mkinmod fails due to a missing definition of a target variable

    • +
    • print.mkinmod(): Improve formatting when printing mkinmod model definitions

    • +
    +
    +
    +

    mkin 0.9-41 (2015-11-09)

    +
    +

    Minor changes

    +
    • Add an R6 class mkinds representing datasets with a printing method

    • +
    • Add a printing method for mkinmod objects

    • +
    • Make it possible to specify arbitrary strings as names for the compounds in mkinmod, and show them in the plot

    • +
    • Use an index.r file to group help topics in static documentation

    • +
    +
    +

    Bug fixes

    +
    • +print.summary.mkinfit(): Avoid an error that occurred when printing summaries generated with mkin versions before 0.9-36
    • +
    +
    +
    +

    mkin 0.9-40 (2015-07-21)

    +
    +

    Bug fixes

    +
    • +endpoints(): For DFOP and SFORB models, where optimize() is used, make use of the fact that the DT50 must be between DT50_k1 and DT50_k2 (DFOP) or DT50_b1 and DT50_b2 (SFORB), as optimize() sometimes did not find the minimum. Likewise for finding DT90 values. Also fit on the log scale to make the function more efficient.
    • +
    +
    +

    Internal changes

    +
    • +DESCRIPTION, NAMESPACE, R/*.R: Import (from) stats, graphics and methods packages, and qualify some function calls for non-base packages installed with R to avoid NOTES made by R CMD check –as-cran with upcoming R versions.
    • +
    +
    +
    +

    mkin 0.9-39 (2015-06-26)

    +
    +

    Major changes

    +
    • New function mmkin(): This function takes a character vector of model shorthand names, or alternatively a list of mkinmod models, as well as a list of dataset as main arguments. It returns a matrix of mkinfit objects, with a row for each model and a column for each dataset. A subsetting method with single brackets is available. Fitting the models in parallel using the parallel package is supported.

    • +
    • New function plot.mmkin(): Plots single-row or single-column mmkin objects including residual plots.

    • +
    +
    +

    Bug fixes

    +
    • +mkinparplot(): Fix the x axis scaling for rate constants and formation fractions that got confused by the introduction of the t-values of transformed parameters.
    • +
    +
    +
    +

    mkin 0.9-38 (2015-06-24)

    +
    +

    Minor changes

    +
    • vignettes/compiled_models.html: Show the performance improvement factor actually obtained when building the vignette, as well as mkin version, some system info and the CPU model used for building the vignette.

    • +
    • GNUMakefile,vignettes/*: Clean up vignette generation and include table of contents in HTML vignettes.

    • +
    +
    +

    Bug fixes

    +
    • +mkinmod(): When generating the C code for the derivatives, only declare the time variable when it is needed and remove the ‘-W-no-unused-variable’ compiler flag as the C compiler used in the CRAN checks on Solaris does not know it.
    • +
    +
    +
    +

    mkin 0.9-36 (2015-06-21)

    +
    +

    Major changes

    +
    • summary.mkinfit(): A one-sided t-test for significant difference of untransformed parameters from zero is now always shown, based on the assumption of normal distribution for estimators of all untransformed parameters. Use with caution, as this assumption is unrealistic e.g. for rate constants in these nonlinear kinetic models.

    • +
    • If a compiler (gcc) is installed, use a version of the differential equation model compiled from C code, which is a huge performance boost for models where only the deSolve method works.

    • +
    • mkinmod(): Create a list component $cf (of class CFuncList) in the list returned by mkinmod, if a version can be compiled from autogenerated C code (see above).

    • +
    • mkinfit(): Set the default solution_type to deSolve when a compiled version of the model is present, except when an analytical solution is possible.

    • +
    +
    +

    Minor changes

    +
    • Added a simple showcase vignette with an evaluation of FOCUS example dataset D
    • +
    +
    +
    +

    mkin 0.9-35 (2015-05-15)

    +
    +

    Major changes

    +
    • Switch from RUnit to testthat for testing
    • +
    +
    +

    Bug fixes

    +
    • mkinparplot(): Avoid warnings that occurred when not all confidence intervals were available in the summary of the fit

    • +
    • print.summary.mkinfit(): Fix printing the summary for the case that the number of iterations is not available

    • +
    • NAMESPACE: export S3 methods plot.mkinfit, summary.mkinfit and print.summary.mkinfit to satisfy R CMD check on R-devel

    • +
    • mkinparplot(): Avoid warning in R CMD check about undeclared global variable Lower

    • +
    +
    +

    New features

    +
    • mkinfit(): Report successful termination when quiet = FALSE. This is helpful for more difficult problems fitted with reweight.method = obs, as no progress is often indicated during the reweighting.

    • +
    • A first test using results established in the expertise written for the German Federal Environmental Agency (UBA) was added.

    • +
    • Add synthetic datasets generated for expertise written for the German Federal Environmental Agency UBA

    • +
    • Add tests based on these datasets

    • +
    +
    +
    +

    mkin 0.9-34 (2014-11-22)

    +
    +

    New features

    +
    • Add the convenience function mkinsub() for creating the lists used in mkinmod()

    • +
    • Add the possibility to fit indeterminate order rate equation (IORE) models using an analytical solution (parent only) or a numeric solution. Paths from IORE compounds to metabolites are supported when using formation fractions (use_of_ff = ‘max’). Note that the numerical solution (method.ode = ‘deSolve’) of the IORE differential equations sometimes fails due to numerical problems.

    • +
    • Switch to using the Port algorithm (using a model/trust region approach) per default. While needing more iterations than the Levenberg-Marquardt algorithm previously used per default, it is less sensitive to starting parameters.

    • +
    +
    +

    Minor changes

    +
    • The formatting of differential equations in the summary was further improved

    • +
    • Always include 0 on y axis when plotting during the fit

    • +
    +
    +
    +

    mkin 0.9-33 (2014-10-22)

    +
    +

    New features

    +
    • The initial value (state.ini) for the observed variable with the highest observed residue is set to 100 in case it has no time zero observation and state.ini = "auto"

    • +
    • A basic unit test for mkinerrmin() was written

    • +
    +
    +

    Bug fixes

    +
    • mkinfit(): The internally fitted parameter for g was named g_ilr even when transform_fractions=FALSE

    • +
    • mkinfit(): The initial value (state.ini) for the parent compound was not set when the parent was not the (only) variable with the highest value in the observed data.

    • +
    • mkinerrmin(): When checking for degrees of freedom for metabolites, check if their time zero value is fixed instead of checking if the observed value is zero. This ensures correct calculation of degrees of freedom also in cases where the metabolite residue at time zero is greater zero.

    • +
    • plot.mkinfit(): Avoid a warning message about only using the first component of ylim that occurred when ylim was specified explicitly

    • +
    +
    +

    Minor changes

    +
    • The formatting of differential equations in the summary was improved by wrapping overly long lines

    • +
    • The FOCUS_Z vignette was rebuilt with the above improvement and using a width of 70 to avoid output outside of the grey area

    • +
    • print.summary.mkinfit(): Avoid a warning that occurred when gmkin showed summaries of initial fits without iterations

    • +
    • mkinfit(): Avoid a warning that occurred when summarising a fit that was performed with maxitmodFit = 0 as done in gmkin for configuring new fits.

    • +
    +
    +
    +

    mkin 0.9-32 (2014-07-24)

    +
    +

    New features

    +
    • The number of degrees of freedom is difficult to define in the case of ilr transformation of formation fractions. Now for each source compartment the number of ilr parameters (=number of optimised parameters) is divided by the number of pathways to metabolites (=number of affected data series) which leads to fractional degrees of freedom in some cases.

    • +
    • The default for the initial value for the first state value is now taken from the mean of the observations at time zero, if available.

    • +
    • The kinetic model can alternatively be specified with a shorthand name for parent only degradation models, e.g. SFO, or DFOP.

    • +
    • Optimisation method, number of model evaluations and time elapsed during optimisation are given in the summary of mkinfit objects.

    • +
    • The maximum number of iterations in the optimisation algorithm can be specified using the argument maxit.modFit to the mkinfit function.

    • +
    • mkinfit gives a warning when the fit does not converge (does not apply to SANN method). This warning is included in the summary.

    • +
    +
    +

    Bug fixes

    +
    • Avoid plotting an artificial 0 residual at time zero in mkinresplot

    • +
    • In the determination of the degrees of freedom in mkinerrmin, formation fractions were accounted for multiple times in the case of parallel formation of metabolites. See the new feature described above for the solution.

    • +
    • transform_rates=FALSE in mkinfit now also works for FOMC and HS models.

    • +
    • Initial values for formation fractions were not set in all cases.

    • +
    • No warning was given when the fit did not converge when a method other than the default Levenberg-Marquardt method Marq was used.

    • +
    +
    +

    Minor changes

    +
    • Vignettes were rebuilt to reflect the changes in the summary method.

    • +
    • Algorithm Pseudo was excluded because it needs user-defined parameter limits which are not supported.

    • +
    • Algorithm Newton was excluded because of its different way to specify the maximum number of iterations and because it does not appear to provide additional benefits.

    • +
    +
    +
    +

    mkin 0.9-31 (2014-07-14)

    +
    +

    Bug fixes

    +
    • The internal renaming of optimised parameters in Version 0.9-30 led to errors in the determination of the degrees of freedom for the chi2 error level calulations in mkinerrmin() used by the summary function.
    • +
    +
    +
    +

    mkin 0.9-30 (2014-07-11)

    +
    +

    New features

    +
    • It is now possible to use formation fractions in combination with turning off the sink in mkinmod().
    • +
    +
    +

    Major changes

    +
    • The original and the transformed parameters now have different names (e.g. k_parent and log_k_parent. They also differ in how many they are when we have formation fractions but no pathway to sink.

    • +
    • The order of some of the information blocks in print.summary.mkinfit.R() has been ordered in a more logical way.

    • +
    +
    +

    Minor changes

    +
    • The vignette FOCUS_Z has been simplified to use formation fractions with turning off the sink, and slightly amended to use the new versions of DT50 values calculated since mkin 0.9-29.

    • +
    • All vignettes have been rebuilt so they reflect all changes.

    • +
    • The ChangeLog was renamed to NEWS.md and the entries were converted to markdown syntax compatible with the tools::news() function built into R.

    • +
    • The test suite was overhauled. Tests of the DFOP and SFORB models with dataset FOCUS_2006_A were removed, as they were too much dependent on the optimisation algorithm and/or starting parameters, because the dataset is SFO (compare kinfit vignette).

    • +
    • Also, the Schaefer complex case can now be fitted using formation fractions, and with the ‘Port’ optimisation method we also fit A2 in the same way as published in the Piacenza paper.

    • +
    • Some more checks were introduced to mkinfit(), leading to warnings or stopping execution if unsupported combinations of methods and parameters are requested.

    • +
    +
    +
    +

    mkin 0.9-29 (2014-06-27)

    +
    • R/mkinresplot.R: Make it possible to specify xlim

    • +
    • R/geometric_mean.R, man/geometric_mean.Rd: Add geometric mean function

    • +
    • R/endpoints.R, man/endpoints.Rd: Calculate additional (pseudo)-DT50 values for FOMC, DFOP, HS and SFORB. Avoid calculation of formation fractions from rate constants when they are directly fitted

    • +
    +
    +

    mkin 0.9-28 (2014-05-20)

    +
    • Do not backtransform confidence intervals for formation fractions if more than one compound is formed, as such parameters only define the pathways as a set

    • +
    • Add historical remarks and some background to the main package vignette

    • +
    • Correct ‘isotropic’ into ‘isometric’ for the ilr transformation

    • +
    +
    +

    mkin 0.9-27 (2014-05-10)

    +
    • Fork the GUI into a separate package gmkin

    • +
    • DESCRIPTION, NAMESPACE, TODO: Adapt and add copyright information

    • +
    • Remove files belonging to the GUI

    • +
    • Possibility to fit without parameter transformations, using bounds as implemented in FME

    • +
    • Add McCall 2,4,5-T dataset

    • +
    • Enable selection of observed variables in plotting

    • +
    • Add possibility to show residual plot in plot.mkinfit

    • +
    • R/mkinparplot.R, man/mkinparplot.Rd: plot parameters with confidence intervals

    • +
    • Change vignette format from Sweave to knitr

    • +
    • Split examples vignette to FOCUS_L and FOCUS_Z

    • +
    • Remove warning about constant formation fractions in mkinmod as it was based on a misconception

    • +
    • Restrict the unit test with the Schaefer data to parent and primary metabolites as formation fraction and DT50 for A2 are highly correlated and passing the test is platform dependent. For example, the test fails in 1 out of 14 platforms on CRAN as of today.

    • +
    • Add Eurofins Regulatory AG copyright notices

    • +
    • Import FME and deSolve instead of depending on them to have clean startup

    • +
    • Add a starter function for the GUI: gmkin()

    • +
    • Change the format of the workspace files of gmkin so they can be distributed and documented in the package

    • +
    • Add gmkin workspace datasets FOCUS_2006_gmkin and FOCUS_2006_Z_gmkin

    • +
    +
    +

    mkin 0.9-24 (2013-11-06)

    +
    • Bugfix re-enabling the fixing of any combination of initial values for state variables

    • +
    • Default values for kinetic rate constants are not all 0.1 any more but are “salted” with a small increment to avoid numeric artefacts with the eigenvalue based solutions

    • +
    • Backtransform fixed ODE parameters for the summary

    • +
    +
    +

    mkin 0.9-22 (2013-10-26)

    +
    • Get rid of the optimisation step in mkinerrmin - this was unnecessary. Thanks to KinGUII for the inspiration - actually this is equation 6-2 in FOCUS kinetics p. 91 that I had overlooked originally

    • +
    • Fix plot.mkinfit as it passed graphical arguments like main to the solver

    • +
    • Do not use plot=TRUE in mkinfit() example

    • +
    • The first successful fits in the not so simple GUI

    • +
    • Fix iteratively reweighted least squares for the case of many metabolites

    • +
    • Unify naming of initial values of state variables

    • +
    • Unify naming in dataframes of optimised and fixed parameters in the summary

    • +
    • Show the weighting method for residuals in the summary

    • +
    • Correct the output of the data in the case of manual weighting

    • +
    • Implement IRLS assuming different variances for observed variables

    • +
    • Do not use 0 values at time zero for chi2 error level calculations. This is the way it is done in KinGUII and it makes sense. It does impact the chi2 error levels in the output. Generally they seem to be lower for metabolites now, presumably because the mean of the observed values is higher

    • +

    For a detailed list of changes to the mkin source please consult the commit history on http://github.com/jranke/mkin

    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/pkgdown.js b/docs/dev/pkgdown.js new file mode 100644 index 00000000..1a99c65f --- /dev/null +++ b/docs/dev/pkgdown.js @@ -0,0 +1,162 @@ +/* http://gregfranko.com/blog/jquery-best-practices/ */ +(function($) { + $(function() { + + $('nav.navbar').headroom(); + + Toc.init({ + $nav: $("#toc"), + $scope: $("main h2, main h3, main h4, main h5, main h6") + }); + + if ($('#toc').length) { + $('body').scrollspy({ + target: '#toc', + offset: $("nav.navbar").outerHeight() + 1 + }); + } + + // Activate popovers + $('[data-bs-toggle="popover"]').popover({ + container: 'body', + html: true, + trigger: 'focus', + placement: "top", + sanitize: false, + }); + + $('[data-bs-toggle="tooltip"]').tooltip(); + + /* Clipboard --------------------------*/ + + function changeTooltipMessage(element, msg) { + var tooltipOriginalTitle=element.getAttribute('data-bs-original-title'); + element.setAttribute('data-bs-original-title', msg); + $(element).tooltip('show'); + element.setAttribute('data-bs-original-title', tooltipOriginalTitle); + } + + if(ClipboardJS.isSupported()) { + $(document).ready(function() { + var copyButton = ""; + + $("div.sourceCode").addClass("hasCopyButton"); + + // Insert copy buttons: + $(copyButton).prependTo(".hasCopyButton"); + + // Initialize tooltips: + $('.btn-copy-ex').tooltip({container: 'body'}); + + // Initialize clipboard: + var clipboard = new ClipboardJS('[data-clipboard-copy]', { + text: function(trigger) { + return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, ""); + } + }); + + clipboard.on('success', function(e) { + changeTooltipMessage(e.trigger, 'Copied!'); + e.clearSelection(); + }); + + clipboard.on('error', function(e) { + changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy'); + }); + + }); + } + + /* Search marking --------------------------*/ + var url = new URL(window.location.href); + var toMark = url.searchParams.get("q"); + var mark = new Mark("main#main"); + if (toMark) { + mark.mark(toMark, { + accuracy: { + value: "complementary", + limiters: [",", ".", ":", "/"], + } + }); + } + + /* Search --------------------------*/ + /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */ + // Initialise search index on focus + var fuse; + $("#search-input").focus(async function(e) { + if (fuse) { + return; + } + + $(e.target).addClass("loading"); + var response = await fetch($("#search-input").data("search-index")); + var data = await response.json(); + + var options = { + keys: ["what", "text", "code"], + ignoreLocation: true, + threshold: 0.1, + includeMatches: true, + includeScore: true, + }; + fuse = new Fuse(data, options); + + $(e.target).removeClass("loading"); + }); + + // Use algolia autocomplete + var options = { + autoselect: true, + debug: true, + hint: false, + minLength: 2, + }; + var q; +async function searchFuse(query, callback) { + await fuse; + + var items; + if (!fuse) { + items = []; + } else { + q = query; + var results = fuse.search(query, { limit: 20 }); + items = results + .filter((x) => x.score <= 0.75) + .map((x) => x.item); + if (items.length === 0) { + items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}]; + } + } + callback(items); +} + $("#search-input").autocomplete(options, [ + { + name: "content", + source: searchFuse, + templates: { + suggestion: (s) => { + if (s.title == s.what) { + return `${s.dir} >
    ${s.title}
    `; + } else if (s.previous_headings == "") { + return `${s.dir} >
    ${s.title}
    > ${s.what}`; + } else { + return `${s.dir} >
    ${s.title}
    > ${s.previous_headings} > ${s.what}`; + } + }, + }, + }, + ]).on('autocomplete:selected', function(event, s) { + window.location.href = s.path + "?q=" + q + "#" + s.id; + }); + }); +})(window.jQuery || window.$) + +document.addEventListener('keydown', function(event) { + // Check if the pressed key is '/' + if (event.key === '/') { + event.preventDefault(); // Prevent any default action associated with the '/' key + document.getElementById('search-input').focus(); // Set focus to the search input + } +}); diff --git a/docs/dev/pkgdown.yml b/docs/dev/pkgdown.yml new file mode 100644 index 00000000..7f59d499 --- /dev/null +++ b/docs/dev/pkgdown.yml @@ -0,0 +1,23 @@ +pandoc: 2.17.1.1 +pkgdown: 2.1.1 +pkgdown_sha: ~ +articles: + prebuilt/2022_cyan_pathway: prebuilt/2022_cyan_pathway.html + prebuilt/2022_dmta_parent: prebuilt/2022_dmta_parent.html + prebuilt/2022_dmta_pathway: prebuilt/2022_dmta_pathway.html + prebuilt/2023_mesotrione_parent: prebuilt/2023_mesotrione_parent.html + web_only/benchmarks: web_only/benchmarks.html + web_only/compiled_models: web_only/compiled_models.html + web_only/dimethenamid_2018: web_only/dimethenamid_2018.html + FOCUS_D: FOCUS_D.html + FOCUS_L: FOCUS_L.html + web_only/FOCUS_Z: web_only/FOCUS_Z.html + mkin: mkin.html + web_only/multistart: web_only/multistart.html + web_only/NAFTA_examples: web_only/NAFTA_examples.html + web_only/saem_benchmarks: web_only/saem_benchmarks.html + twa: twa.html +last_built: 2025-02-14T06:24Z +urls: + reference: https://pkgdown.jrwb.de/mkin/reference + article: https://pkgdown.jrwb.de/mkin/articles diff --git a/docs/dev/reference/AIC.mmkin.html b/docs/dev/reference/AIC.mmkin.html new file mode 100644 index 00000000..06b92093 --- /dev/null +++ b/docs/dev/reference/AIC.mmkin.html @@ -0,0 +1,175 @@ + +Calculate the AIC for a column of an mmkin object — AIC.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Provides a convenient way to compare different kinetic models fitted to the +same dataset.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mmkin'
    +AIC(object, ..., k = 2)
    +
    +# S3 method for class 'mmkin'
    +BIC(object, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An object of class mmkin, containing only one +column.

    + + +
    ...
    +

    For compatibility with the generic method

    + + +
    k
    +

    As in the generic method

    + +
    +
    +

    Value

    +

    As in the generic method (a numeric value for single fits, or a +dataframe if there are several fits in the column).

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +   # skip, as it takes > 10 s on winbuilder
    +  f <- mmkin(c("SFO", "FOMC", "DFOP"),
    +    list("FOCUS A" = FOCUS_2006_A,
    +         "FOCUS C" = FOCUS_2006_C), cores = 1, quiet = TRUE)
    +#> Warning: Optimisation did not converge:
    +#> false convergence (8)
    +  # We get a warning because the FOMC model does not converge for the
    +  # FOCUS A dataset, as it is well described by SFO
    +
    +  AIC(f["SFO", "FOCUS A"]) # We get a single number for a single fit
    +#> [1] 55.28197
    +  AIC(f[["SFO", "FOCUS A"]]) # or when extracting an mkinfit object
    +#> [1] 55.28197
    +
    +  # For FOCUS A, the models fit almost equally well, so the higher the number
    +  # of parameters, the higher (worse) the AIC
    +  AIC(f[, "FOCUS A"])
    +#>      df      AIC
    +#> SFO   3 55.28197
    +#> FOMC  4 57.28198
    +#> DFOP  5 59.28197
    +  AIC(f[, "FOCUS A"], k = 0) # If we do not penalize additional parameters, we get nearly the same
    +#>      df      AIC
    +#> SFO   3 49.28197
    +#> FOMC  4 49.28198
    +#> DFOP  5 49.28197
    +  BIC(f[, "FOCUS A"])        # Comparing the BIC gives a very similar picture
    +#>      df      BIC
    +#> SFO   3 55.52030
    +#> FOMC  4 57.59974
    +#> DFOP  5 59.67918
    +
    +  # For FOCUS C, the more complex models fit better
    +  AIC(f[, "FOCUS C"])
    +#>      df      AIC
    +#> SFO   3 59.29336
    +#> FOMC  4 44.68652
    +#> DFOP  5 29.02372
    +  BIC(f[, "FOCUS C"])
    +#>      df      BIC
    +#> SFO   3 59.88504
    +#> FOMC  4 45.47542
    +#> DFOP  5 30.00984
    +  
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/BIC.mmkin.html b/docs/dev/reference/BIC.mmkin.html new file mode 100644 index 00000000..d84916d6 --- /dev/null +++ b/docs/dev/reference/BIC.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/CAKE_export.html b/docs/dev/reference/CAKE_export.html new file mode 100644 index 00000000..026bc3da --- /dev/null +++ b/docs/dev/reference/CAKE_export.html @@ -0,0 +1,178 @@ + +Export a list of datasets format to a CAKE study file — CAKE_export • mkin + Skip to contents + + +
    +
    +
    + +
    +

    In addition to the datasets, the pathways in the degradation model can be +specified as well.

    +
    + +
    +

    Usage

    +
    CAKE_export(
    +  ds,
    +  map = c(parent = "Parent"),
    +  links = NA,
    +  filename = "CAKE_export.csf",
    +  path = ".",
    +  overwrite = FALSE,
    +  study = "Degradinol aerobic soil degradation",
    +  description = "",
    +  time_unit = "days",
    +  res_unit = "% AR",
    +  comment = "",
    +  date = Sys.Date(),
    +  optimiser = "IRLS"
    +)
    +
    + +
    +

    Arguments

    + + +
    ds
    +

    A named list of datasets in long format as compatible with +mkinfit.

    + + +
    map
    +

    A character vector with CAKE compartment names (Parent, A1, ...), +named with the names used in the list of datasets.

    + + + +

    An optional character vector of target compartments, named with +the names of the source compartments. In order to make this easier, the +names are used as in the datasets supplied.

    + + +
    filename
    +

    Where to write the result. Should end in .csf in order to be +compatible with CAKE.

    + + +
    path
    +

    An optional path to the output file.

    + + +
    overwrite
    +

    If TRUE, existing files are overwritten.

    + + +
    study
    +

    The name of the study.

    + + +
    description
    +

    An optional description.

    + + +
    time_unit
    +

    The time unit for the residue data.

    + + +
    res_unit
    +

    The unit used for the residues.

    + + +
    comment
    +

    An optional comment.

    + + +
    date
    +

    The date of file creation.

    + + +
    optimiser
    +

    Can be OLS or IRLS.

    + +
    +
    +

    Value

    +

    The function is called for its side effect.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/D24_2014.html b/docs/dev/reference/D24_2014.html new file mode 100644 index 00000000..890e91d8 --- /dev/null +++ b/docs/dev/reference/D24_2014.html @@ -0,0 +1,218 @@ + +Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 — D24_2014 • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The five datasets were extracted from the active substance evaluation dossier +published by EFSA. Kinetic evaluations shown for these datasets are intended +to illustrate and advance kinetic modelling. The fact that these data and +some results are shown here does not imply a license to use them in the +context of pesticide registrations, as the use of the data may be +constrained by data protection regulations.

    +
    + +
    +

    Usage

    +
    D24_2014
    +
    + +
    +

    Format

    +

    An mkindsg object grouping five datasets

    +
    +
    +

    Source

    +

    Hellenic Ministry of Rural Development and Agriculture (2014) +Final addendum to the Renewal Assessment Report - public version - 2,4-D +Volume 3 Annex B.8 Fate and behaviour in the environment +https://open.efsa.europa.eu/study-inventory/EFSA-Q-2013-00811

    +
    +
    +

    Details

    +

    Data for the first dataset are from p. 685. Data for the other four +datasets were used in the preprocessed versions given in the kinetics +section (p. 761ff.), with the exception of residues smaller than 1 for DCP +in the soil from Site I2, where the values given on p. 694 were used.

    +

    The R code used to create this data object is installed with this package +in the 'dataset_generation' directory. In the code, page numbers are given for +specific pieces of information in the comments.

    +
    + +
    +

    Examples

    +
    print(D24_2014)
    +#> <mkindsg> holding 5 mkinds objects
    +#> Title $title:  Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 
    +#> Occurrence of observed compounds $observed_n:
    +#> D24 DCP DCA 
    +#>   5   4   4 
    +#> Time normalisation factors $f_time_norm:
    +#> [1] 1.6062378 0.7118732 0.7156063 0.7156063 0.8977124
    +#> Meta information $meta:
    +#>                                 study usda_soil_type study_moisture_ref_type
    +#> Mississippi                Cohen 1991      Silt loam                    <NA>
    +#> Fayette     Liu and Adelfinskaya 2011      Silt loam                     pF1
    +#> RefSol 03-G Liu and Adelfinskaya 2011           Loam                     pF1
    +#> Site E1     Liu and Adelfinskaya 2011           Loam                     pF1
    +#> Site I2     Liu and Adelfinskaya 2011     Loamy sand                     pF1
    +#>             rel_moisture temperature
    +#> Mississippi           NA          25
    +#> Fayette              0.5          20
    +#> RefSol 03-G          0.5          20
    +#> Site E1              0.5          20
    +#> Site I2              0.5          20
    +# \dontrun{
    +print(D24_2014$ds[[1]], data = TRUE)
    +#> <mkinds> with $title:  Mississippi 
    +#> Observed compounds $observed:  D24 
    +#> Sampling times $sampling_times:
    +#> 0, 2, 4, 7, 15, 24, 35, 56, 71, 114, 183, 273, 365 
    +#> With a maximum of  1  replicates
    +#>    time  D24
    +#> 1     0 96.8
    +#> 2     2 81.0
    +#> 3     4 81.7
    +#> 4     7 88.2
    +#> 5    15 66.3
    +#> 6    24 72.9
    +#> 7    35 62.6
    +#> 8    56 54.6
    +#> 9    71 35.2
    +#> 10  114 18.0
    +#> 11  183 11.3
    +#> 12  273  9.9
    +#> 13  365  6.3
    +m_D24 = mkinmod(D24 = mkinsub("SFO", to = "DCP"),
    +  DCP = mkinsub("SFO", to = "DCA"),
    +  DCA = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +print(m_D24)
    +#> <mkinmod> model generated with
    +#> Use of formation fractions $use_of_ff: max 
    +#> Specification $spec:
    +#> $D24
    +#> $type: SFO; $to: DCP; $sink: TRUE
    +#> $DCP
    +#> $type: SFO; $to: DCA; $sink: TRUE
    +#> $DCA
    +#> $type: SFO; $sink: TRUE
    +#> Coefficient matrix $coefmat available
    +#> Compiled model $cf available
    +#> Differential equations:
    +#> d_D24/dt = - k_D24 * D24
    +#> d_DCP/dt = + f_D24_to_DCP * k_D24 * D24 - k_DCP * DCP
    +#> d_DCA/dt = + f_DCP_to_DCA * k_DCP * DCP - k_DCA * DCA
    +m_D24_2 = mkinmod(D24 = mkinsub("DFOP", to = "DCP"),
    +  DCP = mkinsub("SFO", to = "DCA"),
    +  DCA = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +print(m_D24_2)
    +#> <mkinmod> model generated with
    +#> Use of formation fractions $use_of_ff: max 
    +#> Specification $spec:
    +#> $D24
    +#> $type: DFOP; $to: DCP; $sink: TRUE
    +#> $DCP
    +#> $type: SFO; $to: DCA; $sink: TRUE
    +#> $DCA
    +#> $type: SFO; $sink: TRUE
    +#> Compiled model $cf available
    +#> Differential equations:
    +#> d_D24/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
    +#>            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
    +#>            * D24
    +#> d_DCP/dt = + f_D24_to_DCP * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) *
    +#>            exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2
    +#>            * time))) * D24 - k_DCP * DCP
    +#> d_DCA/dt = + f_DCP_to_DCA * k_DCP * DCP - k_DCA * DCA
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/DFOP.solution-1.png b/docs/dev/reference/DFOP.solution-1.png new file mode 100644 index 00000000..6b78836f Binary files /dev/null and b/docs/dev/reference/DFOP.solution-1.png differ diff --git a/docs/dev/reference/DFOP.solution.html b/docs/dev/reference/DFOP.solution.html new file mode 100644 index 00000000..633e909c --- /dev/null +++ b/docs/dev/reference/DFOP.solution.html @@ -0,0 +1,155 @@ + +Double First-Order in Parallel kinetics — DFOP.solution • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Function describing decline from a defined starting value using the sum of +two exponential decline functions.

    +
    + +
    +

    Usage

    +
    DFOP.solution(t, parent_0, k1, k2, g)
    +
    + +
    +

    Arguments

    + + +
    t
    +

    Time.

    + + +
    parent_0
    +

    Starting value for the response variable at time zero.

    + + +
    k1
    +

    First kinetic constant.

    + + +
    k2
    +

    Second kinetic constant.

    + + +
    g
    +

    Fraction of the starting value declining according to the first +kinetic constant.

    + +
    +
    +

    Value

    +

    The value of the response variable at time t.

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics +FOCUS (2014) “Generic guidance for Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +Version 1.1, 18 December 2014 +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    
    +  plot(function(x) DFOP.solution(x, 100, 5, 0.5, 0.3), 0, 4, ylim = c(0,100))
    +
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/Extract.mmkin.html b/docs/dev/reference/Extract.mmkin.html new file mode 100644 index 00000000..a7b231f4 --- /dev/null +++ b/docs/dev/reference/Extract.mmkin.html @@ -0,0 +1,187 @@ + +Subsetting method for mmkin objects — [.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Subsetting method for mmkin objects

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mmkin'
    +x[i, j, ..., drop = FALSE]
    +
    + +
    +

    Arguments

    + + +
    x
    +

    An mmkin object

    + + +
    i
    +

    Row index selecting the fits for specific models

    + + +
    j
    +

    Column index selecting the fits to specific datasets

    + + +
    ...
    +

    Not used, only there to satisfy the generic method definition

    + + +
    drop
    +

    If FALSE, the method always returns an mmkin object, otherwise +either a list of mkinfit objects or a single mkinfit object.

    + +
    +
    +

    Value

    +

    An object of class mmkin.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +  # Only use one core, to pass R CMD check --as-cran
    +  fits <- mmkin(c("SFO", "FOMC"), list(B = FOCUS_2006_B, C = FOCUS_2006_C),
    +                cores = 1, quiet = TRUE)
    +  fits["FOMC", ]
    +#> <mmkin> object
    +#> Status of individual fits:
    +#> 
    +#>       dataset
    +#> model  B  C 
    +#>   FOMC OK OK
    +#> 
    +#> OK: No warnings
    +  fits[, "B"]
    +#> <mmkin> object
    +#> Status of individual fits:
    +#> 
    +#>       dataset
    +#> model  B 
    +#>   SFO  OK
    +#>   FOMC OK
    +#> 
    +#> OK: No warnings
    +  fits["SFO", "B"]
    +#> <mmkin> object
    +#> Status of individual fits:
    +#> 
    +#>      dataset
    +#> model B 
    +#>   SFO OK
    +#> 
    +#> OK: No warnings
    +
    +  head(
    +    # This extracts an mkinfit object with lots of components
    +    fits[["FOMC", "B"]]
    +  )
    +#> $par
    +#>  parent_0 log_alpha  log_beta     sigma 
    +#> 99.666192  2.549850  5.050587  1.890202 
    +#> 
    +#> $objective
    +#> [1] 28.58291
    +#> 
    +#> $convergence
    +#> [1] 0
    +#> 
    +#> $iterations
    +#> [1] 21
    +#> 
    +#> $evaluations
    +#> function gradient 
    +#>       25       78 
    +#> 
    +#> $message
    +#> [1] "both X-convergence and relative convergence (5)"
    +#> 
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_A.html b/docs/dev/reference/FOCUS_2006_A.html new file mode 100644 index 00000000..b819cd4d --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_A.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_B.html b/docs/dev/reference/FOCUS_2006_B.html new file mode 100644 index 00000000..b819cd4d --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_B.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_C.html b/docs/dev/reference/FOCUS_2006_C.html new file mode 100644 index 00000000..b819cd4d --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_C.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_D.html b/docs/dev/reference/FOCUS_2006_D.html new file mode 100644 index 00000000..b819cd4d --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_D.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html b/docs/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html new file mode 100644 index 00000000..d315baa2 --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html @@ -0,0 +1,145 @@ + +Results of fitting the DFOP model to Datasets A to B of FOCUS (2006) — FOCUS_2006_DFOP_ref_A_to_B • mkin + Skip to contents + + +
    +
    +
    + +
    +

    A table with the fitted parameters and the resulting DT50 and DT90 values +generated with different software packages. Taken directly from FOCUS (2006). +The results from fitting the data with the Topfit software was removed, as +the initial concentration of the parent compound was fixed to a value of 100 +in this fit.

    +
    + +
    +

    Usage

    +
    FOCUS_2006_DFOP_ref_A_to_B
    +
    + +
    +

    Format

    +

    A data frame containing the following variables.

    package
    +

    a factor giving the name of the software package

    + +
    M0
    +

    The fitted initial concentration of the parent compound

    + +
    f
    +

    The fitted f parameter

    + +
    k1
    +

    The fitted k1 parameter

    + +
    k2
    +

    The fitted k2 parameter

    + +
    DT50
    +

    The resulting half-life of the parent compound

    + +
    DT90
    +

    The resulting DT90 of the parent compound

    + +
    dataset
    +

    The FOCUS dataset that was used

    + + +
    +
    +

    Source

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence and + Degradation Kinetics from Environmental Fate Studies on Pesticides in EU + Registration” Report of the FOCUS Work Group on Degradation Kinetics, + EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, + http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    + +
    +

    Examples

    +
    data(FOCUS_2006_DFOP_ref_A_to_B)
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_E.html b/docs/dev/reference/FOCUS_2006_E.html new file mode 100644 index 00000000..b819cd4d --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_E.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_F.html b/docs/dev/reference/FOCUS_2006_F.html new file mode 100644 index 00000000..b819cd4d --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_F.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html b/docs/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html new file mode 100644 index 00000000..24bf6df8 --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html @@ -0,0 +1,142 @@ + +Results of fitting the FOMC model to Datasets A to F of FOCUS (2006) — FOCUS_2006_FOMC_ref_A_to_F • mkin + Skip to contents + + +
    +
    +
    + +
    +

    A table with the fitted parameters and the resulting DT50 and DT90 values +generated with different software packages. Taken directly from FOCUS (2006). +The results from fitting the data with the Topfit software was removed, as +the initial concentration of the parent compound was fixed to a value of 100 +in this fit.

    +
    + +
    +

    Usage

    +
    FOCUS_2006_FOMC_ref_A_to_F
    +
    + +
    +

    Format

    +

    A data frame containing the following variables.

    package
    +

    a factor giving the name of the software package

    + +
    M0
    +

    The fitted initial concentration of the parent compound

    + +
    alpha
    +

    The fitted alpha parameter

    + +
    beta
    +

    The fitted beta parameter

    + +
    DT50
    +

    The resulting half-life of the parent compound

    + +
    DT90
    +

    The resulting DT90 of the parent compound

    + +
    dataset
    +

    The FOCUS dataset that was used

    + + +
    +
    +

    Source

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence and + Degradation Kinetics from Environmental Fate Studies on Pesticides in EU + Registration” Report of the FOCUS Work Group on Degradation Kinetics, + EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, + http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    + +
    +

    Examples

    +
    data(FOCUS_2006_FOMC_ref_A_to_F)
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_HS_ref_A_to_F.html b/docs/dev/reference/FOCUS_2006_HS_ref_A_to_F.html new file mode 100644 index 00000000..1f7fad2f --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_HS_ref_A_to_F.html @@ -0,0 +1,145 @@ + +Results of fitting the HS model to Datasets A to F of FOCUS (2006) — FOCUS_2006_HS_ref_A_to_F • mkin + Skip to contents + + +
    +
    +
    + +
    +

    A table with the fitted parameters and the resulting DT50 and DT90 values +generated with different software packages. Taken directly from FOCUS (2006). +The results from fitting the data with the Topfit software was removed, as +the initial concentration of the parent compound was fixed to a value of 100 +in this fit.

    +
    + +
    +

    Usage

    +
    FOCUS_2006_HS_ref_A_to_F
    +
    + +
    +

    Format

    +

    A data frame containing the following variables.

    package
    +

    a factor giving the name of the software package

    + +
    M0
    +

    The fitted initial concentration of the parent compound

    + +
    tb
    +

    The fitted tb parameter

    + +
    k1
    +

    The fitted k1 parameter

    + +
    k2
    +

    The fitted k2 parameter

    + +
    DT50
    +

    The resulting half-life of the parent compound

    + +
    DT90
    +

    The resulting DT90 of the parent compound

    + +
    dataset
    +

    The FOCUS dataset that was used

    + + +
    +
    +

    Source

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence and + Degradation Kinetics from Environmental Fate Studies on Pesticides in EU + Registration” Report of the FOCUS Work Group on Degradation Kinetics, + EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, + http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    + +
    +

    Examples

    +
    data(FOCUS_2006_HS_ref_A_to_F)
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html b/docs/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html new file mode 100644 index 00000000..39b06514 --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html @@ -0,0 +1,139 @@ + +Results of fitting the SFO model to Datasets A to F of FOCUS (2006) — FOCUS_2006_SFO_ref_A_to_F • mkin + Skip to contents + + +
    +
    +
    + +
    +

    A table with the fitted parameters and the resulting DT50 and DT90 values +generated with different software packages. Taken directly from FOCUS (2006). +The results from fitting the data with the Topfit software was removed, as +the initial concentration of the parent compound was fixed to a value of 100 +in this fit.

    +
    + +
    +

    Usage

    +
    FOCUS_2006_SFO_ref_A_to_F
    +
    + +
    +

    Format

    +

    A data frame containing the following variables.

    package
    +

    a factor giving the name of the software package

    + +
    M0
    +

    The fitted initial concentration of the parent compound

    + +
    k
    +

    The fitted first-order degradation rate constant

    + +
    DT50
    +

    The resulting half-life of the parent compound

    + +
    DT90
    +

    The resulting DT90 of the parent compound

    + +
    dataset
    +

    The FOCUS dataset that was used

    + + +
    +
    +

    Source

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence and + Degradation Kinetics from Environmental Fate Studies on Pesticides in EU + Registration” Report of the FOCUS Work Group on Degradation Kinetics, + EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, + http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    + +
    +

    Examples

    +
    data(FOCUS_2006_SFO_ref_A_to_F)
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/FOCUS_2006_datasets.html b/docs/dev/reference/FOCUS_2006_datasets.html new file mode 100644 index 00000000..a147a4f9 --- /dev/null +++ b/docs/dev/reference/FOCUS_2006_datasets.html @@ -0,0 +1,133 @@ + +Datasets A to F from the FOCUS Kinetics report from 2006 — FOCUS_2006_datasets • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Data taken from FOCUS (2006), p. 258.

    +
    + +
    +

    Usage

    +
    FOCUS_2006_A
    +  FOCUS_2006_B
    +  FOCUS_2006_C
    +  FOCUS_2006_D
    +  FOCUS_2006_E
    +  FOCUS_2006_F
    +
    + +
    +

    Format

    +

    6 datasets with observations on the following variables.

    name
    +

    a factor containing the name of the observed variable

    + +
    time
    +

    a numeric vector containing time points

    + +
    value
    +

    a numeric vector containing concentrations in percent of applied radioactivity

    + + +
    +
    +

    Source

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence and + Degradation Kinetics from Environmental Fate Studies on Pesticides in EU + Registration” Report of the FOCUS Work Group on Degradation Kinetics, + EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, + http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    + +
    +

    Examples

    +
    FOCUS_2006_C
    +#>     name time value
    +#> 1 parent    0  85.1
    +#> 2 parent    1  57.9
    +#> 3 parent    3  29.9
    +#> 4 parent    7  14.6
    +#> 5 parent   14   9.7
    +#> 6 parent   28   6.6
    +#> 7 parent   63   4.0
    +#> 8 parent   91   3.9
    +#> 9 parent  119   0.6
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/FOMC.solution-1.png b/docs/dev/reference/FOMC.solution-1.png new file mode 100644 index 00000000..18a4b586 Binary files /dev/null and b/docs/dev/reference/FOMC.solution-1.png differ diff --git a/docs/dev/reference/FOMC.solution.html b/docs/dev/reference/FOMC.solution.html new file mode 100644 index 00000000..5d1f2443 --- /dev/null +++ b/docs/dev/reference/FOMC.solution.html @@ -0,0 +1,166 @@ + +First-Order Multi-Compartment kinetics — FOMC.solution • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Function describing exponential decline from a defined starting value, with +a decreasing rate constant.

    +
    + +
    +

    Usage

    +
    FOMC.solution(t, parent_0, alpha, beta)
    +
    + +
    +

    Arguments

    + + +
    t
    +

    Time.

    + + +
    parent_0
    +

    Starting value for the response variable at time zero.

    + + +
    alpha
    +

    Shape parameter determined by coefficient of variation of rate +constant values.

    + + +
    beta
    +

    Location parameter.

    + +
    +
    +

    Value

    +

    The value of the response variable at time t.

    +
    +
    +

    Details

    +

    The form given here differs slightly from the original reference by +Gustafson and Holden (1990). The parameter beta corresponds to 1/beta +in the original equation.

    +
    +
    +

    Note

    +

    The solution of the FOMC kinetic model reduces to the +SFO.solution for large values of alpha and beta +with \(k = \frac{\beta}{\alpha}\).

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +

    FOCUS (2014) “Generic guidance for Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +Version 1.1, 18 December 2014 +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +

    Gustafson DI and Holden LR (1990) Nonlinear pesticide dissipation in soil: +A new model based on spatial variability. Environmental Science and +Technology 24, 1032-1038

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    
    +  plot(function(x) FOMC.solution(x, 100, 10, 2), 0, 2, ylim = c(0, 100))
    +
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/HS.solution-1.png b/docs/dev/reference/HS.solution-1.png new file mode 100644 index 00000000..61d89dbc Binary files /dev/null and b/docs/dev/reference/HS.solution-1.png differ diff --git a/docs/dev/reference/HS.solution.html b/docs/dev/reference/HS.solution.html new file mode 100644 index 00000000..d15e75dd --- /dev/null +++ b/docs/dev/reference/HS.solution.html @@ -0,0 +1,156 @@ + +Hockey-Stick kinetics — HS.solution • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Function describing two exponential decline functions with a break point +between them.

    +
    + +
    +

    Usage

    +
    HS.solution(t, parent_0, k1, k2, tb)
    +
    + +
    +

    Arguments

    + + +
    t
    +

    Time.

    + + +
    parent_0
    +

    Starting value for the response variable at time zero.

    + + +
    k1
    +

    First kinetic constant.

    + + +
    k2
    +

    Second kinetic constant.

    + + +
    tb
    +

    Break point. Before this time, exponential decline according to +k1 is calculated, after this time, exponential decline proceeds +according to k2.

    + +
    +
    +

    Value

    +

    The value of the response variable at time t.

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics +FOCUS (2014) “Generic guidance for Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +Version 1.1, 18 December 2014 +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    
    +  plot(function(x) HS.solution(x, 100, 2, 0.3, 0.5), 0, 2, ylim=c(0,100))
    +
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/IORE.solution-1.png b/docs/dev/reference/IORE.solution-1.png new file mode 100644 index 00000000..54c9dcae Binary files /dev/null and b/docs/dev/reference/IORE.solution-1.png differ diff --git a/docs/dev/reference/IORE.solution.html b/docs/dev/reference/IORE.solution.html new file mode 100644 index 00000000..47cc1e3d --- /dev/null +++ b/docs/dev/reference/IORE.solution.html @@ -0,0 +1,171 @@ + +Indeterminate order rate equation kinetics — IORE.solution • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Function describing exponential decline from a defined starting value, with +a concentration dependent rate constant.

    +
    + +
    +

    Usage

    +
    IORE.solution(t, parent_0, k__iore, N)
    +
    + +
    +

    Arguments

    + + +
    t
    +

    Time.

    + + +
    parent_0
    +

    Starting value for the response variable at time zero.

    + + +
    k__iore
    +

    Rate constant. Note that this depends on the concentration +units used.

    + + +
    N
    +

    Exponent describing the nonlinearity of the rate equation

    + +
    +
    +

    Value

    +

    The value of the response variable at time t.

    +
    +
    +

    Note

    +

    The solution of the IORE kinetic model reduces to the +SFO.solution if N = 1. The parameters of the IORE model can +be transformed to equivalent parameters of the FOMC mode - see the NAFTA +guidance for details.

    +
    +
    +

    References

    +

    NAFTA Technical Working Group on Pesticides (not dated) Guidance +for Evaluating and Calculating Degradation Kinetics in Environmental Media

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    
    +  plot(function(x) IORE.solution(x, 100, 0.2, 1.3), 0, 2, ylim = c(0, 100))
    +
    +  # \dontrun{
    +    fit.fomc <- mkinfit("FOMC", FOCUS_2006_C, quiet = TRUE)
    +    fit.iore <- mkinfit("IORE", FOCUS_2006_C, quiet = TRUE)
    +    fit.iore.deS <- mkinfit("IORE", FOCUS_2006_C, solution_type = "deSolve", quiet = TRUE)
    +#> Error in is.loaded(initfunc, PACKAGE = dllname, type = "") : 
    +#>   invalid 'PACKAGE' argument
    +
    +    print(data.frame(fit.fomc$par, fit.iore$par, fit.iore.deS$par,
    +                     row.names = paste("model par", 1:4)))
    +#>             fit.fomc.par fit.iore.par fit.iore.deS.par
    +#> model par 1  85.87489063    85.874890        85.874890
    +#> model par 2   0.05192238    -4.826631        -4.826631
    +#> model par 3   0.65096665     1.949403         1.949403
    +#> model par 4   1.85744396     1.857444         1.857444
    +    print(rbind(fomc = endpoints(fit.fomc)$distimes, iore = endpoints(fit.iore)$distimes,
    +                iore.deS = endpoints(fit.iore)$distimes))
    +#>              DT50    DT90 DT50back
    +#> fomc     1.785233 15.1479 4.559973
    +#> iore     1.785233 15.1479 4.559973
    +#> iore.deS 1.785233 15.1479 4.559973
    +  # }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/NAFTA_SOP_2015-1.png b/docs/dev/reference/NAFTA_SOP_2015-1.png new file mode 100644 index 00000000..98d4246c Binary files /dev/null and b/docs/dev/reference/NAFTA_SOP_2015-1.png differ diff --git a/docs/dev/reference/NAFTA_SOP_2015.html b/docs/dev/reference/NAFTA_SOP_2015.html new file mode 100644 index 00000000..3b176eed --- /dev/null +++ b/docs/dev/reference/NAFTA_SOP_2015.html @@ -0,0 +1,167 @@ + +Example datasets from the NAFTA SOP published 2015 — NAFTA_SOP_2015 • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Data taken from US EPA (2015), p. 19 and 23.

    +
    + +
    +

    Usage

    +
    NAFTA_SOP_Appendix_B
    +  NAFTA_SOP_Appendix_D
    +
    + +
    +

    Format

    +

    2 datasets with observations on the following variables.

    name
    +

    a factor containing the name of the observed variable

    + +
    time
    +

    a numeric vector containing time points

    + +
    value
    +

    a numeric vector containing concentrations

    + + +
    +
    +

    Source

    +

    NAFTA (2011) Guidance for evaluating and calculating degradation kinetics + in environmental media. NAFTA Technical Working Group on Pesticides + https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/guidance-evaluating-and-calculating-degradation + accessed 2019-02-22

    +

    US EPA (2015) Standard Operating Procedure for Using the NAFTA Guidance to + Calculate Representative Half-life Values and Characterizing Pesticide + Degradation + https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/standard-operating-procedure-using-nafta-guidance

    +
    + +
    +

    Examples

    +
      nafta_evaluation <- nafta(NAFTA_SOP_Appendix_D, cores = 1)
    +#> The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
    +#> The representative half-life of the IORE model is longer than the one corresponding
    +#> to the terminal degradation rate found with the DFOP model.
    +#> The representative half-life obtained from the DFOP model may be used
    +  print(nafta_evaluation)
    +#> Sums of squares:
    +#>       SFO      IORE      DFOP 
    +#> 1378.6832  615.7730  517.8836 
    +#> 
    +#> Critical sum of squares for checking the SFO model:
    +#> [1] 717.4598
    +#> 
    +#> Parameters:
    +#> $SFO
    +#>          Estimate   Pr(>t)    Lower   Upper
    +#> parent_0  83.7558 1.80e-14 77.18268 90.3288
    +#> k_parent   0.0017 7.43e-05  0.00112  0.0026
    +#> sigma      8.7518 1.22e-05  5.64278 11.8608
    +#> 
    +#> $IORE
    +#>                Estimate Pr(>t)    Lower    Upper
    +#> parent_0       9.69e+01     NA 8.88e+01 1.05e+02
    +#> k__iore_parent 8.40e-14     NA 1.79e-18 3.94e-09
    +#> N_parent       6.68e+00     NA 4.19e+00 9.17e+00
    +#> sigma          5.85e+00     NA 3.76e+00 7.94e+00
    +#> 
    +#> $DFOP
    +#>          Estimate   Pr(>t)    Lower    Upper
    +#> parent_0 9.76e+01 1.94e-13 9.02e+01 1.05e+02
    +#> k1       4.24e-02 5.92e-03 2.03e-02 8.88e-02
    +#> k2       8.24e-04 6.48e-03 3.89e-04 1.75e-03
    +#> g        2.88e-01 2.47e-05 1.95e-01 4.03e-01
    +#> sigma    5.36e+00 2.22e-05 3.43e+00 7.30e+00
    +#> 
    +#> 
    +#> DTx values:
    +#>      DT50    DT90 DT50_rep
    +#> SFO   407    1350      407
    +#> IORE  541 5190000  1560000
    +#> DFOP  429    2380      841
    +#> 
    +#> Representative half-life:
    +#> [1] 841.41
    +  plot(nafta_evaluation)
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/NAFTA_SOP_Appendix_B.html b/docs/dev/reference/NAFTA_SOP_Appendix_B.html new file mode 100644 index 00000000..c3c9b055 --- /dev/null +++ b/docs/dev/reference/NAFTA_SOP_Appendix_B.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/NAFTA_SOP_Appendix_D.html b/docs/dev/reference/NAFTA_SOP_Appendix_D.html new file mode 100644 index 00000000..c3c9b055 --- /dev/null +++ b/docs/dev/reference/NAFTA_SOP_Appendix_D.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/NAFTA_SOP_Attachment-1.png b/docs/dev/reference/NAFTA_SOP_Attachment-1.png new file mode 100644 index 00000000..a6066441 Binary files /dev/null and b/docs/dev/reference/NAFTA_SOP_Attachment-1.png differ diff --git a/docs/dev/reference/NAFTA_SOP_Attachment.html b/docs/dev/reference/NAFTA_SOP_Attachment.html new file mode 100644 index 00000000..afae4f43 --- /dev/null +++ b/docs/dev/reference/NAFTA_SOP_Attachment.html @@ -0,0 +1,156 @@ + +Example datasets from Attachment 1 to the NAFTA SOP published 2015 — NAFTA_SOP_Attachment • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Data taken from from Attachment 1 of the SOP.

    +
    + +
    +

    Usage

    +
    NAFTA_SOP_Attachment
    +
    + +
    +

    Format

    +

    A list (NAFTA_SOP_Attachment) containing 16 datasets suitable + for the evaluation with nafta

    +
    +
    +

    Source

    +

    NAFTA (2011) Guidance for evaluating and calculating degradation kinetics + in environmental media. NAFTA Technical Working Group on Pesticides + https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/guidance-evaluating-and-calculating-degradation + accessed 2019-02-22

    +

    US EPA (2015) Standard Operating Procedure for Using the NAFTA Guidance to + Calculate Representative Half-life Values and Characterizing Pesticide + Degradation + https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/standard-operating-procedure-using-nafta-guidance

    +
    + +
    +

    Examples

    +
      nafta_att_p5a <- nafta(NAFTA_SOP_Attachment[["p5a"]], cores = 1)
    +#> The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
    +#> The half-life obtained from the IORE model may be used
    +  print(nafta_att_p5a)
    +#> Sums of squares:
    +#>       SFO      IORE      DFOP 
    +#> 465.21753  56.27506  32.06401 
    +#> 
    +#> Critical sum of squares for checking the SFO model:
    +#> [1] 64.4304
    +#> 
    +#> Parameters:
    +#> $SFO
    +#>          Estimate   Pr(>t)  Lower   Upper
    +#> parent_0  95.8401 4.67e-21 92.245 99.4357
    +#> k_parent   0.0102 3.92e-12  0.009  0.0117
    +#> sigma      4.8230 3.81e-06  3.214  6.4318
    +#> 
    +#> $IORE
    +#>                Estimate Pr(>t)    Lower    Upper
    +#> parent_0       1.01e+02     NA 9.91e+01 1.02e+02
    +#> k__iore_parent 1.54e-05     NA 4.08e-06 5.84e-05
    +#> N_parent       2.57e+00     NA 2.25e+00 2.89e+00
    +#> sigma          1.68e+00     NA 1.12e+00 2.24e+00
    +#> 
    +#> $DFOP
    +#>          Estimate   Pr(>t)   Lower    Upper
    +#> parent_0 9.99e+01 1.41e-26 98.8116 101.0810
    +#> k1       2.67e-02 5.05e-06  0.0243   0.0295
    +#> k2       3.41e-12 5.00e-01  0.0000      Inf
    +#> g        6.47e-01 3.67e-06  0.6248   0.6677
    +#> sigma    1.27e+00 8.91e-06  0.8395   1.6929
    +#> 
    +#> 
    +#> DTx values:
    +#>      DT50     DT90 DT50_rep
    +#> SFO  67.7 2.25e+02 6.77e+01
    +#> IORE 58.2 1.07e+03 3.22e+02
    +#> DFOP 55.5 3.70e+11 2.03e+11
    +#> 
    +#> Representative half-life:
    +#> [1] 321.51
    +  plot(nafta_att_p5a)
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/SFO.solution-1.png b/docs/dev/reference/SFO.solution-1.png new file mode 100644 index 00000000..34fdd460 Binary files /dev/null and b/docs/dev/reference/SFO.solution-1.png differ diff --git a/docs/dev/reference/SFO.solution.html b/docs/dev/reference/SFO.solution.html new file mode 100644 index 00000000..f61d1d79 --- /dev/null +++ b/docs/dev/reference/SFO.solution.html @@ -0,0 +1,143 @@ + +Single First-Order kinetics — SFO.solution • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Function describing exponential decline from a defined starting value.

    +
    + +
    +

    Usage

    +
    SFO.solution(t, parent_0, k)
    +
    + +
    +

    Arguments

    + + +
    t
    +

    Time.

    + + +
    parent_0
    +

    Starting value for the response variable at time zero.

    + + +
    k
    +

    Kinetic rate constant.

    + +
    +
    +

    Value

    +

    The value of the response variable at time t.

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics +FOCUS (2014) “Generic guidance for Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +Version 1.1, 18 December 2014 +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    
    +  plot(function(x) SFO.solution(x, 100, 3), 0, 2)
    +
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/SFORB.solution-1.png b/docs/dev/reference/SFORB.solution-1.png new file mode 100644 index 00000000..08d25616 Binary files /dev/null and b/docs/dev/reference/SFORB.solution-1.png differ diff --git a/docs/dev/reference/SFORB.solution.html b/docs/dev/reference/SFORB.solution.html new file mode 100644 index 00000000..d9e9440f --- /dev/null +++ b/docs/dev/reference/SFORB.solution.html @@ -0,0 +1,165 @@ + +Single First-Order Reversible Binding kinetics — SFORB.solution • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Function describing the solution of the differential equations describing +the kinetic model with first-order terms for a two-way transfer from a free +to a bound fraction, and a first-order degradation term for the free +fraction. The initial condition is a defined amount in the free fraction +and no substance in the bound fraction.

    +
    + +
    +

    Usage

    +
    SFORB.solution(t, parent_0, k_12, k_21, k_1output)
    +
    + +
    +

    Arguments

    + + +
    t
    +

    Time.

    + + +
    parent_0
    +

    Starting value for the response variable at time zero.

    + + +
    k_12
    +

    Kinetic constant describing transfer from free to bound.

    + + +
    k_21
    +

    Kinetic constant describing transfer from bound to free.

    + + +
    k_1output
    +

    Kinetic constant describing degradation of the free +fraction.

    + +
    +
    +

    Value

    +

    The value of the response variable, which is the sum of free and +bound fractions at time t.

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics +FOCUS (2014) “Generic guidance for Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +Version 1.1, 18 December 2014 +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    
    +  plot(function(x) SFORB.solution(x, 100, 0.5, 2, 3), 0, 2)
    +
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/[.mhmkin.html b/docs/dev/reference/[.mhmkin.html new file mode 100644 index 00000000..19cc9c91 --- /dev/null +++ b/docs/dev/reference/[.mhmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/add_err-1.png b/docs/dev/reference/add_err-1.png new file mode 100644 index 00000000..1bcea3d5 Binary files /dev/null and b/docs/dev/reference/add_err-1.png differ diff --git a/docs/dev/reference/add_err-2.png b/docs/dev/reference/add_err-2.png new file mode 100644 index 00000000..67c083ea Binary files /dev/null and b/docs/dev/reference/add_err-2.png differ diff --git a/docs/dev/reference/add_err-3.png b/docs/dev/reference/add_err-3.png new file mode 100644 index 00000000..f25ae5e7 Binary files /dev/null and b/docs/dev/reference/add_err-3.png differ diff --git a/docs/dev/reference/add_err.html b/docs/dev/reference/add_err.html new file mode 100644 index 00000000..00a2b1d0 --- /dev/null +++ b/docs/dev/reference/add_err.html @@ -0,0 +1,216 @@ + +Add normally distributed errors to simulated kinetic degradation data — add_err • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Normally distributed errors are added to data predicted for a specific +degradation model using mkinpredict. The variance of the error +may depend on the predicted value and is specified as a standard deviation.

    +
    + +
    +

    Usage

    +
    add_err(
    +  prediction,
    +  sdfunc,
    +  secondary = c("M1", "M2"),
    +  n = 10,
    +  LOD = 0.1,
    +  reps = 2,
    +  digits = 1,
    +  seed = NA
    +)
    +
    + +
    +

    Arguments

    + + +
    prediction
    +

    A prediction from a kinetic model as produced by +mkinpredict.

    + + +
    sdfunc
    +

    A function taking the predicted value as its only argument and +returning a standard deviation that should be used for generating the +random error terms for this value.

    + + +
    secondary
    +

    The names of state variables that should have an initial +value of zero

    + + +
    n
    +

    The number of datasets to be generated.

    + + +
    LOD
    +

    The limit of detection (LOD). Values that are below the LOD after +adding the random error will be set to NA.

    + + +
    reps
    +

    The number of replicates to be generated within the datasets.

    + + +
    digits
    +

    The number of digits to which the values will be rounded.

    + + +
    seed
    +

    The seed used for the generation of random numbers. If NA, the +seed is not set.

    + +
    +
    +

    Value

    +

    A list of datasets compatible with mmkin, i.e. the +components of the list are datasets compatible with mkinfit.

    +
    +
    +

    References

    +

    Ranke J and Lehmann R (2015) To t-test or not to t-test, that is +the question. XV Symposium on Pesticide Chemistry 2-4 September 2015, +Piacenza, Italy +https://jrwb.de/posters/piacenza_2015.pdf

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +# The kinetic model
    +m_SFO_SFO <- mkinmod(parent = mkinsub("SFO", "M1"),
    +                     M1 = mkinsub("SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +# Generate a prediction for a specific set of parameters
    +sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +
    +# This is the prediction used for the "Type 2 datasets" on the Piacenza poster
    +# from 2015
    +d_SFO_SFO <- mkinpredict(m_SFO_SFO,
    +                         c(k_parent = 0.1, f_parent_to_M1 = 0.5,
    +                           k_M1 = log(2)/1000),
    +                         c(parent = 100, M1 = 0),
    +                         sampling_times)
    +
    +# Add an error term with a constant (independent of the value) standard deviation
    +# of 10, and generate three datasets
    +d_SFO_SFO_err <- add_err(d_SFO_SFO, function(x) 10, n = 3, seed = 123456789 )
    +
    +# Name the datasets for nicer plotting
    +names(d_SFO_SFO_err) <- paste("Dataset", 1:3)
    +
    +# Name the model in the list of models (with only one member in this case) for
    +# nicer plotting later on.  Be quiet and use only one core not to offend CRAN
    +# checks
    +# \dontrun{
    +f_SFO_SFO <- mmkin(list("SFO-SFO" = m_SFO_SFO),
    +                   d_SFO_SFO_err, cores = 1,
    +                   quiet = TRUE)
    +
    +plot(f_SFO_SFO)
    +
    +
    +# We would like to inspect the fit for dataset 3 more closely
    +# Using double brackets makes the returned object an mkinfit object
    +# instead of a list of mkinfit objects, so plot.mkinfit is used
    +plot(f_SFO_SFO[[3]], show_residuals = TRUE)
    +
    +
    +# If we use single brackets, we should give two indices (model and dataset),
    +# and plot.mmkin is used
    +plot(f_SFO_SFO[1, 3])
    +
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/anova.saem.mmkin.html b/docs/dev/reference/anova.saem.mmkin.html new file mode 100644 index 00000000..c30a8927 --- /dev/null +++ b/docs/dev/reference/anova.saem.mmkin.html @@ -0,0 +1,140 @@ + +Anova method for saem.mmkin objects — anova.saem.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Generate an anova object. The method to calculate the BIC is that from the +saemix package. As in other prominent anova methods, models are sorted by +number of parameters, and the tests (if requested) are always relative to +the model on the previous line.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'saem.mmkin'
    +anova(
    +  object,
    +  ...,
    +  method = c("is", "lin", "gq"),
    +  test = FALSE,
    +  model.names = NULL
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An saem.mmkin object

    + + +
    ...
    +

    further such objects

    + + +
    method
    +

    Method for likelihood calculation: "is" (importance sampling), +"lin" (linear approximation), or "gq" (Gaussian quadrature). Passed +to saemix::logLik.SaemixObject

    + + +
    test
    +

    Should a likelihood ratio test be performed? If TRUE, +the alternative models are tested against the first model. Should +only be done for nested models.

    + + +
    model.names
    +

    Optional character vector of model names

    + +
    +
    +

    Value

    +

    an "anova" data frame; the traditional (S3) result of anova()

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/aw.html b/docs/dev/reference/aw.html new file mode 100644 index 00000000..c87247c5 --- /dev/null +++ b/docs/dev/reference/aw.html @@ -0,0 +1,153 @@ + +Calculate Akaike weights for model averaging — aw • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Akaike weights are calculated based on the relative +expected Kullback-Leibler information as specified +by Burnham and Anderson (2004).

    +
    + +
    +

    Usage

    +
    aw(object, ...)
    +
    +# S3 method for class 'mkinfit'
    +aw(object, ...)
    +
    +# S3 method for class 'mmkin'
    +aw(object, ...)
    +
    +# S3 method for class 'mixed.mmkin'
    +aw(object, ...)
    +
    +# S3 method for class 'multistart'
    +aw(object, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mmkin column object, containing two or more +mkinfit models that have been fitted to the same data, +or an mkinfit object. In the latter case, further mkinfit +objects fitted to the same data should be specified +as dots arguments.

    + + +
    ...
    +

    Not used in the method for mmkin column objects, +further mkinfit objects in the method for mkinfit objects.

    + +
    +
    +

    References

    +

    Burnham KP and Anderson DR (2004) Multimodel +Inference: Understanding AIC and BIC in Model Selection. +Sociological Methods & Research 33(2) 261-304

    +
    + +
    +

    Examples

    +
    # \dontrun{
    +f_sfo <- mkinfit("SFO", FOCUS_2006_D, quiet = TRUE)
    +f_dfop <- mkinfit("DFOP", FOCUS_2006_D, quiet = TRUE)
    +aw_sfo_dfop <- aw(f_sfo, f_dfop)
    +sum(aw_sfo_dfop)
    +#> [1] 1
    +aw_sfo_dfop # SFO gets more weight as it has less parameters and a similar fit
    +#> [1] 0.5970258 0.4029742
    +f <- mmkin(c("SFO", "FOMC", "DFOP"), list("FOCUS D" = FOCUS_2006_D), cores = 1, quiet = TRUE)
    +aw(f)
    +#> [1] 0.4808722 0.1945539 0.3245740
    +sum(aw(f))
    +#> [1] 1
    +aw(f[c("SFO", "DFOP")])
    +#> [1] 0.5970258 0.4029742
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/aw.mixed.mmkin.html b/docs/dev/reference/aw.mixed.mmkin.html new file mode 100644 index 00000000..ccfdbfc6 --- /dev/null +++ b/docs/dev/reference/aw.mixed.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/aw.mkinfit.html b/docs/dev/reference/aw.mkinfit.html new file mode 100644 index 00000000..ccfdbfc6 --- /dev/null +++ b/docs/dev/reference/aw.mkinfit.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/aw.mmkin.html b/docs/dev/reference/aw.mmkin.html new file mode 100644 index 00000000..ccfdbfc6 --- /dev/null +++ b/docs/dev/reference/aw.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/aw.multistart.html b/docs/dev/reference/aw.multistart.html new file mode 100644 index 00000000..ccfdbfc6 --- /dev/null +++ b/docs/dev/reference/aw.multistart.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/backtransform_odeparms.html b/docs/dev/reference/backtransform_odeparms.html new file mode 100644 index 00000000..b07fb165 --- /dev/null +++ b/docs/dev/reference/backtransform_odeparms.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/best.default.html b/docs/dev/reference/best.default.html new file mode 100644 index 00000000..06f15f0c --- /dev/null +++ b/docs/dev/reference/best.default.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/best.html b/docs/dev/reference/best.html new file mode 100644 index 00000000..06f15f0c --- /dev/null +++ b/docs/dev/reference/best.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/check_failed.html b/docs/dev/reference/check_failed.html new file mode 100644 index 00000000..9dea2650 --- /dev/null +++ b/docs/dev/reference/check_failed.html @@ -0,0 +1,100 @@ + +Check if fit within an mhmkin object failed — check_failed • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Check if fit within an mhmkin object failed

    +
    + +
    +

    Usage

    +
    check_failed(x)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    The object to be checked

    + +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/confint.mkinfit.html b/docs/dev/reference/confint.mkinfit.html new file mode 100644 index 00000000..a0051a85 --- /dev/null +++ b/docs/dev/reference/confint.mkinfit.html @@ -0,0 +1,382 @@ + +Confidence intervals for parameters of mkinfit objects — confint.mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The default method 'quadratic' is based on the quadratic approximation of +the curvature of the likelihood function at the maximum likelihood parameter +estimates. +The alternative method 'profile' is based on the profile likelihood for each +parameter. The 'profile' method uses two nested optimisations and can take a +very long time, even if parallelized by specifying 'cores' on unixoid +platforms. The speed of the method could likely be improved by using the +method of Venzon and Moolgavkar (1988).

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinfit'
    +confint(
    +  object,
    +  parm,
    +  level = 0.95,
    +  alpha = 1 - level,
    +  cutoff,
    +  method = c("quadratic", "profile"),
    +  transformed = TRUE,
    +  backtransform = TRUE,
    +  cores = parallel::detectCores(),
    +  rel_tol = 0.01,
    +  quiet = FALSE,
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mkinfit object

    + + +
    parm
    +

    A vector of names of the parameters which are to be given +confidence intervals. If missing, all parameters are considered.

    + + +
    level
    +

    The confidence level required

    + + +
    alpha
    +

    The allowed error probability, overrides 'level' if specified.

    + + +
    cutoff
    +

    Possibility to specify an alternative cutoff for the difference +in the log-likelihoods at the confidence boundary. Specifying an explicit +cutoff value overrides arguments 'level' and 'alpha'

    + + +
    method
    +

    The 'quadratic' method approximates the likelihood function at +the optimised parameters using the second term of the Taylor expansion, +using a second derivative (hessian) contained in the object. +The 'profile' method searches the parameter space for the +cutoff of the confidence intervals by means of a likelihood ratio test.

    + + +
    transformed
    +

    If the quadratic approximation is used, should it be +applied to the likelihood based on the transformed parameters?

    + + +
    backtransform
    +

    If we approximate the likelihood in terms of the +transformed parameters, should we backtransform the parameters with +their confidence intervals?

    + + +
    cores
    +

    The number of cores to be used for multicore processing. +On Windows machines, cores > 1 is currently not supported.

    + + +
    rel_tol
    +

    If the method is 'profile', what should be the accuracy +of the lower and upper bounds, relative to the estimate obtained from +the quadratic method?

    + + +
    quiet
    +

    Should we suppress the message "Profiling the likelihood"

    + + +
    ...
    +

    Not used

    + +
    +
    +

    Value

    +

    A matrix with columns giving lower and upper confidence limits for +each parameter.

    +
    +
    +

    References

    +

    Bates DM and Watts GW (1988) Nonlinear regression analysis & its applications

    +

    Pawitan Y (2013) In all likelihood - Statistical modelling and +inference using likelihood. Clarendon Press, Oxford.

    +

    Venzon DJ and Moolgavkar SH (1988) A Method for Computing +Profile-Likelihood Based Confidence Intervals, Applied Statistics, 37, +87–94.

    +
    + +
    +

    Examples

    +
    f <- mkinfit("SFO", FOCUS_2006_C, quiet = TRUE)
    +confint(f, method = "quadratic")
    +#>                2.5%      97.5%
    +#> parent_0 71.8242430 93.1600766
    +#> k_parent  0.2109541  0.4440528
    +#> sigma     1.9778868  7.3681380
    +
    +# \dontrun{
    +confint(f, method = "profile")
    +#> Profiling the likelihood
    +#>                2.5%      97.5%
    +#> parent_0 73.0641834 92.1392181
    +#> k_parent  0.2170293  0.4235348
    +#> sigma     3.1307772  8.0628314
    +
    +# Set the number of cores for the profiling method for further examples
    +if (identical(Sys.getenv("NOT_CRAN"), "true")) {
    +  n_cores <- parallel::detectCores() - 1
    +} else {
    +  n_cores <- 1
    +}
    +if (Sys.getenv("TRAVIS") != "") n_cores = 1
    +if (Sys.info()["sysname"] == "Windows") n_cores = 1
    +
    +SFO_SFO <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"),
    +  use_of_ff = "min", quiet = TRUE)
    +SFO_SFO.ff <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"),
    +  use_of_ff = "max", quiet = TRUE)
    +f_d_1 <- mkinfit(SFO_SFO, subset(FOCUS_2006_D, value != 0), quiet = TRUE)
    +system.time(ci_profile <- confint(f_d_1, method = "profile", cores = 1, quiet = TRUE))
    +#>    user  system elapsed 
    +#>   1.182   0.004   1.186 
    +# Using more cores does not save much time here, as parent_0 takes up most of the time
    +# If we additionally exclude parent_0 (the confidence of which is often of
    +# minor interest), we get a nice performance improvement if we use at least 4 cores
    +system.time(ci_profile_no_parent_0 <- confint(f_d_1, method = "profile",
    +  c("k_parent_sink", "k_parent_m1", "k_m1_sink", "sigma"), cores = n_cores))
    +#> Profiling the likelihood
    +#>    user  system elapsed 
    +#>   0.429   0.171   0.324 
    +ci_profile
    +#>                       2.5%        97.5%
    +#> parent_0      96.456003640 1.027703e+02
    +#> k_parent_sink  0.040762501 5.549764e-02
    +#> k_parent_m1    0.046786482 5.500879e-02
    +#> k_m1_sink      0.003892605 6.702778e-03
    +#> sigma          2.535612399 3.985263e+00
    +ci_quadratic_transformed <- confint(f_d_1, method = "quadratic")
    +ci_quadratic_transformed
    +#>                       2.5%        97.5%
    +#> parent_0      96.403841640 1.027931e+02
    +#> k_parent_sink  0.041033378 5.596269e-02
    +#> k_parent_m1    0.046777902 5.511931e-02
    +#> k_m1_sink      0.004012217 6.897547e-03
    +#> sigma          2.396089689 3.854918e+00
    +ci_quadratic_untransformed <- confint(f_d_1, method = "quadratic", transformed = FALSE)
    +ci_quadratic_untransformed
    +#>                       2.5%        97.5%
    +#> parent_0      96.403841645 102.79312449
    +#> k_parent_sink  0.040485331   0.05535491
    +#> k_parent_m1    0.046611582   0.05494364
    +#> k_m1_sink      0.003835483   0.00668582
    +#> sigma          2.396089689   3.85491806
    +# Against the expectation based on Bates and Watts (1988), the confidence
    +# intervals based on the internal parameter transformation are less
    +# congruent with the likelihood based intervals. Note the superiority of the
    +# interval based on the untransformed fit for k_m1_sink
    +rel_diffs_transformed <- abs((ci_quadratic_transformed - ci_profile)/ci_profile)
    +rel_diffs_untransformed <- abs((ci_quadratic_untransformed - ci_profile)/ci_profile)
    +rel_diffs_transformed < rel_diffs_untransformed
    +#>                2.5% 97.5%
    +#> parent_0      FALSE FALSE
    +#> k_parent_sink  TRUE FALSE
    +#> k_parent_m1    TRUE FALSE
    +#> k_m1_sink     FALSE FALSE
    +#> sigma         FALSE FALSE
    +signif(rel_diffs_transformed, 3)
    +#>                   2.5%    97.5%
    +#> parent_0      0.000541 0.000222
    +#> k_parent_sink 0.006650 0.008380
    +#> k_parent_m1   0.000183 0.002010
    +#> k_m1_sink     0.030700 0.029100
    +#> sigma         0.055000 0.032700
    +signif(rel_diffs_untransformed, 3)
    +#>                   2.5%    97.5%
    +#> parent_0      0.000541 0.000222
    +#> k_parent_sink 0.006800 0.002570
    +#> k_parent_m1   0.003740 0.001180
    +#> k_m1_sink     0.014700 0.002530
    +#> sigma         0.055000 0.032700
    +
    +
    +# Investigate a case with formation fractions
    +f_d_2 <- mkinfit(SFO_SFO.ff, subset(FOCUS_2006_D, value != 0), quiet = TRUE)
    +ci_profile_ff <- confint(f_d_2, method = "profile", cores = n_cores)
    +#> Profiling the likelihood
    +ci_profile_ff
    +#>                        2.5%        97.5%
    +#> parent_0       96.456003640 1.027703e+02
    +#> k_parent        0.090911032 1.071578e-01
    +#> k_m1            0.003892606 6.702775e-03
    +#> f_parent_to_m1  0.471328495 5.611550e-01
    +#> sigma           2.535612399 3.985263e+00
    +ci_quadratic_transformed_ff <- confint(f_d_2, method = "quadratic")
    +ci_quadratic_transformed_ff
    +#>                        2.5%        97.5%
    +#> parent_0       96.403833581 102.79311649
    +#> k_parent        0.090823771   0.10725430
    +#> k_m1            0.004012219   0.00689755
    +#> f_parent_to_m1  0.469118824   0.55959615
    +#> sigma           2.396089689   3.85491806
    +ci_quadratic_untransformed_ff <- confint(f_d_2, method = "quadratic", transformed = FALSE)
    +ci_quadratic_untransformed_ff
    +#>                        2.5%        97.5%
    +#> parent_0       96.403833586 1.027931e+02
    +#> k_parent        0.090491913 1.069035e-01
    +#> k_m1            0.003835485 6.685823e-03
    +#> f_parent_to_m1  0.469113477 5.598387e-01
    +#> sigma           2.396089689 3.854918e+00
    +rel_diffs_transformed_ff <- abs((ci_quadratic_transformed_ff - ci_profile_ff)/ci_profile_ff)
    +rel_diffs_untransformed_ff <- abs((ci_quadratic_untransformed_ff - ci_profile_ff)/ci_profile_ff)
    +# While the confidence interval for the parent rate constant is closer to
    +# the profile based interval when using the internal parameter
    +# transformation, the interval for the metabolite rate constant is 'better
    +# without internal parameter transformation.
    +rel_diffs_transformed_ff < rel_diffs_untransformed_ff
    +#>                 2.5% 97.5%
    +#> parent_0       FALSE FALSE
    +#> k_parent        TRUE  TRUE
    +#> k_m1           FALSE FALSE
    +#> f_parent_to_m1  TRUE FALSE
    +#> sigma           TRUE FALSE
    +rel_diffs_transformed_ff
    +#>                        2.5%        97.5%
    +#> parent_0       0.0005408690 0.0002217233
    +#> k_parent       0.0009598532 0.0009001864
    +#> k_m1           0.0307283045 0.0290588367
    +#> f_parent_to_m1 0.0046881768 0.0027780062
    +#> sigma          0.0550252516 0.0327066836
    +rel_diffs_untransformed_ff
    +#>                        2.5%        97.5%
    +#> parent_0       0.0005408689 0.0002217233
    +#> k_parent       0.0046102155 0.0023732280
    +#> k_m1           0.0146740687 0.0025291815
    +#> f_parent_to_m1 0.0046995210 0.0023457712
    +#> sigma          0.0550252516 0.0327066836
    +
    +# The profiling for the following fit does not finish in a reasonable time,
    +# therefore we use the quadratic approximation
    +m_synth_DFOP_par <- mkinmod(parent = mkinsub("DFOP", c("M1", "M2")),
    +  M1 = mkinsub("SFO"),
    +  M2 = mkinsub("SFO"),
    +  use_of_ff = "max", quiet = TRUE)
    +DFOP_par_c <- synthetic_data_for_UBA_2014[[12]]$data
    +f_tc_2 <- mkinfit(m_synth_DFOP_par, DFOP_par_c, error_model = "tc",
    +  error_model_algorithm = "direct", quiet = TRUE)
    +confint(f_tc_2, method = "quadratic")
    +#>                        2.5%        97.5%
    +#> parent_0       94.596181875 106.19936592
    +#> k_M1            0.037605432   0.04490757
    +#> k_M2            0.008568745   0.01087675
    +#> f_parent_to_M1  0.021464676   0.62023880
    +#> f_parent_to_M2  0.015167158   0.37975350
    +#> k1              0.273897535   0.33388072
    +#> k2              0.018614555   0.02250379
    +#> g               0.671943738   0.73583261
    +#> sigma_low       0.251283679   0.83992102
    +#> rsd_high        0.040411022   0.07662008
    +confint(f_tc_2, "parent_0", method = "quadratic")
    +#>              2.5%    97.5%
    +#> parent_0 94.59618 106.1994
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/create_deg_func.html b/docs/dev/reference/create_deg_func.html new file mode 100644 index 00000000..4c66c02b --- /dev/null +++ b/docs/dev/reference/create_deg_func.html @@ -0,0 +1,148 @@ + +Create degradation functions for known analytical solutions — create_deg_func • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Create degradation functions for known analytical solutions

    +
    + +
    +

    Usage

    +
    create_deg_func(spec, use_of_ff = c("min", "max"))
    +
    + +
    +

    Arguments

    + + +
    spec
    +

    List of model specifications as contained in mkinmod objects

    + + +
    use_of_ff
    +

    Minimum or maximum use of formation fractions

    + +
    +
    +

    Value

    +

    Degradation function to be attached to mkinmod objects

    +
    + +
    +

    Examples

    +
    
    +SFO_SFO <- mkinmod(
    +  parent = mkinsub("SFO", "m1"),
    +  m1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +FOCUS_D <- subset(FOCUS_2006_D, value != 0) # to avoid warnings
    +fit_1 <- mkinfit(SFO_SFO, FOCUS_D, solution_type = "analytical", quiet = TRUE)
    +# \dontrun{
    +fit_2 <- mkinfit(SFO_SFO, FOCUS_D, solution_type = "deSolve", quiet = TRUE)
    +if (require(rbenchmark))
    +  benchmark(
    +    analytical = mkinfit(SFO_SFO, FOCUS_D, solution_type = "analytical", quiet = TRUE),
    +    deSolve = mkinfit(SFO_SFO, FOCUS_D, solution_type = "deSolve", quiet = TRUE),
    +    replications = 2)
    +#> Loading required package: rbenchmark
    +#>         test replications elapsed relative user.self sys.self user.child
    +#> 1 analytical            2   0.249    1.000     0.249        0          0
    +#> 2    deSolve            2   0.307    1.233     0.306        0          0
    +#>   sys.child
    +#> 1         0
    +#> 2         0
    +  DFOP_SFO <- mkinmod(
    +    parent = mkinsub("DFOP", "m1"),
    +    m1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +  benchmark(
    +    analytical = mkinfit(DFOP_SFO, FOCUS_D, solution_type = "analytical", quiet = TRUE),
    +    deSolve = mkinfit(DFOP_SFO, FOCUS_D, solution_type = "deSolve", quiet = TRUE),
    +    replications = 2)
    +#>         test replications elapsed relative user.self sys.self user.child
    +#> 1 analytical            2   0.391    1.000     0.391        0          0
    +#> 2    deSolve            2   0.543    1.389     0.542        0          0
    +#>   sys.child
    +#> 1         0
    +#> 2         0
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/dimethenamid_2018-1.png b/docs/dev/reference/dimethenamid_2018-1.png new file mode 100644 index 00000000..3a509a7f Binary files /dev/null and b/docs/dev/reference/dimethenamid_2018-1.png differ diff --git a/docs/dev/reference/dimethenamid_2018.html b/docs/dev/reference/dimethenamid_2018.html new file mode 100644 index 00000000..4bd35bc6 --- /dev/null +++ b/docs/dev/reference/dimethenamid_2018.html @@ -0,0 +1,347 @@ + +Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018 — dimethenamid_2018 • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The datasets were extracted from the active substance evaluation dossier +published by EFSA. Kinetic evaluations shown for these datasets are intended +to illustrate and advance kinetic modelling. The fact that these data and +some results are shown here does not imply a license to use them in the +context of pesticide registrations, as the use of the data may be +constrained by data protection regulations.

    +
    + +
    +

    Usage

    +
    dimethenamid_2018
    +
    + +
    +

    Format

    +

    An mkindsg object grouping seven datasets with some meta information

    +
    +
    +

    Source

    +

    Rapporteur Member State Germany, Co-Rapporteur Member State Bulgaria (2018) +Renewal Assessment Report Dimethenamid-P Volume 3 - B.8 Environmental fate and behaviour +Rev. 2 - November 2017 +https://open.efsa.europa.eu/study-inventory/EFSA-Q-2014-00716

    +
    +
    +

    Details

    +

    The R code used to create this data object is installed with this package +in the 'dataset_generation' directory. In the code, page numbers are given for +specific pieces of information in the comments.

    +
    + +
    +

    Examples

    +
    print(dimethenamid_2018)
    +#> <mkindsg> holding 7 mkinds objects
    +#> Title $title:  Aerobic soil degradation data on dimethenamid-P from the EU assessment in 2018 
    +#> Occurrence of observed compounds $observed_n:
    +#> DMTAP   M23   M27   M31  DMTA 
    +#>     3     7     7     7     4 
    +#> Time normalisation factors $f_time_norm:
    +#> [1] 1.0000000 0.9706477 1.2284784 1.2284784 0.6233856 0.7678922 0.6733938
    +#> Meta information $meta:
    +#>                      study  usda_soil_type study_moisture_ref_type rel_moisture
    +#> Calke        Unsworth 2014      Sandy loam                     pF2         1.00
    +#> Borstel  Staudenmaier 2009            Sand                     pF1         0.50
    +#> Elliot 1        Wendt 1997       Clay loam                   pF2.5         0.75
    +#> Elliot 2        Wendt 1997       Clay loam                   pF2.5         0.75
    +#> Flaach          König 1996 Sandy clay loam                     pF1         0.40
    +#> BBA 2.2         König 1995      Loamy sand                     pF1         0.40
    +#> BBA 2.3         König 1995      Sandy loam                     pF1         0.40
    +#>          study_ref_moisture temperature
    +#> Calke                    NA          20
    +#> Borstel               23.00          20
    +#> Elliot 1              33.37          23
    +#> Elliot 2              33.37          23
    +#> Flaach                   NA          20
    +#> BBA 2.2                  NA          20
    +#> BBA 2.3                  NA          20
    +dmta_ds <- lapply(1:7, function(i) {
    +  ds_i <- dimethenamid_2018$ds[[i]]$data
    +  ds_i[ds_i$name == "DMTAP", "name"] <-  "DMTA"
    +  ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i]
    +  ds_i
    +})
    +names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title)
    +dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]])
    +dmta_ds[["Elliot 1"]] <- NULL
    +dmta_ds[["Elliot 2"]] <- NULL
    +# \dontrun{
    +# We don't use DFOP for the parent compound, as this gives numerical
    +# instabilities in the fits
    +sfo_sfo3p <- mkinmod(
    + DMTA = mkinsub("SFO", c("M23", "M27", "M31")),
    + M23 = mkinsub("SFO"),
    + M27 = mkinsub("SFO"),
    + M31 = mkinsub("SFO", "M27", sink = FALSE),
    + quiet = TRUE
    +)
    +dmta_sfo_sfo3p_tc <- mmkin(list("SFO-SFO3+" = sfo_sfo3p),
    +  dmta_ds, error_model = "tc", quiet = TRUE)
    +print(dmta_sfo_sfo3p_tc)
    +#> <mmkin> object
    +#> Status of individual fits:
    +#> 
    +#>            dataset
    +#> model       Calke Borstel Flaach BBA 2.2 BBA 2.3 Elliot
    +#>   SFO-SFO3+ OK    OK      OK     OK      OK      OK    
    +#> 
    +#> OK: No warnings
    +# The default (test_log_parms = FALSE) gives an undue
    +# influence of ill-defined rate constants that have
    +# extremely small values:
    +plot(mixed(dmta_sfo_sfo3p_tc), test_log_parms = FALSE)
    +
    +# If we disregards ill-defined rate constants, the results
    +# look more plausible, but the truth is likely to be in
    +# between these variants
    +plot(mixed(dmta_sfo_sfo3p_tc), test_log_parms = TRUE)
    +# We can also specify a default value for the failing
    +# log parameters, to mimic FOCUS guidance
    +plot(mixed(dmta_sfo_sfo3p_tc), test_log_parms = TRUE,
    +  default_log_parms = log(2)/1000)
    +# As these attempts are not satisfying, we use nonlinear mixed-effects models
    +# f_dmta_nlme_tc <- nlme(dmta_sfo_sfo3p_tc)
    +# nlme reaches maxIter = 50 without convergence
    +f_dmta_saem_tc <- saem(dmta_sfo_sfo3p_tc)
    +# I am commenting out the convergence plot as rendering them
    +# with pkgdown fails (at least without further tweaks to the
    +# graphics device used)
    +#saemix::plot(f_dmta_saem_tc$so, plot.type = "convergence")
    +summary(f_dmta_saem_tc)
    +#> saemix version used for fitting:      3.3 
    +#> mkin version used for pre-fitting:  1.2.10 
    +#> R version used for fitting:         4.4.2 
    +#> Date of fit:     Fri Feb 14 07:29:22 2025 
    +#> Date of summary: Fri Feb 14 07:29:22 2025 
    +#> 
    +#> Equations:
    +#> d_DMTA/dt = - k_DMTA * DMTA
    +#> d_M23/dt = + f_DMTA_to_M23 * k_DMTA * DMTA - k_M23 * M23
    +#> d_M27/dt = + f_DMTA_to_M27 * k_DMTA * DMTA - k_M27 * M27 + k_M31 * M31
    +#> d_M31/dt = + f_DMTA_to_M31 * k_DMTA * DMTA - k_M31 * M31
    +#> 
    +#> Data:
    +#> 563 observations of 4 variable(s) grouped in 6 datasets
    +#> 
    +#> Model predictions using solution type deSolve 
    +#> 
    +#> Fitted in 295.57 s
    +#> Using 300, 100 iterations and 9 chains
    +#> 
    +#> Variance model: Two-component variance function 
    +#> 
    +#> Starting values for degradation parameters:
    +#>       DMTA_0   log_k_DMTA    log_k_M23    log_k_M27    log_k_M31 f_DMTA_ilr_1 
    +#>      95.5662      -2.9048      -3.8130      -4.1600      -4.1486       0.1341 
    +#> f_DMTA_ilr_2 f_DMTA_ilr_3 
    +#>       0.1385      -1.6700 
    +#> 
    +#> Fixed degradation parameter values:
    +#> None
    +#> 
    +#> Starting values for random effects (square root of initial entries in omega):
    +#>              DMTA_0 log_k_DMTA log_k_M23 log_k_M27 log_k_M31 f_DMTA_ilr_1
    +#> DMTA_0        4.802     0.0000    0.0000     0.000    0.0000       0.0000
    +#> log_k_DMTA    0.000     0.9834    0.0000     0.000    0.0000       0.0000
    +#> log_k_M23     0.000     0.0000    0.6983     0.000    0.0000       0.0000
    +#> log_k_M27     0.000     0.0000    0.0000     1.028    0.0000       0.0000
    +#> log_k_M31     0.000     0.0000    0.0000     0.000    0.9841       0.0000
    +#> f_DMTA_ilr_1  0.000     0.0000    0.0000     0.000    0.0000       0.7185
    +#> f_DMTA_ilr_2  0.000     0.0000    0.0000     0.000    0.0000       0.0000
    +#> f_DMTA_ilr_3  0.000     0.0000    0.0000     0.000    0.0000       0.0000
    +#>              f_DMTA_ilr_2 f_DMTA_ilr_3
    +#> DMTA_0             0.0000       0.0000
    +#> log_k_DMTA         0.0000       0.0000
    +#> log_k_M23          0.0000       0.0000
    +#> log_k_M27          0.0000       0.0000
    +#> log_k_M31          0.0000       0.0000
    +#> f_DMTA_ilr_1       0.0000       0.0000
    +#> f_DMTA_ilr_2       0.7378       0.0000
    +#> f_DMTA_ilr_3       0.0000       0.4451
    +#> 
    +#> Starting values for error model parameters:
    +#> a.1 b.1 
    +#>   1   1 
    +#> 
    +#> Results:
    +#> 
    +#> Likelihood computed by importance sampling
    +#>    AIC  BIC logLik
    +#>   2276 2273  -1120
    +#> 
    +#> Optimised parameters:
    +#>                    est.   lower   upper
    +#> DMTA_0          88.4862 84.1127 92.8598
    +#> log_k_DMTA      -3.0512 -3.5674 -2.5351
    +#> log_k_M23       -4.0576 -4.9013 -3.2139
    +#> log_k_M27       -3.8584 -4.2572 -3.4595
    +#> log_k_M31       -3.9779 -4.4844 -3.4714
    +#> f_DMTA_ilr_1     0.1264 -0.2186  0.4714
    +#> f_DMTA_ilr_2     0.1509 -0.2547  0.5565
    +#> f_DMTA_ilr_3    -1.3891 -1.6962 -1.0819
    +#> a.1              0.9196  0.8307  1.0085
    +#> b.1              0.1377  0.1205  0.1549
    +#> SD.DMTA_0        3.5956 -0.8167  8.0078
    +#> SD.log_k_DMTA    0.6437  0.2784  1.0091
    +#> SD.log_k_M23     0.9929  0.3719  1.6139
    +#> SD.log_k_M27     0.4530  0.1522  0.7537
    +#> SD.log_k_M31     0.5773  0.1952  0.9595
    +#> SD.f_DMTA_ilr_1  0.4063  0.1505  0.6621
    +#> SD.f_DMTA_ilr_2  0.4800  0.1817  0.7783
    +#> SD.f_DMTA_ilr_3  0.3582  0.1350  0.5814
    +#> 
    +#> Correlation: 
    +#>              DMTA_0  l__DMTA lg__M23 lg__M27 lg__M31 f_DMTA__1 f_DMTA__2
    +#> log_k_DMTA    0.0306                                                    
    +#> log_k_M23    -0.0234 -0.0032                                            
    +#> log_k_M27    -0.0380 -0.0049  0.0041                                    
    +#> log_k_M31    -0.0247 -0.0031  0.0022  0.0817                            
    +#> f_DMTA_ilr_1 -0.0046 -0.0006  0.0425 -0.0438  0.0319                    
    +#> f_DMTA_ilr_2 -0.0008 -0.0002  0.0216 -0.0267 -0.0890 -0.0349            
    +#> f_DMTA_ilr_3 -0.1805 -0.0136  0.0434  0.0791  0.0390 -0.0061    0.0053  
    +#> 
    +#> Random effects:
    +#>                   est.   lower  upper
    +#> SD.DMTA_0       3.5956 -0.8167 8.0078
    +#> SD.log_k_DMTA   0.6437  0.2784 1.0091
    +#> SD.log_k_M23    0.9929  0.3719 1.6139
    +#> SD.log_k_M27    0.4530  0.1522 0.7537
    +#> SD.log_k_M31    0.5773  0.1952 0.9595
    +#> SD.f_DMTA_ilr_1 0.4063  0.1505 0.6621
    +#> SD.f_DMTA_ilr_2 0.4800  0.1817 0.7783
    +#> SD.f_DMTA_ilr_3 0.3582  0.1350 0.5814
    +#> 
    +#> Variance model:
    +#>       est.  lower  upper
    +#> a.1 0.9196 0.8307 1.0085
    +#> b.1 0.1377 0.1205 0.1549
    +#> 
    +#> Backtransformed parameters:
    +#>                   est.     lower    upper
    +#> DMTA_0        88.48621 84.112654 92.85977
    +#> k_DMTA         0.04730  0.028230  0.07926
    +#> k_M23          0.01729  0.007437  0.04020
    +#> k_M27          0.02110  0.014162  0.03144
    +#> k_M31          0.01872  0.011283  0.03107
    +#> f_DMTA_to_M23  0.14551        NA       NA
    +#> f_DMTA_to_M27  0.12169        NA       NA
    +#> f_DMTA_to_M31  0.11062        NA       NA
    +#> 
    +#> Resulting formation fractions:
    +#>               ff
    +#> DMTA_M23  0.1455
    +#> DMTA_M27  0.1217
    +#> DMTA_M31  0.1106
    +#> DMTA_sink 0.6222
    +#> 
    +#> Estimated disappearance times:
    +#>       DT50   DT90
    +#> DMTA 14.65  48.68
    +#> M23  40.09 133.17
    +#> M27  32.85 109.11
    +#> M31  37.02 122.97
    +# As the confidence interval for the random effects of DMTA_0
    +# includes zero, we could try an alternative model without
    +# such random effects
    +# f_dmta_saem_tc_2 <- saem(dmta_sfo_sfo3p_tc,
    +#   covariance.model = diag(c(0, rep(1, 7))))
    +# saemix::plot(f_dmta_saem_tc_2$so, plot.type = "convergence")
    +# This does not perform better judged by AIC and BIC
    +# saemix::compare.saemix(f_dmta_saem_tc$so, f_dmta_saem_tc_2$so)
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/ds_dfop.html b/docs/dev/reference/ds_dfop.html new file mode 100644 index 00000000..66134d2e --- /dev/null +++ b/docs/dev/reference/ds_dfop.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/ds_dfop_sfo.html b/docs/dev/reference/ds_dfop_sfo.html new file mode 100644 index 00000000..66134d2e --- /dev/null +++ b/docs/dev/reference/ds_dfop_sfo.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/ds_fomc.html b/docs/dev/reference/ds_fomc.html new file mode 100644 index 00000000..66134d2e --- /dev/null +++ b/docs/dev/reference/ds_fomc.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/ds_hs.html b/docs/dev/reference/ds_hs.html new file mode 100644 index 00000000..66134d2e --- /dev/null +++ b/docs/dev/reference/ds_hs.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/ds_mixed-1.png b/docs/dev/reference/ds_mixed-1.png new file mode 100644 index 00000000..7968f1c9 Binary files /dev/null and b/docs/dev/reference/ds_mixed-1.png differ diff --git a/docs/dev/reference/ds_mixed.html b/docs/dev/reference/ds_mixed.html new file mode 100644 index 00000000..875949dd --- /dev/null +++ b/docs/dev/reference/ds_mixed.html @@ -0,0 +1,208 @@ + +Synthetic data for hierarchical kinetic degradation models — ds_mixed • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The R code used to create this data object is installed with this package in +the 'dataset_generation' directory.

    +
    + + + +
    +

    Examples

    +
    # \dontrun{
    +  sfo_mmkin <- mmkin("SFO", ds_sfo, quiet = TRUE, error_model = "tc", cores = 15)
    +  sfo_saem <- saem(sfo_mmkin, no_random_effect = "parent_0")
    +  plot(sfo_saem)
    +
    +# }
    +
    +# This is the code used to generate the datasets
    +cat(readLines(system.file("dataset_generation/ds_mixed.R", package = "mkin")), sep = "\n")
    +#> # Synthetic data for hierarchical kinetic models
    +#> # Refactored version of the code previously in tests/testthat/setup_script.R
    +#> # The number of datasets was 3 for FOMC, and 10 for HS in that script, now it
    +#> # is always 15 for consistency
    +#> 
    +#> library(mkin)  # We use mkinmod and mkinpredict
    +#> sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +#> n <- 15
    +#> log_sd <- 0.3
    +#> err_1 = list(const = 1, prop = 0.05)
    +#> tc <- function(value) sigma_twocomp(value, err_1$const, err_1$prop)
    +#> const <- function(value) 2
    +#> 
    +#> set.seed(123456)
    +#> SFO <- mkinmod(parent = mkinsub("SFO"))
    +#> sfo_pop <- list(parent_0 = 100, k_parent = 0.03)
    +#> sfo_parms <- as.matrix(data.frame(
    +#>     k_parent = rlnorm(n, log(sfo_pop$k_parent), log_sd)))
    +#> set.seed(123456)
    +#> ds_sfo <- lapply(1:n, function(i) {
    +#>   ds_mean <- mkinpredict(SFO, sfo_parms[i, ],
    +#>     c(parent = sfo_pop$parent_0), sampling_times)
    +#>   add_err(ds_mean, tc, n = 1)[[1]]
    +#> })
    +#> attr(ds_sfo, "pop") <- sfo_pop
    +#> attr(ds_sfo, "parms") <- sfo_parms
    +#> 
    +#> set.seed(123456)
    +#> FOMC <- mkinmod(parent = mkinsub("FOMC"))
    +#> fomc_pop <- list(parent_0 = 100, alpha = 2, beta = 8)
    +#> fomc_parms <- as.matrix(data.frame(
    +#>     alpha = rlnorm(n, log(fomc_pop$alpha), 0.4),
    +#>     beta = rlnorm(n, log(fomc_pop$beta), 0.2)))
    +#> set.seed(123456)
    +#> ds_fomc <- lapply(1:n, function(i) {
    +#>   ds_mean <- mkinpredict(FOMC, fomc_parms[i, ],
    +#>     c(parent = fomc_pop$parent_0), sampling_times)
    +#>   add_err(ds_mean, tc, n = 1)[[1]]
    +#> })
    +#> attr(ds_fomc, "pop") <- fomc_pop
    +#> attr(ds_fomc, "parms") <- fomc_parms
    +#> 
    +#> set.seed(123456)
    +#> DFOP <- mkinmod(parent = mkinsub("DFOP"))
    +#> dfop_pop <- list(parent_0 = 100, k1 = 0.06, k2 = 0.015, g = 0.4)
    +#> dfop_parms <- as.matrix(data.frame(
    +#>   k1 = rlnorm(n, log(dfop_pop$k1), log_sd),
    +#>   k2 = rlnorm(n, log(dfop_pop$k2), log_sd),
    +#>   g = plogis(rnorm(n, qlogis(dfop_pop$g), log_sd))))
    +#> set.seed(123456)
    +#> ds_dfop <- lapply(1:n, function(i) {
    +#>   ds_mean <- mkinpredict(DFOP, dfop_parms[i, ],
    +#>     c(parent = dfop_pop$parent_0), sampling_times)
    +#>   add_err(ds_mean, tc, n = 1)[[1]]
    +#> })
    +#> attr(ds_dfop, "pop") <- dfop_pop
    +#> attr(ds_dfop, "parms") <- dfop_parms
    +#> 
    +#> set.seed(123456)
    +#> HS <- mkinmod(parent = mkinsub("HS"))
    +#> hs_pop <- list(parent_0 = 100, k1 = 0.08, k2 = 0.01, tb = 15)
    +#> hs_parms <- as.matrix(data.frame(
    +#>   k1 = rlnorm(n, log(hs_pop$k1), log_sd),
    +#>   k2 = rlnorm(n, log(hs_pop$k2), log_sd),
    +#>   tb = rlnorm(n, log(hs_pop$tb), 0.1)))
    +#> set.seed(123456)
    +#> ds_hs <- lapply(1:n, function(i) {
    +#>   ds_mean <- mkinpredict(HS, hs_parms[i, ],
    +#>     c(parent = hs_pop$parent_0), sampling_times)
    +#>   add_err(ds_mean, const, n = 1)[[1]]
    +#> })
    +#> attr(ds_hs, "pop") <- hs_pop
    +#> attr(ds_hs, "parms") <- hs_parms
    +#> 
    +#> set.seed(123456)
    +#> DFOP_SFO <- mkinmod(
    +#>   parent = mkinsub("DFOP", "m1"),
    +#>   m1 = mkinsub("SFO"),
    +#>   quiet = TRUE)
    +#> dfop_sfo_pop <- list(parent_0 = 100,
    +#>   k_m1 = 0.007, f_parent_to_m1 = 0.5,
    +#>   k1 = 0.1, k2 = 0.02, g = 0.5)
    +#> dfop_sfo_parms <- as.matrix(data.frame(
    +#>   k1 = rlnorm(n, log(dfop_sfo_pop$k1), log_sd),
    +#>   k2 = rlnorm(n, log(dfop_sfo_pop$k2), log_sd),
    +#>   g = plogis(rnorm(n, qlogis(dfop_sfo_pop$g), log_sd)),
    +#>   f_parent_to_m1 = plogis(rnorm(n,
    +#>       qlogis(dfop_sfo_pop$f_parent_to_m1), log_sd)),
    +#>   k_m1 = rlnorm(n, log(dfop_sfo_pop$k_m1), log_sd)))
    +#> ds_dfop_sfo_mean <- lapply(1:n,
    +#>   function(i) {
    +#>     mkinpredict(DFOP_SFO, dfop_sfo_parms[i, ],
    +#>       c(parent = dfop_sfo_pop$parent_0, m1 = 0), sampling_times)
    +#>   }
    +#> )
    +#> set.seed(123456)
    +#> ds_dfop_sfo <- lapply(ds_dfop_sfo_mean, function(ds) {
    +#>   add_err(ds,
    +#>     sdfunc = function(value) sqrt(err_1$const^2 + value^2 * err_1$prop^2),
    +#>     n = 1, secondary = "m1")[[1]]
    +#> })
    +#> attr(ds_dfop_sfo, "pop") <- dfop_sfo_pop
    +#> attr(ds_dfop_sfo, "parms") <- dfop_sfo_parms
    +#> 
    +#> #save(ds_sfo, ds_fomc, ds_dfop, ds_hs, ds_dfop_sfo, file = "data/ds_mixed.rda", version = 2)
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/ds_sfo.html b/docs/dev/reference/ds_sfo.html new file mode 100644 index 00000000..66134d2e --- /dev/null +++ b/docs/dev/reference/ds_sfo.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/endpoints.html b/docs/dev/reference/endpoints.html new file mode 100644 index 00000000..daa1ec0b --- /dev/null +++ b/docs/dev/reference/endpoints.html @@ -0,0 +1,181 @@ + +Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function calculates DT50 and DT90 values as well as formation fractions +from kinetic models fitted with mkinfit. If the SFORB model was specified +for one of the parents or metabolites, the Eigenvalues are returned. These +are equivalent to the rate constants of the DFOP model, but with the +advantage that the SFORB model can also be used for metabolites.

    +
    + +
    +

    Usage

    +
    endpoints(fit, covariates = NULL, covariate_quantile = 0.5)
    +
    + +
    +

    Arguments

    + + +
    fit
    +

    An object of class mkinfit, nlme.mmkin or saem.mmkin, or +another object that has list components mkinmod containing an mkinmod +degradation model, and two numeric vectors, bparms.optim and bparms.fixed, +that contain parameter values for that model.

    + + +
    covariates
    +

    Numeric vector with covariate values for all variables in +any covariate models in the object. If given, it overrides 'covariate_quantile'.

    + + +
    covariate_quantile
    +

    This argument only has an effect if the fitted +object has covariate models. If so, the default is to show endpoints +for the median of the covariate values (50th percentile).

    + +
    +
    +

    Value

    +

    A list with a matrix of dissipation times named distimes, and, if +applicable, a vector of formation fractions named ff and, if the SFORB model +was in use, a vector of eigenvalues of these SFORB models, equivalent to +DFOP rate constants

    +
    +
    +

    Details

    +

    Additional DT50 values are calculated from the FOMC DT90 and k1 and k2 from +HS and DFOP, as well as from Eigenvalues b1 and b2 of any SFORB models

    +
    +
    +

    Note

    +

    The function is used internally by summary.mkinfit, +summary.nlme.mmkin and summary.saem.mmkin.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +  fit <- mkinfit("FOMC", FOCUS_2006_C, quiet = TRUE)
    +  endpoints(fit)
    +#> $distimes
    +#>            DT50    DT90 DT50back
    +#> parent 1.785233 15.1479 4.559973
    +#> 
    +  # \dontrun{
    +    fit_2 <- mkinfit("DFOP", FOCUS_2006_C, quiet = TRUE)
    +    endpoints(fit_2)
    +#> $distimes
    +#>            DT50     DT90 DT50back  DT50_k1  DT50_k2
    +#> parent 1.886925 21.25106 6.397207 1.508293 38.83438
    +#> 
    +    fit_3 <- mkinfit("SFORB", FOCUS_2006_C, quiet = TRUE)
    +    endpoints(fit_3)
    +#> $ff
    +#> parent_free 
    +#>           1 
    +#> 
    +#> $SFORB
    +#> parent_b1 parent_b2  parent_g 
    +#> 0.4595574 0.0178488 0.8539454 
    +#> 
    +#> $distimes
    +#>            DT50     DT90 DT50back DT50_parent_b1 DT50_parent_b2
    +#> parent 1.886925 21.25106 6.397208       1.508293       38.83438
    +#> 
    +  # }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/experimental_data_for_UBA-1.png b/docs/dev/reference/experimental_data_for_UBA-1.png new file mode 100644 index 00000000..07c1b33e Binary files /dev/null and b/docs/dev/reference/experimental_data_for_UBA-1.png differ diff --git a/docs/dev/reference/experimental_data_for_UBA.html b/docs/dev/reference/experimental_data_for_UBA.html new file mode 100644 index 00000000..93ed1dfa --- /dev/null +++ b/docs/dev/reference/experimental_data_for_UBA.html @@ -0,0 +1,255 @@ + +Experimental datasets used for development and testing of error models — experimental_data_for_UBA_2019 • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The 12 datasets were extracted from active substance evaluation dossiers published + by EFSA. Kinetic evaluations shown for these datasets are intended to illustrate + and advance error model specifications. The fact that these data and some + results are shown here do not imply a license to use them in the context of + pesticide registrations, as the use of the data may be constrained by + data protection regulations.

    +

    Preprocessing of data was performed based on the recommendations of the FOCUS + kinetics workgroup (FOCUS, 2014) as described below.

    +

    Datasets 1 and 2 are from the Renewal Assessment Report (RAR) for imazamox + (France, 2015, p. 15). For setting values reported as zero, an LOQ of 0.1 + was assumed. Metabolite residues reported for day zero were added to the + parent compound residues.

    +

    Datasets 3 and 4 are from the Renewal Assessment Report (RAR) for isofetamid + (Belgium, 2014, p. 8) and show the data for two different radiolabels. For + dataset 4, the value given for the metabolite in the day zero sampling + in replicate B was added to the parent compound, following the respective + FOCUS recommendation.

    +

    Dataset 5 is from the Renewal Assessment Report (RAR) for ethofumesate + (Austria, 2015, p. 16).

    +

    Datasets 6 to 10 are from the Renewal Assessment Report (RAR) for glyphosate + (Germany, 2013, pages 8, 28, 50, 51). For the initial sampling, + the residues given for the metabolite were added to the parent + value, following the recommendation of the FOCUS kinetics workgroup.

    +

    Dataset 11 is from the Renewal Assessment Report (RAR) for 2,4-D + (Hellas, 2013, p. 644). Values reported as zero were set to NA, with + the exception of the day three sampling of metabolite A2, which was set + to one half of the LOD reported to be 1% AR.

    +

    Dataset 12 is from the Renewal Assessment Report (RAR) for thifensulfuron-methyl + (United Kingdom, 2014, p. 81).

    +
    + +
    +

    Usage

    +
    experimental_data_for_UBA_2019
    +
    + +
    +

    Format

    +

    A list containing twelve datasets as an R6 class defined by mkinds, + each containing, among others, the following components

    title
    +

    The name of the dataset, e.g. Soil 1

    + +
    data
    +

    A data frame with the data in the form expected by mkinfit

    + + +
    +
    +

    Source

    + + +

    Austria (2015). Ethofumesate Renewal Assessment Report Volume 3 Annex B.8 (AS)

    +

    Belgium (2014). Isofetamid (IKF-5411) Draft Assessment Report Volume 3 Annex B.8 (AS)

    +

    France (2015). Imazamox Draft Renewal Assessment Report Volume 3 Annex B.8 (AS)

    +

    FOCUS (2014) “Generic guidance for Estimating Persistence and + Degradation Kinetics from Environmental Fate Studies on Pesticides in EU + Registration” Report of the FOCUS Work Group on Degradation Kinetics, + Version 1.1, 18 December 2014 + http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +

    Germany (2013). Renewal Assessment Report Glyphosate Volume 3 Annex B.8: Environmental Fate + and Behaviour

    +

    Hellas (2013). Renewal Assessment Report 2,4-D Volume 3 Annex B.8: Fate and behaviour in the + environment

    +

    Ranke (2019) Documentation of results obtained for the error model expertise + written for the German Umweltbundesamt.

    +

    United Kingdom (2014). Thifensulfuron-methyl - Annex B.8 (Volume 3) to the Report and Proposed + Decision of the United Kingdom made to the European Commission under Regulation (EC) No. + 1141/2010 for renewal of an active substance

    +
    + +
    +

    Examples

    +
    # \dontrun{
    +
    +# Model definitions
    +sfo_sfo <- mkinmod(
    +  parent = mkinsub("SFO", to = "A1"),
    +  A1 = mkinsub("SFO"),
    +  use_of_ff = "max"
    +)
    +#> Temporary DLL for differentials generated and loaded
    +
    +dfop_sfo <- mkinmod(
    +  parent = mkinsub("DFOP", to = "A1"),
    +  A1 = mkinsub("SFO"),
    +  use_of_ff = "max"
    +)
    +#> Temporary DLL for differentials generated and loaded
    +
    +sfo_sfo_sfo <- mkinmod(
    +  parent = mkinsub("SFO", to = "A1"),
    +  A1 = mkinsub("SFO", to = "A2"),
    +  A2 = mkinsub("SFO"),
    +  use_of_ff = "max"
    +)
    +#> Temporary DLL for differentials generated and loaded
    +
    +dfop_sfo_sfo <- mkinmod(
    +  parent = mkinsub("DFOP", to = "A1"),
    +  A1 = mkinsub("SFO", to = "A2"),
    +  A2 = mkinsub("SFO"),
    +  use_of_ff = "max"
    +)
    +#> Temporary DLL for differentials generated and loaded
    +d_1_2 <- lapply(experimental_data_for_UBA_2019[1:2], function(x) x$data)
    +names(d_1_2) <- paste("Soil", 1:2)
    +
    +
    +f_1_2_tc <- mmkin(list("DFOP-SFO-SFO" = dfop_sfo_sfo), d_1_2, error_model = "tc")
    +
    +plot(f_1_2_tc, resplot = "errmod")
    +
    +
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/f_time_norm_focus.html b/docs/dev/reference/f_time_norm_focus.html new file mode 100644 index 00000000..f59f5eb2 --- /dev/null +++ b/docs/dev/reference/f_time_norm_focus.html @@ -0,0 +1,203 @@ + +Normalisation factors for aerobic soil degradation according to FOCUS guidance — f_time_norm_focus • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Time step normalisation factors for aerobic soil degradation as described +in Appendix 8 to the FOCUS kinetics guidance (FOCUS 2014, p. 369).

    +
    + +
    +

    Usage

    +
    f_time_norm_focus(object, ...)
    +
    +# S3 method for class 'numeric'
    +f_time_norm_focus(
    +  object,
    +  moisture = NA,
    +  field_moisture = NA,
    +  temperature = object,
    +  Q10 = 2.58,
    +  walker = 0.7,
    +  f_na = NA,
    +  ...
    +)
    +
    +# S3 method for class 'mkindsg'
    +f_time_norm_focus(
    +  object,
    +  study_moisture_ref_source = c("auto", "meta", "focus"),
    +  Q10 = 2.58,
    +  walker = 0.7,
    +  f_na = NA,
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An object containing information used for the calculations

    + + +
    ...
    +

    Currently not used

    + + +
    moisture
    +

    Numeric vector of moisture contents in \% w/w

    + + +
    field_moisture
    +

    Numeric vector of moisture contents at field capacity +(pF2) in \% w/w

    + + +
    temperature
    +

    Numeric vector of temperatures in °C

    + + +
    Q10
    +

    The Q10 value used for temperature normalisation

    + + +
    walker
    +

    The Walker exponent used for moisture normalisation

    + + +
    f_na
    +

    The factor to use for NA values. If set to NA, only factors +for complete cases will be returned.

    + + +
    study_moisture_ref_source
    +

    Source for the reference value +used to calculate the study moisture. If 'auto', preference is given +to a reference moisture given in the meta information, otherwise +the focus soil moisture for the soil class is used

    + +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics +FOCUS (2014) “Generic guidance for Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +Version 1.1, 18 December 2014 +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    f_time_norm_focus(25, 20, 25) # 1.37, compare FOCUS 2014 p. 184
    +#> [1] 1.373956
    +
    +D24_2014$meta
    +#>                                 study usda_soil_type study_moisture_ref_type
    +#> Mississippi                Cohen 1991      Silt loam                    <NA>
    +#> Fayette     Liu and Adelfinskaya 2011      Silt loam                     pF1
    +#> RefSol 03-G Liu and Adelfinskaya 2011           Loam                     pF1
    +#> Site E1     Liu and Adelfinskaya 2011           Loam                     pF1
    +#> Site I2     Liu and Adelfinskaya 2011     Loamy sand                     pF1
    +#>             rel_moisture temperature
    +#> Mississippi           NA          25
    +#> Fayette              0.5          20
    +#> RefSol 03-G          0.5          20
    +#> Site E1              0.5          20
    +#> Site I2              0.5          20
    +# No moisture normalisation in the first dataset, so we use f_na = 1 to get
    +# temperature only normalisation as in the EU evaluation
    +f_time_norm_focus(D24_2014, study_moisture_ref_source = "focus", f_na = 1)
    +#> $f_time_norm was (re)set to normalised values
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/f_time_norm_focus.mkindsg.html b/docs/dev/reference/f_time_norm_focus.mkindsg.html new file mode 100644 index 00000000..9a442194 --- /dev/null +++ b/docs/dev/reference/f_time_norm_focus.mkindsg.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/f_time_norm_focus.numeric.html b/docs/dev/reference/f_time_norm_focus.numeric.html new file mode 100644 index 00000000..9a442194 --- /dev/null +++ b/docs/dev/reference/f_time_norm_focus.numeric.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/focus_soil_moisture.html b/docs/dev/reference/focus_soil_moisture.html new file mode 100644 index 00000000..8feadc34 --- /dev/null +++ b/docs/dev/reference/focus_soil_moisture.html @@ -0,0 +1,123 @@ + +FOCUS default values for soil moisture contents at field capacity, MWHC and 1/3 bar — focus_soil_moisture • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The value were transcribed from p. 36. The table assumes field capacity +corresponds to pF2, MWHC to pF 1 and 1/3 bar to pF 2.5.

    +
    + +
    +

    Usage

    +
    focus_soil_moisture
    +
    + +
    +

    Format

    +

    A matrix with upper case USDA soil classes as row names, and water tension +('pF1', 'pF2', 'pF 2.5') as column names

    +
    +
    +

    Source

    +

    Anonymous (2014) Generic Guidance for Tier 1 FOCUS Ground Water Assessment +Version 2.2, May 2014 https://esdac.jrc.ec.europa.eu/projects/ground-water

    +
    + +
    +

    Examples

    +
    focus_soil_moisture
    +#>                 pF1 pF2 pF2.5
    +#> Sand             24  12     7
    +#> Loamy sand       24  14     9
    +#> Sandy loam       27  19    15
    +#> Sandy clay loam  28  22    18
    +#> Clay loam        32  28    25
    +#> Loam             31  25    21
    +#> Silt loam        32  26    21
    +#> Silty clay loam  34  30    27
    +#> Silt             31  27    21
    +#> Sandy clay       41  35    31
    +#> Silty clay       44  40    36
    +#> Clay             53  48    43
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/get_deg_func.html b/docs/dev/reference/get_deg_func.html new file mode 100644 index 00000000..d3f3dc10 --- /dev/null +++ b/docs/dev/reference/get_deg_func.html @@ -0,0 +1,97 @@ + +Retrieve a degradation function from the mmkin namespace — get_deg_func • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Retrieve a degradation function from the mmkin namespace

    +
    + +
    +

    Usage

    +
    get_deg_func()
    +
    + +
    +

    Value

    +

    A function that was likely previously assigned from within +nlme.mmkin

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/hierarchical_kinetics.html b/docs/dev/reference/hierarchical_kinetics.html new file mode 100644 index 00000000..1c225992 --- /dev/null +++ b/docs/dev/reference/hierarchical_kinetics.html @@ -0,0 +1,158 @@ + +Hierarchical kinetics template — hierarchical_kinetics • mkin + Skip to contents + + +
    +
    +
    + +
    +

    R markdown format for setting up hierarchical kinetics based on a template +provided with the mkin package. This format is based on rmarkdown::pdf_document. +Chunk options are adapted. Echoing R code from code chunks and caching are +turned on per default. character for prepending output from code chunks is +set to the empty string, code tidying is off, figure alignment defaults to +centering, and positioning of figures is set to "H", which means that +figures will not move around in the document, but stay where the user +includes them.

    +
    + +
    +

    Usage

    +
    hierarchical_kinetics(..., keep_tex = FALSE)
    +
    + +
    +

    Arguments

    + + +
    ...
    +

    Arguments to rmarkdown::pdf_document

    + + +
    keep_tex
    +

    Keep the intermediate tex file used in the conversion to PDF. +Note that this argument does not control whether to keep the auxiliary +files (e.g., .aux) generated by LaTeX when compiling .tex to +.pdf. To keep these files, you may set options(tinytex.clean = +FALSE).

    + +
    +
    +

    Value

    +

    R Markdown output format to pass to +render

    +
    +
    +

    Details

    +

    The latter feature (positioning the figures with "H") depends on the LaTeX +package 'float'. In addition, the LaTeX package 'listing' is used in the +template for showing model fit summaries in the Appendix. This means that +the LaTeX packages 'float' and 'listing' need to be installed in the TeX +distribution used.

    +

    On Windows, the easiest way to achieve this (if no TeX distribution +is present before) is to install the 'tinytex' R package, to run +'tinytex::install_tinytex()' to get the basic tiny Tex distribution, +and then to run 'tinytex::tlmgr_install(c("float", "listing"))'.

    +
    + +
    +

    Examples

    +
    
    +# \dontrun{
    +library(rmarkdown)
    +# The following is now commented out after the relase of v1.2.3 for the generation
    +# of online docs, as the command creates a directory and opens an editor
    +#draft("example_analysis.rmd", template = "hierarchical_kinetics", package = "mkin")
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/html_listing.html b/docs/dev/reference/html_listing.html new file mode 100644 index 00000000..779fff4c --- /dev/null +++ b/docs/dev/reference/html_listing.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/illparms.html b/docs/dev/reference/illparms.html new file mode 100644 index 00000000..0b5f6661 --- /dev/null +++ b/docs/dev/reference/illparms.html @@ -0,0 +1,211 @@ + +Method to get the names of ill-defined parameters — illparms • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The method for generalised nonlinear regression fits as obtained +with mkinfit and mmkin checks if the degradation parameters +pass the Wald test (in degradation kinetics often simply called t-test) for +significant difference from zero. For this test, the parameterisation +without parameter transformations is used.

    +
    + +
    +

    Usage

    +
    illparms(object, ...)
    +
    +# S3 method for class 'mkinfit'
    +illparms(object, conf.level = 0.95, ...)
    +
    +# S3 method for class 'illparms.mkinfit'
    +print(x, ...)
    +
    +# S3 method for class 'mmkin'
    +illparms(object, conf.level = 0.95, ...)
    +
    +# S3 method for class 'illparms.mmkin'
    +print(x, ...)
    +
    +# S3 method for class 'saem.mmkin'
    +illparms(
    +  object,
    +  conf.level = 0.95,
    +  random = TRUE,
    +  errmod = TRUE,
    +  slopes = TRUE,
    +  ...
    +)
    +
    +# S3 method for class 'illparms.saem.mmkin'
    +print(x, ...)
    +
    +# S3 method for class 'mhmkin'
    +illparms(object, conf.level = 0.95, random = TRUE, errmod = TRUE, ...)
    +
    +# S3 method for class 'illparms.mhmkin'
    +print(x, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The object to investigate

    + + +
    ...
    +

    For potential future extensions

    + + +
    conf.level
    +

    The confidence level for checking p values

    + + +
    x
    +

    The object to be printed

    + + +
    random
    +

    For hierarchical fits, should random effects be tested?

    + + +
    errmod
    +

    For hierarchical fits, should error model parameters be +tested?

    + + +
    slopes
    +

    For hierarchical saem fits using saemix as backend, +should slope parameters in the covariate model(starting with 'beta_') be +tested?

    + +
    +
    +

    Value

    +

    For mkinfit or saem objects, a character vector of parameter +names. For mmkin or mhmkin objects, a matrix like object of class +'illparms.mmkin' or 'illparms.mhmkin'.

    +
    +
    +

    Details

    +

    The method for hierarchical model fits, also known as nonlinear +mixed-effects model fits as obtained with saem and mhmkin +checks if any of the confidence intervals for the random +effects expressed as standard deviations include zero, and if +the confidence intervals for the error model parameters include +zero.

    +
    +
    +

    Note

    +

    All return objects have printing methods. For the single fits, printing +does not output anything in the case no ill-defined parameters are found.

    +
    + +
    +

    Examples

    +
    fit <- mkinfit("FOMC", FOCUS_2006_A, quiet = TRUE)
    +#> Warning: Optimisation did not converge:
    +#> false convergence (8)
    +illparms(fit)
    +#> [1] "parent_0" "alpha"    "beta"     "sigma"   
    +# \dontrun{
    +fits <- mmkin(
    +  c("SFO", "FOMC"),
    +  list("FOCUS A" = FOCUS_2006_A,
    +       "FOCUS C" = FOCUS_2006_C),
    +  quiet = TRUE)
    +illparms(fits)
    +#>       dataset
    +#> model  FOCUS A                      FOCUS C
    +#>   SFO                                      
    +#>   FOMC parent_0, alpha, beta, sigma        
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/illparms.mhmkin.html b/docs/dev/reference/illparms.mhmkin.html new file mode 100644 index 00000000..efbcc181 --- /dev/null +++ b/docs/dev/reference/illparms.mhmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/illparms.mkinfit.html b/docs/dev/reference/illparms.mkinfit.html new file mode 100644 index 00000000..efbcc181 --- /dev/null +++ b/docs/dev/reference/illparms.mkinfit.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/illparms.mmkin.html b/docs/dev/reference/illparms.mmkin.html new file mode 100644 index 00000000..efbcc181 --- /dev/null +++ b/docs/dev/reference/illparms.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/illparms.saem.mmkin.html b/docs/dev/reference/illparms.saem.mmkin.html new file mode 100644 index 00000000..efbcc181 --- /dev/null +++ b/docs/dev/reference/illparms.saem.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/ilr.html b/docs/dev/reference/ilr.html new file mode 100644 index 00000000..c6efae2d --- /dev/null +++ b/docs/dev/reference/ilr.html @@ -0,0 +1,163 @@ + +Function to perform isometric log-ratio transformation — ilr • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This implementation is a special case of the class of isometric log-ratio +transformations.

    +
    + +
    +

    Usage

    +
    ilr(x)
    +
    +invilr(x)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    A numeric vector. Naturally, the forward transformation is only +sensible for vectors with all elements being greater than zero.

    + +
    +
    +

    Value

    +

    The result of the forward or backward transformation. The returned +components always sum to 1 for the case of the inverse log-ratio +transformation.

    +
    +
    +

    References

    +

    Peter Filzmoser, Karel Hron (2008) Outlier Detection for +Compositional Data Using Robust Methods. Math Geosci 40 233-248

    +
    +
    +

    See also

    +

    Another implementation can be found in R package +robCompositions.

    +
    +
    +

    Author

    +

    René Lehmann and Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +# Order matters
    +ilr(c(0.1, 1, 10))
    +#> [1] -1.628174 -2.820079
    +ilr(c(10, 1, 0.1))
    +#> [1] 1.628174 2.820079
    +# Equal entries give ilr transformations with zeros as elements
    +ilr(c(3, 3, 3))
    +#> [1] 0 0
    +# Almost equal entries give small numbers
    +ilr(c(0.3, 0.4, 0.3))
    +#> [1] -0.2034219  0.1174457
    +# Only the ratio between the numbers counts, not their sum
    +invilr(ilr(c(0.7, 0.29, 0.01)))
    +#> [1] 0.70 0.29 0.01
    +invilr(ilr(2.1 * c(0.7, 0.29, 0.01)))
    +#> [1] 0.70 0.29 0.01
    +# Inverse transformation of larger numbers gives unequal elements
    +invilr(-10)
    +#> [1] 7.213536e-07 9.999993e-01
    +invilr(c(-10, 0))
    +#> [1] 7.207415e-07 9.991507e-01 8.486044e-04
    +# The sum of the elements of the inverse ilr is 1
    +sum(invilr(c(-10, 0)))
    +#> [1] 1
    +# This is why we do not need all elements of the inverse transformation to go back:
    +a <- c(0.1, 0.3, 0.5)
    +b <- invilr(a)
    +length(b) # Four elements
    +#> [1] 4
    +ilr(c(b[1:3], 1 - sum(b[1:3]))) # Gives c(0.1, 0.3, 0.5)
    +#> [1] 0.1 0.3 0.5
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/index.html b/docs/dev/reference/index.html new file mode 100644 index 00000000..476b8804 --- /dev/null +++ b/docs/dev/reference/index.html @@ -0,0 +1,735 @@ + +Package index • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Main functions

    + +

    Essential functionality

    + + +
    + + + + +
    + + mkinmod() print(<mkinmod>) mkinsub() + +
    +
    Function to set up a kinetic model with one or more state variables
    +
    + + mkinfit() + +
    +
    Fit a kinetic model to data with one or more state variables
    +
    + + mmkin() print(<mmkin>) + +
    +
    Fit one or more kinetic models with one or more state variables to one or more datasets
    +
    + + mhmkin() `[`(<mhmkin>) print(<mhmkin>) + +
    +
    Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models
    +
    +

    Generics

    + +

    Generic functions introduced by the package

    + + +
    + + + + +
    + + parms() + +
    +
    Extract model parameters
    +
    + + status() print(<status.mmkin>) print(<status.mhmkin>) + +
    +
    Method to get status information for fit array objects
    +
    + + illparms() print(<illparms.mkinfit>) print(<illparms.mmkin>) print(<illparms.saem.mmkin>) print(<illparms.mhmkin>) + +
    +
    Method to get the names of ill-defined parameters
    +
    + + endpoints() + +
    +
    Function to calculate endpoints for further use from kinetic models fitted with mkinfit
    +
    + + aw() + +
    +
    Calculate Akaike weights for model averaging
    +
    +

    Show results

    + +

    Functions working with mkinfit objects

    + + +
    + + + + +
    + + plot(<mkinfit>) plot_sep() plot_res() plot_err() + +
    +
    Plot the observed data and the fitted model of an mkinfit object
    +
    + + summary(<mkinfit>) print(<summary.mkinfit>) + +
    +
    Summary method for class "mkinfit"
    +
    + + confint(<mkinfit>) + +
    +
    Confidence intervals for parameters of mkinfit objects
    +
    + + update(<mkinfit>) + +
    +
    Update an mkinfit model with different arguments
    +
    + + lrtest(<mkinfit>) lrtest(<mmkin>) + +
    +
    Likelihood ratio test for mkinfit models
    +
    + + loftest() + +
    +
    Lack-of-fit test for models fitted to data with replicates
    +
    + + mkinerrmin() + +
    +
    Calculate the minimum error to assume in order to pass the variance test
    +
    + + CAKE_export() + +
    +
    Export a list of datasets format to a CAKE study file
    +
    +

    Work with mmkin objects

    + +

    Functions working with aggregated results

    + + +
    + + + + +
    + + `[`(<mmkin>) + +
    +
    Subsetting method for mmkin objects
    +
    + + plot(<mmkin>) + +
    +
    Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object
    +
    + + AIC(<mmkin>) BIC(<mmkin>) + +
    +
    Calculate the AIC for a column of an mmkin object
    +
    + + summary(<mmkin>) print(<summary.mmkin>) + +
    +
    Summary method for class "mmkin"
    +
    +

    Mixed models

    + +

    Create and work with nonlinear hierarchical models

    + + +
    + + + + +
    + + hierarchical_kinetics() + +
    +
    Hierarchical kinetics template
    +
    + + read_spreadsheet() + +
    +
    Read datasets and relevant meta information from a spreadsheet file
    +
    + + nlme(<mmkin>) print(<nlme.mmkin>) update(<nlme.mmkin>) + +
    +
    Create an nlme model for an mmkin row object
    +
    + + saem() print(<saem.mmkin>) saemix_model() saemix_data() + +
    +
    Fit nonlinear mixed models with SAEM
    +
    + + mhmkin() `[`(<mhmkin>) print(<mhmkin>) + +
    +
    Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models
    +
    + + plot(<mixed.mmkin>) + +
    +
    Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object
    +
    + + summary(<nlme.mmkin>) print(<summary.nlme.mmkin>) + +
    +
    Summary method for class "nlme.mmkin"
    +
    + + summary(<saem.mmkin>) print(<summary.saem.mmkin>) + +
    +
    Summary method for class "saem.mmkin"
    +
    + + anova(<saem.mmkin>) + +
    +
    Anova method for saem.mmkin objects
    +
    + + logLik(<saem.mmkin>) + +
    +
    logLik method for saem.mmkin objects
    +
    + + nlme_function() nlme_data() + +
    +
    Helper functions to create nlme models from mmkin row objects
    +
    + + get_deg_func() + +
    +
    Retrieve a degradation function from the mmkin namespace
    +
    + + mixed() print(<mixed.mmkin>) + +
    +
    Create a mixed effects model from an mmkin row object
    +
    + + reexports intervals lrtest nlme + +
    +
    Objects exported from other packages
    +
    + + intervals(<saem.mmkin>) + +
    +
    Confidence intervals for parameters in saem.mmkin objects
    +
    + + multistart() print(<multistart>) best() which.best() + +
    +
    Perform a hierarchical model fit with multiple starting values
    +
    + + llhist() + +
    +
    Plot the distribution of log likelihoods from multistart objects
    +
    + + parplot() + +
    +
    Plot parameter variability of multistart objects
    +
    + + check_failed() + +
    +
    Check if fit within an mhmkin object failed
    +
    +

    Datasets and known results

    + + + + +
    + + + + +
    + + ds_mixed ds_sfo ds_fomc ds_dfop ds_hs ds_dfop_sfo + +
    +
    Synthetic data for hierarchical kinetic degradation models
    +
    + + D24_2014 + +
    +
    Aerobic soil degradation data on 2,4-D from the EU assessment in 2014
    +
    + + dimethenamid_2018 + +
    +
    Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018
    +
    + + FOCUS_2006_A FOCUS_2006_B FOCUS_2006_C FOCUS_2006_D FOCUS_2006_E FOCUS_2006_F + +
    +
    Datasets A to F from the FOCUS Kinetics report from 2006
    +
    + + FOCUS_2006_SFO_ref_A_to_F + +
    +
    Results of fitting the SFO model to Datasets A to F of FOCUS (2006)
    +
    + + FOCUS_2006_FOMC_ref_A_to_F + +
    +
    Results of fitting the FOMC model to Datasets A to F of FOCUS (2006)
    +
    + + FOCUS_2006_HS_ref_A_to_F + +
    +
    Results of fitting the HS model to Datasets A to F of FOCUS (2006)
    +
    + + FOCUS_2006_DFOP_ref_A_to_B + +
    +
    Results of fitting the DFOP model to Datasets A to B of FOCUS (2006)
    +
    + + NAFTA_SOP_Appendix_B NAFTA_SOP_Appendix_D + +
    +
    Example datasets from the NAFTA SOP published 2015
    +
    + + NAFTA_SOP_Attachment + +
    +
    Example datasets from Attachment 1 to the NAFTA SOP published 2015
    +
    + + mccall81_245T + +
    +
    Datasets on aerobic soil metabolism of 2,4,5-T in six soils
    +
    + + schaefer07_complex_case + +
    +
    Metabolism data set used for checking the software quality of KinGUI
    +
    + + synthetic_data_for_UBA_2014 + +
    +
    Synthetic datasets for one parent compound with two metabolites
    +
    + + experimental_data_for_UBA_2019 + +
    +
    Experimental datasets used for development and testing of error models
    +
    + + test_data_from_UBA_2014 + +
    +
    Three experimental datasets from two water sediment systems and one soil
    +
    + + focus_soil_moisture + +
    +
    FOCUS default values for soil moisture contents at field capacity, MWHC and 1/3 bar
    +
    + + print(<mkinds>) + +
    +
    A dataset class for mkin
    +
    + + print(<mkindsg>) + +
    +
    A class for dataset groups for mkin
    +
    +

    NAFTA guidance

    + + + + +
    + + + + +
    + + nafta() print(<nafta>) + +
    +
    Evaluate parent kinetics using the NAFTA guidance
    +
    + + plot(<nafta>) + +
    +
    Plot the results of the three models used in the NAFTA scheme.
    +
    +

    Utility functions

    + + + + +
    + + + + +
    + + summary_listing() tex_listing() html_listing() + +
    +
    Display the output of a summary function according to the output format
    +
    + + f_time_norm_focus() + +
    +
    Normalisation factors for aerobic soil degradation according to FOCUS guidance
    +
    + + set_nd_nq() set_nd_nq_focus() + +
    +
    Set non-detects and unquantified values in residue series without replicates
    +
    + + max_twa_parent() max_twa_sfo() max_twa_fomc() max_twa_dfop() max_twa_hs() + +
    +
    Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit
    +
    + + mkin_wide_to_long() + +
    +
    Convert a dataframe with observations over time into long format
    +
    + + mkin_long_to_wide() + +
    +
    Convert a dataframe from long to wide format
    +
    +

    Helper functions mainly used internally

    + + + + +
    + + + + +
    + + mkinpredict() + +
    +
    Produce predictions from a kinetic model using specific parameters
    +
    + + transform_odeparms() backtransform_odeparms() + +
    +
    Functions to transform and backtransform kinetic parameters for fitting
    +
    + + ilr() invilr() + +
    +
    Function to perform isometric log-ratio transformation
    +
    + + logLik(<mkinfit>) + +
    +
    Calculated the log-likelihood of a fitted mkinfit object
    +
    + + residuals(<mkinfit>) + +
    +
    Extract residuals from an mkinfit model
    +
    + + nobs(<mkinfit>) + +
    +
    Number of observations on which an mkinfit object was fitted
    +
    + + mkinresplot() + +
    +
    Function to plot residuals stored in an mkin object
    +
    + + mkinparplot() + +
    +
    Function to plot the confidence intervals obtained using mkinfit
    +
    + + mkinerrplot() + +
    +
    Function to plot squared residuals and the error model for an mkin object
    +
    + + mean_degparms() + +
    +
    Calculate mean degradation parameters for an mmkin row object
    +
    + + create_deg_func() + +
    +
    Create degradation functions for known analytical solutions
    +
    +

    Analytical solutions

    + +

    Parent only model solutions

    + + +
    + + + + +
    + + SFO.solution() + +
    +
    Single First-Order kinetics
    +
    + + FOMC.solution() + +
    +
    First-Order Multi-Compartment kinetics
    +
    + + DFOP.solution() + +
    +
    Double First-Order in Parallel kinetics
    +
    + + SFORB.solution() + +
    +
    Single First-Order Reversible Binding kinetics
    +
    + + HS.solution() + +
    +
    Hockey-Stick kinetics
    +
    + + IORE.solution() + +
    +
    Indeterminate order rate equation kinetics
    +
    + + logistic.solution() + +
    +
    Logistic kinetics
    +
    +

    Generate synthetic datasets

    + + + + +
    + + + + +
    + + add_err() + +
    +
    Add normally distributed errors to simulated kinetic degradation data
    +
    + + sigma_twocomp() + +
    +
    Two-component error model
    +
    +

    Deprecated functions

    + +

    Functions that have been superseded

    + + +
    + + + + +
    + + mkinplot() + +
    +
    Plot the observed data and the fitted model of an mkinfit object
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/intervals.html b/docs/dev/reference/intervals.html new file mode 100644 index 00000000..9cc267c0 --- /dev/null +++ b/docs/dev/reference/intervals.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/intervals.saem.mmkin.html b/docs/dev/reference/intervals.saem.mmkin.html new file mode 100644 index 00000000..4e25aa77 --- /dev/null +++ b/docs/dev/reference/intervals.saem.mmkin.html @@ -0,0 +1,121 @@ + +Confidence intervals for parameters in saem.mmkin objects — intervals.saem.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Confidence intervals for parameters in saem.mmkin objects

    +
    + +
    +

    Usage

    +
    # S3 method for class 'saem.mmkin'
    +intervals(object, level = 0.95, backtransform = TRUE, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The fitted saem.mmkin object

    + + +
    level
    +

    The confidence level. Must be the default of 0.95 as this is what +is available in the saemix object

    + + +
    backtransform
    +

    In case the model was fitted with mkin transformations, +should we backtransform the parameters where a one to one correlation +between transformed and backtransformed parameters exists?

    + + +
    ...
    +

    For compatibility with the generic method

    + +
    +
    +

    Value

    +

    An object with 'intervals.saem.mmkin' and 'intervals.lme' in the +class attribute

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/invilr.html b/docs/dev/reference/invilr.html new file mode 100644 index 00000000..32ca219f --- /dev/null +++ b/docs/dev/reference/invilr.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/llhist.html b/docs/dev/reference/llhist.html new file mode 100644 index 00000000..fca1f427 --- /dev/null +++ b/docs/dev/reference/llhist.html @@ -0,0 +1,123 @@ + +Plot the distribution of log likelihoods from multistart objects — llhist • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Produces a histogram of log-likelihoods. In addition, the likelihood of the +original fit is shown as a red vertical line.

    +
    + +
    +

    Usage

    +
    llhist(object, breaks = "Sturges", lpos = "topleft", main = "", ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The multistart object

    + + +
    breaks
    +

    Passed to hist

    + + +
    lpos
    +

    Positioning of the legend.

    + + +
    main
    +

    Title of the plot

    + + +
    ...
    +

    Passed to hist

    + +
    +
    +

    See also

    + +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/loftest-1.png b/docs/dev/reference/loftest-1.png new file mode 100644 index 00000000..e6281140 Binary files /dev/null and b/docs/dev/reference/loftest-1.png differ diff --git a/docs/dev/reference/loftest-2.png b/docs/dev/reference/loftest-2.png new file mode 100644 index 00000000..32842c7d Binary files /dev/null and b/docs/dev/reference/loftest-2.png differ diff --git a/docs/dev/reference/loftest-3.png b/docs/dev/reference/loftest-3.png new file mode 100644 index 00000000..e2a5663d Binary files /dev/null and b/docs/dev/reference/loftest-3.png differ diff --git a/docs/dev/reference/loftest-4.png b/docs/dev/reference/loftest-4.png new file mode 100644 index 00000000..a052626b Binary files /dev/null and b/docs/dev/reference/loftest-4.png differ diff --git a/docs/dev/reference/loftest-5.png b/docs/dev/reference/loftest-5.png new file mode 100644 index 00000000..168aa062 Binary files /dev/null and b/docs/dev/reference/loftest-5.png differ diff --git a/docs/dev/reference/loftest.html b/docs/dev/reference/loftest.html new file mode 100644 index 00000000..72496e83 --- /dev/null +++ b/docs/dev/reference/loftest.html @@ -0,0 +1,299 @@ + +Lack-of-fit test for models fitted to data with replicates — loftest • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This is a generic function with a method currently only defined for mkinfit +objects. It fits an anova model to the data contained in the object and +compares the likelihoods using the likelihood ratio test +lrtest.default from the lmtest package.

    +
    + +
    +

    Usage

    +
    loftest(object, ...)
    +
    +# S3 method for class 'mkinfit'
    +loftest(object, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    A model object with a defined loftest method

    + + +
    ...
    +

    Not used

    + +
    +
    +

    Details

    +

    The anova model is interpreted as the simplest form of an mkinfit model, +assuming only a constant variance about the means, but not enforcing any +structure of the means, so we have one model parameter for every mean +of replicate samples.

    +
    +
    +

    See also

    +

    lrtest

    +
    + +
    +

    Examples

    +
    # \dontrun{
    +test_data <- subset(synthetic_data_for_UBA_2014[[12]]$data, name == "parent")
    +sfo_fit <- mkinfit("SFO", test_data, quiet = TRUE)
    +plot_res(sfo_fit) # We see a clear pattern in the residuals
    +
    +loftest(sfo_fit)  # We have a clear lack of fit
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: ANOVA with error model const
    +#> Model 2: SFO with error model const
    +#>   #Df  LogLik Df  Chisq Pr(>Chisq)    
    +#> 1  10 -40.710                         
    +#> 2   3 -63.954 -7 46.487  7.027e-08 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +#
    +# We try a different model (the one that was used to generate the data)
    +dfop_fit <- mkinfit("DFOP", test_data, quiet = TRUE)
    +plot_res(dfop_fit) # We don't see systematic deviations, but heteroscedastic residuals
    +
    +# therefore we should consider adapting the error model, although we have
    +loftest(dfop_fit) # no lack of fit
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: ANOVA with error model const
    +#> Model 2: DFOP with error model const
    +#>   #Df  LogLik Df Chisq Pr(>Chisq)
    +#> 1  10 -40.710                    
    +#> 2   5 -42.453 -5 3.485     0.6257
    +#
    +# This is the anova model used internally for the comparison
    +test_data_anova <- test_data
    +test_data_anova$time <- as.factor(test_data_anova$time)
    +anova_fit <- lm(value ~ time, data = test_data_anova)
    +summary(anova_fit)
    +#> 
    +#> Call:
    +#> lm(formula = value ~ time, data = test_data_anova)
    +#> 
    +#> Residuals:
    +#>     Min      1Q  Median      3Q     Max 
    +#> -6.1000 -0.5625  0.0000  0.5625  6.1000 
    +#> 
    +#> Coefficients:
    +#>             Estimate Std. Error t value Pr(>|t|)    
    +#> (Intercept)  103.150      2.323  44.409 7.44e-12 ***
    +#> time1        -19.950      3.285  -6.073 0.000185 ***
    +#> time3        -50.800      3.285 -15.465 8.65e-08 ***
    +#> time7        -68.500      3.285 -20.854 6.28e-09 ***
    +#> time14       -79.750      3.285 -24.278 1.63e-09 ***
    +#> time28       -86.000      3.285 -26.181 8.35e-10 ***
    +#> time60       -94.900      3.285 -28.891 3.48e-10 ***
    +#> time90       -98.500      3.285 -29.986 2.49e-10 ***
    +#> time120     -100.450      3.285 -30.580 2.09e-10 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +#> 
    +#> Residual standard error: 3.285 on 9 degrees of freedom
    +#> Multiple R-squared:  0.9953,	Adjusted R-squared:  0.9912 
    +#> F-statistic: 240.5 on 8 and 9 DF,  p-value: 1.417e-09
    +#> 
    +logLik(anova_fit) # We get the same likelihood and degrees of freedom
    +#> 'log Lik.' -40.71015 (df=10)
    +#
    +test_data_2 <- synthetic_data_for_UBA_2014[[12]]$data
    +m_synth_SFO_lin <- mkinmod(parent = list(type = "SFO", to = "M1"),
    +  M1 = list(type = "SFO", to = "M2"),
    +  M2 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +sfo_lin_fit <- mkinfit(m_synth_SFO_lin, test_data_2, quiet = TRUE)
    +plot_res(sfo_lin_fit) # not a good model, we try parallel formation
    +
    +loftest(sfo_lin_fit)
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: ANOVA with error model const
    +#> Model 2: m_synth_SFO_lin with error model const and fixed parameter(s) M1_0, M2_0
    +#>   #Df   LogLik  Df  Chisq Pr(>Chisq)    
    +#> 1  28  -93.606                          
    +#> 2   7 -171.927 -21 156.64  < 2.2e-16 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +#
    +m_synth_SFO_par <- mkinmod(parent = list(type = "SFO", to = c("M1", "M2")),
    +  M1 = list(type = "SFO"),
    +  M2 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +sfo_par_fit <- mkinfit(m_synth_SFO_par, test_data_2, quiet = TRUE)
    +plot_res(sfo_par_fit) # much better for metabolites
    +
    +loftest(sfo_par_fit)
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: ANOVA with error model const
    +#> Model 2: m_synth_SFO_par with error model const and fixed parameter(s) M1_0, M2_0
    +#>   #Df   LogLik  Df  Chisq Pr(>Chisq)    
    +#> 1  28  -93.606                          
    +#> 2   7 -156.331 -21 125.45  < 2.2e-16 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +#
    +m_synth_DFOP_par <- mkinmod(parent = list(type = "DFOP", to = c("M1", "M2")),
    +  M1 = list(type = "SFO"),
    +  M2 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +dfop_par_fit <- mkinfit(m_synth_DFOP_par, test_data_2, quiet = TRUE)
    +plot_res(dfop_par_fit) # No visual lack of fit
    +
    +loftest(dfop_par_fit)  # no lack of fit found by the test
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: ANOVA with error model const
    +#> Model 2: m_synth_DFOP_par with error model const and fixed parameter(s) M1_0, M2_0
    +#>   #Df   LogLik  Df  Chisq Pr(>Chisq)
    +#> 1  28  -93.606                      
    +#> 2   9 -102.763 -19 18.313     0.5016
    +#
    +# The anova model used for comparison in the case of transformation products
    +test_data_anova_2 <- dfop_par_fit$data
    +test_data_anova_2$variable <- as.factor(test_data_anova_2$variable)
    +test_data_anova_2$time <- as.factor(test_data_anova_2$time)
    +anova_fit_2 <- lm(observed ~ time:variable - 1, data = test_data_anova_2)
    +summary(anova_fit_2)
    +#> 
    +#> Call:
    +#> lm(formula = observed ~ time:variable - 1, data = test_data_anova_2)
    +#> 
    +#> Residuals:
    +#>     Min      1Q  Median      3Q     Max 
    +#> -6.1000 -0.5875  0.0000  0.5875  6.1000 
    +#> 
    +#> Coefficients: (2 not defined because of singularities)
    +#>                        Estimate Std. Error t value Pr(>|t|)    
    +#> time0:variableparent    103.150      1.573  65.562  < 2e-16 ***
    +#> time1:variableparent     83.200      1.573  52.882  < 2e-16 ***
    +#> time3:variableparent     52.350      1.573  33.274  < 2e-16 ***
    +#> time7:variableparent     34.650      1.573  22.024  < 2e-16 ***
    +#> time14:variableparent    23.400      1.573  14.873 6.35e-14 ***
    +#> time28:variableparent    17.150      1.573  10.901 5.47e-11 ***
    +#> time60:variableparent     8.250      1.573   5.244 1.99e-05 ***
    +#> time90:variableparent     4.650      1.573   2.956 0.006717 ** 
    +#> time120:variableparent    2.700      1.573   1.716 0.098507 .  
    +#> time0:variableM1             NA         NA      NA       NA    
    +#> time1:variableM1         11.850      1.573   7.532 6.93e-08 ***
    +#> time3:variableM1         22.700      1.573  14.428 1.26e-13 ***
    +#> time7:variableM1         33.050      1.573  21.007  < 2e-16 ***
    +#> time14:variableM1        31.250      1.573  19.863  < 2e-16 ***
    +#> time28:variableM1        18.900      1.573  12.013 7.02e-12 ***
    +#> time60:variableM1         7.550      1.573   4.799 6.28e-05 ***
    +#> time90:variableM1         3.850      1.573   2.447 0.021772 *  
    +#> time120:variableM1        2.050      1.573   1.303 0.204454    
    +#> time0:variableM2             NA         NA      NA       NA    
    +#> time1:variableM2          6.700      1.573   4.259 0.000254 ***
    +#> time3:variableM2         16.750      1.573  10.646 8.93e-11 ***
    +#> time7:variableM2         25.800      1.573  16.399 6.89e-15 ***
    +#> time14:variableM2        28.600      1.573  18.178 6.35e-16 ***
    +#> time28:variableM2        25.400      1.573  16.144 9.85e-15 ***
    +#> time60:variableM2        21.600      1.573  13.729 3.81e-13 ***
    +#> time90:variableM2        17.800      1.573  11.314 2.51e-11 ***
    +#> time120:variableM2       14.100      1.573   8.962 2.79e-09 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +#> 
    +#> Residual standard error: 2.225 on 25 degrees of freedom
    +#> Multiple R-squared:  0.9979,	Adjusted R-squared:  0.9957 
    +#> F-statistic: 469.2 on 25 and 25 DF,  p-value: < 2.2e-16
    +#> 
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/loftest.mkinfit.html b/docs/dev/reference/loftest.mkinfit.html new file mode 100644 index 00000000..f66a5906 --- /dev/null +++ b/docs/dev/reference/loftest.mkinfit.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/logLik.mkinfit.html b/docs/dev/reference/logLik.mkinfit.html new file mode 100644 index 00000000..bc2847cc --- /dev/null +++ b/docs/dev/reference/logLik.mkinfit.html @@ -0,0 +1,160 @@ + +Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function returns the product of the likelihood densities of each +observed value, as calculated as part of the fitting procedure using +dnorm, i.e. assuming normal distribution, and with the means +predicted by the degradation model, and the standard deviations predicted by +the error model.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinfit'
    +logLik(object, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An object of class mkinfit.

    + + +
    ...
    +

    For compatibility with the generic method

    + +
    +
    +

    Value

    +

    An object of class logLik with the number of estimated +parameters (degradation model parameters plus variance model parameters) +as attribute.

    +
    +
    +

    Details

    +

    The total number of estimated parameters returned with the value of the +likelihood is calculated as the sum of fitted degradation model parameters +and the fitted error model parameters.

    +
    +
    +

    See also

    +

    Compare the AIC of columns of mmkin objects using +AIC.mmkin.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +  # \dontrun{
    +  sfo_sfo <- mkinmod(
    +    parent = mkinsub("SFO", to = "m1"),
    +    m1 = mkinsub("SFO")
    +  )
    +#> Temporary DLL for differentials generated and loaded
    +  d_t <- subset(FOCUS_2006_D, value != 0)
    +  f_nw <- mkinfit(sfo_sfo, d_t, quiet = TRUE) # no weighting (weights are unity)
    +  f_obs <- update(f_nw, error_model = "obs")
    +  f_tc <- update(f_nw, error_model = "tc")
    +  AIC(f_nw, f_obs, f_tc)
    +#>       df      AIC
    +#> f_nw   5 204.4486
    +#> f_obs  6 205.8727
    +#> f_tc   6 141.9656
    +  # }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/logLik.saem.mmkin.html b/docs/dev/reference/logLik.saem.mmkin.html new file mode 100644 index 00000000..d542868e --- /dev/null +++ b/docs/dev/reference/logLik.saem.mmkin.html @@ -0,0 +1,109 @@ + +logLik method for saem.mmkin objects — logLik.saem.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    logLik method for saem.mmkin objects

    +
    + +
    +

    Usage

    +
    # S3 method for class 'saem.mmkin'
    +logLik(object, ..., method = c("is", "lin", "gq"))
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The fitted saem.mmkin object

    + + +
    ...
    +

    Passed to saemix::logLik.SaemixObject

    + + +
    method
    +

    Passed to saemix::logLik.SaemixObject

    + +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/logistic.solution-1.png b/docs/dev/reference/logistic.solution-1.png new file mode 100644 index 00000000..65739bb7 Binary files /dev/null and b/docs/dev/reference/logistic.solution-1.png differ diff --git a/docs/dev/reference/logistic.solution-2.png b/docs/dev/reference/logistic.solution-2.png new file mode 100644 index 00000000..e737621e Binary files /dev/null and b/docs/dev/reference/logistic.solution-2.png differ diff --git a/docs/dev/reference/logistic.solution.html b/docs/dev/reference/logistic.solution.html new file mode 100644 index 00000000..f5fe368a --- /dev/null +++ b/docs/dev/reference/logistic.solution.html @@ -0,0 +1,206 @@ + +Logistic kinetics — logistic.solution • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Function describing exponential decline from a defined starting value, with +an increasing rate constant, supposedly caused by microbial growth

    +
    + +
    +

    Usage

    +
    logistic.solution(t, parent_0, kmax, k0, r)
    +
    + +
    +

    Arguments

    + + +
    t
    +

    Time.

    + + +
    parent_0
    +

    Starting value for the response variable at time zero.

    + + +
    kmax
    +

    Maximum rate constant.

    + + +
    k0
    +

    Minimum rate constant effective at time zero.

    + + +
    r
    +

    Growth rate of the increase in the rate constant.

    + +
    +
    +

    Value

    +

    The value of the response variable at time t.

    +
    +
    +

    Note

    +

    The solution of the logistic model reduces to the +SFO.solution if k0 is equal to kmax.

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics +FOCUS (2014) “Generic guidance for Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +Version 1.1, 18 December 2014 +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    +
    +

    See also

    +

    Other parent solutions: +DFOP.solution(), +FOMC.solution(), +HS.solution(), +IORE.solution(), +SFO.solution(), +SFORB.solution()

    +
    + +
    +

    Examples

    +
    
    +  # Reproduce the plot on page 57 of FOCUS (2014)
    +  plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.2),
    +       from = 0, to = 100, ylim = c(0, 100),
    +       xlab = "Time", ylab = "Residue")
    +  plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.4),
    +       from = 0, to = 100, add = TRUE, lty = 2, col = 2)
    +  plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.8),
    +       from = 0, to = 100, add = TRUE, lty = 3, col = 3)
    +  plot(function(x) logistic.solution(x, 100, 0.08, 0.001, 0.2),
    +       from = 0, to = 100, add = TRUE, lty = 4, col = 4)
    +  plot(function(x) logistic.solution(x, 100, 0.08, 0.08, 0.2),
    +       from = 0, to = 100, add = TRUE, lty = 5, col = 5)
    +  legend("topright", inset = 0.05,
    +         legend = paste0("k0 = ", c(0.0001, 0.0001, 0.0001, 0.001, 0.08),
    +                         ", r = ", c(0.2, 0.4, 0.8, 0.2, 0.2)),
    +         lty = 1:5, col = 1:5)
    +
    +
    +  # Fit with synthetic data
    +  logistic <- mkinmod(parent = mkinsub("logistic"))
    +
    +  sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +  parms_logistic <- c(kmax = 0.08, k0 = 0.0001, r = 0.2)
    +  d_logistic <- mkinpredict(logistic,
    +    parms_logistic, c(parent = 100),
    +    sampling_times)
    +  d_2_1 <- add_err(d_logistic,
    +    sdfunc = function(x) sigma_twocomp(x, 0.5, 0.07),
    +    n = 1, reps = 2, digits = 5, LOD = 0.1, seed = 123456)[[1]]
    +
    +  m <- mkinfit("logistic", d_2_1, quiet = TRUE)
    +  plot_sep(m)
    +
    +  summary(m)$bpar
    +#>              Estimate   se_notrans   t value       Pr(>t)        Lower
    +#> parent_0 1.057896e+02 1.9023449604 55.610120 3.768360e-16 1.016451e+02
    +#> kmax     6.398190e-02 0.0143201030  4.467978 3.841828e-04 3.929235e-02
    +#> k0       1.612775e-04 0.0005866813  0.274898 3.940351e-01 5.846688e-08
    +#> r        2.263946e-01 0.1718110664  1.317695 1.061043e-01 4.335843e-02
    +#> sigma    5.332935e+00 0.9145907310  5.830952 4.036926e-05 3.340213e+00
    +#>                Upper
    +#> parent_0 109.9341588
    +#> kmax       0.1041853
    +#> k0         0.4448749
    +#> r          1.1821120
    +#> sigma      7.3256566
    +  endpoints(m)$distimes
    +#>            DT50     DT90  DT50_k0 DT50_kmax
    +#> parent 36.86533 62.41511 4297.853  10.83349
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/lrtest.html b/docs/dev/reference/lrtest.html new file mode 100644 index 00000000..9cc267c0 --- /dev/null +++ b/docs/dev/reference/lrtest.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/lrtest.mkinfit.html b/docs/dev/reference/lrtest.mkinfit.html new file mode 100644 index 00000000..c34e1cdd --- /dev/null +++ b/docs/dev/reference/lrtest.mkinfit.html @@ -0,0 +1,191 @@ + +Likelihood ratio test for mkinfit models — lrtest.mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Compare two mkinfit models based on their likelihood. If two fitted +mkinfit objects are given as arguments, it is checked if they have been +fitted to the same data. It is the responsibility of the user to make sure +that the models are nested, i.e. one of them has less degrees of freedom +and can be expressed by fixing the parameters of the other.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinfit'
    +lrtest(object, object_2 = NULL, ...)
    +
    +# S3 method for class 'mmkin'
    +lrtest(object, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mkinfit object, or an mmkin column +object containing two fits to the same data.

    + + +
    object_2
    +

    Optionally, another mkinfit object fitted to the same data.

    + + +
    ...
    +

    Argument to mkinfit, passed to +update.mkinfit for creating the alternative fitted object.

    + +
    +
    +

    Details

    +

    Alternatively, an argument to mkinfit can be given which is then passed +to update.mkinfit to obtain the alternative model.

    +

    The comparison is then made by the lrtest.default +method from the lmtest package. The model with the higher number of fitted +parameters (alternative hypothesis) is listed first, then the model with the +lower number of fitted parameters (null hypothesis).

    +
    + +
    +

    Examples

    +
    # \dontrun{
    +test_data <- subset(synthetic_data_for_UBA_2014[[12]]$data, name == "parent")
    +sfo_fit <- mkinfit("SFO", test_data, quiet = TRUE)
    +dfop_fit <- mkinfit("DFOP", test_data, quiet = TRUE)
    +lrtest(dfop_fit, sfo_fit)
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: DFOP with error model const
    +#> Model 2: SFO with error model const
    +#>   #Df  LogLik Df  Chisq Pr(>Chisq)    
    +#> 1   5 -42.453                         
    +#> 2   3 -63.954 -2 43.002  4.594e-10 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +lrtest(sfo_fit, dfop_fit)
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: DFOP with error model const
    +#> Model 2: SFO with error model const
    +#>   #Df  LogLik Df  Chisq Pr(>Chisq)    
    +#> 1   5 -42.453                         
    +#> 2   3 -63.954 -2 43.002  4.594e-10 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +
    +# The following two examples are commented out as they fail during
    +# generation of the static help pages by pkgdown
    +#lrtest(dfop_fit, error_model = "tc")
    +#lrtest(dfop_fit, fixed_parms = c(k2 = 0))
    +
    +# However, this equivalent syntax also works for static help pages
    +lrtest(dfop_fit, update(dfop_fit, error_model = "tc"))
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: DFOP with error model tc
    +#> Model 2: DFOP with error model const
    +#>   #Df  LogLik Df  Chisq Pr(>Chisq)    
    +#> 1   6 -34.587                         
    +#> 2   5 -42.453 -1 15.731  7.302e-05 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +lrtest(dfop_fit, update(dfop_fit, fixed_parms = c(k2 = 0)))
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: DFOP with error model const
    +#> Model 2: DFOP with error model const and fixed parameter(s) k2
    +#>   #Df  LogLik Df  Chisq Pr(>Chisq)    
    +#> 1   5 -42.453                         
    +#> 2   4 -57.340 -1 29.776  4.851e-08 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/lrtest.mmkin.html b/docs/dev/reference/lrtest.mmkin.html new file mode 100644 index 00000000..dcefa4aa --- /dev/null +++ b/docs/dev/reference/lrtest.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/max_twa_dfop.html b/docs/dev/reference/max_twa_dfop.html new file mode 100644 index 00000000..47bf3da7 --- /dev/null +++ b/docs/dev/reference/max_twa_dfop.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/max_twa_fomc.html b/docs/dev/reference/max_twa_fomc.html new file mode 100644 index 00000000..47bf3da7 --- /dev/null +++ b/docs/dev/reference/max_twa_fomc.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/max_twa_hs.html b/docs/dev/reference/max_twa_hs.html new file mode 100644 index 00000000..47bf3da7 --- /dev/null +++ b/docs/dev/reference/max_twa_hs.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/max_twa_parent.html b/docs/dev/reference/max_twa_parent.html new file mode 100644 index 00000000..550a2678 --- /dev/null +++ b/docs/dev/reference/max_twa_parent.html @@ -0,0 +1,192 @@ + +Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function calculates maximum moving window time weighted average +concentrations (TWAs) for kinetic models fitted with mkinfit. +Currently, only calculations for the parent are implemented for the SFO, +FOMC, DFOP and HS models, using the analytical formulas given in the PEC +soil section of the FOCUS guidance.

    +
    + +
    +

    Usage

    +
    max_twa_parent(fit, windows)
    +
    +max_twa_sfo(M0 = 1, k, t)
    +
    +max_twa_fomc(M0 = 1, alpha, beta, t)
    +
    +max_twa_dfop(M0 = 1, k1, k2, g, t)
    +
    +max_twa_hs(M0 = 1, k1, k2, tb, t)
    +
    + +
    +

    Arguments

    + + +
    fit
    +

    An object of class mkinfit.

    + + +
    windows
    +

    The width of the time windows for which the TWAs should be +calculated.

    + + +
    M0
    +

    The initial concentration for which the maximum time weighted +average over the decline curve should be calculated. The default is to use +a value of 1, which means that a relative maximum time weighted average +factor (f_twa) is calculated.

    + + +
    k
    +

    The rate constant in the case of SFO kinetics.

    + + +
    t
    +

    The width of the time window.

    + + +
    alpha
    +

    Parameter of the FOMC model.

    + + +
    beta
    +

    Parameter of the FOMC model.

    + + +
    k1
    +

    The first rate constant of the DFOP or the HS kinetics.

    + + +
    k2
    +

    The second rate constant of the DFOP or the HS kinetics.

    + + +
    g
    +

    Parameter of the DFOP model.

    + + +
    tb
    +

    Parameter of the HS model.

    + +
    +
    +

    Value

    +

    For max_twa_parent, a numeric vector, named using the +windows argument. For the other functions, a numeric vector of +length one (also known as 'a number').

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +  fit <- mkinfit("FOMC", FOCUS_2006_C, quiet = TRUE)
    +  max_twa_parent(fit, c(7, 21))
    +#>        7       21 
    +#> 34.71343 18.22124 
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/max_twa_sfo.html b/docs/dev/reference/max_twa_sfo.html new file mode 100644 index 00000000..47bf3da7 --- /dev/null +++ b/docs/dev/reference/max_twa_sfo.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/mccall81_245T-1.png b/docs/dev/reference/mccall81_245T-1.png new file mode 100644 index 00000000..3bb35cbd Binary files /dev/null and b/docs/dev/reference/mccall81_245T-1.png differ diff --git a/docs/dev/reference/mccall81_245T.html b/docs/dev/reference/mccall81_245T.html new file mode 100644 index 00000000..996e9fc2 --- /dev/null +++ b/docs/dev/reference/mccall81_245T.html @@ -0,0 +1,201 @@ + +Datasets on aerobic soil metabolism of 2,4,5-T in six soils — mccall81_245T • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Time course of 2,4,5-trichlorophenoxyacetic acid, and the corresponding + 2,4,5-trichlorophenol and 2,4,5-trichloroanisole as recovered in diethylether + extracts.

    +
    + +
    +

    Usage

    +
    mccall81_245T
    +
    + +
    +

    Format

    +

    A dataframe containing the following variables.

    name
    +

    the name of the compound observed. Note that T245 is used as + an acronym for 2,4,5-T. T245 is a legitimate object name + in R, which is necessary for specifying models using + mkinmod.

    + +
    time
    +

    a numeric vector containing sampling times in days after + treatment

    + +
    value
    +

    a numeric vector containing concentrations in percent of applied radioactivity

    + +
    soil
    +

    a factor containing the name of the soil

    + + +
    +
    +

    Source

    +

    McCall P, Vrona SA, Kelley SS (1981) Fate of uniformly carbon-14 ring labelled 2,4,5-Trichlorophenoxyacetic acid and 2,4-dichlorophenoxyacetic acid. J Agric Chem 29, 100-107 + doi:10.1021/jf00103a026

    +
    + +
    +

    Examples

    +
      SFO_SFO_SFO <- mkinmod(T245 = list(type = "SFO", to = "phenol"),
    +    phenol = list(type = "SFO", to = "anisole"),
    +    anisole = list(type = "SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +  # \dontrun{
    +    fit.1 <- mkinfit(SFO_SFO_SFO, subset(mccall81_245T, soil == "Commerce"), quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +    summary(fit.1)$bpar
    +#>                         Estimate   se_notrans   t value       Pr(>t)
    +#> T245_0              1.038550e+02 2.1847074943 47.537272 4.472189e-18
    +#> k_T245              4.337042e-02 0.0018983965 22.845818 2.276911e-13
    +#> k_phenol            4.050581e-01 0.2986993738  1.356073 9.756990e-02
    +#> k_anisole           6.678742e-03 0.0008021439  8.326114 2.623177e-07
    +#> f_T245_to_phenol    6.227599e-01 0.3985340721  1.562626 6.949414e-02
    +#> f_phenol_to_anisole 1.000000e+00 0.6718440131  1.488441 7.867790e-02
    +#> sigma               2.514628e+00 0.4907558973  5.123989 6.233159e-05
    +#>                            Lower        Upper
    +#> T245_0              99.246061490 1.084640e+02
    +#> k_T245               0.039631621 4.746194e-02
    +#> k_phenol             0.218013879 7.525762e-01
    +#> k_anisole            0.005370739 8.305299e-03
    +#> f_T245_to_phenol     0.547559080 6.924813e-01
    +#> f_phenol_to_anisole  0.000000000 1.000000e+00
    +#> sigma                1.706607296 3.322649e+00
    +    endpoints(fit.1)
    +#> $ff
    +#>    T245_phenol      T245_sink phenol_anisole    phenol_sink 
    +#>   6.227599e-01   3.772401e-01   1.000000e+00   3.072478e-10 
    +#> 
    +#> $distimes
    +#>               DT50      DT90
    +#> T245     15.982025  53.09114
    +#> phenol    1.711229   5.68458
    +#> anisole 103.784093 344.76329
    +#> 
    +    # formation fraction from phenol to anisol is practically 1. As we cannot
    +    # fix formation fractions when using the ilr transformation, we can turn of
    +    # the sink in the model generation
    +    SFO_SFO_SFO_2 <- mkinmod(T245 = list(type = "SFO", to = "phenol"),
    +      phenol = list(type = "SFO", to = "anisole", sink = FALSE),
    +      anisole = list(type = "SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +    fit.2 <- mkinfit(SFO_SFO_SFO_2, subset(mccall81_245T, soil == "Commerce"),
    +      quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +    summary(fit.2)$bpar
    +#>                      Estimate   se_notrans   t value       Pr(>t)        Lower
    +#> T245_0           1.038550e+02 2.1623653059 48.028439 4.993108e-19 99.271020328
    +#> k_T245           4.337042e-02 0.0018343666 23.643268 3.573556e-14  0.039650976
    +#> k_phenol         4.050582e-01 0.1177237651  3.440752 1.679255e-03  0.218746589
    +#> k_anisole        6.678742e-03 0.0006829745  9.778903 1.872894e-08  0.005377083
    +#> f_T245_to_phenol 6.227599e-01 0.0342197873 18.198824 2.039411e-12  0.547975634
    +#> sigma            2.514628e+00 0.3790944250  6.633250 2.875782e-06  1.710983655
    +#>                         Upper
    +#> T245_0           108.43904079
    +#> k_T245             0.04743877
    +#> k_phenol           0.75005593
    +#> k_anisole          0.00829550
    +#> f_T245_to_phenol   0.69212307
    +#> sigma              3.31827222
    +    endpoints(fit.1)
    +#> $ff
    +#>    T245_phenol      T245_sink phenol_anisole    phenol_sink 
    +#>   6.227599e-01   3.772401e-01   1.000000e+00   3.072478e-10 
    +#> 
    +#> $distimes
    +#>               DT50      DT90
    +#> T245     15.982025  53.09114
    +#> phenol    1.711229   5.68458
    +#> anisole 103.784093 344.76329
    +#> 
    +    plot_sep(fit.2)
    +
    +  # }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mean_degparms.html b/docs/dev/reference/mean_degparms.html new file mode 100644 index 00000000..41517875 --- /dev/null +++ b/docs/dev/reference/mean_degparms.html @@ -0,0 +1,134 @@ + +Calculate mean degradation parameters for an mmkin row object — mean_degparms • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Calculate mean degradation parameters for an mmkin row object

    +
    + +
    +

    Usage

    +
    mean_degparms(
    +  object,
    +  random = FALSE,
    +  test_log_parms = FALSE,
    +  conf.level = 0.6,
    +  default_log_parms = NA
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mmkin row object containing several fits of the same model to different datasets

    + + +
    random
    +

    Should a list with fixed and random effects be returned?

    + + +
    test_log_parms
    +

    If TRUE, log parameters are only considered in +the mean calculations if their untransformed counterparts (most likely +rate constants) pass the t-test for significant difference from zero.

    + + +
    conf.level
    +

    Possibility to adjust the required confidence level +for parameter that are tested if requested by 'test_log_parms'.

    + + +
    default_log_parms
    +

    If set to a numeric value, this is used +as a default value for the tested log parameters that failed the +t-test.

    + +
    +
    +

    Value

    +

    If random is FALSE (default), a named vector containing mean values +of the fitted degradation model parameters. If random is TRUE, a list with +fixed and random effects, in the format required by the start argument of +nlme for the case of a single grouping variable ds.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mhmkin-1.png b/docs/dev/reference/mhmkin-1.png new file mode 100644 index 00000000..1c99aead Binary files /dev/null and b/docs/dev/reference/mhmkin-1.png differ diff --git a/docs/dev/reference/mhmkin-2.png b/docs/dev/reference/mhmkin-2.png new file mode 100644 index 00000000..7311206d Binary files /dev/null and b/docs/dev/reference/mhmkin-2.png differ diff --git a/docs/dev/reference/mhmkin.html b/docs/dev/reference/mhmkin.html new file mode 100644 index 00000000..513fc780 --- /dev/null +++ b/docs/dev/reference/mhmkin.html @@ -0,0 +1,286 @@ + +Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models — mhmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The name of the methods expresses that (multiple) hierarchichal +(also known as multilevel) multicompartment kinetic models are +fitted. Our kinetic models are nonlinear, so we can use various nonlinear +mixed-effects model fitting functions.

    +
    + +
    +

    Usage

    +
    mhmkin(objects, ...)
    +
    +# S3 method for class 'mmkin'
    +mhmkin(objects, ...)
    +
    +# S3 method for class 'list'
    +mhmkin(
    +  objects,
    +  backend = "saemix",
    +  algorithm = "saem",
    +  no_random_effect = NULL,
    +  ...,
    +  cores = if (Sys.info()["sysname"] == "Windows") 1 else parallel::detectCores(),
    +  cluster = NULL
    +)
    +
    +# S3 method for class 'mhmkin'
    +x[i, j, ..., drop = FALSE]
    +
    +# S3 method for class 'mhmkin'
    +print(x, ...)
    +
    + +
    +

    Arguments

    + + +
    objects
    +

    A list of mmkin objects containing fits of the same +degradation models to the same data, but using different error models. +Alternatively, a single mmkin object containing fits of several +degradation models to the same data

    + + +
    ...
    +

    Further arguments that will be passed to the nonlinear mixed-effects +model fitting function.

    + + +
    backend
    +

    The backend to be used for fitting. Currently, only saemix is +supported

    + + +
    algorithm
    +

    The algorithm to be used for fitting (currently not used)

    + + +
    no_random_effect
    +

    Default is NULL and will be passed to saem. If a +character vector is supplied, it will be passed to all calls to saem, +which will exclude random effects for all matching parameters. Alternatively, +a list of character vectors or an object of class illparms.mhmkin can be +specified. They have to have the same dimensions that the return object of +the current call will have, i.e. the number of rows must match the number +of degradation models in the mmkin object(s), and the number of columns must +match the number of error models used in the mmkin object(s).

    + + +
    cores
    +

    The number of cores to be used for multicore processing. This +is only used when the cluster argument is NULL. On Windows +machines, cores > 1 is not supported, you need to use the cluster +argument to use multiple logical processors. Per default, all cores detected +by parallel::detectCores() are used, except on Windows where the default +is 1.

    + + +
    cluster
    +

    A cluster as returned by makeCluster to be used for +parallel execution.

    + + +
    x
    +

    An mhmkin object.

    + + +
    i
    +

    Row index selecting the fits for specific models

    + + +
    j
    +

    Column index selecting the fits to specific datasets

    + + +
    drop
    +

    If FALSE, the method always returns an mhmkin object, otherwise +either a list of fit objects or a single fit object.

    + +
    +
    +

    Value

    +

    A two-dimensional array of fit objects and/or try-errors that can +be indexed using the degradation model names for the first index (row index) +and the error model names for the second index (column index), with class +attribute 'mhmkin'.

    +

    An object inheriting from mhmkin.

    +
    +
    +

    See also

    +

    [.mhmkin for subsetting mhmkin objects

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    # \dontrun{
    +# We start with separate evaluations of all the first six datasets with two
    +# degradation models and two error models
    +f_sep_const <- mmkin(c("SFO", "FOMC"), ds_fomc[1:6], cores = 2, quiet = TRUE)
    +f_sep_tc <- update(f_sep_const, error_model = "tc")
    +# The mhmkin function sets up hierarchical degradation models aka
    +# nonlinear mixed-effects models for all four combinations, specifying
    +# uncorrelated random effects for all degradation parameters
    +f_saem_1 <- mhmkin(list(f_sep_const, f_sep_tc), cores = 2)
    +status(f_saem_1)
    +#>            error
    +#> degradation const tc
    +#>        SFO  OK    OK
    +#>        FOMC OK    OK
    +#> 
    +#> OK: Fit terminated successfully
    +# The 'illparms' function shows that in all hierarchical fits, at least
    +# one random effect is ill-defined (the confidence interval for the
    +# random effect expressed as standard deviation includes zero)
    +illparms(f_saem_1)
    +#>            error
    +#> degradation const        tc                        
    +#>        SFO  sd(parent_0) sd(parent_0)              
    +#>        FOMC sd(log_beta) sd(parent_0), sd(log_beta)
    +# Therefore we repeat the fits, excluding the ill-defined random effects
    +f_saem_2 <- update(f_saem_1, no_random_effect = illparms(f_saem_1))
    +status(f_saem_2)
    +#>            error
    +#> degradation const tc
    +#>        SFO  OK    OK
    +#>        FOMC OK    OK
    +#> 
    +#> OK: Fit terminated successfully
    +illparms(f_saem_2)
    +#>            error
    +#> degradation const tc
    +#>        SFO          
    +#>        FOMC         
    +# Model comparisons show that FOMC with two-component error is preferable,
    +# and confirms our reduction of the default parameter model
    +anova(f_saem_1)
    +#> Data: 95 observations of 1 variable(s) grouped in 6 datasets
    +#> 
    +#>            npar    AIC    BIC     Lik
    +#> SFO const     5 574.40 573.35 -282.20
    +#> SFO tc        6 543.72 542.47 -265.86
    +#> FOMC const    7 489.67 488.22 -237.84
    +#> FOMC tc       8 406.11 404.44 -195.05
    +anova(f_saem_2)
    +#> Data: 95 observations of 1 variable(s) grouped in 6 datasets
    +#> 
    +#>            npar    AIC    BIC     Lik
    +#> SFO const     4 572.22 571.39 -282.11
    +#> SFO tc        5 541.63 540.59 -265.81
    +#> FOMC const    6 487.38 486.13 -237.69
    +#> FOMC tc       6 402.12 400.88 -195.06
    +# The convergence plot for the selected model looks fine
    +saemix::plot(f_saem_2[["FOMC", "tc"]]$so, plot.type = "convergence")
    +
    +# The plot of predictions versus data shows that we have a pretty data-rich
    +# situation with homogeneous distribution of residuals, because we used the
    +# same degradation model, error model and parameter distribution model that
    +# was used in the data generation.
    +plot(f_saem_2[["FOMC", "tc"]])
    +
    +# We can specify the same parameter model reductions manually
    +no_ranef <- list("parent_0", "log_beta", "parent_0", c("parent_0", "log_beta"))
    +dim(no_ranef) <- c(2, 2)
    +f_saem_2m <- update(f_saem_1, no_random_effect = no_ranef)
    +anova(f_saem_2m)
    +#> Data: 95 observations of 1 variable(s) grouped in 6 datasets
    +#> 
    +#>            npar    AIC    BIC     Lik
    +#> SFO const     4 572.22 571.39 -282.11
    +#> SFO tc        5 541.63 540.59 -265.81
    +#> FOMC const    6 487.38 486.13 -237.69
    +#> FOMC tc       6 402.12 400.88 -195.06
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mhmkin.list.html b/docs/dev/reference/mhmkin.list.html new file mode 100644 index 00000000..19cc9c91 --- /dev/null +++ b/docs/dev/reference/mhmkin.list.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/mhmkin.mmkin.html b/docs/dev/reference/mhmkin.mmkin.html new file mode 100644 index 00000000..19cc9c91 --- /dev/null +++ b/docs/dev/reference/mhmkin.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/mixed-1.png b/docs/dev/reference/mixed-1.png new file mode 100644 index 00000000..d46a2485 Binary files /dev/null and b/docs/dev/reference/mixed-1.png differ diff --git a/docs/dev/reference/mixed.html b/docs/dev/reference/mixed.html new file mode 100644 index 00000000..513fb226 --- /dev/null +++ b/docs/dev/reference/mixed.html @@ -0,0 +1,199 @@ + +Create a mixed effects model from an mmkin row object — mixed • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Create a mixed effects model from an mmkin row object

    +
    + +
    +

    Usage

    +
    mixed(object, ...)
    +
    +# S3 method for class 'mmkin'
    +mixed(object, method = c("none"), ...)
    +
    +# S3 method for class 'mixed.mmkin'
    +print(x, digits = max(3, getOption("digits") - 3), ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mmkin row object

    + + +
    ...
    +

    Currently not used

    + + +
    method
    +

    The method to be used

    + + +
    x
    +

    A mixed.mmkin object to print

    + + +
    digits
    +

    Number of digits to use for printing.

    + +
    +
    +

    Value

    +

    An object of class 'mixed.mmkin' which has the observed data in a +single dataframe which is convenient for plotting

    +
    + +
    +

    Examples

    +
    sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +n_biphasic <- 8
    +err_1 = list(const = 1, prop = 0.07)
    +
    +DFOP_SFO <- mkinmod(
    +  parent = mkinsub("DFOP", "m1"),
    +  m1 = mkinsub("SFO"),
    +  quiet = TRUE)
    +
    +set.seed(123456)
    +log_sd <- 0.3
    +syn_biphasic_parms <- as.matrix(data.frame(
    +  k1 = rlnorm(n_biphasic, log(0.05), log_sd),
    +  k2 = rlnorm(n_biphasic, log(0.01), log_sd),
    +  g = plogis(rnorm(n_biphasic, 0, log_sd)),
    +  f_parent_to_m1 = plogis(rnorm(n_biphasic, 0, log_sd)),
    +  k_m1 = rlnorm(n_biphasic, log(0.002), log_sd)))
    +
    +ds_biphasic_mean <- lapply(1:n_biphasic,
    +  function(i) {
    +    mkinpredict(DFOP_SFO, syn_biphasic_parms[i, ],
    +      c(parent = 100, m1 = 0), sampling_times)
    +  }
    +)
    +
    +set.seed(123456L)
    +ds_biphasic <- lapply(ds_biphasic_mean, function(ds) {
    +  add_err(ds,
    +    sdfunc = function(value) sqrt(err_1$const^2 + value^2 * err_1$prop^2),
    +    n = 1, secondary = "m1")[[1]]
    +})
    +
    +# \dontrun{
    +f_mmkin <- mmkin(list("DFOP-SFO" = DFOP_SFO), ds_biphasic, error_model = "tc", quiet = TRUE)
    +
    +f_mixed <- mixed(f_mmkin)
    +print(f_mixed)
    +#> Kinetic model fitted by nonlinear regression to each dataset
    +#> Structural model:
    +#> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
    +#>            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
    +#>            * parent
    +#> d_m1/dt = + f_parent_to_m1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g)
    +#>            * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
    +#>            exp(-k2 * time))) * parent - k_m1 * m1
    +#> 
    +#> Data:
    +#> 271 observations of 2 variable(s) grouped in 8 datasets
    +#> 
    +#> <mmkin> object
    +#> Status of individual fits:
    +#> 
    +#>           dataset
    +#> model      1  2  3  4  5  6 7  8 
    +#>   DFOP-SFO OK OK OK OK OK C OK OK
    +#> 
    +#> C: Optimisation did not converge:
    +#> iteration limit reached without convergence (10)
    +#> OK: No warnings
    +#> 
    +#> Mean fitted parameters:
    +#>        parent_0        log_k_m1 f_parent_qlogis          log_k1          log_k2 
    +#>      100.605312       -8.758664       -0.001917       -3.350887       -3.990017 
    +#>        g_qlogis 
    +#>       -0.091167 
    +plot(f_mixed)
    +
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mixed.mmkin.html b/docs/dev/reference/mixed.mmkin.html new file mode 100644 index 00000000..7b45f95d --- /dev/null +++ b/docs/dev/reference/mixed.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/mkin_long_to_wide.html b/docs/dev/reference/mkin_long_to_wide.html new file mode 100644 index 00000000..c8c748a4 --- /dev/null +++ b/docs/dev/reference/mkin_long_to_wide.html @@ -0,0 +1,155 @@ + +Convert a dataframe from long to wide format — mkin_long_to_wide • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function takes a dataframe in the long form, i.e. with a row for each +observed value, and converts it into a dataframe with one independent +variable and several dependent variables as columns.

    +
    + +
    +

    Usage

    +
    mkin_long_to_wide(long_data, time = "time", outtime = "time")
    +
    + +
    +

    Arguments

    + + +
    long_data
    +

    The dataframe must contain one variable called "time" with +the time values specified by the time argument, one column called +"name" with the grouping of the observed values, and finally one column of +observed values called "value".

    + + +
    time
    +

    The name of the time variable in the long input data.

    + + +
    outtime
    +

    The name of the time variable in the wide output data.

    + +
    +
    +

    Value

    +

    Dataframe in wide format.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +mkin_long_to_wide(FOCUS_2006_D)
    +#>    time parent    m1
    +#> 1     0  99.46  0.00
    +#> 2     0 102.04  0.00
    +#> 3     1  93.50  4.84
    +#> 4     1  92.50  5.64
    +#> 5     3  63.23 12.91
    +#> 6     3  68.99 12.96
    +#> 7     7  52.32 22.97
    +#> 8     7  55.13 24.47
    +#> 9    14  27.27 41.69
    +#> 10   14  26.64 33.21
    +#> 11   21  11.50 44.37
    +#> 12   21  11.64 46.44
    +#> 13   35   2.85 41.22
    +#> 14   35   2.91 37.95
    +#> 15   50   0.69 41.19
    +#> 16   50   0.63 40.01
    +#> 17   75   0.05 40.09
    +#> 18   75   0.06 33.85
    +#> 19  100     NA 31.04
    +#> 20  100     NA 33.13
    +#> 21  120     NA 25.15
    +#> 22  120     NA 33.31
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkin_wide_to_long.html b/docs/dev/reference/mkin_wide_to_long.html new file mode 100644 index 00000000..98a9e7e6 --- /dev/null +++ b/docs/dev/reference/mkin_wide_to_long.html @@ -0,0 +1,135 @@ + +Convert a dataframe with observations over time into long format — mkin_wide_to_long • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function simply takes a dataframe with one independent variable and +several dependent variable and converts it into the long form as required by +mkinfit.

    +
    + +
    +

    Usage

    +
    mkin_wide_to_long(wide_data, time = "t")
    +
    + +
    +

    Arguments

    + + +
    wide_data
    +

    The dataframe must contain one variable with the time +values specified by the time argument and usually more than one +column of observed values.

    + + +
    time
    +

    The name of the time variable.

    + +
    +
    +

    Value

    +

    Dataframe in long format as needed for mkinfit.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +wide <- data.frame(t = c(1,2,3), x = c(1,4,7), y = c(3,4,5))
    +mkin_wide_to_long(wide)
    +#>   name time value
    +#> 1    x    1     1
    +#> 2    x    2     4
    +#> 3    x    3     7
    +#> 4    y    1     3
    +#> 5    y    2     4
    +#> 6    y    3     5
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinds.html b/docs/dev/reference/mkinds.html new file mode 100644 index 00000000..a0387d78 --- /dev/null +++ b/docs/dev/reference/mkinds.html @@ -0,0 +1,219 @@ + +A dataset class for mkin — mkinds • mkin + Skip to contents + + +
    +
    +
    + +
    +

    At the moment this dataset class is hardly used in mkin. For example, +mkinfit does not take mkinds datasets as argument, but works with dataframes +such as the on contained in the data field of mkinds objects. Some datasets +provided by this package come as mkinds objects nevertheless.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinds'
    +print(x, data = FALSE, ...)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    An mkinds object.

    + + +
    data
    +

    Should the data be printed?

    + + +
    ...
    +

    Not used.

    + +
    +
    +

    Public fields

    +

    title
    +

    A full title for the dataset

    + + +
    sampling_times
    +

    The sampling times

    + + +
    time_unit
    +

    The time unit

    + + +
    observed
    +

    Names of the observed variables

    + + +
    unit
    +

    The unit of the observations

    + + +
    replicates
    +

    The maximum number of replicates per sampling time

    + + +
    data
    +

    A data frame with at least the columns name, time +and value in order to be compatible with mkinfit

    + + +

    +
    +
    +

    Methods

    + +
    +

    Public methods

    + +


    +

    Method new()

    +

    Create a new mkinds object

    +

    Usage

    +

    mkinds$new(title = "", data, time_unit = NA, unit = NA)

    +
    + +
    +

    Arguments

    +

    title
    +

    The dataset title

    + + +
    data
    +

    The data

    + + +
    time_unit
    +

    The time unit

    + + +
    unit
    +

    The unit of the observations

    + + +

    +
    + +


    +

    Method clone()

    +

    The objects of this class are cloneable with this method.

    +

    Usage

    +

    mkinds$clone(deep = FALSE)

    +
    + +
    +

    Arguments

    +

    deep
    +

    Whether to make a deep clone.

    + + +

    +
    + +
    + +
    + +
    +

    Examples

    +
    
    +mds <- mkinds$new("FOCUS A", FOCUS_2006_A)
    +print(mds)
    +#> <mkinds> with $title:  FOCUS A 
    +#> Observed compounds $observed:  parent 
    +#> Sampling times $sampling_times:
    +#> 0, 3, 7, 14, 30, 62, 90, 118 
    +#> With a maximum of  1  replicates
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkindsg.html b/docs/dev/reference/mkindsg.html new file mode 100644 index 00000000..fec3f4be --- /dev/null +++ b/docs/dev/reference/mkindsg.html @@ -0,0 +1,407 @@ + +A class for dataset groups for mkin — mkindsg • mkin + Skip to contents + + +
    +
    +
    + +
    +

    A container for working with datasets that share at least one compound, +so that combined evaluations are desirable.

    +

    Time normalisation factors are initialised with a value of 1 for each +dataset if no data are supplied.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkindsg'
    +print(x, data = FALSE, verbose = data, ...)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    An mkindsg object.

    + + +
    data
    +

    Should the mkinds objects be printed with their data?

    + + +
    verbose
    +

    Should the mkinds objects be printed?

    + + +
    ...
    +

    Not used.

    + +
    +
    +

    Public fields

    +

    title
    +

    A title for the dataset group

    + + +
    ds
    +

    A list of mkinds objects

    + + +
    observed_n
    +

    Occurrence counts of compounds in datasets

    + + +
    f_time_norm
    +

    Time normalisation factors

    + + +
    meta
    +

    A data frame with a row for each dataset, +containing additional information in the form +of categorical data (factors) or numerical data +(e.g. temperature, moisture, +or covariates like soil pH).

    + + +

    +
    +
    +

    Methods

    + +
    +

    Public methods

    + +


    +

    Method new()

    +

    Create a new mkindsg object

    +

    Usage

    +

    mkindsg$new(title = "", ds, f_time_norm = rep(1, length(ds)), meta)

    +
    + +
    +

    Arguments

    +

    title
    +

    The title

    + + +
    ds
    +

    A list of mkinds objects

    + + +
    f_time_norm
    +

    Time normalisation factors

    + + +
    meta
    +

    The meta data

    + + +

    +
    + +


    +

    Method clone()

    +

    The objects of this class are cloneable with this method.

    +

    Usage

    +

    mkindsg$clone(deep = FALSE)

    +
    + +
    +

    Arguments

    +

    deep
    +

    Whether to make a deep clone.

    + + +

    +
    + +
    + +
    + +
    +

    Examples

    +
    
    +mdsg <- mkindsg$new("Experimental X", experimental_data_for_UBA_2019[6:10])
    +print(mdsg)
    +#> <mkindsg> holding 5 mkinds objects
    +#> Title $title:  Experimental X 
    +#> Occurrence of observed compounds $observed_n:
    +#> parent     A1 
    +#>      5      5 
    +print(mdsg, verbose = TRUE)
    +#> <mkindsg> holding 5 mkinds objects
    +#> Title $title:  Experimental X 
    +#> Occurrence of observed compounds $observed_n:
    +#> parent     A1 
    +#>      5      5 
    +#> 
    +#> Datasets $ds:
    +#> <mkinds> with $title:  Soil 6 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 3, 6, 10, 20, 34, 55, 90, 112, 132 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#> 
    +#> <mkinds> with $title:  Soil 7 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 3, 7, 14, 30, 60, 90, 120, 180 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#> 
    +#> <mkinds> with $title:  Soil 8 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 1, 3, 8, 14, 27, 48, 70 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#> 
    +#> <mkinds> with $title:  Soil 9 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 1, 3, 8, 14, 27, 48, 70, 91, 120 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#> 
    +#> <mkinds> with $title:  Soil 10 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 8, 14, 21, 41, 63, 91, 120 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +print(mdsg, verbose = TRUE, data = TRUE)
    +#> <mkindsg> holding 5 mkinds objects
    +#> Title $title:  Experimental X 
    +#> Occurrence of observed compounds $observed_n:
    +#> parent     A1 
    +#>      5      5 
    +#> 
    +#> Datasets $ds:
    +#> <mkinds> with $title:  Soil 6 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 3, 6, 10, 20, 34, 55, 90, 112, 132 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#>    time parent   A1
    +#> 1     0   97.2   NA
    +#> 2     0   96.4   NA
    +#> 3     3   71.1  4.3
    +#> 4     3   69.2  4.6
    +#> 5     6   58.1  7.0
    +#> 6     6   56.6  7.2
    +#> 7    10   44.4  8.2
    +#> 8    10   43.4  8.0
    +#> 9    20   33.3 11.0
    +#> 10   20   29.2 13.7
    +#> 11   34   17.6 11.5
    +#> 12   34   18.0 12.7
    +#> 13   55   10.5 14.9
    +#> 14   55    9.3 14.5
    +#> 15   90    4.5 12.1
    +#> 16   90    4.7 12.3
    +#> 17  112    3.0  9.9
    +#> 18  112    3.4 10.2
    +#> 19  132    2.3  8.8
    +#> 20  132    2.7  7.8
    +#> 
    +#> <mkinds> with $title:  Soil 7 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 3, 7, 14, 30, 60, 90, 120, 180 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#>    time parent   A1
    +#> 1     0   93.6   NA
    +#> 2     0   92.3   NA
    +#> 3     3   87.0  3.9
    +#> 4     3   82.2  3.1
    +#> 5     7   74.0  6.9
    +#> 6     7   73.9  6.6
    +#> 7    14   64.2 10.4
    +#> 8    14   69.5  8.3
    +#> 9    30   54.0 14.4
    +#> 10   30   54.6 13.7
    +#> 11   60   41.1 22.1
    +#> 12   60   38.4 22.3
    +#> 13   90   32.5 27.5
    +#> 14   90   35.5 25.4
    +#> 15  120   28.1 28.0
    +#> 16  120   29.0 26.6
    +#> 17  180   26.5 25.8
    +#> 18  180   27.6 25.3
    +#> 
    +#> <mkinds> with $title:  Soil 8 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 1, 3, 8, 14, 27, 48, 70 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#>    time parent   A1
    +#> 1     0   91.9   NA
    +#> 2     0   90.8   NA
    +#> 3     1   64.9  9.6
    +#> 4     1   66.2  7.7
    +#> 5     3   43.5 15.0
    +#> 6     3   44.1 15.1
    +#> 7     8   18.3 21.2
    +#> 8     8   18.1 21.1
    +#> 9    14   10.2 19.7
    +#> 10   14   10.8 18.9
    +#> 11   27    4.9 17.5
    +#> 12   27    3.3 15.9
    +#> 13   48    1.6  9.5
    +#> 14   48    1.5  9.8
    +#> 15   70    1.1  6.2
    +#> 16   70    0.9  6.1
    +#> 
    +#> <mkinds> with $title:  Soil 9 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 1, 3, 8, 14, 27, 48, 70, 91, 120 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#>    time parent   A1
    +#> 1     0   99.8   NA
    +#> 2     0   98.3   NA
    +#> 3     1   77.1  4.2
    +#> 4     1   77.2  3.9
    +#> 5     3   59.0  7.4
    +#> 6     3   58.1  7.9
    +#> 7     8   27.4 14.5
    +#> 8     8   29.2 13.7
    +#> 9    14   19.1 14.2
    +#> 10   14   29.6 12.2
    +#> 11   27   10.1 13.7
    +#> 12   27   18.2 13.2
    +#> 13   48    4.5 13.6
    +#> 14   48    9.1 15.4
    +#> 15   70    2.3 10.4
    +#> 16   70    2.9 11.6
    +#> 17   91    2.0 10.0
    +#> 18   91    1.8  9.5
    +#> 19  120    2.0  9.1
    +#> 20  120    2.2  9.0
    +#> 
    +#> <mkinds> with $title:  Soil 10 
    +#> Observed compounds $observed:  parent, A1 
    +#> Sampling times $sampling_times:
    +#> 0, 8, 14, 21, 41, 63, 91, 120 
    +#> With a maximum of  2  replicates
    +#> Time unit:  days 
    +#> Observation unit:  \%AR 
    +#>    time parent   A1
    +#> 1     0   96.1   NA
    +#> 2     0   94.3   NA
    +#> 3     8   73.9  3.3
    +#> 4     8   73.9  3.4
    +#> 5    14   69.4  3.9
    +#> 6    14   73.1  2.9
    +#> 7    21   65.6  6.4
    +#> 8    21   65.3  7.2
    +#> 9    41   55.9  9.1
    +#> 10   41   54.4  8.5
    +#> 11   63   47.0 11.7
    +#> 12   63   49.3 12.0
    +#> 13   91   44.7 13.3
    +#> 14   91   46.7 13.2
    +#> 15  120   42.1 14.3
    +#> 16  120   41.3 12.1
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinerrmin.html b/docs/dev/reference/mkinerrmin.html new file mode 100644 index 00000000..14e4e187 --- /dev/null +++ b/docs/dev/reference/mkinerrmin.html @@ -0,0 +1,163 @@ + +Calculate the minimum error to assume in order to pass the variance test — mkinerrmin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function finds the smallest relative error still resulting in passing +the chi-squared test as defined in the FOCUS kinetics report from 2006.

    +
    + +
    +

    Usage

    +
    mkinerrmin(fit, alpha = 0.05)
    +
    + +
    +

    Arguments

    + + +
    fit
    +

    an object of class mkinfit.

    + + +
    alpha
    +

    The confidence level chosen for the chi-squared test.

    + +
    +
    +

    Value

    +

    A dataframe with the following components:

    +
    err.min
    +

    The +relative error, expressed as a fraction.

    +
    n.optim
    +

    The number of +optimised parameters attributed to the data series.

    +
    df
    +

    The number of +remaining degrees of freedom for the chi2 error level calculations. Note +that mean values are used for the chi2 statistic and therefore every time +point with observed values in the series only counts one time.

    +

    The +dataframe has one row for the total dataset and one further row for each +observed state variable in the model.

    +
    +
    +

    Details

    +

    This function is used internally by summary.mkinfit.

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in EU +Registration” Report of the FOCUS Work Group on Degradation Kinetics, EC +Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    + +
    +

    Examples

    +
    
    +SFO_SFO = mkinmod(parent = mkinsub("SFO", to = "m1"),
    +                  m1 = mkinsub("SFO"),
    +                  use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +fit_FOCUS_D = mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +round(mkinerrmin(fit_FOCUS_D), 4)
    +#>          err.min n.optim df
    +#> All data  0.0640       4 15
    +#> parent    0.0646       2  7
    +#> m1        0.0469       2  8
    +# \dontrun{
    +  fit_FOCUS_E = mkinfit(SFO_SFO, FOCUS_2006_E, quiet = TRUE)
    +  round(mkinerrmin(fit_FOCUS_E), 4)
    +#>          err.min n.optim df
    +#> All data  0.1544       4 13
    +#> parent    0.1659       2  7
    +#> m1        0.1095       2  6
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinerrplot-1.png b/docs/dev/reference/mkinerrplot-1.png new file mode 100644 index 00000000..03a054c8 Binary files /dev/null and b/docs/dev/reference/mkinerrplot-1.png differ diff --git a/docs/dev/reference/mkinerrplot.html b/docs/dev/reference/mkinerrplot.html new file mode 100644 index 00000000..01adc052 --- /dev/null +++ b/docs/dev/reference/mkinerrplot.html @@ -0,0 +1,201 @@ + +Function to plot squared residuals and the error model for an mkin object — mkinerrplot • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function plots the squared residuals for the specified subset of the +observed variables from an mkinfit object. In addition, one or more dashed +line(s) show the fitted error model. A combined plot of the fitted model +and this error model plot can be obtained with plot.mkinfit +using the argument show_errplot = TRUE.

    +
    + +
    +

    Usage

    +
    mkinerrplot(
    +  object,
    +  obs_vars = names(object$mkinmod$map),
    +  xlim = c(0, 1.1 * max(object$data$predicted)),
    +  xlab = "Predicted",
    +  ylab = "Squared residual",
    +  maxy = "auto",
    +  legend = TRUE,
    +  lpos = "topright",
    +  col_obs = "auto",
    +  pch_obs = "auto",
    +  frame = TRUE,
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    A fit represented in an mkinfit object.

    + + +
    obs_vars
    +

    A character vector of names of the observed variables for +which residuals should be plotted. Defaults to all observed variables in +the model

    + + +
    xlim
    +

    plot range in x direction.

    + + +
    xlab
    +

    Label for the x axis.

    + + +
    ylab
    +

    Label for the y axis.

    + + +
    maxy
    +

    Maximum value of the residuals. This is used for the scaling of +the y axis and defaults to "auto".

    + + +
    legend
    +

    Should a legend be plotted?

    + + +
    lpos
    +

    Where should the legend be placed? Default is "topright". Will +be passed on to legend.

    + + +
    col_obs
    +

    Colors for the observed variables.

    + + +
    pch_obs
    +

    Symbols to be used for the observed variables.

    + + +
    frame
    +

    Should a frame be drawn around the plots?

    + + +
    ...
    +

    further arguments passed to plot.

    + +
    +
    +

    Value

    +

    Nothing is returned by this function, as it is called for its side +effect, namely to produce a plot.

    +
    +
    +

    See also

    +

    mkinplot, for a way to plot the data and the fitted +lines of the mkinfit object.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +# \dontrun{
    +model <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +fit <- mkinfit(model, FOCUS_2006_D, error_model = "tc", quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +mkinerrplot(fit)
    +
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinfit-1.png b/docs/dev/reference/mkinfit-1.png new file mode 100644 index 00000000..77f6e65c Binary files /dev/null and b/docs/dev/reference/mkinfit-1.png differ diff --git a/docs/dev/reference/mkinfit.html b/docs/dev/reference/mkinfit.html new file mode 100644 index 00000000..1c84b9b2 --- /dev/null +++ b/docs/dev/reference/mkinfit.html @@ -0,0 +1,679 @@ + +Fit a kinetic model to data with one or more state variables — mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function maximises the likelihood of the observed data using the Port +algorithm stats::nlminb(), and the specified initial or fixed +parameters and starting values. In each step of the optimisation, the +kinetic model is solved using the function mkinpredict(), except +if an analytical solution is implemented, in which case the model is solved +using the degradation function in the mkinmod object. The +parameters of the selected error model are fitted simultaneously with the +degradation model parameters, as both of them are arguments of the +likelihood function.

    +
    + +
    +

    Usage

    +
    mkinfit(
    +  mkinmod,
    +  observed,
    +  parms.ini = "auto",
    +  state.ini = "auto",
    +  err.ini = "auto",
    +  fixed_parms = NULL,
    +  fixed_initials = names(mkinmod$diffs)[-1],
    +  from_max_mean = FALSE,
    +  solution_type = c("auto", "analytical", "eigen", "deSolve"),
    +  method.ode = "lsoda",
    +  use_compiled = "auto",
    +  control = list(eval.max = 300, iter.max = 200),
    +  transform_rates = TRUE,
    +  transform_fractions = TRUE,
    +  quiet = FALSE,
    +  atol = 1e-08,
    +  rtol = 1e-10,
    +  error_model = c("const", "obs", "tc"),
    +  error_model_algorithm = c("auto", "d_3", "direct", "twostep", "threestep", "fourstep",
    +    "IRLS", "OLS"),
    +  reweight.tol = 1e-08,
    +  reweight.max.iter = 10,
    +  trace_parms = FALSE,
    +  test_residuals = FALSE,
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    mkinmod
    +

    A list of class mkinmod, containing the kinetic +model to be fitted to the data, or one of the shorthand names ("SFO", +"FOMC", "DFOP", "HS", "SFORB", "IORE"). If a shorthand name is given, a +parent only degradation model is generated for the variable with the +highest value in observed.

    + + +
    observed
    +

    A dataframe or an object coercible to a dataframe +(e.g. a tibble) with the observed data. The first column called +"name" must contain the name of the observed variable for each data point. +The second column must contain the times of observation, named "time". +The third column must be named "value" and contain the observed values. +Zero values in the "value" column will be removed, with a warning, in +order to avoid problems with fitting the two-component error model. This +is not expected to be a problem, because in general, values of zero are +not observed in degradation data, because there is a lower limit of +detection.

    + + +
    parms.ini
    +

    A named vector of initial values for the parameters, +including parameters to be optimised and potentially also fixed parameters +as indicated by fixed_parms. If set to "auto", initial values for +rate constants are set to default values. Using parameter names that are +not in the model gives an error.

    +

    It is possible to only specify a subset of the parameters that the model +needs. You can use the parameter lists "bparms.ode" from a previously +fitted model, which contains the differential equation parameters from +this model. This works nicely if the models are nested. An example is +given below.

    + + +
    state.ini
    +

    A named vector of initial values for the state variables of +the model. In case the observed variables are represented by more than one +model variable, the names will differ from the names of the observed +variables (see map component of mkinmod). The default +is to set the initial value of the first model variable to the mean of the +time zero values for the variable with the maximum observed value, and all +others to 0. If this variable has no time zero observations, its initial +value is set to 100.

    + + +
    err.ini
    +

    A named vector of initial values for the error model +parameters to be optimised. If set to "auto", initial values are set to +default values. Otherwise, inital values for all error model parameters +must be given.

    + + +
    fixed_parms
    +

    The names of parameters that should not be optimised but +rather kept at the values specified in parms.ini. Alternatively, +a named numeric vector of parameters to be fixed, regardless of the values +in parms.ini.

    + + +
    fixed_initials
    +

    The names of model variables for which the initial +state at time 0 should be excluded from the optimisation. Defaults to all +state variables except for the first one.

    + + +
    from_max_mean
    +

    If this is set to TRUE, and the model has only one +observed variable, then data before the time of the maximum observed value +(after averaging for each sampling time) are discarded, and this time is +subtracted from all remaining time values, so the time of the maximum +observed mean value is the new time zero.

    + + +
    solution_type
    +

    If set to "eigen", the solution of the system of +differential equations is based on the spectral decomposition of the +coefficient matrix in cases that this is possible. If set to "deSolve", a +numerical ode solver from package deSolve is used. If +set to "analytical", an analytical solution of the model is used. This is +only implemented for relatively simple degradation models. The default is +"auto", which uses "analytical" if possible, otherwise "deSolve" if a +compiler is present, and "eigen" if no compiler is present and the model +can be expressed using eigenvalues and eigenvectors.

    + + +
    method.ode
    +

    The solution method passed via mkinpredict() +to deSolve::ode() in case the solution type is "deSolve". The default +"lsoda" is performant, but sometimes fails to converge.

    + + +
    use_compiled
    +

    If set to FALSE, no compiled version of the +mkinmod model is used in the calls to mkinpredict() even if a compiled +version is present.

    + + +
    control
    +

    A list of control arguments passed to stats::nlminb().

    + + +
    transform_rates
    +

    Boolean specifying if kinetic rate constants should +be transformed in the model specification used in the fitting for better +compliance with the assumption of normal distribution of the estimator. If +TRUE, also alpha and beta parameters of the FOMC model are +log-transformed, as well as k1 and k2 rate constants for the DFOP and HS +models and the break point tb of the HS model. If FALSE, zero is used as +a lower bound for the rates in the optimisation.

    + + +
    transform_fractions
    +

    Boolean specifying if formation fractions +should be transformed in the model specification used in the fitting for +better compliance with the assumption of normal distribution of the +estimator. The default (TRUE) is to do transformations. If TRUE, +the g parameter of the DFOP model is also transformed. Transformations +are described in transform_odeparms.

    + + +
    quiet
    +

    Suppress printing out the current value of the negative +log-likelihood after each improvement?

    + + +
    atol
    +

    Absolute error tolerance, passed to deSolve::ode(). Default +is 1e-8, which is lower than the default in the deSolve::lsoda() +function which is used per default.

    + + +
    rtol
    +

    Absolute error tolerance, passed to deSolve::ode(). Default +is 1e-10, much lower than in deSolve::lsoda().

    + + +
    error_model
    +

    If the error model is "const", a constant standard +deviation is assumed.

    +

    If the error model is "obs", each observed variable is assumed to have its +own variance.

    +

    If the error model is "tc" (two-component error model), a two component +error model similar to the one described by Rocke and Lorenzato (1995) is +used for setting up the likelihood function. Note that this model +deviates from the model by Rocke and Lorenzato, as their model implies +that the errors follow a lognormal distribution for large values, not a +normal distribution as assumed by this method.

    + + +
    error_model_algorithm
    +

    If "auto", the selected algorithm depends on +the error model. If the error model is "const", unweighted nonlinear +least squares fitting ("OLS") is selected. If the error model is "obs", or +"tc", the "d_3" algorithm is selected.

    +

    The algorithm "d_3" will directly minimize the negative log-likelihood +and independently also use the three step algorithm described below. +The fit with the higher likelihood is returned.

    +

    The algorithm "direct" will directly minimize the negative log-likelihood.

    +

    The algorithm "twostep" will minimize the negative log-likelihood after an +initial unweighted least squares optimisation step.

    +

    The algorithm "threestep" starts with unweighted least squares, then +optimizes only the error model using the degradation model parameters +found, and then minimizes the negative log-likelihood with free +degradation and error model parameters.

    +

    The algorithm "fourstep" starts with unweighted least squares, then +optimizes only the error model using the degradation model parameters +found, then optimizes the degradation model again with fixed error model +parameters, and finally minimizes the negative log-likelihood with free +degradation and error model parameters.

    +

    The algorithm "IRLS" (Iteratively Reweighted Least Squares) starts with +unweighted least squares, and then iterates optimization of the error +model parameters and subsequent optimization of the degradation model +using those error model parameters, until the error model parameters +converge.

    + + +
    reweight.tol
    +

    Tolerance for the convergence criterion calculated from +the error model parameters in IRLS fits.

    + + +
    reweight.max.iter
    +

    Maximum number of iterations in IRLS fits.

    + + +
    trace_parms
    +

    Should a trace of the parameter values be listed?

    + + +
    test_residuals
    +

    Should the residuals be tested for normal distribution?

    + + +
    ...
    +

    Further arguments that will be passed on to +deSolve::ode().

    + +
    +
    +

    Value

    +

    A list with "mkinfit" in the class attribute.

    +
    +
    +

    Details

    +

    Per default, parameters in the kinetic models are internally transformed in +order to better satisfy the assumption of a normal distribution of their +estimators.

    +
    +
    +

    Note

    +

    When using the "IORE" submodel for metabolites, fitting with +"transform_rates = TRUE" (the default) often leads to failures of the +numerical ODE solver. In this situation it may help to switch off the +internal rate transformation.

    +
    +
    +

    References

    +

    Rocke DM and Lorenzato S (1995) A two-component model +for measurement error in analytical chemistry. Technometrics 37(2), 176-184.

    +

    Ranke J and Meinecke S (2019) Error Models for the Kinetic Evaluation of Chemical +Degradation Data. Environments 6(12) 124 +doi:10.3390/environments6120124 +.

    +
    +
    +

    See also

    +

    summary.mkinfit, plot.mkinfit, parms and lrtest.

    +

    Comparisons of models fitted to the same data can be made using +AIC by virtue of the method logLik.mkinfit.

    +

    Fitting of several models to several datasets in a single call to +mmkin.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +# Use shorthand notation for parent only degradation
    +fit <- mkinfit("FOMC", FOCUS_2006_C, quiet = TRUE)
    +summary(fit)
    +#> mkin version used for fitting:    1.2.10 
    +#> R version used for fitting:       4.4.2 
    +#> Date of fit:     Fri Feb 14 07:30:02 2025 
    +#> Date of summary: Fri Feb 14 07:30:02 2025 
    +#> 
    +#> Equations:
    +#> d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent
    +#> 
    +#> Model predictions using solution type analytical 
    +#> 
    +#> Fitted using 222 model solutions performed in 0.014 s
    +#> 
    +#> Error model: Constant variance 
    +#> 
    +#> Error model algorithm: OLS 
    +#> 
    +#> Starting values for parameters to be optimised:
    +#>          value   type
    +#> parent_0  85.1  state
    +#> alpha      1.0 deparm
    +#> beta      10.0 deparm
    +#> 
    +#> Starting values for the transformed parameters actually optimised:
    +#>               value lower upper
    +#> parent_0  85.100000  -Inf   Inf
    +#> log_alpha  0.000000  -Inf   Inf
    +#> log_beta   2.302585  -Inf   Inf
    +#> 
    +#> Fixed parameter values:
    +#> None
    +#> 
    +#> Results:
    +#> 
    +#>        AIC      BIC    logLik
    +#>   44.68652 45.47542 -18.34326
    +#> 
    +#> Optimised, transformed parameters with symmetric confidence intervals:
    +#>           Estimate Std. Error    Lower   Upper
    +#> parent_0  85.87000     1.8070 81.23000 90.5200
    +#> log_alpha  0.05192     0.1353 -0.29580  0.3996
    +#> log_beta   0.65100     0.2287  0.06315  1.2390
    +#> sigma      1.85700     0.4378  0.73200  2.9830
    +#> 
    +#> Parameter correlation:
    +#>             parent_0  log_alpha   log_beta     sigma
    +#> parent_0   1.000e+00 -1.565e-01 -3.142e-01 4.681e-08
    +#> log_alpha -1.565e-01  1.000e+00  9.564e-01 1.013e-07
    +#> log_beta  -3.142e-01  9.564e-01  1.000e+00 8.637e-08
    +#> sigma      4.681e-08  1.013e-07  8.637e-08 1.000e+00
    +#> 
    +#> Backtransformed parameters:
    +#> Confidence intervals for internally transformed parameters are asymmetric.
    +#> t-test (unrealistically) based on the assumption of normal distribution
    +#> for estimators of untransformed parameters.
    +#>          Estimate t value    Pr(>t)   Lower  Upper
    +#> parent_0   85.870  47.530 3.893e-08 81.2300 90.520
    +#> alpha       1.053   7.393 3.562e-04  0.7439  1.491
    +#> beta        1.917   4.373 3.601e-03  1.0650  3.451
    +#> sigma       1.857   4.243 4.074e-03  0.7320  2.983
    +#> 
    +#> FOCUS Chi2 error levels in percent:
    +#>          err.min n.optim df
    +#> All data   6.657       3  6
    +#> parent     6.657       3  6
    +#> 
    +#> Estimated disappearance times:
    +#>         DT50  DT90 DT50back
    +#> parent 1.785 15.15     4.56
    +#> 
    +#> Data:
    +#>  time variable observed predicted residual
    +#>     0   parent     85.1    85.875  -0.7749
    +#>     1   parent     57.9    55.191   2.7091
    +#>     3   parent     29.9    31.845  -1.9452
    +#>     7   parent     14.6    17.012  -2.4124
    +#>    14   parent      9.7     9.241   0.4590
    +#>    28   parent      6.6     4.754   1.8460
    +#>    63   parent      4.0     2.102   1.8977
    +#>    91   parent      3.9     1.441   2.4590
    +#>   119   parent      0.6     1.092  -0.4919
    +
    +# One parent compound, one metabolite, both single first order.
    +# We remove zero values from FOCUS dataset D in order to avoid warnings
    +FOCUS_D <- subset(FOCUS_2006_D, value != 0)
    +# Use mkinsub for convenience in model formulation. Pathway to sink included per default.
    +SFO_SFO <- mkinmod(
    +  parent = mkinsub("SFO", "m1"),
    +  m1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +
    +# Fit the model quietly to the FOCUS example dataset D using defaults
    +fit <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE)
    +plot_sep(fit)
    +
    +# As lower parent values appear to have lower variance, we try an alternative error model
    +fit.tc <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "tc")
    +# This avoids the warning, and the likelihood ratio test confirms it is preferable
    +lrtest(fit.tc, fit)
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: SFO_SFO with error model tc and fixed parameter(s) m1_0
    +#> Model 2: SFO_SFO with error model const and fixed parameter(s) m1_0
    +#>   #Df  LogLik Df  Chisq Pr(>Chisq)    
    +#> 1   6 -64.983                         
    +#> 2   5 -97.224 -1 64.483  9.737e-16 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +# We can also allow for different variances of parent and metabolite as error model
    +fit.obs <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "obs")
    +# The two-component error model has significantly higher likelihood
    +lrtest(fit.obs, fit.tc)
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: SFO_SFO with error model tc and fixed parameter(s) m1_0
    +#> Model 2: SFO_SFO with error model obs and fixed parameter(s) m1_0
    +#>   #Df  LogLik Df  Chisq Pr(>Chisq)    
    +#> 1   6 -64.983                         
    +#> 2   6 -96.936  0 63.907  < 2.2e-16 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +parms(fit.tc)
    +#>       parent_0       k_parent           k_m1 f_parent_to_m1      sigma_low 
    +#>   1.007343e+02   1.005562e-01   5.166712e-03   5.083933e-01   3.049883e-03 
    +#>       rsd_high 
    +#>   7.928118e-02 
    +endpoints(fit.tc)
    +#> $ff
    +#>   parent_m1 parent_sink 
    +#>   0.5083933   0.4916067 
    +#> 
    +#> $distimes
    +#>             DT50      DT90
    +#> parent   6.89313  22.89848
    +#> m1     134.15634 445.65771
    +#> 
    +
    +# We can show a quick (only one replication) benchmark for this case, as we
    +# have several alternative solution methods for the model. We skip
    +# uncompiled deSolve, as it is so slow. More benchmarks are found in the
    +# benchmark vignette
    +# \dontrun{
    +if(require(rbenchmark)) {
    +  benchmark(replications = 1, order = "relative", columns = c("test", "relative", "elapsed"),
    +    deSolve_compiled = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "tc",
    +      solution_type = "deSolve", use_compiled = TRUE),
    +    eigen = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "tc",
    +      solution_type = "eigen"),
    +    analytical = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = "tc",
    +      solution_type = "analytical"))
    +}
    +#>               test relative elapsed
    +#> 3       analytical    1.000   0.242
    +#> 2            eigen    1.913   0.463
    +#> 1 deSolve_compiled    1.917   0.464
    +# }
    +
    +# Use stepwise fitting, using optimised parameters from parent only fit, FOMC-SFO
    +# \dontrun{
    +FOMC_SFO <- mkinmod(
    +  parent = mkinsub("FOMC", "m1"),
    +  m1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +fit.FOMC_SFO <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE)
    +# Again, we get a warning and try a more sophisticated error model
    +fit.FOMC_SFO.tc <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE, error_model = "tc")
    +# This model has a higher likelihood, but not significantly so
    +lrtest(fit.tc, fit.FOMC_SFO.tc)
    +#> Likelihood ratio test
    +#> 
    +#> Model 1: FOMC_SFO with error model tc and fixed parameter(s) m1_0
    +#> Model 2: SFO_SFO with error model tc and fixed parameter(s) m1_0
    +#>   #Df  LogLik Df  Chisq Pr(>Chisq)
    +#> 1   7 -64.829                     
    +#> 2   6 -64.983 -1 0.3075     0.5792
    +# Also, the missing standard error for log_beta and the t-tests for alpha
    +# and beta indicate overparameterisation
    +summary(fit.FOMC_SFO.tc, data = FALSE)
    +#> Warning: NaNs produced
    +#> Warning: diag(V) had non-positive or NA entries; the non-finite result may be dubious
    +#> mkin version used for fitting:    1.2.10 
    +#> R version used for fitting:       4.4.2 
    +#> Date of fit:     Fri Feb 14 07:30:07 2025 
    +#> Date of summary: Fri Feb 14 07:30:07 2025 
    +#> 
    +#> Equations:
    +#> d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent
    +#> d_m1/dt = + f_parent_to_m1 * (alpha/beta) * 1/((time/beta) + 1) *
    +#>            parent - k_m1 * m1
    +#> 
    +#> Model predictions using solution type deSolve 
    +#> 
    +#> Fitted using 4062 model solutions performed in 0.77 s
    +#> 
    +#> Error model: Two-component variance function 
    +#> 
    +#> Error model algorithm: d_3 
    +#> Direct fitting and three-step fitting yield approximately the same likelihood 
    +#> 
    +#> Starting values for parameters to be optimised:
    +#>                 value   type
    +#> parent_0       100.75  state
    +#> alpha            1.00 deparm
    +#> beta            10.00 deparm
    +#> k_m1             0.10 deparm
    +#> f_parent_to_m1   0.50 deparm
    +#> sigma_low        0.10  error
    +#> rsd_high         0.10  error
    +#> 
    +#> Starting values for the transformed parameters actually optimised:
    +#>                      value lower upper
    +#> parent_0        100.750000  -Inf   Inf
    +#> log_k_m1         -2.302585  -Inf   Inf
    +#> f_parent_qlogis   0.000000  -Inf   Inf
    +#> log_alpha         0.000000  -Inf   Inf
    +#> log_beta          2.302585  -Inf   Inf
    +#> sigma_low         0.100000     0   Inf
    +#> rsd_high          0.100000     0   Inf
    +#> 
    +#> Fixed parameter values:
    +#>      value  type
    +#> m1_0     0 state
    +#> 
    +#> Results:
    +#> 
    +#>       AIC      BIC    logLik
    +#>   143.658 155.1211 -64.82902
    +#> 
    +#> Optimised, transformed parameters with symmetric confidence intervals:
    +#>                   Estimate Std. Error     Lower      Upper
    +#> parent_0        101.600000  2.6400000 96.240000 107.000000
    +#> log_k_m1         -5.284000  0.0929100 -5.474000  -5.095000
    +#> f_parent_qlogis   0.001426  0.0766900 -0.155000   0.157800
    +#> log_alpha         5.522000  0.0077320  5.506000   5.538000
    +#> log_beta          7.806000        NaN       NaN        NaN
    +#> sigma_low         0.002488  0.0002431  0.001992   0.002984
    +#> rsd_high          0.079210  0.0093280  0.060180   0.098230
    +#> 
    +#> Parameter correlation:
    +#>                  parent_0  log_k_m1 f_parent_qlogis log_alpha log_beta
    +#> parent_0         1.000000 -0.095161        -0.76675   0.70542      NaN
    +#> log_k_m1        -0.095161  1.000000         0.51429  -0.14382      NaN
    +#> f_parent_qlogis -0.766750  0.514286         1.00000  -0.61393      NaN
    +#> log_alpha        0.705417 -0.143821        -0.61393   1.00000      NaN
    +#> log_beta              NaN       NaN             NaN       NaN        1
    +#> sigma_low        0.016086  0.001583         0.01547   5.87036      NaN
    +#> rsd_high         0.006618 -0.011695        -0.05356   0.04848      NaN
    +#>                 sigma_low  rsd_high
    +#> parent_0         0.016086  0.006618
    +#> log_k_m1         0.001583 -0.011695
    +#> f_parent_qlogis  0.015466 -0.053560
    +#> log_alpha        5.870361  0.048483
    +#> log_beta              NaN       NaN
    +#> sigma_low        1.000000 -0.652545
    +#> rsd_high        -0.652545  1.000000
    +#> 
    +#> Backtransformed parameters:
    +#> Confidence intervals for internally transformed parameters are asymmetric.
    +#> t-test (unrealistically) based on the assumption of normal distribution
    +#> for estimators of untransformed parameters.
    +#>                 Estimate t value    Pr(>t)     Lower     Upper
    +#> parent_0       1.016e+02 32.7800 6.310e-26 9.624e+01 1.070e+02
    +#> k_m1           5.072e-03 10.1200 1.216e-11 4.196e-03 6.130e-03
    +#> f_parent_to_m1 5.004e-01 20.8300 4.316e-20 4.613e-01 5.394e-01
    +#> alpha          2.502e+02  0.5624 2.889e-01 2.463e+02 2.542e+02
    +#> beta           2.455e+03  0.5549 2.915e-01        NA        NA
    +#> sigma_low      2.488e-03  0.4843 3.158e-01 1.992e-03 2.984e-03
    +#> rsd_high       7.921e-02  8.4300 8.001e-10 6.018e-02 9.823e-02
    +#> 
    +#> FOCUS Chi2 error levels in percent:
    +#>          err.min n.optim df
    +#> All data   6.781       5 14
    +#> parent     7.141       3  6
    +#> m1         4.640       2  8
    +#> 
    +#> Resulting formation fractions:
    +#>                 ff
    +#> parent_m1   0.5004
    +#> parent_sink 0.4996
    +#> 
    +#> Estimated disappearance times:
    +#>           DT50  DT90 DT50back
    +#> parent   6.812  22.7    6.834
    +#> m1     136.661 454.0       NA
    +
    +# We can easily use starting parameters from the parent only fit (only for illustration)
    +fit.FOMC = mkinfit("FOMC", FOCUS_2006_D, quiet = TRUE, error_model = "tc")
    +fit.FOMC_SFO <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE,
    +  parms.ini = fit.FOMC$bparms.ode, error_model = "tc")
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinmod.html b/docs/dev/reference/mkinmod.html new file mode 100644 index 00000000..d26086eb --- /dev/null +++ b/docs/dev/reference/mkinmod.html @@ -0,0 +1,382 @@ + +Function to set up a kinetic model with one or more state variables — mkinmod • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function is usually called using a call to mkinsub() for each observed +variable, specifying the corresponding submodel as well as outgoing pathways +(see examples).

    +

    Print mkinmod objects in a way that the user finds his way to get to its +components.

    +
    + +
    +

    Usage

    +
    mkinmod(
    +  ...,
    +  use_of_ff = "max",
    +  name = NULL,
    +  speclist = NULL,
    +  quiet = FALSE,
    +  verbose = FALSE,
    +  dll_dir = NULL,
    +  unload = FALSE,
    +  overwrite = FALSE
    +)
    +
    +# S3 method for class 'mkinmod'
    +print(x, ...)
    +
    +mkinsub(submodel, to = NULL, sink = TRUE, full_name = NA)
    +
    + +
    +

    Arguments

    + + +
    ...
    +

    For each observed variable, a list as obtained by mkinsub() +has to be specified as an argument (see examples). Currently, single +first order kinetics "SFO", indeterminate order rate equation kinetics +"IORE", or single first order with reversible binding "SFORB" are +implemented for all variables, while "FOMC", "DFOP", "HS" and "logistic" +can additionally be chosen for the first variable which is assumed to be +the source compartment. +Additionally, mkinsub() has an argument to, specifying names of +variables to which a transfer is to be assumed in the model. +If the argument use_of_ff is set to "min" +and the model for the compartment is "SFO" or "SFORB", an +additional mkinsub() argument can be sink = FALSE, effectively +fixing the flux to sink to zero. +In print.mkinmod, this argument is currently not used.

    + + +
    use_of_ff
    +

    Specification of the use of formation fractions in the +model equations and, if applicable, the coefficient matrix. If "max", +formation fractions are always used (default). If "min", a minimum use of +formation fractions is made, i.e. each first-order pathway to a metabolite +has its own rate constant.

    + + +
    name
    +

    A name for the model. Should be a valid R object name.

    + + +
    speclist
    +

    The specification of the observed variables and their +submodel types and pathways can be given as a single list using this +argument. Default is NULL.

    + + +
    quiet
    +

    Should messages be suppressed?

    + + +
    verbose
    +

    If TRUE, passed to inline::cfunction() if +applicable to give detailed information about the C function being built.

    + + +
    dll_dir
    +

    Directory where an DLL object, if generated internally by +inline::cfunction(), should be saved. The DLL will only be stored in a +permanent location for use in future sessions, if 'dll_dir' and 'name' +are specified. This is helpful if fit objects are cached e.g. by knitr, +as the cache remains functional across sessions if the DLL is stored in +a user defined location.

    + + +
    unload
    +

    If a DLL from the target location in 'dll_dir' is already +loaded, should that be unloaded first?

    + + +
    overwrite
    +

    If a file exists at the target DLL location in 'dll_dir', +should this be overwritten?

    + + +
    x
    +

    An mkinmod object.

    + + +
    submodel
    +

    Character vector of length one to specify the submodel type. +See mkinmod for the list of allowed submodel names.

    + + +
    to
    +

    Vector of the names of the state variable to which a +transformation shall be included in the model.

    + + +
    sink
    +

    Should a pathway to sink be included in the model in addition to +the pathways to other state variables?

    + + +
    full_name
    +

    An optional name to be used e.g. for plotting fits +performed with the model. You can use non-ASCII characters here, but then +your R code will not be portable, i.e. may produce unintended plot +results on other operating systems or system configurations.

    + +
    +
    +

    Value

    +

    A list of class mkinmod for use with mkinfit(), +containing, among others,

    +
    diffs
    +

    A vector of string representations of differential equations, one for +each modelling variable.

    + +
    map
    +

    A list containing named character vectors for each observed variable, +specifying the modelling variables by which it is represented.

    + +
    use_of_ff
    +

    The content of use_of_ff is passed on in this list component.

    + +
    deg_func
    +

    If generated, a function containing the solution of the degradation +model.

    + +
    coefmat
    +

    The coefficient matrix, if the system of differential equations can be +represented by one.

    + +
    cf
    +

    If generated, a compiled function calculating the derivatives as +returned by cfunction.

    + + +

    A list for use with mkinmod.

    +
    +
    +

    Details

    +

    For the definition of model types and their parameters, the equations given +in the FOCUS and NAFTA guidance documents are used.

    +

    For kinetic models with more than one observed variable, a symbolic solution +of the system of differential equations is included in the resulting +mkinmod object in some cases, speeding up the solution.

    +

    If a C compiler is found by pkgbuild::has_compiler() and there +is more than one observed variable in the specification, C code is generated +for evaluating the differential equations, compiled using +inline::cfunction() and added to the resulting mkinmod object.

    +
    +
    +

    Note

    +

    The IORE submodel is not well tested for metabolites. When using this +model for metabolites, you may want to read the note in the help +page to mkinfit.

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +

    NAFTA Technical Working Group on Pesticides (not dated) Guidance for +Evaluating and Calculating Degradation Kinetics in Environmental Media

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +# Specify the SFO model (this is not needed any more, as we can now mkinfit("SFO", ...)
    +SFO <- mkinmod(parent = mkinsub("SFO"))
    +
    +# One parent compound, one metabolite, both single first order
    +SFO_SFO <- mkinmod(
    +  parent = mkinsub("SFO", "m1"),
    +  m1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +print(SFO_SFO)
    +#> <mkinmod> model generated with
    +#> Use of formation fractions $use_of_ff: max 
    +#> Specification $spec:
    +#> $parent
    +#> $type: SFO; $to: m1; $sink: TRUE
    +#> $m1
    +#> $type: SFO; $sink: TRUE
    +#> Coefficient matrix $coefmat available
    +#> Compiled model $cf available
    +#> Differential equations:
    +#> d_parent/dt = - k_parent * parent
    +#> d_m1/dt = + f_parent_to_m1 * k_parent * parent - k_m1 * m1
    +
    +# \dontrun{
    + fit_sfo_sfo <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE, solution_type = "deSolve")
    +#> Warning: Observations with value of zero were removed from the data
    +
    + # Now supplying compound names used for plotting, and write to user defined location
    + # We need to choose a path outside the session tempdir because this gets removed
    + DLL_dir <- "~/.local/share/mkin"
    + if (!dir.exists(DLL_dir)) dir.create(DLL_dir)
    + SFO_SFO.2 <- mkinmod(
    +   parent = mkinsub("SFO", "m1", full_name = "Test compound"),
    +   m1 = mkinsub("SFO", full_name = "Metabolite M1"),
    +   name = "SFO_SFO", dll_dir = DLL_dir, unload = TRUE, overwrite = TRUE)
    +#> Temporary DLL for differentials generated and loaded
    +#> Copied DLL from /tmp/RtmpSeNGYy/file226312370605e2.so to /home/jranke/.local/share/mkin/SFO_SFO.so
    +# Now we can save the model and restore it in a new session
    +saveRDS(SFO_SFO.2, file = "~/SFO_SFO.rds")
    +# Terminate the R session here if you would like to check, and then do
    +library(mkin)
    +SFO_SFO.3 <- readRDS("~/SFO_SFO.rds")
    +fit_sfo_sfo <- mkinfit(SFO_SFO.3, FOCUS_2006_D, quiet = TRUE, solution_type = "deSolve")
    +#> Warning: Observations with value of zero were removed from the data
    +
    +# Show details of creating the C function
    +SFO_SFO <- mkinmod(
    +  parent = mkinsub("SFO", "m1"),
    +  m1 = mkinsub("SFO"), verbose = TRUE)
    +#> Program source:
    +#>   1: #include <R.h>
    +#>   2: 
    +#>   3: 
    +#>   4: static double parms [3];
    +#>   5: #define k_parent parms[0]
    +#>   6: #define f_parent_to_m1 parms[1]
    +#>   7: #define k_m1 parms[2]
    +#>   8: 
    +#>   9: void initpar(void (* odeparms)(int *, double *)) {
    +#>  10:     int N = 3;
    +#>  11:     odeparms(&N, parms);
    +#>  12: }
    +#>  13: 
    +#>  14: 
    +#>  15: void diffs ( int * n, double * t, double * y, double * f, double * rpar, int * ipar ) {
    +#>  16: 
    +#>  17: f[0] = - k_parent * y[0];
    +#>  18: f[1] = + f_parent_to_m1 * k_parent * y[0] - k_m1 * y[1];
    +#>  19: }
    +#> Temporary DLL for differentials generated and loaded
    +
    +# The symbolic solution which is available in this case is not
    +# made for human reading but for speed of computation
    +SFO_SFO$deg_func
    +#> function (observed, odeini, odeparms) 
    +#> {
    +#>     predicted <- numeric(0)
    +#>     with(as.list(odeparms), {
    +#>         t <- observed[observed$name == "parent", "time"]
    +#>         predicted <<- c(predicted, SFO.solution(t, odeini["parent"], 
    +#>             k_parent))
    +#>         t <- observed[observed$name == "m1", "time"]
    +#>         predicted <<- c(predicted, (((k_m1 - k_parent) * odeini["m1"] - 
    +#>             f_parent_to_m1 * k_parent * odeini["parent"]) * exp(-k_m1 * 
    +#>             t) + f_parent_to_m1 * k_parent * odeini["parent"] * 
    +#>             exp(-k_parent * t))/(k_m1 - k_parent))
    +#>     })
    +#>     return(predicted)
    +#> }
    +#> <environment: 0x5555577ec6d0>
    +
    +# If we have several parallel metabolites
    +# (compare tests/testthat/test_synthetic_data_for_UBA_2014.R)
    +m_synth_DFOP_par <- mkinmod(
    + parent = mkinsub("DFOP", c("M1", "M2")),
    + M1 = mkinsub("SFO"),
    + M2 = mkinsub("SFO"),
    + quiet = TRUE)
    +
    +fit_DFOP_par_c <- mkinfit(m_synth_DFOP_par,
    +  synthetic_data_for_UBA_2014[[12]]$data,
    +  quiet = TRUE)
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinparplot-1.png b/docs/dev/reference/mkinparplot-1.png new file mode 100644 index 00000000..8d34b451 Binary files /dev/null and b/docs/dev/reference/mkinparplot-1.png differ diff --git a/docs/dev/reference/mkinparplot.html b/docs/dev/reference/mkinparplot.html new file mode 100644 index 00000000..e3f85961 --- /dev/null +++ b/docs/dev/reference/mkinparplot.html @@ -0,0 +1,128 @@ + +Function to plot the confidence intervals obtained using mkinfit — mkinparplot • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function plots the confidence intervals for the parameters fitted using +mkinfit.

    +
    + +
    +

    Usage

    +
    mkinparplot(object)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    A fit represented in an mkinfit object.

    + +
    +
    +

    Value

    +

    Nothing is returned by this function, as it is called for its side +effect, namely to produce a plot.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +# \dontrun{
    +model <- mkinmod(
    +  T245 = mkinsub("SFO", to = c("phenol"), sink = FALSE),
    +  phenol = mkinsub("SFO", to = c("anisole")),
    +  anisole = mkinsub("SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +fit <- mkinfit(model, subset(mccall81_245T, soil == "Commerce"), quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +mkinparplot(fit)
    +
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinplot.html b/docs/dev/reference/mkinplot.html new file mode 100644 index 00000000..2505b060 --- /dev/null +++ b/docs/dev/reference/mkinplot.html @@ -0,0 +1,115 @@ + +Plot the observed data and the fitted model of an mkinfit object — mkinplot • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Deprecated function. It now only calls the plot method +plot.mkinfit.

    +
    + +
    +

    Usage

    +
    mkinplot(fit, ...)
    +
    + +
    +

    Arguments

    + + +
    fit
    +

    an object of class mkinfit.

    + + +
    ...
    +

    further arguments passed to plot.mkinfit.

    + +
    +
    +

    Value

    +

    The function is called for its side effect.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinpredict.html b/docs/dev/reference/mkinpredict.html new file mode 100644 index 00000000..e11dacdf --- /dev/null +++ b/docs/dev/reference/mkinpredict.html @@ -0,0 +1,390 @@ + +Produce predictions from a kinetic model using specific parameters — mkinpredict • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function produces a time series for all the observed variables in a +kinetic model as specified by mkinmod, using a specific set of +kinetic parameters and initial values for the state variables.

    +
    + +
    +

    Usage

    +
    mkinpredict(x, odeparms, odeini, outtimes, ...)
    +
    +# S3 method for class 'mkinmod'
    +mkinpredict(
    +  x,
    +  odeparms = c(k_parent_sink = 0.1),
    +  odeini = c(parent = 100),
    +  outtimes = seq(0, 120, by = 0.1),
    +  solution_type = "deSolve",
    +  use_compiled = "auto",
    +  use_symbols = FALSE,
    +  method.ode = "lsoda",
    +  atol = 1e-08,
    +  rtol = 1e-10,
    +  maxsteps = 20000L,
    +  map_output = TRUE,
    +  na_stop = TRUE,
    +  ...
    +)
    +
    +# S3 method for class 'mkinfit'
    +mkinpredict(
    +  x,
    +  odeparms = x$bparms.ode,
    +  odeini = x$bparms.state,
    +  outtimes = seq(0, 120, by = 0.1),
    +  solution_type = "deSolve",
    +  use_compiled = "auto",
    +  method.ode = "lsoda",
    +  atol = 1e-08,
    +  rtol = 1e-10,
    +  map_output = TRUE,
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    A kinetic model as produced by mkinmod, or a kinetic fit as +fitted by mkinfit. In the latter case, the fitted parameters are used for +the prediction.

    + + +
    odeparms
    +

    A numeric vector specifying the parameters used in the +kinetic model, which is generally defined as a set of ordinary differential +equations.

    + + +
    odeini
    +

    A numeric vector containing the initial values of the state +variables of the model. Note that the state variables can differ from the +observed variables, for example in the case of the SFORB model.

    + + +
    outtimes
    +

    A numeric vector specifying the time points for which model +predictions should be generated.

    + + +
    ...
    +

    Further arguments passed to the ode solver in case such a +solver is used.

    + + +
    solution_type
    +

    The method that should be used for producing the +predictions. This should generally be "analytical" if there is only one +observed variable, and usually "deSolve" in the case of several observed +variables. The third possibility "eigen" is fast in comparison to uncompiled +ODE models, but not applicable to some models, e.g. using FOMC for the +parent compound.

    + + +
    use_compiled
    +

    If set to FALSE, no compiled version of the +mkinmod model is used, even if is present.

    + + +
    use_symbols
    +

    If set to TRUE (default), symbol info present in +the mkinmod object is used if available for accessing compiled code

    + + +
    method.ode
    +

    The solution method passed via mkinpredict to deSolve::ode() in +case the solution type is "deSolve" and we are not using compiled code. +When using compiled code, only lsoda is supported.

    + + +
    atol
    +

    Absolute error tolerance, passed to the ode solver.

    + + +
    rtol
    +

    Absolute error tolerance, passed to the ode solver.

    + + +
    maxsteps
    +

    Maximum number of steps, passed to the ode solver.

    + + +
    map_output
    +

    Boolean to specify if the output should list values for +the observed variables (default) or for all state variables (if set to +FALSE). Setting this to FALSE has no effect for analytical solutions, +as these always return mapped output.

    + + +
    na_stop
    +

    Should it be an error if deSolve::ode() returns NaN values

    + +
    +
    +

    Value

    +

    A matrix with the numeric solution in wide format

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +SFO <- mkinmod(degradinol = mkinsub("SFO"))
    +# Compare solution types
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,
    +      solution_type = "analytical")
    +#>    time  degradinol
    +#> 0     0 100.0000000
    +#> 1     1  74.0818221
    +#> 2     2  54.8811636
    +#> 3     3  40.6569660
    +#> 4     4  30.1194212
    +#> 5     5  22.3130160
    +#> 6     6  16.5298888
    +#> 7     7  12.2456428
    +#> 8     8   9.0717953
    +#> 9     9   6.7205513
    +#> 10   10   4.9787068
    +#> 11   11   3.6883167
    +#> 12   12   2.7323722
    +#> 13   13   2.0241911
    +#> 14   14   1.4995577
    +#> 15   15   1.1108997
    +#> 16   16   0.8229747
    +#> 17   17   0.6096747
    +#> 18   18   0.4516581
    +#> 19   19   0.3345965
    +#> 20   20   0.2478752
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,
    +      solution_type = "deSolve")
    +#>    time  degradinol
    +#> 0     0 100.0000000
    +#> 1     1  74.0818221
    +#> 2     2  54.8811636
    +#> 3     3  40.6569660
    +#> 4     4  30.1194212
    +#> 5     5  22.3130160
    +#> 6     6  16.5298888
    +#> 7     7  12.2456428
    +#> 8     8   9.0717953
    +#> 9     9   6.7205513
    +#> 10   10   4.9787068
    +#> 11   11   3.6883167
    +#> 12   12   2.7323722
    +#> 13   13   2.0241911
    +#> 14   14   1.4995577
    +#> 15   15   1.1108996
    +#> 16   16   0.8229747
    +#> 17   17   0.6096747
    +#> 18   18   0.4516581
    +#> 19   19   0.3345965
    +#> 20   20   0.2478752
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,
    +      solution_type = "deSolve", use_compiled = FALSE)
    +#>    time  degradinol
    +#> 0     0 100.0000000
    +#> 1     1  74.0818221
    +#> 2     2  54.8811636
    +#> 3     3  40.6569660
    +#> 4     4  30.1194212
    +#> 5     5  22.3130160
    +#> 6     6  16.5298888
    +#> 7     7  12.2456428
    +#> 8     8   9.0717953
    +#> 9     9   6.7205513
    +#> 10   10   4.9787068
    +#> 11   11   3.6883167
    +#> 12   12   2.7323722
    +#> 13   13   2.0241911
    +#> 14   14   1.4995577
    +#> 15   15   1.1108996
    +#> 16   16   0.8229747
    +#> 17   17   0.6096747
    +#> 18   18   0.4516581
    +#> 19   19   0.3345965
    +#> 20   20   0.2478752
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,
    +      solution_type = "eigen")
    +#>    time  degradinol
    +#> 0     0 100.0000000
    +#> 1     1  74.0818221
    +#> 2     2  54.8811636
    +#> 3     3  40.6569660
    +#> 4     4  30.1194212
    +#> 5     5  22.3130160
    +#> 6     6  16.5298888
    +#> 7     7  12.2456428
    +#> 8     8   9.0717953
    +#> 9     9   6.7205513
    +#> 10   10   4.9787068
    +#> 11   11   3.6883167
    +#> 12   12   2.7323722
    +#> 13   13   2.0241911
    +#> 14   14   1.4995577
    +#> 15   15   1.1108997
    +#> 16   16   0.8229747
    +#> 17   17   0.6096747
    +#> 18   18   0.4516581
    +#> 19   19   0.3345965
    +#> 20   20   0.2478752
    +
    +# Compare integration methods to analytical solution
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,
    +      solution_type = "analytical")[21,]
    +#>       time degradinol 
    +#> 20.0000000  0.2478752 
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,
    +      method = "lsoda", use_compiled = FALSE)[21,]
    +#>       time degradinol 
    +#> 20.0000000  0.2478752 
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,
    +      method = "ode45", use_compiled = FALSE)[21,]
    +#>       time degradinol 
    +#> 20.0000000  0.2478752 
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20,
    +      method = "rk4", use_compiled = FALSE)[21,]
    +#>       time degradinol 
    +#> 20.0000000  0.2480043 
    +# rk4 is not as precise here
    +
    +# The number of output times used to make a lot of difference until the
    +# default for atol was adjusted
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100),
    +      seq(0, 20, by = 0.1))[201,]
    +#>       time degradinol 
    +#> 20.0000000  0.2478752 
    +mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100),
    +      seq(0, 20, by = 0.01))[2001,]
    +#>       time degradinol 
    +#> 20.0000000  0.2478752 
    +
    +# Comparison of the performance of solution types
    +SFO_SFO = mkinmod(parent = list(type = "SFO", to = "m1"),
    +                  m1 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +if(require(rbenchmark)) {
    +  benchmark(replications = 10, order = "relative", columns = c("test", "relative", "elapsed"),
    +    eigen = mkinpredict(SFO_SFO,
    +      c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01),
    +      c(parent = 100, m1 = 0), seq(0, 20, by = 0.1),
    +      solution_type = "eigen")[201,],
    +    deSolve_compiled = mkinpredict(SFO_SFO,
    +      c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01),
    +      c(parent = 100, m1 = 0), seq(0, 20, by = 0.1),
    +      solution_type = "deSolve")[201,],
    +    deSolve = mkinpredict(SFO_SFO,
    +      c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01),
    +      c(parent = 100, m1 = 0), seq(0, 20, by = 0.1),
    +      solution_type = "deSolve", use_compiled = FALSE)[201,],
    +    analytical = mkinpredict(SFO_SFO,
    +      c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01),
    +      c(parent = 100, m1 = 0), seq(0, 20, by = 0.1),
    +      solution_type = "analytical", use_compiled = FALSE)[201,])
    +}
    +#>               test relative elapsed
    +#> 2 deSolve_compiled      1.0   0.002
    +#> 4       analytical      1.0   0.002
    +#> 1            eigen      4.0   0.008
    +#> 3          deSolve     30.5   0.061
    +
    +# \dontrun{
    +  # Predict from a fitted model
    +  f <- mkinfit(SFO_SFO, FOCUS_2006_C, quiet = TRUE)
    +  f <- mkinfit(SFO_SFO, FOCUS_2006_C, quiet = TRUE, solution_type = "deSolve")
    +  head(mkinpredict(f))
    +#> Error in !is.null(x$symbols) & use_symbols: operations are possible only for numeric, logical or complex types
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinpredict.mkinfit.html b/docs/dev/reference/mkinpredict.mkinfit.html new file mode 100644 index 00000000..5f03c04c --- /dev/null +++ b/docs/dev/reference/mkinpredict.mkinfit.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/mkinpredict.mkinmod.html b/docs/dev/reference/mkinpredict.mkinmod.html new file mode 100644 index 00000000..5f03c04c --- /dev/null +++ b/docs/dev/reference/mkinpredict.mkinmod.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/mkinresplot-1.png b/docs/dev/reference/mkinresplot-1.png new file mode 100644 index 00000000..29da1fda Binary files /dev/null and b/docs/dev/reference/mkinresplot-1.png differ diff --git a/docs/dev/reference/mkinresplot.html b/docs/dev/reference/mkinresplot.html new file mode 100644 index 00000000..b9de393d --- /dev/null +++ b/docs/dev/reference/mkinresplot.html @@ -0,0 +1,203 @@ + +Function to plot residuals stored in an mkin object — mkinresplot • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function plots the residuals for the specified subset of the observed +variables from an mkinfit object. A combined plot of the fitted model and +the residuals can be obtained using plot.mkinfit using the +argument show_residuals = TRUE.

    +
    + +
    +

    Usage

    +
    mkinresplot(
    +  object,
    +  obs_vars = names(object$mkinmod$map),
    +  xlim = c(0, 1.1 * max(object$data$time)),
    +  standardized = FALSE,
    +  xlab = "Time",
    +  ylab = ifelse(standardized, "Standardized residual", "Residual"),
    +  maxabs = "auto",
    +  legend = TRUE,
    +  lpos = "topright",
    +  col_obs = "auto",
    +  pch_obs = "auto",
    +  frame = TRUE,
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    A fit represented in an mkinfit object.

    + + +
    obs_vars
    +

    A character vector of names of the observed variables for +which residuals should be plotted. Defaults to all observed variables in +the model

    + + +
    xlim
    +

    plot range in x direction.

    + + +
    standardized
    +

    Should the residuals be standardized by dividing by the +standard deviation given by the error model of the fit?

    + + +
    xlab
    +

    Label for the x axis.

    + + +
    ylab
    +

    Label for the y axis.

    + + +
    maxabs
    +

    Maximum absolute value of the residuals. This is used for the +scaling of the y axis and defaults to "auto".

    + + +
    legend
    +

    Should a legend be plotted?

    + + +
    lpos
    +

    Where should the legend be placed? Default is "topright". Will +be passed on to legend.

    + + +
    col_obs
    +

    Colors for the observed variables.

    + + +
    pch_obs
    +

    Symbols to be used for the observed variables.

    + + +
    frame
    +

    Should a frame be drawn around the plots?

    + + +
    ...
    +

    further arguments passed to plot.

    + +
    +
    +

    Value

    +

    Nothing is returned by this function, as it is called for its side +effect, namely to produce a plot.

    +
    +
    +

    See also

    +

    mkinplot, for a way to plot the data and the fitted +lines of the mkinfit object, and plot_res for a function +combining the plot of the fit and the residual plot.

    +
    +
    +

    Author

    +

    Johannes Ranke and Katrin Lindenberger

    +
    + +
    +

    Examples

    +
    
    +model <- mkinmod(parent = mkinsub("SFO", "m1"), m1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +fit <- mkinfit(model, FOCUS_2006_D, quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +mkinresplot(fit, "m1")
    +
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/mkinsub.html b/docs/dev/reference/mkinsub.html new file mode 100644 index 00000000..0ffb4f23 --- /dev/null +++ b/docs/dev/reference/mkinsub.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/mmkin-1.png b/docs/dev/reference/mmkin-1.png new file mode 100644 index 00000000..060775ff Binary files /dev/null and b/docs/dev/reference/mmkin-1.png differ diff --git a/docs/dev/reference/mmkin-2.png b/docs/dev/reference/mmkin-2.png new file mode 100644 index 00000000..242a50fa Binary files /dev/null and b/docs/dev/reference/mmkin-2.png differ diff --git a/docs/dev/reference/mmkin-3.png b/docs/dev/reference/mmkin-3.png new file mode 100644 index 00000000..ef013dea Binary files /dev/null and b/docs/dev/reference/mmkin-3.png differ diff --git a/docs/dev/reference/mmkin-4.png b/docs/dev/reference/mmkin-4.png new file mode 100644 index 00000000..c08d231d Binary files /dev/null and b/docs/dev/reference/mmkin-4.png differ diff --git a/docs/dev/reference/mmkin-5.png b/docs/dev/reference/mmkin-5.png new file mode 100644 index 00000000..fe5797b4 Binary files /dev/null and b/docs/dev/reference/mmkin-5.png differ diff --git a/docs/dev/reference/mmkin.html b/docs/dev/reference/mmkin.html new file mode 100644 index 00000000..c2bbd3c4 --- /dev/null +++ b/docs/dev/reference/mmkin.html @@ -0,0 +1,239 @@ + +Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function calls mkinfit on all combinations of models and +datasets specified in its first two arguments.

    +
    + +
    +

    Usage

    +
    mmkin(
    +  models = c("SFO", "FOMC", "DFOP"),
    +  datasets,
    +  cores = if (Sys.info()["sysname"] == "Windows") 1 else parallel::detectCores(),
    +  cluster = NULL,
    +  ...
    +)
    +
    +# S3 method for class 'mmkin'
    +print(x, ...)
    +
    + +
    +

    Arguments

    + + +
    models
    +

    Either a character vector of shorthand names like +c("SFO", "FOMC", "DFOP", "HS", "SFORB"), or an optionally named +list of mkinmod objects.

    + + +
    datasets
    +

    An optionally named list of datasets suitable as observed +data for mkinfit.

    + + +
    cores
    +

    The number of cores to be used for multicore processing. This +is only used when the cluster argument is NULL. On Windows +machines, cores > 1 is not supported, you need to use the cluster +argument to use multiple logical processors. Per default, all cores +detected by parallel::detectCores() are used, except on Windows where +the default is 1.

    + + +
    cluster
    +

    A cluster as returned by makeCluster to be used +for parallel execution.

    + + +
    ...
    +

    Not used.

    + + +
    x
    +

    An mmkin object.

    + +
    +
    +

    Value

    +

    A two-dimensional array of mkinfit +objects and/or try-errors that can be indexed using the model names for the +first index (row index) and the dataset names for the second index (column +index).

    +
    +
    +

    See also

    +

    [.mmkin for subsetting, plot.mmkin for +plotting.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +# \dontrun{
    +m_synth_SFO_lin <- mkinmod(parent = mkinsub("SFO", "M1"),
    +                           M1 = mkinsub("SFO", "M2"),
    +                           M2 = mkinsub("SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +m_synth_FOMC_lin <- mkinmod(parent = mkinsub("FOMC", "M1"),
    +                            M1 = mkinsub("SFO", "M2"),
    +                            M2 = mkinsub("SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +models <- list(SFO_lin = m_synth_SFO_lin, FOMC_lin = m_synth_FOMC_lin)
    +datasets <- lapply(synthetic_data_for_UBA_2014[1:3], function(x) x$data)
    +names(datasets) <- paste("Dataset", 1:3)
    +
    +time_default <- system.time(fits.0 <- mmkin(models, datasets, quiet = TRUE))
    +time_1 <- system.time(fits.4 <- mmkin(models, datasets, cores = 1, quiet = TRUE))
    +
    +time_default
    +#>    user  system elapsed 
    +#>   1.522   0.957   0.720 
    +time_1
    +#>    user  system elapsed 
    +#>   1.991   0.024   2.015 
    +
    +endpoints(fits.0[["SFO_lin", 2]])
    +#> $ff
    +#>   parent_M1 parent_sink       M1_M2     M1_sink 
    +#>   0.7340481   0.2659519   0.7505690   0.2494310 
    +#> 
    +#> $distimes
    +#>              DT50       DT90
    +#> parent  0.8777689   2.915885
    +#> M1      2.3257403   7.725942
    +#> M2     33.7201060 112.015767
    +#> 
    +
    +# plot.mkinfit handles rows or columns of mmkin result objects
    +plot(fits.0[1, ])
    +
    +plot(fits.0[1, ], obs_var = c("M1", "M2"))
    +
    +plot(fits.0[, 1])
    +
    +# Use double brackets to extract a single mkinfit object, which will be plotted
    +# by plot.mkinfit and can be plotted using plot_sep
    +plot(fits.0[[1, 1]], sep_obs = TRUE, show_residuals = TRUE, show_errmin = TRUE)
    +
    +plot_sep(fits.0[[1, 1]])
    +# Plotting with mmkin (single brackets, extracting an mmkin object) does not
    +# allow to plot the observed variables separately
    +plot(fits.0[1, 1])
    +
    +
    +# On Windows, we can use multiple cores by making a cluster first
    +cl <- parallel::makePSOCKcluster(12)
    +f <- mmkin(c("SFO", "FOMC", "DFOP"),
    +  list(A = FOCUS_2006_A, B = FOCUS_2006_B, C = FOCUS_2006_C, D = FOCUS_2006_D),
    +  cluster = cl, quiet = TRUE)
    +print(f)
    +#> <mmkin> object
    +#> Status of individual fits:
    +#> 
    +#>       dataset
    +#> model  A  B  C  D 
    +#>   SFO  OK OK OK OK
    +#>   FOMC C  OK OK OK
    +#>   DFOP OK OK OK OK
    +#> 
    +#> C: Optimisation did not converge:
    +#> false convergence (8)
    +#> OK: No warnings
    +# We get false convergence for the FOMC fit to FOCUS_2006_A because this
    +# dataset is really SFO, and the FOMC fit is overparameterised
    +parallel::stopCluster(cl)
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/multistart-1.png b/docs/dev/reference/multistart-1.png new file mode 100644 index 00000000..d326b0c4 Binary files /dev/null and b/docs/dev/reference/multistart-1.png differ diff --git a/docs/dev/reference/multistart-2.png b/docs/dev/reference/multistart-2.png new file mode 100644 index 00000000..b6ae3051 Binary files /dev/null and b/docs/dev/reference/multistart-2.png differ diff --git a/docs/dev/reference/multistart.html b/docs/dev/reference/multistart.html new file mode 100644 index 00000000..3db38d97 --- /dev/null +++ b/docs/dev/reference/multistart.html @@ -0,0 +1,212 @@ + +Perform a hierarchical model fit with multiple starting values — multistart • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The purpose of this method is to check if a certain algorithm for fitting +nonlinear hierarchical models (also known as nonlinear mixed-effects models) +will reliably yield results that are sufficiently similar to each other, if +started with a certain range of reasonable starting parameters. It is +inspired by the article on practical identifiabiliy in the frame of nonlinear +mixed-effects models by Duchesne et al (2021).

    +
    + +
    +

    Usage

    +
    multistart(
    +  object,
    +  n = 50,
    +  cores = if (Sys.info()["sysname"] == "Windows") 1 else parallel::detectCores(),
    +  cluster = NULL,
    +  ...
    +)
    +
    +# S3 method for class 'saem.mmkin'
    +multistart(object, n = 50, cores = 1, cluster = NULL, ...)
    +
    +# S3 method for class 'multistart'
    +print(x, ...)
    +
    +best(object, ...)
    +
    +# Default S3 method
    +best(object, ...)
    +
    +which.best(object, ...)
    +
    +# Default S3 method
    +which.best(object, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The fit object to work with

    + + +
    n
    +

    How many different combinations of starting parameters should be +used?

    + + +
    cores
    +

    How many fits should be run in parallel (only on posix platforms)?

    + + +
    cluster
    +

    A cluster as returned by parallel::makeCluster to be used +for parallel execution.

    + + +
    ...
    +

    Passed to the update function.

    + + +
    x
    +

    The multistart object to print

    + +
    +
    +

    Value

    +

    A list of saem.mmkin objects, with class attributes +'multistart.saem.mmkin' and 'multistart'.

    +

    The object with the highest likelihood

    +

    The index of the object with the highest likelihood

    +
    +
    +

    References

    +

    Duchesne R, Guillemin A, Gandrillon O, Crauste F. Practical +identifiability in the frame of nonlinear mixed effects models: the example +of the in vitro erythropoiesis. BMC Bioinformatics. 2021 Oct 4;22(1):478. +doi: 10.1186/s12859-021-04373-4.

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    # \dontrun{
    +library(mkin)
    +dmta_ds <- lapply(1:7, function(i) {
    +  ds_i <- dimethenamid_2018$ds[[i]]$data
    +  ds_i[ds_i$name == "DMTAP", "name"] <-  "DMTA"
    +  ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i]
    +  ds_i
    +})
    +names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title)
    +dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]])
    +dmta_ds[["Elliot 1"]] <- dmta_ds[["Elliot 2"]] <- NULL
    +
    +f_mmkin <- mmkin("DFOP", dmta_ds, error_model = "tc", cores = 7, quiet = TRUE)
    +f_saem_full <- saem(f_mmkin)
    +f_saem_full_multi <- multistart(f_saem_full, n = 16, cores = 16)
    +parplot(f_saem_full_multi, lpos = "topleft", las = 2)
    +
    +illparms(f_saem_full)
    +#> [1] "sd(log_k2)"
    +
    +f_saem_reduced <- update(f_saem_full, no_random_effect = "log_k2")
    +illparms(f_saem_reduced)
    +# On Windows, we need to create a PSOCK cluster first and refer to it
    +# in the call to multistart()
    +library(parallel)
    +cl <- makePSOCKcluster(12)
    +f_saem_reduced_multi <- multistart(f_saem_reduced, n = 16, cluster = cl)
    +parplot(f_saem_reduced_multi, lpos = "topright", ylim = c(0.5, 2), las = 2)
    +
    +stopCluster(cl)
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/multistart.saem.mmkin.html b/docs/dev/reference/multistart.saem.mmkin.html new file mode 100644 index 00000000..06f15f0c --- /dev/null +++ b/docs/dev/reference/multistart.saem.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/nafta-1.png b/docs/dev/reference/nafta-1.png new file mode 100644 index 00000000..98d4246c Binary files /dev/null and b/docs/dev/reference/nafta-1.png differ diff --git a/docs/dev/reference/nafta.html b/docs/dev/reference/nafta.html new file mode 100644 index 00000000..f7b018e5 --- /dev/null +++ b/docs/dev/reference/nafta.html @@ -0,0 +1,215 @@ + +Evaluate parent kinetics using the NAFTA guidance — nafta • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The function fits the SFO, IORE and DFOP models using mmkin +and returns an object of class nafta that has methods for printing +and plotting.

    +

    Print nafta objects. The results for the three models are printed in the +order of increasing model complexity, i.e. SFO, then IORE, and finally DFOP.

    +
    + +
    +

    Usage

    +
    nafta(ds, title = NA, quiet = FALSE, ...)
    +
    +# S3 method for class 'nafta'
    +print(x, quiet = TRUE, digits = 3, ...)
    +
    + +
    +

    Source

    +

    NAFTA (2011) Guidance for evaluating and calculating degradation +kinetics in environmental media. NAFTA Technical Working Group on +Pesticides +https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/guidance-evaluating-and-calculating-degradation +accessed 2019-02-22

    +

    US EPA (2015) Standard Operating Procedure for Using the NAFTA Guidance to +Calculate Representative Half-life Values and Characterizing Pesticide +Degradation +https://www.epa.gov/pesticide-science-and-assessing-pesticide-risks/standard-operating-procedure-using-nafta-guidance

    +
    +
    +

    Arguments

    + + +
    ds
    +

    A dataframe that must contain one variable called "time" with the +time values specified by the time argument, one column called +"name" with the grouping of the observed values, and finally one column of +observed values called "value".

    + + +
    title
    +

    Optional title of the dataset

    + + +
    quiet
    +

    Should the evaluation text be shown?

    + + +
    ...
    +

    Further arguments passed to mmkin (not for the +printing method).

    + + +
    x
    +

    An nafta object.

    + + +
    digits
    +

    Number of digits to be used for printing parameters and +dissipation times.

    + +
    +
    +

    Value

    +

    An list of class nafta. The list element named "mmkin" is the +mmkin object containing the fits of the three models. The +list element named "title" contains the title of the dataset used. The +list element "data" contains the dataset used in the fits.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +  nafta_evaluation <- nafta(NAFTA_SOP_Appendix_D, cores = 1)
    +#> The SFO model is rejected as S_SFO is equal or higher than the critical value S_c
    +#> The representative half-life of the IORE model is longer than the one corresponding
    +#> to the terminal degradation rate found with the DFOP model.
    +#> The representative half-life obtained from the DFOP model may be used
    +  print(nafta_evaluation)
    +#> Sums of squares:
    +#>       SFO      IORE      DFOP 
    +#> 1378.6832  615.7730  517.8836 
    +#> 
    +#> Critical sum of squares for checking the SFO model:
    +#> [1] 717.4598
    +#> 
    +#> Parameters:
    +#> $SFO
    +#>          Estimate   Pr(>t)    Lower   Upper
    +#> parent_0  83.7558 1.80e-14 77.18268 90.3288
    +#> k_parent   0.0017 7.43e-05  0.00112  0.0026
    +#> sigma      8.7518 1.22e-05  5.64278 11.8608
    +#> 
    +#> $IORE
    +#>                Estimate Pr(>t)    Lower    Upper
    +#> parent_0       9.69e+01     NA 8.88e+01 1.05e+02
    +#> k__iore_parent 8.40e-14     NA 1.79e-18 3.94e-09
    +#> N_parent       6.68e+00     NA 4.19e+00 9.17e+00
    +#> sigma          5.85e+00     NA 3.76e+00 7.94e+00
    +#> 
    +#> $DFOP
    +#>          Estimate   Pr(>t)    Lower    Upper
    +#> parent_0 9.76e+01 1.94e-13 9.02e+01 1.05e+02
    +#> k1       4.24e-02 5.92e-03 2.03e-02 8.88e-02
    +#> k2       8.24e-04 6.48e-03 3.89e-04 1.75e-03
    +#> g        2.88e-01 2.47e-05 1.95e-01 4.03e-01
    +#> sigma    5.36e+00 2.22e-05 3.43e+00 7.30e+00
    +#> 
    +#> 
    +#> DTx values:
    +#>      DT50    DT90 DT50_rep
    +#> SFO   407    1350      407
    +#> IORE  541 5190000  1560000
    +#> DFOP  429    2380      841
    +#> 
    +#> Representative half-life:
    +#> [1] 841.41
    +  plot(nafta_evaluation)
    +
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/nlme-1.png b/docs/dev/reference/nlme-1.png new file mode 100644 index 00000000..9583da2a Binary files /dev/null and b/docs/dev/reference/nlme-1.png differ diff --git a/docs/dev/reference/nlme-2.png b/docs/dev/reference/nlme-2.png new file mode 100644 index 00000000..08e3b642 Binary files /dev/null and b/docs/dev/reference/nlme-2.png differ diff --git a/docs/dev/reference/nlme.html b/docs/dev/reference/nlme.html new file mode 100644 index 00000000..e3c13f48 --- /dev/null +++ b/docs/dev/reference/nlme.html @@ -0,0 +1,197 @@ + +Helper functions to create nlme models from mmkin row objects — nlme_function • mkin + Skip to contents + + +
    +
    +
    + +
    +

    These functions facilitate setting up a nonlinear mixed effects model for +an mmkin row object. An mmkin row object is essentially a list of mkinfit +objects that have been obtained by fitting the same model to a list of +datasets. They are used internally by the nlme.mmkin() method.

    +
    + +
    +

    Usage

    +
    nlme_function(object)
    +
    +nlme_data(object)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mmkin row object containing several fits of the same model to different datasets

    + +
    +
    +

    Value

    +

    A function that can be used with nlme

    +

    A nlme::groupedData object

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +m_SFO <- mkinmod(parent = mkinsub("SFO"))
    +d_SFO_1 <- mkinpredict(m_SFO,
    +  c(k_parent = 0.1),
    +  c(parent = 98), sampling_times)
    +d_SFO_1_long <- mkin_wide_to_long(d_SFO_1, time = "time")
    +d_SFO_2 <- mkinpredict(m_SFO,
    +  c(k_parent = 0.05),
    +  c(parent = 102), sampling_times)
    +d_SFO_2_long <- mkin_wide_to_long(d_SFO_2, time = "time")
    +d_SFO_3 <- mkinpredict(m_SFO,
    +  c(k_parent = 0.02),
    +  c(parent = 103), sampling_times)
    +d_SFO_3_long <- mkin_wide_to_long(d_SFO_3, time = "time")
    +
    +d1 <- add_err(d_SFO_1, function(value) 3, n = 1)
    +d2 <- add_err(d_SFO_2, function(value) 2, n = 1)
    +d3 <- add_err(d_SFO_3, function(value) 4, n = 1)
    +ds <- c(d1 = d1, d2 = d2, d3 = d3)
    +
    +f <- mmkin("SFO", ds, cores = 1, quiet = TRUE)
    +mean_dp <- mean_degparms(f)
    +grouped_data <- nlme_data(f)
    +nlme_f <- nlme_function(f)
    +# These assignments are necessary for these objects to be
    +# visible to nlme and augPred when evaluation is done by
    +# pkgdown to generate the html docs.
    +assign("nlme_f", nlme_f, globalenv())
    +assign("grouped_data", grouped_data, globalenv())
    +
    +library(nlme)
    +m_nlme <- nlme(value ~ nlme_f(name, time, parent_0, log_k_parent_sink),
    +  data = grouped_data,
    +  fixed = parent_0 + log_k_parent_sink ~ 1,
    +  random = pdDiag(parent_0 + log_k_parent_sink ~ 1),
    +  start = mean_dp)
    +summary(m_nlme)
    +#> Nonlinear mixed-effects model fit by maximum likelihood
    +#>   Model: value ~ nlme_f(name, time, parent_0, log_k_parent_sink) 
    +#>   Data: grouped_data 
    +#>        AIC      BIC    logLik
    +#>   266.6428 275.8935 -128.3214
    +#> 
    +#> Random effects:
    +#>  Formula: list(parent_0 ~ 1, log_k_parent_sink ~ 1)
    +#>  Level: ds
    +#>  Structure: Diagonal
    +#>             parent_0 log_k_parent_sink Residual
    +#> StdDev: 0.0003775775         0.7058039 3.065183
    +#> 
    +#> Fixed effects:  parent_0 + log_k_parent_sink ~ 1 
    +#>                       Value Std.Error DF   t-value p-value
    +#> parent_0          101.18323 0.7900461 43 128.07257       0
    +#> log_k_parent_sink  -3.08708 0.4171755 43  -7.39995       0
    +#>  Correlation: 
    +#>                   prnt_0
    +#> log_k_parent_sink 0.031 
    +#> 
    +#> Standardized Within-Group Residuals:
    +#>         Min          Q1         Med          Q3         Max 
    +#> -2.38427070 -0.52059848  0.03593021  0.39987268  2.73188969 
    +#> 
    +#> Number of Observations: 47
    +#> Number of Groups: 3 
    +plot(augPred(m_nlme, level = 0:1), layout = c(3, 1))
    +
    +# augPred does not work on fits with more than one state
    +# variable
    +#
    +# The procedure is greatly simplified by the nlme.mmkin function
    +f_nlme <- nlme(f)
    +plot(f_nlme)
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/nlme.mmkin-1.png b/docs/dev/reference/nlme.mmkin-1.png new file mode 100644 index 00000000..a940da0c Binary files /dev/null and b/docs/dev/reference/nlme.mmkin-1.png differ diff --git a/docs/dev/reference/nlme.mmkin-2.png b/docs/dev/reference/nlme.mmkin-2.png new file mode 100644 index 00000000..b12ddb73 Binary files /dev/null and b/docs/dev/reference/nlme.mmkin-2.png differ diff --git a/docs/dev/reference/nlme.mmkin-3.png b/docs/dev/reference/nlme.mmkin-3.png new file mode 100644 index 00000000..629fe7d2 Binary files /dev/null and b/docs/dev/reference/nlme.mmkin-3.png differ diff --git a/docs/dev/reference/nlme.mmkin.html b/docs/dev/reference/nlme.mmkin.html new file mode 100644 index 00000000..40fb16d3 --- /dev/null +++ b/docs/dev/reference/nlme.mmkin.html @@ -0,0 +1,415 @@ + +Create an nlme model for an mmkin row object — nlme.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This functions sets up a nonlinear mixed effects model for an mmkin row +object. An mmkin row object is essentially a list of mkinfit objects that +have been obtained by fitting the same model to a list of datasets.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mmkin'
    +nlme(
    +  model,
    +  data = "auto",
    +  fixed = lapply(as.list(names(mean_degparms(model))), function(el) eval(parse(text =
    +    paste(el, 1, sep = "~")))),
    +  random = pdDiag(fixed),
    +  groups,
    +  start = mean_degparms(model, random = TRUE, test_log_parms = TRUE),
    +  correlation = NULL,
    +  weights = NULL,
    +  subset,
    +  method = c("ML", "REML"),
    +  na.action = na.fail,
    +  naPattern,
    +  control = list(),
    +  verbose = FALSE
    +)
    +
    +# S3 method for class 'nlme.mmkin'
    +print(x, digits = max(3, getOption("digits") - 3), ...)
    +
    +# S3 method for class 'nlme.mmkin'
    +update(object, ...)
    +
    + +
    +

    Arguments

    + + +
    model
    +

    An mmkin row object.

    + + +
    data
    +

    Ignored, data are taken from the mmkin model

    + + +
    fixed
    +

    Ignored, all degradation parameters fitted in the +mmkin model are used as fixed parameters

    + + +
    random
    +

    If not specified, no correlations between random effects are +set up for the optimised degradation model parameters. This is +achieved by using the nlme::pdDiag method.

    + + +
    groups
    +

    See the documentation of nlme

    + + +
    start
    +

    If not specified, mean values of the fitted degradation +parameters taken from the mmkin object are used

    + + +
    correlation
    +

    See the documentation of nlme

    + + +
    weights
    +

    passed to nlme

    + + +
    subset
    +

    passed to nlme

    + + +
    method
    +

    passed to nlme

    + + +
    na.action
    +

    passed to nlme

    + + +
    naPattern
    +

    passed to nlme

    + + +
    control
    +

    passed to nlme

    + + +
    verbose
    +

    passed to nlme

    + + +
    x
    +

    An nlme.mmkin object to print

    + + +
    digits
    +

    Number of digits to use for printing

    + + +
    ...
    +

    Update specifications passed to update.nlme

    + + +
    object
    +

    An nlme.mmkin object to update

    + +
    +
    +

    Value

    +

    Upon success, a fitted 'nlme.mmkin' object, which is an nlme object +with additional elements. It also inherits from 'mixed.mmkin'.

    +
    +
    +

    Details

    +

    Note that the convergence of the nlme algorithms depends on the quality +of the data. In degradation kinetics, we often only have few datasets +(e.g. data for few soils) and complicated degradation models, which may +make it impossible to obtain convergence with nlme.

    +
    +
    +

    Note

    +

    As the object inherits from nlme::nlme, there is a wealth of +methods that will automatically work on 'nlme.mmkin' objects, such as +nlme::intervals(), nlme::anova.lme() and nlme::coef.lme().

    +
    + + +
    +

    Examples

    +
    ds <- lapply(experimental_data_for_UBA_2019[6:10],
    + function(x) subset(x$data[c("name", "time", "value")], name == "parent"))
    +
    +# \dontrun{
    +  f <- mmkin(c("SFO", "DFOP"), ds, quiet = TRUE, cores = 1)
    +  library(nlme)
    +  f_nlme_sfo <- nlme(f["SFO", ])
    +  f_nlme_dfop <- nlme(f["DFOP", ])
    +  anova(f_nlme_sfo, f_nlme_dfop)
    +#>             Model df      AIC      BIC    logLik   Test  L.Ratio p-value
    +#> f_nlme_sfo      1  5 625.0539 637.5529 -307.5269                        
    +#> f_nlme_dfop     2  9 495.1270 517.6253 -238.5635 1 vs 2 137.9269  <.0001
    +  print(f_nlme_dfop)
    +#> Kinetic nonlinear mixed-effects model fit by maximum likelihood
    +#> 
    +#> Structural model:
    +#> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
    +#>            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
    +#>            * parent
    +#> 
    +#> Data:
    +#> 90 observations of 1 variable(s) grouped in 5 datasets
    +#> 
    +#> Log-likelihood: -238.6
    +#> 
    +#> Fixed effects:
    +#>  list(parent_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1) 
    +#> parent_0   log_k1   log_k2 g_qlogis 
    +#>  94.1702  -1.8002  -4.1474   0.0324 
    +#> 
    +#> Random effects:
    +#>  Formula: list(parent_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1)
    +#>  Level: ds
    +#>  Structure: Diagonal
    +#>         parent_0 log_k1 log_k2 g_qlogis Residual
    +#> StdDev:    2.488 0.8447   1.33   0.4652    2.321
    +#> 
    +  plot(f_nlme_dfop)
    +
    +  endpoints(f_nlme_dfop)
    +#> $distimes
    +#>            DT50     DT90 DT50back  DT50_k1  DT50_k2
    +#> parent 10.79857 100.7937 30.34192 4.193937 43.85442
    +#> 
    +
    +  ds_2 <- lapply(experimental_data_for_UBA_2019[6:10],
    +   function(x) x$data[c("name", "time", "value")])
    +  m_sfo_sfo <- mkinmod(parent = mkinsub("SFO", "A1"),
    +    A1 = mkinsub("SFO"), use_of_ff = "min", quiet = TRUE)
    +  m_sfo_sfo_ff <- mkinmod(parent = mkinsub("SFO", "A1"),
    +    A1 = mkinsub("SFO"), use_of_ff = "max", quiet = TRUE)
    +  m_dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "A1"),
    +    A1 = mkinsub("SFO"), quiet = TRUE)
    +
    +  f_2 <- mmkin(list("SFO-SFO" = m_sfo_sfo,
    +   "SFO-SFO-ff" = m_sfo_sfo_ff,
    +   "DFOP-SFO" = m_dfop_sfo),
    +    ds_2, quiet = TRUE)
    +
    +  f_nlme_sfo_sfo <- nlme(f_2["SFO-SFO", ])
    +  plot(f_nlme_sfo_sfo)
    +
    +
    +  # With formation fractions this does not coverge with defaults
    +  # f_nlme_sfo_sfo_ff <- nlme(f_2["SFO-SFO-ff", ])
    +  #plot(f_nlme_sfo_sfo_ff)
    +
    +  # For the following, we need to increase pnlsMaxIter and the tolerance
    +  # to get convergence
    +  f_nlme_dfop_sfo <- nlme(f_2["DFOP-SFO", ],
    +    control = list(pnlsMaxIter = 120, tolerance = 5e-4))
    +
    +  plot(f_nlme_dfop_sfo)
    +
    +
    +  anova(f_nlme_dfop_sfo, f_nlme_sfo_sfo)
    +#>                 Model df       AIC      BIC    logLik   Test  L.Ratio p-value
    +#> f_nlme_dfop_sfo     1 13  843.8547  884.620 -408.9273                        
    +#> f_nlme_sfo_sfo      2  9 1085.1821 1113.404 -533.5910 1 vs 2 249.3274  <.0001
    +
    +  endpoints(f_nlme_sfo_sfo)
    +#> $ff
    +#> parent_sink   parent_A1     A1_sink 
    +#>   0.5912432   0.4087568   1.0000000 
    +#> 
    +#> $distimes
    +#>            DT50     DT90
    +#> parent 19.13518  63.5657
    +#> A1     66.02155 219.3189
    +#> 
    +  endpoints(f_nlme_dfop_sfo)
    +#> $ff
    +#>   parent_A1 parent_sink 
    +#>   0.2768574   0.7231426 
    +#> 
    +#> $distimes
    +#>             DT50     DT90 DT50back  DT50_k1  DT50_k2
    +#> parent  11.07091 104.6320 31.49737 4.462383 46.20825
    +#> A1     162.30550 539.1672       NA       NA       NA
    +#> 
    +
    +  if (length(findFunction("varConstProp")) > 0) { # tc error model for nlme available
    +    # Attempts to fit metabolite kinetics with the tc error model are possible,
    +    # but need tweeking of control values and sometimes do not converge
    +
    +    f_tc <- mmkin(c("SFO", "DFOP"), ds, quiet = TRUE, error_model = "tc")
    +    f_nlme_sfo_tc <- nlme(f_tc["SFO", ])
    +    f_nlme_dfop_tc <- nlme(f_tc["DFOP", ])
    +    AIC(f_nlme_sfo, f_nlme_sfo_tc, f_nlme_dfop, f_nlme_dfop_tc)
    +    print(f_nlme_dfop_tc)
    +  }
    +#> Kinetic nonlinear mixed-effects model fit by maximum likelihood
    +#> 
    +#> Structural model:
    +#> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
    +#>            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
    +#>            * parent
    +#> 
    +#> Data:
    +#> 90 observations of 1 variable(s) grouped in 5 datasets
    +#> 
    +#> Log-likelihood: -238.4
    +#> 
    +#> Fixed effects:
    +#>  list(parent_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1) 
    +#> parent_0   log_k1   log_k2 g_qlogis 
    +#> 94.04774 -1.82340 -4.16716  0.05685 
    +#> 
    +#> Random effects:
    +#>  Formula: list(parent_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1)
    +#>  Level: ds
    +#>  Structure: Diagonal
    +#>         parent_0 log_k1 log_k2 g_qlogis Residual
    +#> StdDev:    2.474   0.85  1.337   0.4659        1
    +#> 
    +#> Variance function:
    +#>  Structure: Constant plus proportion of variance covariate
    +#>  Formula: ~fitted(.) 
    +#>  Parameter estimates:
    +#>      const       prop 
    +#> 2.23222933 0.01262399 
    +
    +  f_2_obs <- update(f_2, error_model = "obs")
    +  f_nlme_sfo_sfo_obs <- nlme(f_2_obs["SFO-SFO", ])
    +  print(f_nlme_sfo_sfo_obs)
    +#> Kinetic nonlinear mixed-effects model fit by maximum likelihood
    +#> 
    +#> Structural model:
    +#> d_parent/dt = - k_parent_sink * parent - k_parent_A1 * parent
    +#> d_A1/dt = + k_parent_A1 * parent - k_A1_sink * A1
    +#> 
    +#> Data:
    +#> 170 observations of 2 variable(s) grouped in 5 datasets
    +#> 
    +#> Log-likelihood: -473
    +#> 
    +#> Fixed effects:
    +#>  list(parent_0 ~ 1, log_k_parent_sink ~ 1, log_k_parent_A1 ~ 1,      log_k_A1_sink ~ 1) 
    +#>          parent_0 log_k_parent_sink   log_k_parent_A1     log_k_A1_sink 
    +#>            87.976            -3.670            -4.164            -4.645 
    +#> 
    +#> Random effects:
    +#>  Formula: list(parent_0 ~ 1, log_k_parent_sink ~ 1, log_k_parent_A1 ~ 1,      log_k_A1_sink ~ 1)
    +#>  Level: ds
    +#>  Structure: Diagonal
    +#>         parent_0 log_k_parent_sink log_k_parent_A1 log_k_A1_sink Residual
    +#> StdDev:    3.992             1.777           1.055        0.4821    6.483
    +#> 
    +#> Variance function:
    +#>  Structure: Different standard deviations per stratum
    +#>  Formula: ~1 | name 
    +#>  Parameter estimates:
    +#>    parent        A1 
    +#> 1.0000000 0.2050005 
    +  f_nlme_dfop_sfo_obs <- nlme(f_2_obs["DFOP-SFO", ],
    +    control = list(pnlsMaxIter = 120, tolerance = 5e-4))
    +
    +  f_2_tc <- update(f_2, error_model = "tc")
    +  # f_nlme_sfo_sfo_tc <- nlme(f_2_tc["SFO-SFO", ]) # No convergence with 50 iterations
    +  # f_nlme_dfop_sfo_tc <- nlme(f_2_tc["DFOP-SFO", ],
    +  #  control = list(pnlsMaxIter = 120, tolerance = 5e-4)) # Error in X[, fmap[[nm]]] <- gradnm
    +
    +  anova(f_nlme_dfop_sfo, f_nlme_dfop_sfo_obs)
    +#>                     Model df      AIC     BIC    logLik   Test  L.Ratio p-value
    +#> f_nlme_dfop_sfo         1 13 843.8547 884.620 -408.9273                        
    +#> f_nlme_dfop_sfo_obs     2 14 817.5338 861.435 -394.7669 1 vs 2 28.32084  <.0001
    +
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/nlme_data.html b/docs/dev/reference/nlme_data.html new file mode 100644 index 00000000..c1e64a4a --- /dev/null +++ b/docs/dev/reference/nlme_data.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/nobs.mkinfit.html b/docs/dev/reference/nobs.mkinfit.html new file mode 100644 index 00000000..809dafaf --- /dev/null +++ b/docs/dev/reference/nobs.mkinfit.html @@ -0,0 +1,109 @@ + +Number of observations on which an mkinfit object was fitted — nobs.mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Number of observations on which an mkinfit object was fitted

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinfit'
    +nobs(object, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mkinfit object

    + + +
    ...
    +

    For compatibility with the generic method

    + +
    +
    +

    Value

    +

    The number of rows in the data included in the mkinfit object

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/parms.html b/docs/dev/reference/parms.html new file mode 100644 index 00000000..71a8737f --- /dev/null +++ b/docs/dev/reference/parms.html @@ -0,0 +1,250 @@ + +Extract model parameters — parms • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function returns degradation model parameters as well as error +model parameters per default, in order to avoid working with a fitted model +without considering the error structure that was assumed for the fit.

    +
    + +
    +

    Usage

    +
    parms(object, ...)
    +
    +# S3 method for class 'mkinfit'
    +parms(object, transformed = FALSE, errparms = TRUE, ...)
    +
    +# S3 method for class 'mmkin'
    +parms(object, transformed = FALSE, errparms = TRUE, ...)
    +
    +# S3 method for class 'multistart'
    +parms(object, exclude_failed = TRUE, ...)
    +
    +# S3 method for class 'saem.mmkin'
    +parms(object, ci = FALSE, covariates = NULL, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    A fitted model object.

    + + +
    ...
    +

    Not used

    + + +
    transformed
    +

    Should the parameters be returned as used internally +during the optimisation?

    + + +
    errparms
    +

    Should the error model parameters be returned +in addition to the degradation parameters?

    + + +
    exclude_failed
    +

    For multistart objects, should rows for failed fits +be removed from the returned parameter matrix?

    + + +
    ci
    +

    Should a matrix with estimates and confidence interval boundaries +be returned? If FALSE (default), a vector of estimates is returned if no +covariates are given, otherwise a matrix of estimates is returned, with +each column corresponding to a row of the data frame holding the covariates

    + + +
    covariates
    +

    A data frame holding covariate values for which to +return parameter values. Only has an effect if 'ci' is FALSE.

    + +
    +
    +

    Value

    +

    Depending on the object, a numeric vector of fitted model parameters, +a matrix (e.g. for mmkin row objects), or a list of matrices (e.g. for +mmkin objects with more than one row).

    +
    +
    +

    See also

    + +
    + +
    +

    Examples

    +
    # mkinfit objects
    +fit <- mkinfit("SFO", FOCUS_2006_C, quiet = TRUE)
    +parms(fit)
    +#>   parent_0   k_parent      sigma 
    +#> 82.4921598  0.3060633  4.6730124 
    +parms(fit, transformed = TRUE)
    +#>     parent_0 log_k_parent        sigma 
    +#>    82.492160    -1.183963     4.673012 
    +
    +# mmkin objects
    +ds <- lapply(experimental_data_for_UBA_2019[6:10],
    + function(x) subset(x$data[c("name", "time", "value")]))
    +names(ds) <- paste("Dataset", 6:10)
    +# \dontrun{
    +fits <- mmkin(c("SFO", "FOMC", "DFOP"), ds, quiet = TRUE, cores = 1)
    +parms(fits["SFO", ])
    +#>            Dataset 6    Dataset 7  Dataset 8  Dataset 9  Dataset 10
    +#> parent_0 88.52275400 82.666781678 86.8547308 91.7779306 82.14809450
    +#> k_parent  0.05794659  0.009647805  0.2102974  0.1232258  0.00720421
    +#> sigma     5.15274487  7.040168584  3.6769645  6.4669234  6.50457673
    +parms(fits[, 2])
    +#> $SFO
    +#>             Dataset 7
    +#> parent_0 82.666781678
    +#> k_parent  0.009647805
    +#> sigma     7.040168584
    +#> 
    +#> $FOMC
    +#>           Dataset 7
    +#> parent_0 92.6837649
    +#> alpha     0.4967832
    +#> beta     14.1451255
    +#> sigma     1.9167519
    +#> 
    +#> $DFOP
    +#>             Dataset 7
    +#> parent_0 91.058971584
    +#> k1        0.044946770
    +#> k2        0.002868336
    +#> g         0.526942414
    +#> sigma     2.221302196
    +#> 
    +parms(fits)
    +#> $SFO
    +#>            Dataset 6    Dataset 7  Dataset 8  Dataset 9  Dataset 10
    +#> parent_0 88.52275400 82.666781678 86.8547308 91.7779306 82.14809450
    +#> k_parent  0.05794659  0.009647805  0.2102974  0.1232258  0.00720421
    +#> sigma     5.15274487  7.040168584  3.6769645  6.4669234  6.50457673
    +#> 
    +#> $FOMC
    +#>          Dataset 6  Dataset 7 Dataset 8 Dataset 9 Dataset 10
    +#> parent_0 95.558575 92.6837649 90.719787 98.383939 94.8481458
    +#> alpha     1.338667  0.4967832  1.639099  1.074460  0.2805272
    +#> beta     13.033315 14.1451255  5.007077  4.397126  6.9052224
    +#> sigma     1.847671  1.9167519  1.066063  3.146056  1.6222778
    +#> 
    +#> $DFOP
    +#>            Dataset 6    Dataset 7   Dataset 8   Dataset 9   Dataset 10
    +#> parent_0 96.55213663 91.058971584 90.34509493 98.14858820 94.311323735
    +#> k1        0.21954588  0.044946770  0.41232288  0.31697588  0.080663857
    +#> k2        0.02957934  0.002868336  0.07581766  0.03260384  0.003425417
    +#> g         0.44845068  0.526942414  0.66091967  0.65322767  0.342652880
    +#> sigma     1.35690468  2.221302196  1.34169076  2.87159846  1.942067831
    +#> 
    +parms(fits, transformed = TRUE)
    +#> $SFO
    +#>              Dataset 6 Dataset 7 Dataset 8 Dataset 9 Dataset 10
    +#> parent_0     88.522754 82.666782 86.854731 91.777931  82.148095
    +#> log_k_parent -2.848234 -4.641025 -1.559232 -2.093737  -4.933090
    +#> sigma         5.152745  7.040169  3.676964  6.466923   6.504577
    +#> 
    +#> $FOMC
    +#>            Dataset 6  Dataset 7  Dataset 8   Dataset 9 Dataset 10
    +#> parent_0  95.5585751 92.6837649 90.7197870 98.38393898  94.848146
    +#> log_alpha  0.2916741 -0.6996015  0.4941466  0.07181816  -1.271085
    +#> log_beta   2.5675088  2.6493701  1.6108523  1.48095106   1.932278
    +#> sigma      1.8476712  1.9167519  1.0660627  3.14605557   1.622278
    +#> 
    +#> $DFOP
    +#>           Dataset 6  Dataset 7  Dataset 8  Dataset 9 Dataset 10
    +#> parent_0 96.5521366 91.0589716 90.3450949 98.1485882 94.3113237
    +#> log_k1   -1.5161940 -3.1022764 -0.8859486 -1.1489296 -2.5174647
    +#> log_k2   -3.5206791 -5.8540232 -2.5794240 -3.4233253 -5.6765322
    +#> g_qlogis -0.2069326  0.1078741  0.6673953  0.6332573 -0.6514943
    +#> sigma     1.3569047  2.2213022  1.3416908  2.8715985  1.9420678
    +#> 
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/parms.mkinfit.html b/docs/dev/reference/parms.mkinfit.html new file mode 100644 index 00000000..fee7b266 --- /dev/null +++ b/docs/dev/reference/parms.mkinfit.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/parms.mmkin.html b/docs/dev/reference/parms.mmkin.html new file mode 100644 index 00000000..fee7b266 --- /dev/null +++ b/docs/dev/reference/parms.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/parms.multistart.html b/docs/dev/reference/parms.multistart.html new file mode 100644 index 00000000..fee7b266 --- /dev/null +++ b/docs/dev/reference/parms.multistart.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/parms.saem.mmkin.html b/docs/dev/reference/parms.saem.mmkin.html new file mode 100644 index 00000000..fee7b266 --- /dev/null +++ b/docs/dev/reference/parms.saem.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/parplot.html b/docs/dev/reference/parplot.html new file mode 100644 index 00000000..4a11710f --- /dev/null +++ b/docs/dev/reference/parplot.html @@ -0,0 +1,161 @@ + +Plot parameter variability of multistart objects — parplot • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Produces a boxplot with all parameters from the multiple runs, scaled +either by the parameters of the run with the highest likelihood, +or by their medians as proposed in the paper by Duchesne et al. (2021).

    +
    + +
    +

    Usage

    +
    parplot(object, ...)
    +
    +# S3 method for class 'multistart.saem.mmkin'
    +parplot(
    +  object,
    +  llmin = -Inf,
    +  llquant = NA,
    +  scale = c("best", "median"),
    +  lpos = "bottomleft",
    +  main = "",
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The multistart object

    + + +
    ...
    +

    Passed to boxplot

    + + +
    llmin
    +

    The minimum likelihood of objects to be shown

    + + +
    llquant
    +

    Fractional value for selecting only the fits with higher +likelihoods. Overrides 'llmin'.

    + + +
    scale
    +

    By default, scale parameters using the best +available fit. +If 'median', parameters are scaled using the median parameters from all fits.

    + + +
    lpos
    +

    Positioning of the legend.

    + + +
    main
    +

    Title of the plot

    + +
    +
    +

    Details

    +

    Starting values of degradation model parameters and error model parameters +are shown as green circles. The results obtained in the original run +are shown as red circles.

    +
    +
    +

    References

    +

    Duchesne R, Guillemin A, Gandrillon O, Crauste F. Practical +identifiability in the frame of nonlinear mixed effects models: the example +of the in vitro erythropoiesis. BMC Bioinformatics. 2021 Oct 4;22(1):478. +doi: 10.1186/s12859-021-04373-4.

    +
    +
    +

    See also

    + +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/parplot.multistart.saem.mmkin.html b/docs/dev/reference/parplot.multistart.saem.mmkin.html new file mode 100644 index 00000000..d795c84e --- /dev/null +++ b/docs/dev/reference/parplot.multistart.saem.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/plot.mixed.mmkin-1.png b/docs/dev/reference/plot.mixed.mmkin-1.png new file mode 100644 index 00000000..61b47f93 Binary files /dev/null and b/docs/dev/reference/plot.mixed.mmkin-1.png differ diff --git a/docs/dev/reference/plot.mixed.mmkin-2.png b/docs/dev/reference/plot.mixed.mmkin-2.png new file mode 100644 index 00000000..9229163a Binary files /dev/null and b/docs/dev/reference/plot.mixed.mmkin-2.png differ diff --git a/docs/dev/reference/plot.mixed.mmkin-3.png b/docs/dev/reference/plot.mixed.mmkin-3.png new file mode 100644 index 00000000..749efd4b Binary files /dev/null and b/docs/dev/reference/plot.mixed.mmkin-3.png differ diff --git a/docs/dev/reference/plot.mixed.mmkin-4.png b/docs/dev/reference/plot.mixed.mmkin-4.png new file mode 100644 index 00000000..336a80de Binary files /dev/null and b/docs/dev/reference/plot.mixed.mmkin-4.png differ diff --git a/docs/dev/reference/plot.mixed.mmkin.html b/docs/dev/reference/plot.mixed.mmkin.html new file mode 100644 index 00000000..06afd21f --- /dev/null +++ b/docs/dev/reference/plot.mixed.mmkin.html @@ -0,0 +1,294 @@ + +Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mixed.mmkin'
    +plot(
    +  x,
    +  i = 1:ncol(x$mmkin),
    +  obs_vars = names(x$mkinmod$map),
    +  standardized = TRUE,
    +  covariates = NULL,
    +  covariate_quantiles = c(0.5, 0.05, 0.95),
    +  xlab = "Time",
    +  xlim = range(x$data$time),
    +  resplot = c("predicted", "time"),
    +  pop_curves = "auto",
    +  pred_over = NULL,
    +  test_log_parms = FALSE,
    +  conf.level = 0.6,
    +  default_log_parms = NA,
    +  ymax = "auto",
    +  maxabs = "auto",
    +  ncol.legend = ifelse(length(i) <= 3, length(i) + 1, ifelse(length(i) <= 8, 3, 4)),
    +  nrow.legend = ceiling((length(i) + 1)/ncol.legend),
    +  rel.height.legend = 0.02 + 0.07 * nrow.legend,
    +  rel.height.bottom = 1.1,
    +  pch_ds = c(1:25, 33, 35:38, 40:41, 47:57, 60:90)[1:length(i)],
    +  col_ds = pch_ds + 1,
    +  lty_ds = col_ds,
    +  frame = TRUE,
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    An object of class mixed.mmkin, saem.mmkin or nlme.mmkin

    + + +
    i
    +

    A numeric index to select datasets for which to plot the individual predictions, +in case plots get too large

    + + +
    obs_vars
    +

    A character vector of names of the observed variables for +which the data and the model should be plotted. Defauls to all observed +variables in the model.

    + + +
    standardized
    +

    Should the residuals be standardized? Only takes effect if +resplot = "time".

    + + +
    covariates
    +

    Data frame with covariate values for all variables in +any covariate models in the object. If given, it overrides 'covariate_quantiles'. +Each line in the data frame will result in a line drawn for the population. +Rownames are used in the legend to label the lines.

    + + +
    covariate_quantiles
    +

    This argument only has an effect if the fitted +object has covariate models. If so, the default is to show three population +curves, for the 5th percentile, the 50th percentile and the 95th percentile +of the covariate values used for fitting the model.

    + + +
    xlab
    +

    Label for the x axis.

    + + +
    xlim
    +

    Plot range in x direction.

    + + +
    resplot
    +

    Should the residuals plotted against time or against +predicted values?

    + + +
    pop_curves
    +

    Per default, one population curve is drawn in case +population parameters are fitted by the model, e.g. for saem objects. +In case there is a covariate model, the behaviour depends on the value +of 'covariates'

    + + +
    pred_over
    +

    Named list of alternative predictions as obtained +from mkinpredict with a compatible mkinmod.

    + + +
    test_log_parms
    +

    Passed to mean_degparms in the case of an +mixed.mmkin object

    + + +
    conf.level
    +

    Passed to mean_degparms in the case of an +mixed.mmkin object

    + + +
    default_log_parms
    +

    Passed to mean_degparms in the case of an +mixed.mmkin object

    + + +
    ymax
    +

    Vector of maximum y axis values

    + + +
    maxabs
    +

    Maximum absolute value of the residuals. This is used for the +scaling of the y axis and defaults to "auto".

    + + +
    ncol.legend
    +

    Number of columns to use in the legend

    + + +
    nrow.legend
    +

    Number of rows to use in the legend

    + + +
    rel.height.legend
    +

    The relative height of the legend shown on top

    + + +
    rel.height.bottom
    +

    The relative height of the bottom plot row

    + + +
    pch_ds
    +

    Symbols to be used for plotting the data.

    + + +
    col_ds
    +

    Colors used for plotting the observed data and the +corresponding model prediction lines for the different datasets.

    + + +
    lty_ds
    +

    Line types to be used for the model predictions.

    + + +
    frame
    +

    Should a frame be drawn around the plots?

    + + +
    ...
    +

    Further arguments passed to plot.

    + +
    +
    +

    Value

    +

    The function is called for its side effect.

    +
    +
    +

    Note

    +

    Covariate models are currently only supported for saem.mmkin objects.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    ds <- lapply(experimental_data_for_UBA_2019[6:10],
    + function(x) x$data[c("name", "time", "value")])
    +names(ds) <- paste0("ds ", 6:10)
    +dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "A1"),
    +  A1 = mkinsub("SFO"), quiet = TRUE)
    +# \dontrun{
    +f <- mmkin(list("DFOP-SFO" = dfop_sfo), ds, quiet = TRUE)
    +plot(f[, 3:4], standardized = TRUE)
    +
    +
    +# For this fit we need to increase pnlsMaxiter, and we increase the
    +# tolerance in order to speed up the fit for this example evaluation
    +# It still takes 20 seconds to run
    +f_nlme <- nlme(f, control = list(pnlsMaxIter = 120, tolerance = 1e-3))
    +plot(f_nlme)
    +
    +
    +f_saem <- saem(f, transformations = "saemix")
    +plot(f_saem)
    +
    +
    +f_obs <- mmkin(list("DFOP-SFO" = dfop_sfo), ds, quiet = TRUE, error_model = "obs")
    +f_nlmix <- nlmix(f_obs)
    +#> Error in nlmix(f_obs): could not find function "nlmix"
    +plot(f_nlmix)
    +#> Error: object 'f_nlmix' not found
    +
    +# We can overlay the two variants if we generate predictions
    +pred_nlme <- mkinpredict(dfop_sfo,
    +  f_nlme$bparms.optim[-1],
    +  c(parent = f_nlme$bparms.optim[[1]], A1 = 0),
    +  seq(0, 180, by = 0.2))
    +plot(f_saem, pred_over = list(nlme = pred_nlme))
    +
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/plot.mkinfit-1.png b/docs/dev/reference/plot.mkinfit-1.png new file mode 100644 index 00000000..0a120916 Binary files /dev/null and b/docs/dev/reference/plot.mkinfit-1.png differ diff --git a/docs/dev/reference/plot.mkinfit-2.png b/docs/dev/reference/plot.mkinfit-2.png new file mode 100644 index 00000000..d3a39657 Binary files /dev/null and b/docs/dev/reference/plot.mkinfit-2.png differ diff --git a/docs/dev/reference/plot.mkinfit-3.png b/docs/dev/reference/plot.mkinfit-3.png new file mode 100644 index 00000000..3a74e51e Binary files /dev/null and b/docs/dev/reference/plot.mkinfit-3.png differ diff --git a/docs/dev/reference/plot.mkinfit-4.png b/docs/dev/reference/plot.mkinfit-4.png new file mode 100644 index 00000000..0027f3eb Binary files /dev/null and b/docs/dev/reference/plot.mkinfit-4.png differ diff --git a/docs/dev/reference/plot.mkinfit-5.png b/docs/dev/reference/plot.mkinfit-5.png new file mode 100644 index 00000000..9112cbb9 Binary files /dev/null and b/docs/dev/reference/plot.mkinfit-5.png differ diff --git a/docs/dev/reference/plot.mkinfit-6.png b/docs/dev/reference/plot.mkinfit-6.png new file mode 100644 index 00000000..6127d2f7 Binary files /dev/null and b/docs/dev/reference/plot.mkinfit-6.png differ diff --git a/docs/dev/reference/plot.mkinfit-7.png b/docs/dev/reference/plot.mkinfit-7.png new file mode 100644 index 00000000..2b92c212 Binary files /dev/null and b/docs/dev/reference/plot.mkinfit-7.png differ diff --git a/docs/dev/reference/plot.mkinfit.html b/docs/dev/reference/plot.mkinfit.html new file mode 100644 index 00000000..ffebd25d --- /dev/null +++ b/docs/dev/reference/plot.mkinfit.html @@ -0,0 +1,321 @@ + +Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Solves the differential equations with the optimised and fixed parameters +from a previous successful call to mkinfit and plots the +observed data together with the solution of the fitted model.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinfit'
    +plot(
    +  x,
    +  fit = x,
    +  obs_vars = names(fit$mkinmod$map),
    +  xlab = "Time",
    +  ylab = "Residue",
    +  xlim = range(fit$data$time),
    +  ylim = "default",
    +  col_obs = 1:length(obs_vars),
    +  pch_obs = col_obs,
    +  lty_obs = rep(1, length(obs_vars)),
    +  add = FALSE,
    +  legend = !add,
    +  show_residuals = FALSE,
    +  show_errplot = FALSE,
    +  maxabs = "auto",
    +  sep_obs = FALSE,
    +  rel.height.middle = 0.9,
    +  row_layout = FALSE,
    +  lpos = "topright",
    +  inset = c(0.05, 0.05),
    +  show_errmin = FALSE,
    +  errmin_digits = 3,
    +  frame = TRUE,
    +  ...
    +)
    +
    +plot_sep(
    +  fit,
    +  show_errmin = TRUE,
    +  show_residuals = ifelse(identical(fit$err_mod, "const"), TRUE, "standardized"),
    +  ...
    +)
    +
    +plot_res(
    +  fit,
    +  sep_obs = FALSE,
    +  show_errmin = sep_obs,
    +  standardized = ifelse(identical(fit$err_mod, "const"), FALSE, TRUE),
    +  ...
    +)
    +
    +plot_err(fit, sep_obs = FALSE, show_errmin = sep_obs, ...)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    Alias for fit introduced for compatibility with the generic S3 +method.

    + + +
    fit
    +

    An object of class mkinfit.

    + + +
    obs_vars
    +

    A character vector of names of the observed variables for +which the data and the model should be plotted. Defauls to all observed +variables in the model.

    + + +
    xlab
    +

    Label for the x axis.

    + + +
    ylab
    +

    Label for the y axis.

    + + +
    xlim
    +

    Plot range in x direction.

    + + +
    ylim
    +

    Plot range in y direction. If given as a list, plot ranges +for the different plot rows can be given for row layout.

    + + +
    col_obs
    +

    Colors used for plotting the observed data and the +corresponding model prediction lines.

    + + +
    pch_obs
    +

    Symbols to be used for plotting the data.

    + + +
    lty_obs
    +

    Line types to be used for the model predictions.

    + + +
    add
    +

    Should the plot be added to an existing plot?

    + + +
    legend
    +

    Should a legend be added to the plot?

    + + +
    show_residuals
    +

    Should residuals be shown? If only one plot of the +fits is shown, the residual plot is in the lower third of the plot. +Otherwise, i.e. if "sep_obs" is given, the residual plots will be located +to the right of the plots of the fitted curves. If this is set to +'standardized', a plot of the residuals divided by the standard deviation +given by the fitted error model will be shown.

    + + +
    show_errplot
    +

    Should squared residuals and the error model be shown? +If only one plot of the fits is shown, this plot is in the lower third of +the plot. Otherwise, i.e. if "sep_obs" is given, the residual plots will +be located to the right of the plots of the fitted curves.

    + + +
    maxabs
    +

    Maximum absolute value of the residuals. This is used for the +scaling of the y axis and defaults to "auto".

    + + +
    sep_obs
    +

    Should the observed variables be shown in separate subplots? +If yes, residual plots requested by "show_residuals" will be shown next +to, not below the plot of the fits.

    + + +
    rel.height.middle
    +

    The relative height of the middle plot, if more +than two rows of plots are shown.

    + + +
    row_layout
    +

    Should we use a row layout where the residual plot or the +error model plot is shown to the right?

    + + +
    lpos
    +

    Position(s) of the legend(s). Passed to legend as +the first argument. If not length one, this should be of the same length +as the obs_var argument.

    + + +
    inset
    +

    Passed to legend if applicable.

    + + +
    show_errmin
    +

    Should the FOCUS chi2 error value be shown in the upper +margin of the plot?

    + + +
    errmin_digits
    +

    The number of significant digits for rounding the FOCUS +chi2 error percentage.

    + + +
    frame
    +

    Should a frame be drawn around the plots?

    + + +
    ...
    +

    Further arguments passed to plot.

    + + +
    standardized
    +

    When calling 'plot_res', should the residuals be +standardized in the residual plot?

    + +
    +
    +

    Value

    +

    The function is called for its side effect.

    +
    +
    +

    Details

    +

    If the current plot device is a tikz device, then +latex is being used for the formatting of the chi2 error level, if +show_errmin = TRUE.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +# One parent compound, one metabolite, both single first order, path from
    +# parent to sink included
    +# \dontrun{
    +SFO_SFO <- mkinmod(parent = mkinsub("SFO", "m1", full = "Parent"),
    +                   m1 = mkinsub("SFO", full = "Metabolite M1" ))
    +#> Temporary DLL for differentials generated and loaded
    +fit <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +fit <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE, error_model = "tc")
    +#> Warning: Observations with value of zero were removed from the data
    +plot(fit)
    +
    +plot_res(fit)
    +
    +plot_res(fit, standardized = FALSE)
    +
    +plot_err(fit)
    +
    +
    +# Show the observed variables separately, with residuals
    +plot(fit, sep_obs = TRUE, show_residuals = TRUE, lpos = c("topright", "bottomright"),
    +     show_errmin = TRUE)
    +
    +
    +# The same can be obtained with less typing, using the convenience function plot_sep
    +plot_sep(fit, lpos = c("topright", "bottomright"))
    +
    +
    +# Show the observed variables separately, with the error model
    +plot(fit, sep_obs = TRUE, show_errplot = TRUE, lpos = c("topright", "bottomright"),
    +     show_errmin = TRUE)
    +
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/plot.mmkin-1.png b/docs/dev/reference/plot.mmkin-1.png new file mode 100644 index 00000000..58051871 Binary files /dev/null and b/docs/dev/reference/plot.mmkin-1.png differ diff --git a/docs/dev/reference/plot.mmkin-2.png b/docs/dev/reference/plot.mmkin-2.png new file mode 100644 index 00000000..eff04808 Binary files /dev/null and b/docs/dev/reference/plot.mmkin-2.png differ diff --git a/docs/dev/reference/plot.mmkin-3.png b/docs/dev/reference/plot.mmkin-3.png new file mode 100644 index 00000000..781c6351 Binary files /dev/null and b/docs/dev/reference/plot.mmkin-3.png differ diff --git a/docs/dev/reference/plot.mmkin-4.png b/docs/dev/reference/plot.mmkin-4.png new file mode 100644 index 00000000..ffbc6cab Binary files /dev/null and b/docs/dev/reference/plot.mmkin-4.png differ diff --git a/docs/dev/reference/plot.mmkin-5.png b/docs/dev/reference/plot.mmkin-5.png new file mode 100644 index 00000000..37bbac8b Binary files /dev/null and b/docs/dev/reference/plot.mmkin-5.png differ diff --git a/docs/dev/reference/plot.mmkin.html b/docs/dev/reference/plot.mmkin.html new file mode 100644 index 00000000..1f7907e9 --- /dev/null +++ b/docs/dev/reference/plot.mmkin.html @@ -0,0 +1,222 @@ + +Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    When x is a row selected from an mmkin object ([.mmkin), the +same model fitted for at least one dataset is shown. When it is a column, +the fit of at least one model to the same dataset is shown.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mmkin'
    +plot(
    +  x,
    +  main = "auto",
    +  legends = 1,
    +  resplot = c("time", "errmod"),
    +  ylab = "Residue",
    +  standardized = FALSE,
    +  show_errmin = TRUE,
    +  errmin_var = "All data",
    +  errmin_digits = 3,
    +  cex = 0.7,
    +  rel.height.middle = 0.9,
    +  ymax = "auto",
    +  ...
    +)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    An object of class mmkin, with either one row or one +column.

    + + +
    main
    +

    The main title placed on the outer margin of the plot.

    + + +
    legends
    +

    An index for the fits for which legends should be shown.

    + + +
    resplot
    +

    Should the residuals plotted against time, using +mkinresplot, or as squared residuals against predicted +values, with the error model, using mkinerrplot.

    + + +
    ylab
    +

    Label for the y axis.

    + + +
    standardized
    +

    Should the residuals be standardized? This option +is passed to mkinresplot, it only takes effect if +resplot = "time".

    + + +
    show_errmin
    +

    Should the chi2 error level be shown on top of the plots +to the left?

    + + +
    errmin_var
    +

    The variable for which the FOCUS chi2 error value should +be shown.

    + + +
    errmin_digits
    +

    The number of significant digits for rounding the FOCUS +chi2 error percentage.

    + + +
    cex
    +

    Passed to the plot functions and mtext.

    + + +
    rel.height.middle
    +

    The relative height of the middle plot, if more +than two rows of plots are shown.

    + + +
    ymax
    +

    Maximum y axis value for plot.mkinfit.

    + + +
    ...
    +

    Further arguments passed to plot.mkinfit and +mkinresplot.

    + +
    +
    +

    Value

    +

    The function is called for its side effect.

    +
    +
    +

    Details

    +

    If the current plot device is a tikz device, then +latex is being used for the formatting of the chi2 error level.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +  # \dontrun{
    +  # Only use one core not to offend CRAN checks
    +  fits <- mmkin(c("FOMC", "HS"),
    +                list("FOCUS B" = FOCUS_2006_B, "FOCUS C" = FOCUS_2006_C), # named list for titles
    +                cores = 1, quiet = TRUE, error_model = "tc")
    +#> Warning: Optimisation did not converge:
    +#> iteration limit reached without convergence (10)
    +  plot(fits[, "FOCUS C"])
    +
    +  plot(fits["FOMC", ])
    +
    +  plot(fits["FOMC", ], show_errmin = FALSE)
    +
    +
    +  # We can also plot a single fit, if we like the way plot.mmkin works, but then the plot
    +  # height should be smaller than the plot width (this is not possible for the html pages
    +  # generated by pkgdown, as far as I know).
    +  plot(fits["FOMC", "FOCUS C"]) # same as plot(fits[1, 2])
    +
    +
    +  # Show the error models
    +  plot(fits["FOMC", ], resplot = "errmod")
    +
    +  # }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/plot.nafta.html b/docs/dev/reference/plot.nafta.html new file mode 100644 index 00000000..16bf0942 --- /dev/null +++ b/docs/dev/reference/plot.nafta.html @@ -0,0 +1,128 @@ + +Plot the results of the three models used in the NAFTA scheme. — plot.nafta • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The plots are ordered with increasing complexity of the model in this +function (SFO, then IORE, then DFOP).

    +
    + +
    +

    Usage

    +
    # S3 method for class 'nafta'
    +plot(x, legend = FALSE, main = "auto", ...)
    +
    + +
    +

    Arguments

    + + +
    x
    +

    An object of class nafta.

    + + +
    legend
    +

    Should a legend be added?

    + + +
    main
    +

    Possibility to override the main title of the plot.

    + + +
    ...
    +

    Further arguments passed to plot.mmkin.

    + +
    +
    +

    Value

    +

    The function is called for its side effect.

    +
    +
    +

    Details

    +

    Calls plot.mmkin.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/plot_err.html b/docs/dev/reference/plot_err.html new file mode 100644 index 00000000..2885b160 --- /dev/null +++ b/docs/dev/reference/plot_err.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/plot_res.html b/docs/dev/reference/plot_res.html new file mode 100644 index 00000000..2885b160 --- /dev/null +++ b/docs/dev/reference/plot_res.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/plot_sep.html b/docs/dev/reference/plot_sep.html new file mode 100644 index 00000000..2885b160 --- /dev/null +++ b/docs/dev/reference/plot_sep.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.illparms.mhmkin.html b/docs/dev/reference/print.illparms.mhmkin.html new file mode 100644 index 00000000..efbcc181 --- /dev/null +++ b/docs/dev/reference/print.illparms.mhmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.illparms.mkinfit.html b/docs/dev/reference/print.illparms.mkinfit.html new file mode 100644 index 00000000..efbcc181 --- /dev/null +++ b/docs/dev/reference/print.illparms.mkinfit.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.illparms.mmkin.html b/docs/dev/reference/print.illparms.mmkin.html new file mode 100644 index 00000000..efbcc181 --- /dev/null +++ b/docs/dev/reference/print.illparms.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.illparms.saem.mmkin.html b/docs/dev/reference/print.illparms.saem.mmkin.html new file mode 100644 index 00000000..efbcc181 --- /dev/null +++ b/docs/dev/reference/print.illparms.saem.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.mhmkin.html b/docs/dev/reference/print.mhmkin.html new file mode 100644 index 00000000..19cc9c91 --- /dev/null +++ b/docs/dev/reference/print.mhmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.mixed.mmkin.html b/docs/dev/reference/print.mixed.mmkin.html new file mode 100644 index 00000000..7b45f95d --- /dev/null +++ b/docs/dev/reference/print.mixed.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.mkinds.html b/docs/dev/reference/print.mkinds.html new file mode 100644 index 00000000..69424352 --- /dev/null +++ b/docs/dev/reference/print.mkinds.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.mkindsg.html b/docs/dev/reference/print.mkindsg.html new file mode 100644 index 00000000..66f9a81d --- /dev/null +++ b/docs/dev/reference/print.mkindsg.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.mkinmod.html b/docs/dev/reference/print.mkinmod.html new file mode 100644 index 00000000..0ffb4f23 --- /dev/null +++ b/docs/dev/reference/print.mkinmod.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.mmkin.html b/docs/dev/reference/print.mmkin.html new file mode 100644 index 00000000..9ea1bd04 --- /dev/null +++ b/docs/dev/reference/print.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.multistart.html b/docs/dev/reference/print.multistart.html new file mode 100644 index 00000000..06f15f0c --- /dev/null +++ b/docs/dev/reference/print.multistart.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.nafta.html b/docs/dev/reference/print.nafta.html new file mode 100644 index 00000000..e9563e53 --- /dev/null +++ b/docs/dev/reference/print.nafta.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.nlme.mmkin.html b/docs/dev/reference/print.nlme.mmkin.html new file mode 100644 index 00000000..dc3bfe09 --- /dev/null +++ b/docs/dev/reference/print.nlme.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.saem.mmkin.html b/docs/dev/reference/print.saem.mmkin.html new file mode 100644 index 00000000..fb5a153f --- /dev/null +++ b/docs/dev/reference/print.saem.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.status.mhmkin.html b/docs/dev/reference/print.status.mhmkin.html new file mode 100644 index 00000000..9451cf16 --- /dev/null +++ b/docs/dev/reference/print.status.mhmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.status.mmkin.html b/docs/dev/reference/print.status.mmkin.html new file mode 100644 index 00000000..9451cf16 --- /dev/null +++ b/docs/dev/reference/print.status.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.summary.mkinfit.html b/docs/dev/reference/print.summary.mkinfit.html new file mode 100644 index 00000000..e8ff4c3c --- /dev/null +++ b/docs/dev/reference/print.summary.mkinfit.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.summary.mmkin.html b/docs/dev/reference/print.summary.mmkin.html new file mode 100644 index 00000000..2ec58ffd --- /dev/null +++ b/docs/dev/reference/print.summary.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.summary.nlme.mmkin.html b/docs/dev/reference/print.summary.nlme.mmkin.html new file mode 100644 index 00000000..b6c51558 --- /dev/null +++ b/docs/dev/reference/print.summary.nlme.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/print.summary.saem.mmkin.html b/docs/dev/reference/print.summary.saem.mmkin.html new file mode 100644 index 00000000..280587f2 --- /dev/null +++ b/docs/dev/reference/print.summary.saem.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/read_spreadsheet.html b/docs/dev/reference/read_spreadsheet.html new file mode 100644 index 00000000..d9c6ca2d --- /dev/null +++ b/docs/dev/reference/read_spreadsheet.html @@ -0,0 +1,155 @@ + +Read datasets and relevant meta information from a spreadsheet file — read_spreadsheet • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function imports one dataset from each sheet of a spreadsheet file. +These sheets are selected based on the contents of a sheet 'Datasets', with +a column called 'Dataset Number', containing numbers identifying the dataset +sheets to be read in. In the second column there must be a grouping +variable, which will often be named 'Soil'. Optionally, time normalization +factors can be given in columns named 'Temperature' and 'Moisture'.

    +
    + +
    +

    Usage

    +
    read_spreadsheet(
    +  path,
    +  valid_datasets = "all",
    +  parent_only = FALSE,
    +  normalize = TRUE
    +)
    +
    + +
    +

    Arguments

    + + +
    path
    +

    Absolute or relative path to the spreadsheet file

    + + +
    valid_datasets
    +

    Optional numeric index of the valid datasets, default is +to use all datasets

    + + +
    parent_only
    +

    Should only the parent data be used?

    + + +
    normalize
    +

    Should the time scale be normalized using temperature +and moisture normalisation factors in the sheet 'Datasets'?

    + +
    +
    +

    Details

    +

    There must be a sheet 'Compounds', with columns 'Name' and 'Acronym'. +The first row read after the header read in from this sheet is assumed +to contain name and acronym of the parent compound.

    +

    The dataset sheets should be named using the dataset numbers read in from +the 'Datasets' sheet, i.e. '1', '2', ... . In each dataset sheet, the name +of the observed variable (e.g. the acronym of the parent compound or +one of its transformation products) should be in the first column, +the time values should be in the second colum, and the observed value +in the third column.

    +

    In case relevant covariate data are available, they should be given +in a sheet 'Covariates', containing one line for each value of the grouping +variable specified in 'Datasets'. These values should be in the first +column and the column must have the same name as the second column in +'Datasets'. Covariates will be read in from columns four and higher. +Their names should preferably not contain special characters like spaces, +so they can be easily used for specifying covariate models.

    +

    A similar data structure is defined as the R6 class mkindsg, but +is probably more complicated to use.

    +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/reexports.html b/docs/dev/reference/reexports.html new file mode 100644 index 00000000..e0763155 --- /dev/null +++ b/docs/dev/reference/reexports.html @@ -0,0 +1,118 @@ + +Objects exported from other packages — reexports • mkin + Skip to contents + + +
    +
    +
    + +
    +

    These objects are imported from other packages. Follow the links +below to see their documentation.

    +
    lmtest
    +

    lrtest

    + + +
    nlme
    +

    intervals, nlme

    + + +
    + + + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/residuals.mkinfit.html b/docs/dev/reference/residuals.mkinfit.html new file mode 100644 index 00000000..cd5c7aff --- /dev/null +++ b/docs/dev/reference/residuals.mkinfit.html @@ -0,0 +1,121 @@ + +Extract residuals from an mkinfit model — residuals.mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Extract residuals from an mkinfit model

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinfit'
    +residuals(object, standardized = FALSE, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    A mkinfit object

    + + +
    standardized
    +

    Should the residuals be standardized by dividing by the +standard deviation obtained from the fitted error model?

    + + +
    ...
    +

    Not used

    + +
    + +
    +

    Examples

    +
    f <- mkinfit("DFOP", FOCUS_2006_C, quiet = TRUE)
    +residuals(f)
    +#> [1]  0.09726374 -0.13912142 -0.15351210  0.73388322 -0.08657004 -0.93204702
    +#> [7] -0.03269080  1.45347823 -0.88423697
    +residuals(f, standardized = TRUE)
    +#> [1]  0.13969917 -0.19981904 -0.22048826  1.05407091 -0.12433989 -1.33869208
    +#> [7] -0.04695355  2.08761977 -1.27002287
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/saem-1.png b/docs/dev/reference/saem-1.png new file mode 100644 index 00000000..1fa206c4 Binary files /dev/null and b/docs/dev/reference/saem-1.png differ diff --git a/docs/dev/reference/saem-2.png b/docs/dev/reference/saem-2.png new file mode 100644 index 00000000..e5c62c35 Binary files /dev/null and b/docs/dev/reference/saem-2.png differ diff --git a/docs/dev/reference/saem-3.png b/docs/dev/reference/saem-3.png new file mode 100644 index 00000000..09eb2d40 Binary files /dev/null and b/docs/dev/reference/saem-3.png differ diff --git a/docs/dev/reference/saem-4.png b/docs/dev/reference/saem-4.png new file mode 100644 index 00000000..87ebc56f Binary files /dev/null and b/docs/dev/reference/saem-4.png differ diff --git a/docs/dev/reference/saem.html b/docs/dev/reference/saem.html new file mode 100644 index 00000000..25eb03c7 --- /dev/null +++ b/docs/dev/reference/saem.html @@ -0,0 +1,731 @@ + +Fit nonlinear mixed models with SAEM — saem • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function uses saemix::saemix() as a backend for fitting nonlinear mixed +effects models created from mmkin row objects using the Stochastic Approximation +Expectation Maximisation algorithm (SAEM).

    +
    + +
    +

    Usage

    +
    saem(object, ...)
    +
    +# S3 method for class 'mmkin'
    +saem(
    +  object,
    +  transformations = c("mkin", "saemix"),
    +  error_model = "auto",
    +  degparms_start = numeric(),
    +  test_log_parms = TRUE,
    +  conf.level = 0.6,
    +  solution_type = "auto",
    +  covariance.model = "auto",
    +  omega.init = "auto",
    +  covariates = NULL,
    +  covariate_models = NULL,
    +  no_random_effect = NULL,
    +  error.init = c(1, 1),
    +  nbiter.saemix = c(300, 100),
    +  control = list(displayProgress = FALSE, print = FALSE, nbiter.saemix = nbiter.saemix,
    +    save = FALSE, save.graphs = FALSE),
    +  verbose = FALSE,
    +  quiet = FALSE,
    +  ...
    +)
    +
    +# S3 method for class 'saem.mmkin'
    +print(x, digits = max(3, getOption("digits") - 3), ...)
    +
    +saemix_model(
    +  object,
    +  solution_type = "auto",
    +  transformations = c("mkin", "saemix"),
    +  error_model = "auto",
    +  degparms_start = numeric(),
    +  covariance.model = "auto",
    +  no_random_effect = NULL,
    +  omega.init = "auto",
    +  covariates = NULL,
    +  covariate_models = NULL,
    +  error.init = numeric(),
    +  test_log_parms = FALSE,
    +  conf.level = 0.6,
    +  verbose = FALSE,
    +  ...
    +)
    +
    +saemix_data(object, covariates = NULL, verbose = FALSE, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mmkin row object containing several fits of the same +mkinmod model to different datasets

    + + +
    ...
    +

    Further parameters passed to saemix::saemixModel.

    + + +
    transformations
    +

    Per default, all parameter transformations are done +in mkin. If this argument is set to 'saemix', parameter transformations +are done in 'saemix' for the supported cases, i.e. (as of version 1.1.2) +SFO, FOMC, DFOP and HS without fixing parent_0, and SFO or DFOP with +one SFO metabolite.

    + + +
    error_model
    +

    Possibility to override the error model used in the mmkin object

    + + +
    degparms_start
    +

    Parameter values given as a named numeric vector will +be used to override the starting values obtained from the 'mmkin' object.

    + + +
    test_log_parms
    +

    If TRUE, an attempt is made to use more robust starting +values for population parameters fitted as log parameters in mkin (like +rate constants) by only considering rate constants that pass the t-test +when calculating mean degradation parameters using mean_degparms.

    + + +
    conf.level
    +

    Possibility to adjust the required confidence level +for parameter that are tested if requested by 'test_log_parms'.

    + + +
    solution_type
    +

    Possibility to specify the solution type in case the +automatic choice is not desired

    + + +
    covariance.model
    +

    Will be passed to saemix::saemixModel(). Per +default, uncorrelated random effects are specified for all degradation +parameters.

    + + +
    omega.init
    +

    Will be passed to saemix::saemixModel(). If using +mkin transformations and the default covariance model with optionally +excluded random effects, the variances of the degradation parameters +are estimated using mean_degparms, with testing of untransformed +log parameters for significant difference from zero. If not using +mkin transformations or a custom covariance model, the default +initialisation of saemix::saemixModel is used for omega.init.

    + + +
    covariates
    +

    A data frame with covariate data for use in +'covariate_models', with dataset names as row names.

    + + +
    covariate_models
    +

    A list containing linear model formulas with one explanatory +variable, i.e. of the type 'parameter ~ covariate'. Covariates must be available +in the 'covariates' data frame.

    + + +
    no_random_effect
    +

    Character vector of degradation parameters for +which there should be no variability over the groups. Only used +if the covariance model is not explicitly specified.

    + + +
    error.init
    +

    Will be passed to saemix::saemixModel().

    + + +
    nbiter.saemix
    +

    Convenience option to increase the number of +iterations

    + + +
    control
    +

    Passed to saemix::saemix.

    + + +
    verbose
    +

    Should we print information about created objects of +type saemix::SaemixModel and saemix::SaemixData?

    + + +
    quiet
    +

    Should we suppress the messages saemix prints at the beginning +and the end of the optimisation process?

    + + +
    x
    +

    An saem.mmkin object to print

    + + +
    digits
    +

    Number of digits to use for printing

    + +
    +
    +

    Value

    +

    An S3 object of class 'saem.mmkin', containing the fitted +saemix::SaemixObject as a list component named 'so'. The +object also inherits from 'mixed.mmkin'.

    +

    An saemix::SaemixModel object.

    +

    An saemix::SaemixData object.

    +
    +
    +

    Details

    +

    An mmkin row object is essentially a list of mkinfit objects that have been +obtained by fitting the same model to a list of datasets using mkinfit.

    +

    Starting values for the fixed effects (population mean parameters, argument +psi0 of saemix::saemixModel() are the mean values of the parameters found +using mmkin.

    +
    + + +
    +

    Examples

    +
    # \dontrun{
    +ds <- lapply(experimental_data_for_UBA_2019[6:10],
    + function(x) subset(x$data[c("name", "time", "value")]))
    +names(ds) <- paste("Dataset", 6:10)
    +f_mmkin_parent_p0_fixed <- mmkin("FOMC", ds,
    +  state.ini = c(parent = 100), fixed_initials = "parent", quiet = TRUE)
    +f_saem_p0_fixed <- saem(f_mmkin_parent_p0_fixed)
    +
    +f_mmkin_parent <- mmkin(c("SFO", "FOMC", "DFOP"), ds, quiet = TRUE)
    +f_saem_sfo <- saem(f_mmkin_parent["SFO", ])
    +f_saem_fomc <- saem(f_mmkin_parent["FOMC", ])
    +f_saem_dfop <- saem(f_mmkin_parent["DFOP", ])
    +anova(f_saem_sfo, f_saem_fomc, f_saem_dfop)
    +#> Data: 90 observations of 1 variable(s) grouped in 5 datasets
    +#> 
    +#>             npar    AIC    BIC     Lik
    +#> f_saem_sfo     5 624.33 622.38 -307.17
    +#> f_saem_fomc    7 467.85 465.11 -226.92
    +#> f_saem_dfop    9 493.76 490.24 -237.88
    +anova(f_saem_sfo, f_saem_dfop, test = TRUE)
    +#> Data: 90 observations of 1 variable(s) grouped in 5 datasets
    +#> 
    +#>             npar    AIC    BIC     Lik  Chisq Df Pr(>Chisq)    
    +#> f_saem_sfo     5 624.33 622.38 -307.17                         
    +#> f_saem_dfop    9 493.76 490.24 -237.88 138.57  4  < 2.2e-16 ***
    +#> ---
    +#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    +illparms(f_saem_dfop)
    +#> [1] "sd(g_qlogis)"
    +f_saem_dfop_red <- update(f_saem_dfop, no_random_effect = "g_qlogis")
    +anova(f_saem_dfop, f_saem_dfop_red, test = TRUE)
    +#> Data: 90 observations of 1 variable(s) grouped in 5 datasets
    +#> 
    +#>                 npar    AIC    BIC     Lik Chisq Df Pr(>Chisq)
    +#> f_saem_dfop_red    8 488.68 485.55 -236.34                    
    +#> f_saem_dfop        9 493.76 490.24 -237.88     0  1          1
    +
    +anova(f_saem_sfo, f_saem_fomc, f_saem_dfop)
    +#> Data: 90 observations of 1 variable(s) grouped in 5 datasets
    +#> 
    +#>             npar    AIC    BIC     Lik
    +#> f_saem_sfo     5 624.33 622.38 -307.17
    +#> f_saem_fomc    7 467.85 465.11 -226.92
    +#> f_saem_dfop    9 493.76 490.24 -237.88
    +# The returned saem.mmkin object contains an SaemixObject, therefore we can use
    +# functions from saemix
    +library(saemix)
    +#> Loading required package: npde
    +#> Package saemix, version 3.3, March 2024
    +#>   please direct bugs, questions and feedback to emmanuelle.comets@inserm.fr
    +#> 
    +#> Attaching package: ‘saemix’
    +#> The following objects are masked from ‘package:npde’:
    +#> 
    +#>     kurtosis, skewness
    +compare.saemix(f_saem_sfo$so, f_saem_fomc$so, f_saem_dfop$so)
    +#> Likelihoods calculated by importance sampling
    +#>        AIC      BIC
    +#> 1 624.3316 622.3788
    +#> 2 467.8472 465.1132
    +#> 3 493.7592 490.2441
    +plot(f_saem_fomc$so, plot.type = "convergence")
    +
    +plot(f_saem_fomc$so, plot.type = "individual.fit")
    +#> Simulating data using nsim = 1000 simulated datasets
    +#> Computing WRES and npde .
    +
    +plot(f_saem_fomc$so, plot.type = "npde")
    +#> Simulating data using nsim = 1000 simulated datasets
    +#> Computing WRES and npde .
    +#> Please use npdeSaemix to obtain VPC and npde
    +plot(f_saem_fomc$so, plot.type = "vpc")
    +
    +
    +f_mmkin_parent_tc <- update(f_mmkin_parent, error_model = "tc")
    +f_saem_fomc_tc <- saem(f_mmkin_parent_tc["FOMC", ])
    +anova(f_saem_fomc, f_saem_fomc_tc, test = TRUE)
    +#> Data: 90 observations of 1 variable(s) grouped in 5 datasets
    +#> 
    +#>                npar    AIC    BIC     Lik Chisq Df Pr(>Chisq)
    +#> f_saem_fomc       7 467.85 465.11 -226.92                    
    +#> f_saem_fomc_tc    8 469.90 466.77 -226.95     0  1          1
    +
    +sfo_sfo <- mkinmod(parent = mkinsub("SFO", "A1"),
    +  A1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +fomc_sfo <- mkinmod(parent = mkinsub("FOMC", "A1"),
    +  A1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "A1"),
    +  A1 = mkinsub("SFO"))
    +#> Temporary DLL for differentials generated and loaded
    +# The following fit uses analytical solutions for SFO-SFO and DFOP-SFO,
    +# and compiled ODEs for FOMC that are much slower
    +f_mmkin <- mmkin(list(
    +    "SFO-SFO" = sfo_sfo, "FOMC-SFO" = fomc_sfo, "DFOP-SFO" = dfop_sfo),
    +  ds, quiet = TRUE)
    +# saem fits of SFO-SFO and DFOP-SFO to these data take about five seconds
    +# each on this system, as we use analytical solutions written for saemix.
    +# When using the analytical solutions written for mkin this took around
    +# four minutes
    +f_saem_sfo_sfo <- saem(f_mmkin["SFO-SFO", ])
    +f_saem_dfop_sfo <- saem(f_mmkin["DFOP-SFO", ])
    +# We can use print, plot and summary methods to check the results
    +print(f_saem_dfop_sfo)
    +#> Kinetic nonlinear mixed-effects model fit by SAEM
    +#> Structural model:
    +#> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
    +#>            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
    +#>            * parent
    +#> d_A1/dt = + f_parent_to_A1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g)
    +#>            * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
    +#>            exp(-k2 * time))) * parent - k_A1 * A1
    +#> 
    +#> Data:
    +#> 170 observations of 2 variable(s) grouped in 5 datasets
    +#> 
    +#> Likelihood computed by importance sampling
    +#>     AIC   BIC logLik
    +#>   839.2 834.1 -406.6
    +#> 
    +#> Fitted parameters:
    +#>                    estimate    lower   upper
    +#> parent_0           93.70402 91.04104 96.3670
    +#> log_k_A1           -5.83760 -7.66452 -4.0107
    +#> f_parent_qlogis    -0.95718 -1.35955 -0.5548
    +#> log_k1             -2.35514 -3.39402 -1.3163
    +#> log_k2             -3.79634 -5.64009 -1.9526
    +#> g_qlogis           -0.02108 -0.66463  0.6225
    +#> a.1                 1.88191  1.66491  2.0989
    +#> SD.parent_0         2.81628  0.78922  4.8433
    +#> SD.log_k_A1         1.78751  0.42105  3.1540
    +#> SD.f_parent_qlogis  0.45016  0.16116  0.7391
    +#> SD.log_k1           1.06923  0.31676  1.8217
    +#> SD.log_k2           2.03768  0.70938  3.3660
    +#> SD.g_qlogis         0.44024 -0.09262  0.9731
    +plot(f_saem_dfop_sfo)
    +
    +summary(f_saem_dfop_sfo, data = TRUE)
    +#> saemix version used for fitting:      3.3 
    +#> mkin version used for pre-fitting:  1.2.10 
    +#> R version used for fitting:         4.4.2 
    +#> Date of fit:     Fri Feb 14 07:32:13 2025 
    +#> Date of summary: Fri Feb 14 07:32:13 2025 
    +#> 
    +#> Equations:
    +#> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
    +#>            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
    +#>            * parent
    +#> d_A1/dt = + f_parent_to_A1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g)
    +#>            * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
    +#>            exp(-k2 * time))) * parent - k_A1 * A1
    +#> 
    +#> Data:
    +#> 170 observations of 2 variable(s) grouped in 5 datasets
    +#> 
    +#> Model predictions using solution type analytical 
    +#> 
    +#> Fitted in 3.605 s
    +#> Using 300, 100 iterations and 10 chains
    +#> 
    +#> Variance model: Constant variance 
    +#> 
    +#> Starting values for degradation parameters:
    +#>        parent_0        log_k_A1 f_parent_qlogis          log_k1          log_k2 
    +#>         93.8102         -5.3734         -0.9711         -1.8799         -4.2708 
    +#>        g_qlogis 
    +#>          0.1356 
    +#> 
    +#> Fixed degradation parameter values:
    +#> None
    +#> 
    +#> Starting values for random effects (square root of initial entries in omega):
    +#>                 parent_0 log_k_A1 f_parent_qlogis log_k1 log_k2 g_qlogis
    +#> parent_0           4.941    0.000          0.0000  0.000  0.000   0.0000
    +#> log_k_A1           0.000    2.551          0.0000  0.000  0.000   0.0000
    +#> f_parent_qlogis    0.000    0.000          0.7251  0.000  0.000   0.0000
    +#> log_k1             0.000    0.000          0.0000  1.449  0.000   0.0000
    +#> log_k2             0.000    0.000          0.0000  0.000  2.228   0.0000
    +#> g_qlogis           0.000    0.000          0.0000  0.000  0.000   0.7814
    +#> 
    +#> Starting values for error model parameters:
    +#> a.1 
    +#>   1 
    +#> 
    +#> Results:
    +#> 
    +#> Likelihood computed by importance sampling
    +#>     AIC   BIC logLik
    +#>   839.2 834.1 -406.6
    +#> 
    +#> Optimised parameters:
    +#>                        est.    lower   upper
    +#> parent_0           93.70402 91.04104 96.3670
    +#> log_k_A1           -5.83760 -7.66452 -4.0107
    +#> f_parent_qlogis    -0.95718 -1.35955 -0.5548
    +#> log_k1             -2.35514 -3.39402 -1.3163
    +#> log_k2             -3.79634 -5.64009 -1.9526
    +#> g_qlogis           -0.02108 -0.66463  0.6225
    +#> a.1                 1.88191  1.66491  2.0989
    +#> SD.parent_0         2.81628  0.78922  4.8433
    +#> SD.log_k_A1         1.78751  0.42105  3.1540
    +#> SD.f_parent_qlogis  0.45016  0.16116  0.7391
    +#> SD.log_k1           1.06923  0.31676  1.8217
    +#> SD.log_k2           2.03768  0.70938  3.3660
    +#> SD.g_qlogis         0.44024 -0.09262  0.9731
    +#> 
    +#> Correlation: 
    +#>                 parnt_0 lg_k_A1 f_prnt_ log_k1  log_k2 
    +#> log_k_A1        -0.0147                                
    +#> f_parent_qlogis -0.0269  0.0573                        
    +#> log_k1           0.0263 -0.0011 -0.0040                
    +#> log_k2           0.0020  0.0065 -0.0002 -0.0776        
    +#> g_qlogis        -0.0248 -0.0180 -0.0004 -0.0903 -0.0603
    +#> 
    +#> Random effects:
    +#>                      est.    lower  upper
    +#> SD.parent_0        2.8163  0.78922 4.8433
    +#> SD.log_k_A1        1.7875  0.42105 3.1540
    +#> SD.f_parent_qlogis 0.4502  0.16116 0.7391
    +#> SD.log_k1          1.0692  0.31676 1.8217
    +#> SD.log_k2          2.0377  0.70938 3.3660
    +#> SD.g_qlogis        0.4402 -0.09262 0.9731
    +#> 
    +#> Variance model:
    +#>      est. lower upper
    +#> a.1 1.882 1.665 2.099
    +#> 
    +#> Backtransformed parameters:
    +#>                     est.     lower    upper
    +#> parent_0       93.704015 9.104e+01 96.36699
    +#> k_A1            0.002916 4.692e-04  0.01812
    +#> f_parent_to_A1  0.277443 2.043e-01  0.36475
    +#> k1              0.094880 3.357e-02  0.26813
    +#> k2              0.022453 3.553e-03  0.14191
    +#> g               0.494731 3.397e-01  0.65078
    +#> 
    +#> Resulting formation fractions:
    +#>                 ff
    +#> parent_A1   0.2774
    +#> parent_sink 0.7226
    +#> 
    +#> Estimated disappearance times:
    +#>         DT50   DT90 DT50back DT50_k1 DT50_k2
    +#> parent  14.0  72.38    21.79   7.306   30.87
    +#> A1     237.7 789.68       NA      NA      NA
    +#> 
    +#> Data:
    +#>          ds   name time observed predicted residual   std standardized
    +#>   Dataset 6 parent    0     97.2  95.70025  1.49975 1.882      0.79693
    +#>   Dataset 6 parent    0     96.4  95.70025  0.69975 1.882      0.37183
    +#>   Dataset 6 parent    3     71.1  71.44670 -0.34670 1.882     -0.18423
    +#>   Dataset 6 parent    3     69.2  71.44670 -2.24670 1.882     -1.19384
    +#>   Dataset 6 parent    6     58.1  56.59283  1.50717 1.882      0.80087
    +#>   Dataset 6 parent    6     56.6  56.59283  0.00717 1.882      0.00381
    +#>   Dataset 6 parent   10     44.4  44.56648 -0.16648 1.882     -0.08847
    +#>   Dataset 6 parent   10     43.4  44.56648 -1.16648 1.882     -0.61984
    +#>   Dataset 6 parent   20     33.3  29.76020  3.53980 1.882      1.88096
    +#>   Dataset 6 parent   20     29.2  29.76020 -0.56020 1.882     -0.29767
    +#>   Dataset 6 parent   34     17.6  19.39208 -1.79208 1.882     -0.95226
    +#>   Dataset 6 parent   34     18.0  19.39208 -1.39208 1.882     -0.73971
    +#>   Dataset 6 parent   55     10.5  10.55761 -0.05761 1.882     -0.03061
    +#>   Dataset 6 parent   55      9.3  10.55761 -1.25761 1.882     -0.66826
    +#>   Dataset 6 parent   90      4.5   3.84742  0.65258 1.882      0.34676
    +#>   Dataset 6 parent   90      4.7   3.84742  0.85258 1.882      0.45304
    +#>   Dataset 6 parent  112      3.0   2.03997  0.96003 1.882      0.51013
    +#>   Dataset 6 parent  112      3.4   2.03997  1.36003 1.882      0.72268
    +#>   Dataset 6 parent  132      2.3   1.14585  1.15415 1.882      0.61328
    +#>   Dataset 6 parent  132      2.7   1.14585  1.55415 1.882      0.82583
    +#>   Dataset 6     A1    3      4.3   4.86054 -0.56054 1.882     -0.29786
    +#>   Dataset 6     A1    3      4.6   4.86054 -0.26054 1.882     -0.13844
    +#>   Dataset 6     A1    6      7.0   7.74179 -0.74179 1.882     -0.39417
    +#>   Dataset 6     A1    6      7.2   7.74179 -0.54179 1.882     -0.28789
    +#>   Dataset 6     A1   10      8.2   9.94048 -1.74048 1.882     -0.92485
    +#>   Dataset 6     A1   10      8.0   9.94048 -1.94048 1.882     -1.03112
    +#>   Dataset 6     A1   20     11.0  12.19109 -1.19109 1.882     -0.63291
    +#>   Dataset 6     A1   20     13.7  12.19109  1.50891 1.882      0.80180
    +#>   Dataset 6     A1   34     11.5  13.10706 -1.60706 1.882     -0.85395
    +#>   Dataset 6     A1   34     12.7  13.10706 -0.40706 1.882     -0.21630
    +#>   Dataset 6     A1   55     14.9  13.06131  1.83869 1.882      0.97703
    +#>   Dataset 6     A1   55     14.5  13.06131  1.43869 1.882      0.76448
    +#>   Dataset 6     A1   90     12.1  11.54495  0.55505 1.882      0.29494
    +#>   Dataset 6     A1   90     12.3  11.54495  0.75505 1.882      0.40122
    +#>   Dataset 6     A1  112      9.9  10.31533 -0.41533 1.882     -0.22070
    +#>   Dataset 6     A1  112     10.2  10.31533 -0.11533 1.882     -0.06128
    +#>   Dataset 6     A1  132      8.8   9.20222 -0.40222 1.882     -0.21373
    +#>   Dataset 6     A1  132      7.8   9.20222 -1.40222 1.882     -0.74510
    +#>   Dataset 7 parent    0     93.6  90.82357  2.77643 1.882      1.47532
    +#>   Dataset 7 parent    0     92.3  90.82357  1.47643 1.882      0.78453
    +#>   Dataset 7 parent    3     87.0  84.73448  2.26552 1.882      1.20384
    +#>   Dataset 7 parent    3     82.2  84.73448 -2.53448 1.882     -1.34675
    +#>   Dataset 7 parent    7     74.0  77.65013 -3.65013 1.882     -1.93958
    +#>   Dataset 7 parent    7     73.9  77.65013 -3.75013 1.882     -1.99272
    +#>   Dataset 7 parent   14     64.2  67.60639 -3.40639 1.882     -1.81007
    +#>   Dataset 7 parent   14     69.5  67.60639  1.89361 1.882      1.00621
    +#>   Dataset 7 parent   30     54.0  52.53663  1.46337 1.882      0.77760
    +#>   Dataset 7 parent   30     54.6  52.53663  2.06337 1.882      1.09642
    +#>   Dataset 7 parent   60     41.1  39.42728  1.67272 1.882      0.88884
    +#>   Dataset 7 parent   60     38.4  39.42728 -1.02728 1.882     -0.54587
    +#>   Dataset 7 parent   90     32.5  33.76360 -1.26360 1.882     -0.67144
    +#>   Dataset 7 parent   90     35.5  33.76360  1.73640 1.882      0.92268
    +#>   Dataset 7 parent  120     28.1  30.39975 -2.29975 1.882     -1.22203
    +#>   Dataset 7 parent  120     29.0  30.39975 -1.39975 1.882     -0.74379
    +#>   Dataset 7 parent  180     26.5  25.62379  0.87621 1.882      0.46559
    +#>   Dataset 7 parent  180     27.6  25.62379  1.97621 1.882      1.05010
    +#>   Dataset 7     A1    3      3.9   2.70005  1.19995 1.882      0.63762
    +#>   Dataset 7     A1    3      3.1   2.70005  0.39995 1.882      0.21252
    +#>   Dataset 7     A1    7      6.9   5.83475  1.06525 1.882      0.56605
    +#>   Dataset 7     A1    7      6.6   5.83475  0.76525 1.882      0.40663
    +#>   Dataset 7     A1   14     10.4  10.26142  0.13858 1.882      0.07364
    +#>   Dataset 7     A1   14      8.3  10.26142 -1.96142 1.882     -1.04225
    +#>   Dataset 7     A1   30     14.4  16.82999 -2.42999 1.882     -1.29123
    +#>   Dataset 7     A1   30     13.7  16.82999 -3.12999 1.882     -1.66319
    +#>   Dataset 7     A1   60     22.1  22.32486 -0.22486 1.882     -0.11949
    +#>   Dataset 7     A1   60     22.3  22.32486 -0.02486 1.882     -0.01321
    +#>   Dataset 7     A1   90     27.5  24.45927  3.04073 1.882      1.61576
    +#>   Dataset 7     A1   90     25.4  24.45927  0.94073 1.882      0.49988
    +#>   Dataset 7     A1  120     28.0  25.54862  2.45138 1.882      1.30260
    +#>   Dataset 7     A1  120     26.6  25.54862  1.05138 1.882      0.55868
    +#>   Dataset 7     A1  180     25.8  26.82277 -1.02277 1.882     -0.54347
    +#>   Dataset 7     A1  180     25.3  26.82277 -1.52277 1.882     -0.80916
    +#>   Dataset 8 parent    0     91.9  91.16791  0.73209 1.882      0.38901
    +#>   Dataset 8 parent    0     90.8  91.16791 -0.36791 1.882     -0.19550
    +#>   Dataset 8 parent    1     64.9  67.58358 -2.68358 1.882     -1.42598
    +#>   Dataset 8 parent    1     66.2  67.58358 -1.38358 1.882     -0.73520
    +#>   Dataset 8 parent    3     43.5  41.62086  1.87914 1.882      0.99853
    +#>   Dataset 8 parent    3     44.1  41.62086  2.47914 1.882      1.31735
    +#>   Dataset 8 parent    8     18.3  19.60116 -1.30116 1.882     -0.69140
    +#>   Dataset 8 parent    8     18.1  19.60116 -1.50116 1.882     -0.79768
    +#>   Dataset 8 parent   14     10.2  10.63101 -0.43101 1.882     -0.22903
    +#>   Dataset 8 parent   14     10.8  10.63101  0.16899 1.882      0.08980
    +#>   Dataset 8 parent   27      4.9   3.12435  1.77565 1.882      0.94354
    +#>   Dataset 8 parent   27      3.3   3.12435  0.17565 1.882      0.09334
    +#>   Dataset 8 parent   48      1.6   0.43578  1.16422 1.882      0.61864
    +#>   Dataset 8 parent   48      1.5   0.43578  1.06422 1.882      0.56550
    +#>   Dataset 8 parent   70      1.1   0.05534  1.04466 1.882      0.55510
    +#>   Dataset 8 parent   70      0.9   0.05534  0.84466 1.882      0.44883
    +#>   Dataset 8     A1    1      9.6   7.63450  1.96550 1.882      1.04442
    +#>   Dataset 8     A1    1      7.7   7.63450  0.06550 1.882      0.03481
    +#>   Dataset 8     A1    3     15.0  15.52593 -0.52593 1.882     -0.27947
    +#>   Dataset 8     A1    3     15.1  15.52593 -0.42593 1.882     -0.22633
    +#>   Dataset 8     A1    8     21.2  20.32192  0.87808 1.882      0.46659
    +#>   Dataset 8     A1    8     21.1  20.32192  0.77808 1.882      0.41345
    +#>   Dataset 8     A1   14     19.7  20.09721 -0.39721 1.882     -0.21107
    +#>   Dataset 8     A1   14     18.9  20.09721 -1.19721 1.882     -0.63617
    +#>   Dataset 8     A1   27     17.5  16.37477  1.12523 1.882      0.59792
    +#>   Dataset 8     A1   27     15.9  16.37477 -0.47477 1.882     -0.25228
    +#>   Dataset 8     A1   48      9.5  10.13141 -0.63141 1.882     -0.33551
    +#>   Dataset 8     A1   48      9.8  10.13141 -0.33141 1.882     -0.17610
    +#>   Dataset 8     A1   70      6.2   5.81827  0.38173 1.882      0.20284
    +#>   Dataset 8     A1   70      6.1   5.81827  0.28173 1.882      0.14970
    +#>   Dataset 9 parent    0     99.8  97.48728  2.31272 1.882      1.22892
    +#>   Dataset 9 parent    0     98.3  97.48728  0.81272 1.882      0.43186
    +#>   Dataset 9 parent    1     77.1  79.29476 -2.19476 1.882     -1.16624
    +#>   Dataset 9 parent    1     77.2  79.29476 -2.09476 1.882     -1.11310
    +#>   Dataset 9 parent    3     59.0  55.67060  3.32940 1.882      1.76915
    +#>   Dataset 9 parent    3     58.1  55.67060  2.42940 1.882      1.29092
    +#>   Dataset 9 parent    8     27.4  31.57871 -4.17871 1.882     -2.22046
    +#>   Dataset 9 parent    8     29.2  31.57871 -2.37871 1.882     -1.26398
    +#>   Dataset 9 parent   14     19.1  22.51546 -3.41546 1.882     -1.81489
    +#>   Dataset 9 parent   14     29.6  22.51546  7.08454 1.882      3.76454
    +#>   Dataset 9 parent   27     10.1  14.09074 -3.99074 1.882     -2.12057
    +#>   Dataset 9 parent   27     18.2  14.09074  4.10926 1.882      2.18355
    +#>   Dataset 9 parent   48      4.5   6.95747 -2.45747 1.882     -1.30584
    +#>   Dataset 9 parent   48      9.1   6.95747  2.14253 1.882      1.13848
    +#>   Dataset 9 parent   70      2.3   3.32472 -1.02472 1.882     -0.54451
    +#>   Dataset 9 parent   70      2.9   3.32472 -0.42472 1.882     -0.22569
    +#>   Dataset 9 parent   91      2.0   1.64300  0.35700 1.882      0.18970
    +#>   Dataset 9 parent   91      1.8   1.64300  0.15700 1.882      0.08343
    +#>   Dataset 9 parent  120      2.0   0.62073  1.37927 1.882      0.73291
    +#>   Dataset 9 parent  120      2.2   0.62073  1.57927 1.882      0.83918
    +#>   Dataset 9     A1    1      4.2   3.64568  0.55432 1.882      0.29455
    +#>   Dataset 9     A1    1      3.9   3.64568  0.25432 1.882      0.13514
    +#>   Dataset 9     A1    3      7.4   8.30173 -0.90173 1.882     -0.47916
    +#>   Dataset 9     A1    3      7.9   8.30173 -0.40173 1.882     -0.21347
    +#>   Dataset 9     A1    8     14.5  12.71589  1.78411 1.882      0.94803
    +#>   Dataset 9     A1    8     13.7  12.71589  0.98411 1.882      0.52293
    +#>   Dataset 9     A1   14     14.2  13.90452  0.29548 1.882      0.15701
    +#>   Dataset 9     A1   14     12.2  13.90452 -1.70452 1.882     -0.90574
    +#>   Dataset 9     A1   27     13.7  14.15523 -0.45523 1.882     -0.24190
    +#>   Dataset 9     A1   27     13.2  14.15523 -0.95523 1.882     -0.50759
    +#>   Dataset 9     A1   48     13.6  13.31038  0.28962 1.882      0.15389
    +#>   Dataset 9     A1   48     15.4  13.31038  2.08962 1.882      1.11037
    +#>   Dataset 9     A1   70     10.4  11.85965 -1.45965 1.882     -0.77562
    +#>   Dataset 9     A1   70     11.6  11.85965 -0.25965 1.882     -0.13797
    +#>   Dataset 9     A1   91     10.0  10.36294 -0.36294 1.882     -0.19286
    +#>   Dataset 9     A1   91      9.5  10.36294 -0.86294 1.882     -0.45855
    +#>   Dataset 9     A1  120      9.1   8.43003  0.66997 1.882      0.35601
    +#>   Dataset 9     A1  120      9.0   8.43003  0.56997 1.882      0.30287
    +#>  Dataset 10 parent    0     96.1  93.95603  2.14397 1.882      1.13925
    +#>  Dataset 10 parent    0     94.3  93.95603  0.34397 1.882      0.18278
    +#>  Dataset 10 parent    8     73.9  77.70592 -3.80592 1.882     -2.02237
    +#>  Dataset 10 parent    8     73.9  77.70592 -3.80592 1.882     -2.02237
    +#>  Dataset 10 parent   14     69.4  70.04570 -0.64570 1.882     -0.34311
    +#>  Dataset 10 parent   14     73.1  70.04570  3.05430 1.882      1.62298
    +#>  Dataset 10 parent   21     65.6  64.01710  1.58290 1.882      0.84111
    +#>  Dataset 10 parent   21     65.3  64.01710  1.28290 1.882      0.68170
    +#>  Dataset 10 parent   41     55.9  54.98434  0.91566 1.882      0.48656
    +#>  Dataset 10 parent   41     54.4  54.98434 -0.58434 1.882     -0.31050
    +#>  Dataset 10 parent   63     47.0  49.87137 -2.87137 1.882     -1.52577
    +#>  Dataset 10 parent   63     49.3  49.87137 -0.57137 1.882     -0.30361
    +#>  Dataset 10 parent   91     44.7  45.06727 -0.36727 1.882     -0.19516
    +#>  Dataset 10 parent   91     46.7  45.06727  1.63273 1.882      0.86759
    +#>  Dataset 10 parent  120     42.1  40.76402  1.33598 1.882      0.70991
    +#>  Dataset 10 parent  120     41.3  40.76402  0.53598 1.882      0.28481
    +#>  Dataset 10     A1    8      3.3   4.14599 -0.84599 1.882     -0.44954
    +#>  Dataset 10     A1    8      3.4   4.14599 -0.74599 1.882     -0.39640
    +#>  Dataset 10     A1   14      3.9   6.08478 -2.18478 1.882     -1.16093
    +#>  Dataset 10     A1   14      2.9   6.08478 -3.18478 1.882     -1.69231
    +#>  Dataset 10     A1   21      6.4   7.59411 -1.19411 1.882     -0.63452
    +#>  Dataset 10     A1   21      7.2   7.59411 -0.39411 1.882     -0.20942
    +#>  Dataset 10     A1   41      9.1   9.78292 -0.68292 1.882     -0.36289
    +#>  Dataset 10     A1   41      8.5   9.78292 -1.28292 1.882     -0.68171
    +#>  Dataset 10     A1   63     11.7  10.93274  0.76726 1.882      0.40770
    +#>  Dataset 10     A1   63     12.0  10.93274  1.06726 1.882      0.56711
    +#>  Dataset 10     A1   91     13.3  11.93986  1.36014 1.882      0.72274
    +#>  Dataset 10     A1   91     13.2  11.93986  1.26014 1.882      0.66961
    +#>  Dataset 10     A1  120     14.3  12.79238  1.50762 1.882      0.80111
    +#>  Dataset 10     A1  120     12.1  12.79238 -0.69238 1.882     -0.36791
    +
    +# The following takes about 6 minutes
    +f_saem_dfop_sfo_deSolve <- saem(f_mmkin["DFOP-SFO", ], solution_type = "deSolve",
    +  nbiter.saemix = c(200, 80))
    +#> DINTDY-  T (=R1) illegal      
    +#> In above message, R1 = 70
    +#>  
    +#>       T not in interval TCUR - HU (= R1) to TCUR (=R2)      
    +#> In above message, R1 = 53.1042, R2 = 56.6326
    +#>  
    +#> DINTDY-  T (=R1) illegal      
    +#> In above message, R1 = 91
    +#>  
    +#>       T not in interval TCUR - HU (= R1) to TCUR (=R2)      
    +#> In above message, R1 = 53.1042, R2 = 56.6326
    +#>  
    +#> DLSODA-  Trouble in DINTDY.  ITASK = I1, TOUT = R1
    +#> In above message, I1 = 1
    +#>  
    +#> In above message, R1 = 91
    +#>  
    +#> Error in deSolve::lsoda(y = odeini, times = outtimes, func = lsoda_func,  : 
    +#>   illegal input detected before taking any integration steps - see written message
    +
    +#anova(
    +#  f_saem_dfop_sfo,
    +#  f_saem_dfop_sfo_deSolve))
    +
    +# If the model supports it, we can also use eigenvalue based solutions, which
    +# take a similar amount of time
    +#f_saem_sfo_sfo_eigen <- saem(f_mmkin["SFO-SFO", ], solution_type = "eigen",
    +#  control = list(nbiter.saemix = c(200, 80), nbdisplay = 10))
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/saem.mmkin.html b/docs/dev/reference/saem.mmkin.html new file mode 100644 index 00000000..fb5a153f --- /dev/null +++ b/docs/dev/reference/saem.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/saemix_data.html b/docs/dev/reference/saemix_data.html new file mode 100644 index 00000000..fb5a153f --- /dev/null +++ b/docs/dev/reference/saemix_data.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/saemix_model.html b/docs/dev/reference/saemix_model.html new file mode 100644 index 00000000..fb5a153f --- /dev/null +++ b/docs/dev/reference/saemix_model.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/schaefer07_complex_case-1.png b/docs/dev/reference/schaefer07_complex_case-1.png new file mode 100644 index 00000000..4a44d324 Binary files /dev/null and b/docs/dev/reference/schaefer07_complex_case-1.png differ diff --git a/docs/dev/reference/schaefer07_complex_case.html b/docs/dev/reference/schaefer07_complex_case.html new file mode 100644 index 00000000..7b54053f --- /dev/null +++ b/docs/dev/reference/schaefer07_complex_case.html @@ -0,0 +1,175 @@ + +Metabolism data set used for checking the software quality of KinGUI — schaefer07_complex_case • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This dataset was used for a comparison of KinGUI and ModelMaker to check the + software quality of KinGUI in the original publication (Schäfer et al., 2007). + The results from the fitting are also included.

    +
    + +
    +

    Usage

    +
    schaefer07_complex_case
    +
    + +
    +

    Format

    +

    The data set is a data frame with 8 observations on the following 6 variables.

    time
    +

    a numeric vector

    + +
    parent
    +

    a numeric vector

    + +
    A1
    +

    a numeric vector

    + +
    B1
    +

    a numeric vector

    + +
    C1
    +

    a numeric vector

    + +
    A2
    +

    a numeric vector

    + + +

    The results are a data frame with 14 results for different parameter values

    +
    +
    +

    References

    +

    Schäfer D, Mikolasch B, Rainbird P and Harvey B (2007). KinGUI: a new kinetic + software tool for evaluations according to FOCUS degradation kinetics. In: Del + Re AAM, Capri E, Fragoulis G and Trevisan M (Eds.). Proceedings of the XIII + Symposium Pesticide Chemistry, Piacenza, 2007, p. 916-923.

    +
    + +
    +

    Examples

    +
    data <- mkin_wide_to_long(schaefer07_complex_case, time = "time")
    +model <- mkinmod(
    +  parent = list(type = "SFO", to = c("A1", "B1", "C1"), sink = FALSE),
    +  A1 = list(type = "SFO", to = "A2"),
    +  B1 = list(type = "SFO"),
    +  C1 = list(type = "SFO"),
    +  A2 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +  # \dontrun{
    +    fit <- mkinfit(model, data, quiet = TRUE)
    +    plot(fit)
    +
    +    endpoints(fit)
    +#> $ff
    +#>   parent_A1   parent_B1   parent_C1 parent_sink       A1_A2     A1_sink 
    +#>   0.3809618   0.1954668   0.4235714   0.0000000   0.4479540   0.5520460 
    +#> 
    +#> $distimes
    +#>            DT50      DT90
    +#> parent 13.95078  46.34349
    +#> A1     49.75347 165.27745
    +#> B1     37.26905 123.80511
    +#> C1     11.23129  37.30955
    +#> A2     28.50690  94.69789
    +#> 
    +  # }
    + # Compare with the results obtained in the original publication
    + print(schaefer07_complex_results)
    +#>         compound          parameter  KinGUI ModelMaker deviation
    +#> 1         parent   degradation rate  0.0496     0.0506       2.0
    +#> 2         parent               DT50 13.9900    13.6900       2.2
    +#> 3  metabolite A1 formation fraction  0.3803     0.3696       2.9
    +#> 4  metabolite A1   degradation rate  0.0139     0.0136       2.2
    +#> 5  metabolite A1               DT50 49.9600    50.8900       1.8
    +#> 6  metabolite B1 formation fraction  0.1866     0.1818       2.6
    +#> 7  metabolite B1   degradation rate  0.0175     0.0172       1.7
    +#> 8  metabolite B1               DT50 39.6100    40.2400       1.6
    +#> 9  metabolite C1 formation fraction  0.4331     0.4486       3.5
    +#> 10 metabolite C1   degradation rate  0.0638     0.0700       8.9
    +#> 11 metabolite C1               DT50 10.8700     9.9000       9.8
    +#> 12 metabolite A2 formation fraction  0.4529     0.4559       0.7
    +#> 13 metabolite A2   degradation rate  0.0245     0.0244       0.4
    +#> 14 metabolite A2               DT50 28.2400    28.4500       0.7
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/schaefer07_complex_results.html b/docs/dev/reference/schaefer07_complex_results.html new file mode 100644 index 00000000..d2396bcf --- /dev/null +++ b/docs/dev/reference/schaefer07_complex_results.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/set_nd_nq.html b/docs/dev/reference/set_nd_nq.html new file mode 100644 index 00000000..c282b58d --- /dev/null +++ b/docs/dev/reference/set_nd_nq.html @@ -0,0 +1,234 @@ + +Set non-detects and unquantified values in residue series without replicates — set_nd_nq • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function automates replacing unquantified values in residue time and +depth series. For time series, the function performs part of the residue +processing proposed in the FOCUS kinetics guidance for parent compounds +and metabolites. For two-dimensional residue series over time and depth, +it automates the proposal of Boesten et al (2015).

    +
    + +
    +

    Usage

    +
    set_nd_nq(res_raw, lod, loq = NA, time_zero_presence = FALSE)
    +
    +set_nd_nq_focus(
    +  res_raw,
    +  lod,
    +  loq = NA,
    +  set_first_sample_nd = TRUE,
    +  first_sample_nd_value = 0,
    +  ignore_below_loq_after_first_nd = TRUE
    +)
    +
    + +
    +

    Arguments

    + + +
    res_raw
    +

    Character vector of a residue time series, or matrix of +residue values with rows representing depth profiles for a specific sampling +time, and columns representing time series of residues at the same depth. +Values below the limit of detection (lod) have to be coded as "nd", values +between the limit of detection and the limit of quantification, if any, have +to be coded as "nq". Samples not analysed have to be coded as "na". All +values that are not "na", "nd" or "nq" have to be coercible to numeric

    + + +
    lod
    +

    Limit of detection (numeric)

    + + +
    loq
    +

    Limit of quantification(numeric). Must be specified if the FOCUS rule to +stop after the first non-detection is to be applied

    + + +
    time_zero_presence
    +

    Do we assume that residues occur at time zero? +This only affects samples from the first sampling time that have been +reported as "nd" (not detected).

    + + +
    set_first_sample_nd
    +

    Should the first sample be set to "first_sample_nd_value" +in case it is a non-detection?

    + + +
    first_sample_nd_value
    +

    Value to be used for the first sample if it is a non-detection

    + + +
    ignore_below_loq_after_first_nd
    +

    Should we ignore values below the LOQ after the first +non-detection that occurs after the quantified values?

    + +
    +
    +

    Value

    +

    A numeric vector, if a vector was supplied, or a numeric matrix otherwise

    +
    +
    +

    Functions

    + +
    • set_nd_nq_focus(): Set non-detects in residue time series according to FOCUS rules

    • +
    +
    +

    References

    +

    Boesten, J. J. T. I., van der Linden, A. M. A., Beltman, W. H. +J. and Pol, J. W. (2015). Leaching of plant protection products and their +transformation products; Proposals for improving the assessment of leaching +to groundwater in the Netherlands — Version 2. Alterra report 2630, Alterra +Wageningen UR (University & Research centre)

    +

    FOCUS (2014) Generic Guidance for Estimating Persistence and Degradation +Kinetics from Environmental Fate Studies on Pesticides in EU Registration, Version 1.1, +18 December 2014, p. 251

    +
    + +
    +

    Examples

    +
    # FOCUS (2014) p. 75/76 and 131/132
    +parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd")
    +set_nd_nq(parent_1, 0.02)
    +#>  [1] 0.12 0.09 0.05 0.03 0.01   NA   NA   NA   NA   NA
    +parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd")
    +set_nd_nq(parent_2, 0.02)
    +#>  [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.03 0.01   NA   NA
    +set_nd_nq_focus(parent_2, 0.02, loq = 0.05)
    +#>  [1] 0.12 0.09 0.05 0.03 0.01   NA   NA   NA   NA   NA
    +parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd")
    +set_nd_nq(parent_3, 0.02)
    +#>  [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.06 0.01   NA   NA
    +set_nd_nq_focus(parent_3, 0.02, loq = 0.05)
    +#>  [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.06 0.01   NA   NA
    +metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd")
    +set_nd_nq(metabolite, 0.02)
    +#>  [1]   NA   NA 0.01 0.03 0.06 0.10 0.11 0.10 0.09 0.05 0.03 0.01   NA
    +set_nd_nq_focus(metabolite, 0.02, 0.05)
    +#>  [1] 0.00   NA 0.01 0.03 0.06 0.10 0.11 0.10 0.09 0.05 0.03 0.01   NA
    +#
    +# Boesten et al. (2015), p. 57/58
    +table_8 <- matrix(
    +  c(10, 10, rep("nd", 4),
    +    10, 10, rep("nq", 2), rep("nd", 2),
    +    10, 10, 10, "nq", "nd", "nd",
    +    "nq", 10, "nq", rep("nd", 3),
    +    "nd", "nq", "nq", rep("nd", 3),
    +    rep("nd", 6), rep("nd", 6)),
    +  ncol = 6, byrow = TRUE)
    +set_nd_nq(table_8, 0.5, 1.5, time_zero_presence = TRUE)
    +#>       [,1]  [,2]  [,3] [,4] [,5] [,6]
    +#> [1,] 10.00 10.00  0.25 0.25   NA   NA
    +#> [2,] 10.00 10.00  1.00 1.00 0.25   NA
    +#> [3,] 10.00 10.00 10.00 1.00 0.25   NA
    +#> [4,]  1.00 10.00  1.00 0.25   NA   NA
    +#> [5,]  0.25  1.00  1.00 0.25   NA   NA
    +#> [6,]    NA  0.25  0.25   NA   NA   NA
    +#> [7,]    NA    NA    NA   NA   NA   NA
    +table_10 <- matrix(
    +  c(10, 10, rep("nd", 4),
    +    10, 10, rep("nd", 4),
    +    10, 10, 10, rep("nd", 3),
    +    "nd", 10, rep("nd", 4),
    +    rep("nd", 18)),
    +  ncol = 6, byrow = TRUE)
    +set_nd_nq(table_10, 0.5, time_zero_presence = TRUE)
    +#>       [,1]  [,2]  [,3] [,4] [,5] [,6]
    +#> [1,] 10.00 10.00  0.25   NA   NA   NA
    +#> [2,] 10.00 10.00  0.25   NA   NA   NA
    +#> [3,] 10.00 10.00 10.00 0.25   NA   NA
    +#> [4,]  0.25 10.00  0.25   NA   NA   NA
    +#> [5,]    NA  0.25    NA   NA   NA   NA
    +#> [6,]    NA    NA    NA   NA   NA   NA
    +#> [7,]    NA    NA    NA   NA   NA   NA
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/set_nd_nq_focus.html b/docs/dev/reference/set_nd_nq_focus.html new file mode 100644 index 00000000..7a1908a6 --- /dev/null +++ b/docs/dev/reference/set_nd_nq_focus.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/sigma_twocomp-1.png b/docs/dev/reference/sigma_twocomp-1.png new file mode 100644 index 00000000..89500ee7 Binary files /dev/null and b/docs/dev/reference/sigma_twocomp-1.png differ diff --git a/docs/dev/reference/sigma_twocomp.html b/docs/dev/reference/sigma_twocomp.html new file mode 100644 index 00000000..12af9e8a --- /dev/null +++ b/docs/dev/reference/sigma_twocomp.html @@ -0,0 +1,169 @@ + +Two-component error model — sigma_twocomp • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Function describing the standard deviation of the measurement error in +dependence of the measured value \(y\):

    +
    + +
    +

    Usage

    +
    sigma_twocomp(y, sigma_low, rsd_high)
    +
    + +
    +

    Arguments

    + + +
    y
    +

    The magnitude of the observed value

    + + +
    sigma_low
    +

    The asymptotic minimum of the standard deviation for low +observed values

    + + +
    rsd_high
    +

    The coefficient describing the increase of the standard +deviation with the magnitude of the observed value

    + +
    +
    +

    Value

    +

    The standard deviation of the response variable.

    +
    +
    +

    Details

    +

    $$\sigma = \sqrt{ \sigma_{low}^2 + y^2 * {rsd}_{high}^2}$$ sigma = +sqrt(sigma_low^2 + y^2 * rsd_high^2)

    +

    This is the error model used for example by Werner et al. (1978). The model +proposed by Rocke and Lorenzato (1995) can be written in this form as well, +but assumes approximate lognormal distribution of errors for high values of +y.

    +
    +
    +

    References

    +

    Werner, Mario, Brooks, Samuel H., and Knott, Lancaster B. (1978) +Additive, Multiplicative, and Mixed Analytical Errors. Clinical Chemistry +24(11), 1895-1898.

    +

    Rocke, David M. and Lorenzato, Stefan (1995) A two-component model for +measurement error in analytical chemistry. Technometrics 37(2), 176-184.

    +

    Ranke J and Meinecke S (2019) Error Models for the Kinetic Evaluation of Chemical +Degradation Data. Environments 6(12) 124 +doi:10.3390/environments6120124 +.

    +
    + +
    +

    Examples

    +
    times <- c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +d_pred <- data.frame(time = times, parent = 100 * exp(- 0.03 * times))
    +set.seed(123456)
    +d_syn <- add_err(d_pred, function(y) sigma_twocomp(y, 1, 0.07),
    +  reps = 2, n = 1)[[1]]
    +f_nls <- nls(value ~ SSasymp(time, 0, parent_0, lrc), data = d_syn,
    + start = list(parent_0 = 100, lrc = -3))
    +library(nlme)
    +f_gnls <- gnls(value ~ SSasymp(time, 0, parent_0, lrc),
    +  data = d_syn, na.action = na.omit,
    +  start = list(parent_0 = 100, lrc = -3))
    +if (length(findFunction("varConstProp")) > 0) {
    +  f_gnls_tc <- update(f_gnls, weights = varConstProp())
    +  f_gnls_tc_sf <- update(f_gnls_tc, control = list(sigma = 1))
    +}
    +f_mkin <- mkinfit("SFO", d_syn, error_model = "const", quiet = TRUE)
    +f_mkin_tc <- mkinfit("SFO", d_syn, error_model = "tc", quiet = TRUE)
    +plot_res(f_mkin_tc, standardized = TRUE)
    +
    +AIC(f_nls, f_gnls, f_gnls_tc, f_gnls_tc_sf, f_mkin, f_mkin_tc)
    +#>              df      AIC
    +#> f_nls         3 114.4817
    +#> f_gnls        3 114.4817
    +#> f_gnls_tc     5 103.6447
    +#> f_gnls_tc_sf  4 101.6447
    +#> f_mkin        3 114.4817
    +#> f_mkin_tc     4 101.6446
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/status.html b/docs/dev/reference/status.html new file mode 100644 index 00000000..e6388137 --- /dev/null +++ b/docs/dev/reference/status.html @@ -0,0 +1,145 @@ + +Method to get status information for fit array objects — status • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Method to get status information for fit array objects

    +
    + +
    +

    Usage

    +
    status(object, ...)
    +
    +# S3 method for class 'mmkin'
    +status(object, ...)
    +
    +# S3 method for class 'status.mmkin'
    +print(x, ...)
    +
    +# S3 method for class 'mhmkin'
    +status(object, ...)
    +
    +# S3 method for class 'status.mhmkin'
    +print(x, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The object to investigate

    + + +
    ...
    +

    For potential future extensions

    + + +
    x
    +

    The object to be printed

    + +
    +
    +

    Value

    +

    An object with the same dimensions as the fit array +suitable printing method.

    +
    + +
    +

    Examples

    +
    # \dontrun{
    +fits <- mmkin(
    +  c("SFO", "FOMC"),
    +  list("FOCUS A" = FOCUS_2006_A,
    +       "FOCUS B" = FOCUS_2006_C),
    +  quiet = TRUE)
    +status(fits)
    +#>       dataset
    +#> model  FOCUS A FOCUS B
    +#>   SFO  OK      OK     
    +#>   FOMC C       OK     
    +#> 
    +#> C: Optimisation did not converge:
    +#> false convergence (8)
    +#> OK: No warnings
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/status.mhmkin.html b/docs/dev/reference/status.mhmkin.html new file mode 100644 index 00000000..9451cf16 --- /dev/null +++ b/docs/dev/reference/status.mhmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/status.mmkin.html b/docs/dev/reference/status.mmkin.html new file mode 100644 index 00000000..9451cf16 --- /dev/null +++ b/docs/dev/reference/status.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/summary.mkinfit.html b/docs/dev/reference/summary.mkinfit.html new file mode 100644 index 00000000..63a08d05 --- /dev/null +++ b/docs/dev/reference/summary.mkinfit.html @@ -0,0 +1,290 @@ + +Summary method for class "mkinfit" — summary.mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Lists model equations, initial parameter values, optimised parameters with +some uncertainty statistics, the chi2 error levels calculated according to +FOCUS guidance (2006) as defined therein, formation fractions, DT50 values +and optionally the data, consisting of observed, predicted and residual +values.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinfit'
    +summary(object, data = TRUE, distimes = TRUE, alpha = 0.05, ...)
    +
    +# S3 method for class 'summary.mkinfit'
    +print(x, digits = max(3, getOption("digits") - 3), ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    an object of class mkinfit.

    + + +
    data
    +

    logical, indicating whether the data should be included in the +summary.

    + + +
    distimes
    +

    logical, indicating whether DT50 and DT90 values should be +included.

    + + +
    alpha
    +

    error level for confidence interval estimation from t +distribution

    + + +
    ...
    +

    optional arguments passed to methods like print.

    + + +
    x
    +

    an object of class summary.mkinfit.

    + + +
    digits
    +

    Number of digits to use for printing

    + +
    +
    +

    Value

    +

    The summary function returns a list with components, among others

    +
    version, Rversion
    +

    The mkin and R versions used

    + +
    date.fit, date.summary
    +

    The dates where the fit and the summary were +produced

    + +
    diffs
    +

    The differential equations used in the model

    + +
    use_of_ff
    +

    Was maximum or minimum use made of formation fractions

    + +
    bpar
    +

    Optimised and backtransformed +parameters

    + +
    data
    +

    The data (see Description above).

    + +
    start
    +

    The starting values and bounds, if applicable, for optimised +parameters.

    + +
    fixed
    +

    The values of fixed parameters.

    + +
    errmin
    +

    The chi2 error levels for +each observed variable.

    + +
    bparms.ode
    +

    All backtransformed ODE +parameters, for use as starting parameters for related models.

    + +
    errparms
    +

    Error model parameters.

    + +
    ff
    +

    The estimated formation fractions derived from the fitted +model.

    + +
    distimes
    +

    The DT50 and DT90 values for each observed variable.

    + +
    SFORB
    +

    If applicable, eigenvalues and fractional eigenvector component +g of SFORB systems in the model.

    + +

    The print method is called for its side effect, i.e. printing the summary.

    +
    +
    +

    References

    +

    FOCUS (2006) “Guidance Document on Estimating Persistence +and Degradation Kinetics from Environmental Fate Studies on Pesticides in +EU Registration” Report of the FOCUS Work Group on Degradation Kinetics, +EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, +http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +  summary(mkinfit("SFO", FOCUS_2006_A, quiet = TRUE))
    +#> mkin version used for fitting:    1.2.10 
    +#> R version used for fitting:       4.4.2 
    +#> Date of fit:     Fri Feb 14 07:34:16 2025 
    +#> Date of summary: Fri Feb 14 07:34:16 2025 
    +#> 
    +#> Equations:
    +#> d_parent/dt = - k_parent * parent
    +#> 
    +#> Model predictions using solution type analytical 
    +#> 
    +#> Fitted using 131 model solutions performed in 0.009 s
    +#> 
    +#> Error model: Constant variance 
    +#> 
    +#> Error model algorithm: OLS 
    +#> 
    +#> Starting values for parameters to be optimised:
    +#>           value   type
    +#> parent_0 101.24  state
    +#> k_parent   0.10 deparm
    +#> 
    +#> Starting values for the transformed parameters actually optimised:
    +#>                   value lower upper
    +#> parent_0     101.240000  -Inf   Inf
    +#> log_k_parent  -2.302585  -Inf   Inf
    +#> 
    +#> Fixed parameter values:
    +#> None
    +#> 
    +#> Results:
    +#> 
    +#>        AIC     BIC    logLik
    +#>   55.28197 55.5203 -24.64099
    +#> 
    +#> Optimised, transformed parameters with symmetric confidence intervals:
    +#>              Estimate Std. Error  Lower   Upper
    +#> parent_0      109.200    3.70400 99.630 118.700
    +#> log_k_parent   -3.291    0.09176 -3.527  -3.055
    +#> sigma           5.266    1.31600  1.882   8.649
    +#> 
    +#> Parameter correlation:
    +#>               parent_0 log_k_parent     sigma
    +#> parent_0     1.000e+00    5.428e-01 1.642e-07
    +#> log_k_parent 5.428e-01    1.000e+00 2.507e-07
    +#> sigma        1.642e-07    2.507e-07 1.000e+00
    +#> 
    +#> Backtransformed parameters:
    +#> Confidence intervals for internally transformed parameters are asymmetric.
    +#> t-test (unrealistically) based on the assumption of normal distribution
    +#> for estimators of untransformed parameters.
    +#>           Estimate t value    Pr(>t)   Lower     Upper
    +#> parent_0 109.20000   29.47 4.218e-07 99.6300 118.70000
    +#> k_parent   0.03722   10.90 5.650e-05  0.0294   0.04712
    +#> sigma      5.26600    4.00 5.162e-03  1.8820   8.64900
    +#> 
    +#> FOCUS Chi2 error levels in percent:
    +#>          err.min n.optim df
    +#> All data   8.385       2  6
    +#> parent     8.385       2  6
    +#> 
    +#> Estimated disappearance times:
    +#>         DT50  DT90
    +#> parent 18.62 61.87
    +#> 
    +#> Data:
    +#>  time variable observed predicted residual
    +#>     0   parent   101.24   109.153  -7.9132
    +#>     3   parent    99.27    97.622   1.6484
    +#>     7   parent    90.11    84.119   5.9913
    +#>    14   parent    72.19    64.826   7.3641
    +#>    30   parent    29.71    35.738  -6.0283
    +#>    62   parent     5.98    10.862  -4.8818
    +#>    90   parent     1.54     3.831  -2.2911
    +#>   118   parent     0.39     1.351  -0.9613
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/summary.mmkin.html b/docs/dev/reference/summary.mmkin.html new file mode 100644 index 00000000..dad19e59 --- /dev/null +++ b/docs/dev/reference/summary.mmkin.html @@ -0,0 +1,155 @@ + +Summary method for class "mmkin" — summary.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Shows status information on the mkinfit objects contained in the object +and gives an overview of ill-defined parameters calculated by illparms.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mmkin'
    +summary(object, conf.level = 0.95, ...)
    +
    +# S3 method for class 'summary.mmkin'
    +print(x, digits = max(3, getOption("digits") - 3), ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    an object of class mmkin

    + + +
    conf.level
    +

    confidence level for testing parameters

    + + +
    ...
    +

    optional arguments passed to methods like print.

    + + +
    x
    +

    an object of class summary.mmkin.

    + + +
    digits
    +

    number of digits to use for printing

    + +
    + +
    +

    Examples

    +
    
    +fits <- mmkin(
    +  c("SFO", "FOMC"),
    +  list("FOCUS A" = FOCUS_2006_A,
    +       "FOCUS C" = FOCUS_2006_C),
    +  quiet = TRUE, cores = 1)
    +#> Warning: Optimisation did not converge:
    +#> false convergence (8)
    +  summary(fits)
    +#> Error model: Constant variance 
    +#> Fitted in 0.512 s
    +#> 
    +#> Status:
    +#>       dataset
    +#> model  FOCUS A FOCUS C
    +#>   SFO  OK      OK     
    +#>   FOMC C       OK     
    +#> 
    +#> C: Optimisation did not converge:
    +#> false convergence (8)
    +#> OK: No warnings
    +#> 
    +#> Ill-defined parameters:
    +#>       dataset
    +#> model  FOCUS A                      FOCUS C
    +#>   SFO                                      
    +#>   FOMC parent_0, alpha, beta, sigma        
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/summary.nlme.mmkin.html b/docs/dev/reference/summary.nlme.mmkin.html new file mode 100644 index 00000000..dd4c4771 --- /dev/null +++ b/docs/dev/reference/summary.nlme.mmkin.html @@ -0,0 +1,391 @@ + +Summary method for class "nlme.mmkin" — summary.nlme.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Lists model equations, initial parameter values, optimised parameters +for fixed effects (population), random effects (deviations from the +population mean) and residual error model, as well as the resulting +endpoints such as formation fractions and DT50 values. Optionally +(default is FALSE), the data are listed in full.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'nlme.mmkin'
    +summary(
    +  object,
    +  data = FALSE,
    +  verbose = FALSE,
    +  distimes = TRUE,
    +  alpha = 0.05,
    +  ...
    +)
    +
    +# S3 method for class 'summary.nlme.mmkin'
    +print(x, digits = max(3, getOption("digits") - 3), verbose = x$verbose, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    an object of class nlme.mmkin

    + + +
    data
    +

    logical, indicating whether the full data should be included in +the summary.

    + + +
    verbose
    +

    Should the summary be verbose?

    + + +
    distimes
    +

    logical, indicating whether DT50 and DT90 values should be +included.

    + + +
    alpha
    +

    error level for confidence interval estimation from the t +distribution

    + + +
    ...
    +

    optional arguments passed to methods like print.

    + + +
    x
    +

    an object of class summary.nlme.mmkin

    + + +
    digits
    +

    Number of digits to use for printing

    + +
    +
    +

    Value

    +

    The summary function returns a list based on the nlme object +obtained in the fit, with at least the following additional components

    +
    nlmeversion, mkinversion, Rversion
    +

    The nlme, mkin and R versions used

    + +
    date.fit, date.summary
    +

    The dates where the fit and the summary were +produced

    + +
    diffs
    +

    The differential equations used in the degradation model

    + +
    use_of_ff
    +

    Was maximum or minimum use made of formation fractions

    + +
    data
    +

    The data

    + +
    confint_trans
    +

    Transformed parameters as used in the optimisation, with confidence intervals

    + +
    confint_back
    +

    Backtransformed parameters, with confidence intervals if available

    + +
    ff
    +

    The estimated formation fractions derived from the fitted +model.

    + +
    distimes
    +

    The DT50 and DT90 values for each observed variable.

    + +
    SFORB
    +

    If applicable, eigenvalues of SFORB components of the model.

    + +

    The print method is called for its side effect, i.e. printing the summary.

    +
    +
    +

    Author

    +

    Johannes Ranke for the mkin specific parts +José Pinheiro and Douglas Bates for the components inherited from nlme

    +
    + +
    +

    Examples

    +
    
    +# Generate five datasets following SFO kinetics
    +sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +dt50_sfo_in_pop <- 50
    +k_in_pop <- log(2) / dt50_sfo_in_pop
    +set.seed(1234)
    +k_in <- rlnorm(5, log(k_in_pop), 0.5)
    +SFO <- mkinmod(parent = mkinsub("SFO"))
    +
    +pred_sfo <- function(k) {
    +  mkinpredict(SFO,
    +    c(k_parent = k),
    +    c(parent = 100),
    +    sampling_times)
    +}
    +
    +ds_sfo_mean <- lapply(k_in, pred_sfo)
    +names(ds_sfo_mean) <- paste("ds", 1:5)
    +
    +set.seed(12345)
    +ds_sfo_syn <- lapply(ds_sfo_mean, function(ds) {
    +  add_err(ds,
    +    sdfunc = function(value) sqrt(1^2 + value^2 * 0.07^2),
    +    n = 1)[[1]]
    +})
    +
    +# \dontrun{
    +# Evaluate using mmkin and nlme
    +library(nlme)
    +f_mmkin <- mmkin("SFO", ds_sfo_syn, quiet = TRUE, error_model = "tc", cores = 1)
    +#> Warning: Optimisation did not converge:
    +#> iteration limit reached without convergence (10)
    +f_nlme <- nlme(f_mmkin)
    +summary(f_nlme, data = TRUE)
    +#> nlme version used for fitting:      3.1.166 
    +#> mkin version used for pre-fitting:  1.2.10 
    +#> R version used for fitting:         4.4.2 
    +#> Date of fit:     Fri Feb 14 07:34:18 2025 
    +#> Date of summary: Fri Feb 14 07:34:18 2025 
    +#> 
    +#> Equations:
    +#> d_parent/dt = - k_parent * parent
    +#> 
    +#> Data:
    +#> 90 observations of 1 variable(s) grouped in 5 datasets
    +#> 
    +#> Model predictions using solution type analytical 
    +#> 
    +#> Fitted in 0.187 s using 4 iterations
    +#> 
    +#> Variance model: Two-component variance function 
    +#> 
    +#> Mean of starting values for individual parameters:
    +#>     parent_0 log_k_parent 
    +#>      101.569       -4.454 
    +#> 
    +#> Fixed degradation parameter values:
    +#> None
    +#> 
    +#> Results:
    +#> 
    +#>     AIC   BIC logLik
    +#>   584.5 599.5 -286.2
    +#> 
    +#> Optimised, transformed parameters with symmetric confidence intervals:
    +#>               lower    est.   upper
    +#> parent_0     99.371 101.592 103.814
    +#> log_k_parent -4.973  -4.449  -3.926
    +#> 
    +#> Correlation: 
    +#>              parnt_0
    +#> log_k_parent 0.0507 
    +#> 
    +#> Random effects:
    +#>  Formula: list(parent_0 ~ 1, log_k_parent ~ 1)
    +#>  Level: ds
    +#>  Structure: Diagonal
    +#>          parent_0 log_k_parent Residual
    +#> StdDev: 6.921e-05       0.5863        1
    +#> 
    +#> Variance function:
    +#>  Structure: Constant plus proportion of variance covariate
    +#>  Formula: ~fitted(.) 
    +#>  Parameter estimates:
    +#>        const         prop 
    +#> 0.0001208313 0.0789967985 
    +#> 
    +#> Backtransformed parameters with asymmetric confidence intervals:
    +#>              lower      est.     upper
    +#> parent_0 99.370882 101.59243 103.81398
    +#> k_parent  0.006923   0.01168   0.01972
    +#> 
    +#> Estimated disappearance times:
    +#>         DT50  DT90
    +#> parent 59.32 197.1
    +#> 
    +#> Data:
    +#>    ds   name time observed predicted  residual    std standardized
    +#>  ds 1 parent    0    104.1   101.592   2.50757 8.0255     0.312451
    +#>  ds 1 parent    0    105.0   101.592   3.40757 8.0255     0.424594
    +#>  ds 1 parent    1     98.5   100.796  -2.29571 7.9625    -0.288313
    +#>  ds 1 parent    1     96.1   100.796  -4.69571 7.9625    -0.589725
    +#>  ds 1 parent    3    101.9    99.221   2.67904 7.8381     0.341796
    +#>  ds 1 parent    3     85.2    99.221 -14.02096 7.8381    -1.788812
    +#>  ds 1 parent    7     99.1    96.145   2.95512 7.5951     0.389081
    +#>  ds 1 parent    7     93.0    96.145  -3.14488 7.5951    -0.414065
    +#>  ds 1 parent   14     88.1    90.989  -2.88944 7.1879    -0.401987
    +#>  ds 1 parent   14     84.1    90.989  -6.88944 7.1879    -0.958480
    +#>  ds 1 parent   28     80.2    81.493  -1.29305 6.4377    -0.200857
    +#>  ds 1 parent   28     91.3    81.493   9.80695 6.4377     1.523364
    +#>  ds 1 parent   60     65.1    63.344   1.75642 5.0039     0.351008
    +#>  ds 1 parent   60     65.8    63.344   2.45642 5.0039     0.490898
    +#>  ds 1 parent   90     47.8    50.018  -2.21764 3.9512    -0.561252
    +#>  ds 1 parent   90     53.5    50.018   3.48236 3.9512     0.881335
    +#>  ds 1 parent  120     37.6    39.495  -1.89515 3.1200    -0.607423
    +#>  ds 1 parent  120     39.3    39.495  -0.19515 3.1200    -0.062549
    +#>  ds 2 parent    0    107.9   101.592   6.30757 8.0255     0.785943
    +#>  ds 2 parent    0    102.1   101.592   0.50757 8.0255     0.063245
    +#>  ds 2 parent    1    103.8   100.058   3.74159 7.9043     0.473361
    +#>  ds 2 parent    1    108.6   100.058   8.54159 7.9043     1.080626
    +#>  ds 2 parent    3     91.0    97.060  -6.05952 7.6674    -0.790297
    +#>  ds 2 parent    3     84.9    97.060 -12.15952 7.6674    -1.585874
    +#>  ds 2 parent    7     79.3    91.329 -12.02867 7.2147    -1.667251
    +#>  ds 2 parent    7    100.9    91.329   9.57133 7.2147     1.326647
    +#>  ds 2 parent   14     77.3    82.102  -4.80185 6.4858    -0.740366
    +#>  ds 2 parent   14     83.5    82.102   1.39815 6.4858     0.215571
    +#>  ds 2 parent   28     66.8    66.351   0.44945 5.2415     0.085748
    +#>  ds 2 parent   28     63.3    66.351  -3.05055 5.2415    -0.582002
    +#>  ds 2 parent   60     40.8    40.775   0.02474 3.2211     0.007679
    +#>  ds 2 parent   60     44.8    40.775   4.02474 3.2211     1.249485
    +#>  ds 2 parent   90     27.8    25.832   1.96762 2.0407     0.964198
    +#>  ds 2 parent   90     27.0    25.832   1.16762 2.0407     0.572171
    +#>  ds 2 parent  120     15.2    16.366  -1.16561 1.2928    -0.901595
    +#>  ds 2 parent  120     15.5    16.366  -0.86561 1.2928    -0.669547
    +#>  ds 3 parent    0     97.7   101.592  -3.89243 8.0255    -0.485009
    +#>  ds 3 parent    0     88.2   101.592 -13.39243 8.0255    -1.668740
    +#>  ds 3 parent    1    109.9    99.218  10.68196 7.8379     1.362858
    +#>  ds 3 parent    1     97.8    99.218  -1.41804 7.8379    -0.180921
    +#>  ds 3 parent    3    100.5    94.634   5.86555 7.4758     0.784603
    +#>  ds 3 parent    3     77.4    94.634 -17.23445 7.4758    -2.305360
    +#>  ds 3 parent    7     78.3    86.093  -7.79273 6.8011    -1.145813
    +#>  ds 3 parent    7     90.3    86.093   4.20727 6.8011     0.618620
    +#>  ds 3 parent   14     76.0    72.958   3.04222 5.7634     0.527848
    +#>  ds 3 parent   14     79.1    72.958   6.14222 5.7634     1.065722
    +#>  ds 3 parent   28     46.0    52.394  -6.39404 4.1390    -1.544842
    +#>  ds 3 parent   28     53.4    52.394   1.00596 4.1390     0.243046
    +#>  ds 3 parent   60     25.1    24.582   0.51786 1.9419     0.266676
    +#>  ds 3 parent   60     21.4    24.582  -3.18214 1.9419    -1.638664
    +#>  ds 3 parent   90     11.0    12.092  -1.09202 0.9552    -1.143199
    +#>  ds 3 parent   90     14.2    12.092   2.10798 0.9552     2.206777
    +#>  ds 3 parent  120      5.8     5.948  -0.14810 0.4699    -0.315178
    +#>  ds 3 parent  120      6.1     5.948   0.15190 0.4699     0.323282
    +#>  ds 4 parent    0     95.3   101.592  -6.29243 8.0255    -0.784057
    +#>  ds 4 parent    0    102.0   101.592   0.40757 8.0255     0.050784
    +#>  ds 4 parent    1    104.4   101.125   3.27549 7.9885     0.410025
    +#>  ds 4 parent    1    105.4   101.125   4.27549 7.9885     0.535205
    +#>  ds 4 parent    3    113.7   100.195  13.50487 7.9151     1.706218
    +#>  ds 4 parent    3     82.3   100.195 -17.89513 7.9151    -2.260886
    +#>  ds 4 parent    7     98.1    98.362  -0.26190 7.7703    -0.033706
    +#>  ds 4 parent    7     87.8    98.362 -10.56190 7.7703    -1.359270
    +#>  ds 4 parent   14     97.9    95.234   2.66590 7.5232     0.354357
    +#>  ds 4 parent   14    104.8    95.234   9.56590 7.5232     1.271521
    +#>  ds 4 parent   28     85.0    89.274  -4.27372 7.0523    -0.606001
    +#>  ds 4 parent   28     77.2    89.274 -12.07372 7.0523    -1.712017
    +#>  ds 4 parent   60     82.2    77.013   5.18661 6.0838     0.852526
    +#>  ds 4 parent   60     86.1    77.013   9.08661 6.0838     1.493571
    +#>  ds 4 parent   90     70.5    67.053   3.44692 5.2970     0.650733
    +#>  ds 4 parent   90     61.7    67.053  -5.35308 5.2970    -1.010591
    +#>  ds 4 parent  120     60.0    58.381   1.61905 4.6119     0.351058
    +#>  ds 4 parent  120     56.4    58.381  -1.98095 4.6119    -0.429530
    +#>  ds 5 parent    0     92.6   101.592  -8.99243 8.0255    -1.120485
    +#>  ds 5 parent    0    116.5   101.592  14.90757 8.0255     1.857531
    +#>  ds 5 parent    1    108.0    99.914   8.08560 7.8929     1.024413
    +#>  ds 5 parent    1    104.9    99.914   4.98560 7.8929     0.631655
    +#>  ds 5 parent    3    100.5    96.641   3.85898 7.6343     0.505477
    +#>  ds 5 parent    3     89.5    96.641  -7.14102 7.6343    -0.935383
    +#>  ds 5 parent    7     91.7    90.412   1.28752 7.1423     0.180267
    +#>  ds 5 parent    7     95.1    90.412   4.68752 7.1423     0.656304
    +#>  ds 5 parent   14     82.2    80.463   1.73715 6.3563     0.273295
    +#>  ds 5 parent   14     84.5    80.463   4.03715 6.3563     0.635141
    +#>  ds 5 parent   28     60.5    63.728  -3.22788 5.0343    -0.641178
    +#>  ds 5 parent   28     72.8    63.728   9.07212 5.0343     1.802062
    +#>  ds 5 parent   60     38.3    37.399   0.90061 2.9544     0.304835
    +#>  ds 5 parent   60     40.7    37.399   3.30061 2.9544     1.117174
    +#>  ds 5 parent   90     22.5    22.692  -0.19165 1.7926    -0.106913
    +#>  ds 5 parent   90     20.8    22.692  -1.89165 1.7926    -1.055273
    +#>  ds 5 parent  120     13.4    13.768  -0.36790 1.0876    -0.338259
    +#>  ds 5 parent  120     13.8    13.768   0.03210 1.0876     0.029517
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/summary.saem.mmkin.html b/docs/dev/reference/summary.saem.mmkin.html new file mode 100644 index 00000000..e6138f37 --- /dev/null +++ b/docs/dev/reference/summary.saem.mmkin.html @@ -0,0 +1,631 @@ + +Summary method for class "saem.mmkin" — summary.saem.mmkin • mkin + Skip to contents + + +
    +
    +
    + +
    +

    Lists model equations, initial parameter values, optimised parameters +for fixed effects (population), random effects (deviations from the +population mean) and residual error model, as well as the resulting +endpoints such as formation fractions and DT50 values. Optionally +(default is FALSE), the data are listed in full.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'saem.mmkin'
    +summary(
    +  object,
    +  data = FALSE,
    +  verbose = FALSE,
    +  covariates = NULL,
    +  covariate_quantile = 0.5,
    +  distimes = TRUE,
    +  ...
    +)
    +
    +# S3 method for class 'summary.saem.mmkin'
    +print(x, digits = max(3, getOption("digits") - 3), verbose = x$verbose, ...)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    an object of class saem.mmkin

    + + +
    data
    +

    logical, indicating whether the full data should be included in +the summary.

    + + +
    verbose
    +

    Should the summary be verbose?

    + + +
    covariates
    +

    Numeric vector with covariate values for all variables in +any covariate models in the object. If given, it overrides 'covariate_quantile'.

    + + +
    covariate_quantile
    +

    This argument only has an effect if the fitted +object has covariate models. If so, the default is to show endpoints +for the median of the covariate values (50th percentile).

    + + +
    distimes
    +

    logical, indicating whether DT50 and DT90 values should be +included.

    + + +
    ...
    +

    optional arguments passed to methods like print.

    + + +
    x
    +

    an object of class summary.saem.mmkin

    + + +
    digits
    +

    Number of digits to use for printing

    + +
    +
    +

    Value

    +

    The summary function returns a list based on the saemix::SaemixObject +obtained in the fit, with at least the following additional components

    +
    saemixversion, mkinversion, Rversion
    +

    The saemix, mkin and R versions used

    + +
    date.fit, date.summary
    +

    The dates where the fit and the summary were +produced

    + +
    diffs
    +

    The differential equations used in the degradation model

    + +
    use_of_ff
    +

    Was maximum or minimum use made of formation fractions

    + +
    data
    +

    The data

    + +
    confint_trans
    +

    Transformed parameters as used in the optimisation, with confidence intervals

    + +
    confint_back
    +

    Backtransformed parameters, with confidence intervals if available

    + +
    confint_errmod
    +

    Error model parameters with confidence intervals

    + +
    ff
    +

    The estimated formation fractions derived from the fitted +model.

    + +
    distimes
    +

    The DT50 and DT90 values for each observed variable.

    + +
    SFORB
    +

    If applicable, eigenvalues of SFORB components of the model.

    + +

    The print method is called for its side effect, i.e. printing the summary.

    +
    +
    +

    Author

    +

    Johannes Ranke for the mkin specific parts +saemix authors for the parts inherited from saemix.

    +
    + +
    +

    Examples

    +
    # Generate five datasets following DFOP-SFO kinetics
    +sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "m1"),
    + m1 = mkinsub("SFO"), quiet = TRUE)
    +set.seed(1234)
    +k1_in <- rlnorm(5, log(0.1), 0.3)
    +k2_in <- rlnorm(5, log(0.02), 0.3)
    +g_in <- plogis(rnorm(5, qlogis(0.5), 0.3))
    +f_parent_to_m1_in <- plogis(rnorm(5, qlogis(0.3), 0.3))
    +k_m1_in <- rlnorm(5, log(0.02), 0.3)
    +
    +pred_dfop_sfo <- function(k1, k2, g, f_parent_to_m1, k_m1) {
    +  mkinpredict(dfop_sfo,
    +    c(k1 = k1, k2 = k2, g = g, f_parent_to_m1 = f_parent_to_m1, k_m1 = k_m1),
    +    c(parent = 100, m1 = 0),
    +    sampling_times)
    +}
    +
    +ds_mean_dfop_sfo <- lapply(1:5, function(i) {
    +  mkinpredict(dfop_sfo,
    +    c(k1 = k1_in[i], k2 = k2_in[i], g = g_in[i],
    +      f_parent_to_m1 = f_parent_to_m1_in[i], k_m1 = k_m1_in[i]),
    +    c(parent = 100, m1 = 0),
    +    sampling_times)
    +})
    +names(ds_mean_dfop_sfo) <- paste("ds", 1:5)
    +
    +ds_syn_dfop_sfo <- lapply(ds_mean_dfop_sfo, function(ds) {
    +  add_err(ds,
    +    sdfunc = function(value) sqrt(1^2 + value^2 * 0.07^2),
    +    n = 1)[[1]]
    +})
    +
    +# \dontrun{
    +# Evaluate using mmkin and saem
    +f_mmkin_dfop_sfo <- mmkin(list(dfop_sfo), ds_syn_dfop_sfo,
    +  quiet = TRUE, error_model = "tc", cores = 5)
    +f_saem_dfop_sfo <- saem(f_mmkin_dfop_sfo)
    +print(f_saem_dfop_sfo)
    +#> Kinetic nonlinear mixed-effects model fit by SAEM
    +#> Structural model:
    +#> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
    +#>            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
    +#>            * parent
    +#> d_m1/dt = + f_parent_to_m1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g)
    +#>            * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
    +#>            exp(-k2 * time))) * parent - k_m1 * m1
    +#> 
    +#> Data:
    +#> 171 observations of 2 variable(s) grouped in 5 datasets
    +#> 
    +#> Likelihood computed by importance sampling
    +#>     AIC   BIC logLik
    +#>   810.8 805.4 -391.4
    +#> 
    +#> Fitted parameters:
    +#>                      estimate     lower     upper
    +#> parent_0           100.966822  97.90584 104.02780
    +#> log_k_m1            -4.076164  -4.17485  -3.97748
    +#> f_parent_qlogis     -0.940902  -1.35358  -0.52823
    +#> log_k1              -2.363988  -2.71690  -2.01107
    +#> log_k2              -4.060016  -4.21743  -3.90260
    +#> g_qlogis            -0.029999  -0.44766   0.38766
    +#> a.1                  0.876272   0.67790   1.07464
    +#> b.1                  0.079594   0.06521   0.09398
    +#> SD.parent_0          0.076322 -76.45825  76.61089
    +#> SD.log_k_m1          0.005052  -1.08943   1.09953
    +#> SD.f_parent_qlogis   0.446968   0.16577   0.72816
    +#> SD.log_k1            0.348786   0.09502   0.60255
    +#> SD.log_k2            0.147456   0.03111   0.26380
    +#> SD.g_qlogis          0.348244   0.02794   0.66854
    +illparms(f_saem_dfop_sfo)
    +#> [1] "sd(parent_0)" "sd(log_k_m1)"
    +f_saem_dfop_sfo_2 <- update(f_saem_dfop_sfo,
    +  no_random_effect = c("parent_0", "log_k_m1"))
    +illparms(f_saem_dfop_sfo_2)
    +intervals(f_saem_dfop_sfo_2)
    +#> Approximate 95% confidence intervals
    +#> 
    +#>  Fixed effects:
    +#>                      lower         est.        upper
    +#> parent_0       98.04247057 101.09950884 104.15654711
    +#> k_m1            0.01528983   0.01687734   0.01862969
    +#> f_parent_to_m1  0.20447650   0.27932896   0.36887691
    +#> k1              0.06779844   0.09638524   0.13702550
    +#> k2              0.01495629   0.01741775   0.02028431
    +#> g               0.37669311   0.48368409   0.59219202
    +#> 
    +#>  Random effects:
    +#>                          lower      est.     upper
    +#> sd(f_parent_qlogis) 0.16515113 0.4448330 0.7245148
    +#> sd(log_k1)          0.08982399 0.3447403 0.5996565
    +#> sd(log_k2)          0.02806780 0.1419560 0.2558443
    +#> sd(g_qlogis)        0.04908644 0.3801993 0.7113121
    +#> 
    +#>  
    +#>          lower       est.      upper
    +#> a.1 0.67993373 0.87630147 1.07266921
    +#> b.1 0.06522297 0.07920531 0.09318766
    +summary(f_saem_dfop_sfo_2, data = TRUE)
    +#> saemix version used for fitting:      3.3 
    +#> mkin version used for pre-fitting:  1.2.10 
    +#> R version used for fitting:         4.4.2 
    +#> Date of fit:     Fri Feb 14 07:34:33 2025 
    +#> Date of summary: Fri Feb 14 07:34:33 2025 
    +#> 
    +#> Equations:
    +#> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 *
    +#>            time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time)))
    +#>            * parent
    +#> d_m1/dt = + f_parent_to_m1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g)
    +#>            * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) *
    +#>            exp(-k2 * time))) * parent - k_m1 * m1
    +#> 
    +#> Data:
    +#> 171 observations of 2 variable(s) grouped in 5 datasets
    +#> 
    +#> Model predictions using solution type analytical 
    +#> 
    +#> Fitted in 8.903 s
    +#> Using 300, 100 iterations and 10 chains
    +#> 
    +#> Variance model: Two-component variance function 
    +#> 
    +#> Starting values for degradation parameters:
    +#>        parent_0        log_k_m1 f_parent_qlogis          log_k1          log_k2 
    +#>       101.65645        -4.05368        -0.94311        -2.35943        -4.07006 
    +#>        g_qlogis 
    +#>        -0.01133 
    +#> 
    +#> Fixed degradation parameter values:
    +#> None
    +#> 
    +#> Starting values for random effects (square root of initial entries in omega):
    +#>                 parent_0 log_k_m1 f_parent_qlogis log_k1 log_k2 g_qlogis
    +#> parent_0           6.742   0.0000          0.0000 0.0000 0.0000    0.000
    +#> log_k_m1           0.000   0.2236          0.0000 0.0000 0.0000    0.000
    +#> f_parent_qlogis    0.000   0.0000          0.5572 0.0000 0.0000    0.000
    +#> log_k1             0.000   0.0000          0.0000 0.8031 0.0000    0.000
    +#> log_k2             0.000   0.0000          0.0000 0.0000 0.2931    0.000
    +#> g_qlogis           0.000   0.0000          0.0000 0.0000 0.0000    0.807
    +#> 
    +#> Starting values for error model parameters:
    +#> a.1 b.1 
    +#>   1   1 
    +#> 
    +#> Results:
    +#> 
    +#> Likelihood computed by importance sampling
    +#>     AIC   BIC logLik
    +#>   806.9 802.2 -391.5
    +#> 
    +#> Optimised parameters:
    +#>                         est.    lower     upper
    +#> parent_0           101.09951 98.04247 104.15655
    +#> log_k_m1            -4.08178 -4.18057  -3.98300
    +#> f_parent_qlogis     -0.94779 -1.35855  -0.53704
    +#> log_k1              -2.33940 -2.69122  -1.98759
    +#> log_k2              -4.05027 -4.20262  -3.89791
    +#> g_qlogis            -0.06529 -0.50361   0.37303
    +#> a.1                  0.87630  0.67993   1.07267
    +#> b.1                  0.07921  0.06522   0.09319
    +#> SD.f_parent_qlogis   0.44483  0.16515   0.72451
    +#> SD.log_k1            0.34474  0.08982   0.59966
    +#> SD.log_k2            0.14196  0.02807   0.25584
    +#> SD.g_qlogis          0.38020  0.04909   0.71131
    +#> 
    +#> Correlation: 
    +#>                 parnt_0 lg_k_m1 f_prnt_ log_k1  log_k2 
    +#> log_k_m1        -0.4716                                
    +#> f_parent_qlogis -0.2394  0.2617                        
    +#> log_k1           0.1677 -0.1566 -0.0659                
    +#> log_k2           0.0165  0.0638  0.0045  0.2013        
    +#> g_qlogis         0.1118 -0.1118 -0.0340 -0.2324 -0.3419
    +#> 
    +#> Random effects:
    +#>                      est.   lower  upper
    +#> SD.f_parent_qlogis 0.4448 0.16515 0.7245
    +#> SD.log_k1          0.3447 0.08982 0.5997
    +#> SD.log_k2          0.1420 0.02807 0.2558
    +#> SD.g_qlogis        0.3802 0.04909 0.7113
    +#> 
    +#> Variance model:
    +#>        est.   lower   upper
    +#> a.1 0.87630 0.67993 1.07267
    +#> b.1 0.07921 0.06522 0.09319
    +#> 
    +#> Backtransformed parameters:
    +#>                     est.    lower     upper
    +#> parent_0       101.09951 98.04247 104.15655
    +#> k_m1             0.01688  0.01529   0.01863
    +#> f_parent_to_m1   0.27933  0.20448   0.36888
    +#> k1               0.09639  0.06780   0.13703
    +#> k2               0.01742  0.01496   0.02028
    +#> g                0.48368  0.37669   0.59219
    +#> 
    +#> Resulting formation fractions:
    +#>                 ff
    +#> parent_m1   0.2793
    +#> parent_sink 0.7207
    +#> 
    +#> Estimated disappearance times:
    +#>         DT50   DT90 DT50back DT50_k1 DT50_k2
    +#> parent 15.66  94.28    28.38   7.191    39.8
    +#> m1     41.07 136.43       NA      NA      NA
    +#> 
    +#> Data:
    +#>    ds   name time observed  predicted  residual    std standardized
    +#>  ds 1 parent    0     89.8  1.011e+02 -11.29951 8.0554    -1.402721
    +#>  ds 1 parent    0    104.1  1.011e+02   3.00049 8.0554     0.372481
    +#>  ds 1 parent    1     88.7  9.624e+01  -7.53600 7.6726    -0.982195
    +#>  ds 1 parent    1     95.5  9.624e+01  -0.73600 7.6726    -0.095925
    +#>  ds 1 parent    3     81.8  8.736e+01  -5.55672 6.9744    -0.796732
    +#>  ds 1 parent    3     94.5  8.736e+01   7.14328 6.9744     1.024217
    +#>  ds 1 parent    7     71.5  7.251e+01  -1.00511 5.8093    -0.173019
    +#>  ds 1 parent    7     70.3  7.251e+01  -2.20511 5.8093    -0.379585
    +#>  ds 1 parent   14     54.2  5.356e+01   0.63921 4.3319     0.147560
    +#>  ds 1 parent   14     49.6  5.356e+01  -3.96079 4.3319    -0.914340
    +#>  ds 1 parent   28     31.5  3.175e+01  -0.25429 2.6634    -0.095475
    +#>  ds 1 parent   28     28.8  3.175e+01  -2.95429 2.6634    -1.109218
    +#>  ds 1 parent   60     12.1  1.281e+01  -0.71388 1.3409    -0.532390
    +#>  ds 1 parent   60     13.6  1.281e+01   0.78612 1.3409     0.586271
    +#>  ds 1 parent   90      6.2  6.405e+00  -0.20462 1.0125    -0.202083
    +#>  ds 1 parent   90      8.3  6.405e+00   1.89538 1.0125     1.871910
    +#>  ds 1 parent  120      2.2  3.329e+00  -1.12941 0.9151    -1.234165
    +#>  ds 1 parent  120      2.4  3.329e+00  -0.92941 0.9151    -1.015615
    +#>  ds 1     m1    1      0.3  1.177e+00  -0.87699 0.8812    -0.995168
    +#>  ds 1     m1    1      0.2  1.177e+00  -0.97699 0.8812    -1.108644
    +#>  ds 1     m1    3      2.2  3.268e+00  -1.06821 0.9137    -1.169063
    +#>  ds 1     m1    3      3.0  3.268e+00  -0.26821 0.9137    -0.293536
    +#>  ds 1     m1    7      6.5  6.555e+00  -0.05539 1.0186    -0.054377
    +#>  ds 1     m1    7      5.0  6.555e+00  -1.55539 1.0186    -1.527022
    +#>  ds 1     m1   14     10.2  1.017e+01   0.03108 1.1902     0.026117
    +#>  ds 1     m1   14      9.5  1.017e+01  -0.66892 1.1902    -0.562010
    +#>  ds 1     m1   28     12.2  1.270e+01  -0.50262 1.3342    -0.376708
    +#>  ds 1     m1   28     13.4  1.270e+01   0.69738 1.3342     0.522686
    +#>  ds 1     m1   60     11.8  1.078e+01   1.01734 1.2236     0.831403
    +#>  ds 1     m1   60     13.2  1.078e+01   2.41734 1.2236     1.975530
    +#>  ds 1     m1   90      6.6  7.686e+00  -1.08586 1.0670    -1.017675
    +#>  ds 1     m1   90      9.3  7.686e+00   1.61414 1.0670     1.512779
    +#>  ds 1     m1  120      3.5  5.205e+00  -1.70467 0.9684    -1.760250
    +#>  ds 1     m1  120      5.4  5.205e+00   0.19533 0.9684     0.201701
    +#>  ds 2 parent    0    118.0  1.011e+02  16.90049 8.0554     2.098026
    +#>  ds 2 parent    0     99.8  1.011e+02  -1.29951 8.0554    -0.161321
    +#>  ds 2 parent    1     90.2  9.574e+01  -5.53784 7.6334    -0.725473
    +#>  ds 2 parent    1     94.6  9.574e+01  -1.13784 7.6334    -0.149060
    +#>  ds 2 parent    3     96.1  8.638e+01   9.72233 6.8975     1.409551
    +#>  ds 2 parent    3     78.4  8.638e+01  -7.97767 6.8975    -1.156610
    +#>  ds 2 parent    7     77.9  7.194e+01   5.95854 5.7651     1.033547
    +#>  ds 2 parent    7     77.7  7.194e+01   5.75854 5.7651     0.998856
    +#>  ds 2 parent   14     56.0  5.558e+01   0.42141 4.4885     0.093888
    +#>  ds 2 parent   14     54.7  5.558e+01  -0.87859 4.4885    -0.195742
    +#>  ds 2 parent   28     36.6  3.852e+01  -1.92382 3.1746    -0.605999
    +#>  ds 2 parent   28     36.8  3.852e+01  -1.72382 3.1746    -0.543000
    +#>  ds 2 parent   60     22.1  2.108e+01   1.02043 1.8856     0.541168
    +#>  ds 2 parent   60     24.7  2.108e+01   3.62043 1.8856     1.920034
    +#>  ds 2 parent   90     12.4  1.250e+01  -0.09675 1.3220    -0.073184
    +#>  ds 2 parent   90     10.8  1.250e+01  -1.69675 1.3220    -1.283492
    +#>  ds 2 parent  120      6.8  7.426e+00  -0.62587 1.0554    -0.593027
    +#>  ds 2 parent  120      7.9  7.426e+00   0.47413 1.0554     0.449242
    +#>  ds 2     m1    1      1.3  1.417e+00  -0.11735 0.8835    -0.132825
    +#>  ds 2     m1    3      3.7  3.823e+00  -0.12301 0.9271    -0.132673
    +#>  ds 2     m1    3      4.7  3.823e+00   0.87699 0.9271     0.945909
    +#>  ds 2     m1    7      8.1  7.288e+00   0.81180 1.0494     0.773619
    +#>  ds 2     m1    7      7.9  7.288e+00   0.61180 1.0494     0.583025
    +#>  ds 2     m1   14     10.1  1.057e+01  -0.46957 1.2119    -0.387459
    +#>  ds 2     m1   14     10.3  1.057e+01  -0.26957 1.2119    -0.222432
    +#>  ds 2     m1   28     10.7  1.234e+01  -1.63555 1.3124    -1.246185
    +#>  ds 2     m1   28     12.2  1.234e+01  -0.13555 1.3124    -0.103281
    +#>  ds 2     m1   60     10.7  1.065e+01   0.04641 1.2165     0.038151
    +#>  ds 2     m1   60     12.5  1.065e+01   1.84641 1.2165     1.517773
    +#>  ds 2     m1   90      9.1  8.177e+00   0.92337 1.0896     0.847403
    +#>  ds 2     m1   90      7.4  8.177e+00  -0.77663 1.0896    -0.712734
    +#>  ds 2     m1  120      6.1  5.966e+00   0.13404 0.9956     0.134631
    +#>  ds 2     m1  120      4.5  5.966e+00  -1.46596 0.9956    -1.472460
    +#>  ds 3 parent    0    106.2  1.011e+02   5.10049 8.0554     0.633175
    +#>  ds 3 parent    0    106.9  1.011e+02   5.80049 8.0554     0.720073
    +#>  ds 3 parent    1    107.4  9.365e+01  13.74627 7.4695     1.840332
    +#>  ds 3 parent    1     96.1  9.365e+01   2.44627 7.4695     0.327504
    +#>  ds 3 parent    3     79.4  8.139e+01  -1.99118 6.5059    -0.306058
    +#>  ds 3 parent    3     82.6  8.139e+01   1.20882 6.5059     0.185803
    +#>  ds 3 parent    7     63.9  6.445e+01  -0.54666 5.1792    -0.105549
    +#>  ds 3 parent    7     62.4  6.445e+01  -2.04666 5.1792    -0.395170
    +#>  ds 3 parent   14     51.0  4.830e+01   2.69944 3.9247     0.687800
    +#>  ds 3 parent   14     47.1  4.830e+01  -1.20056 3.9247    -0.305896
    +#>  ds 3 parent   28     36.1  3.426e+01   1.83885 2.8516     0.644839
    +#>  ds 3 parent   28     36.6  3.426e+01   2.33885 2.8516     0.820177
    +#>  ds 3 parent   60     20.1  1.968e+01   0.42208 1.7881     0.236053
    +#>  ds 3 parent   60     19.8  1.968e+01   0.12208 1.7881     0.068273
    +#>  ds 3 parent   90     11.3  1.194e+01  -0.64013 1.2893    -0.496496
    +#>  ds 3 parent   90     10.7  1.194e+01  -1.24013 1.2893    -0.961865
    +#>  ds 3 parent  120      8.2  7.247e+00   0.95264 1.0476     0.909381
    +#>  ds 3 parent  120      7.3  7.247e+00   0.05264 1.0476     0.050254
    +#>  ds 3     m1    0      0.8 -2.956e-12   0.80000 0.8763     0.912928
    +#>  ds 3     m1    1      1.8  1.757e+00   0.04318 0.8873     0.048666
    +#>  ds 3     m1    1      2.3  1.757e+00   0.54318 0.8873     0.612186
    +#>  ds 3     m1    3      4.2  4.566e+00  -0.36607 0.9480    -0.386149
    +#>  ds 3     m1    3      4.1  4.566e+00  -0.46607 0.9480    -0.491634
    +#>  ds 3     m1    7      6.8  8.157e+00  -1.35680 1.0887    -1.246241
    +#>  ds 3     m1    7     10.1  8.157e+00   1.94320 1.0887     1.784855
    +#>  ds 3     m1   14     11.4  1.085e+01   0.55367 1.2272     0.451182
    +#>  ds 3     m1   14     12.8  1.085e+01   1.95367 1.2272     1.592023
    +#>  ds 3     m1   28     11.5  1.149e+01   0.01098 1.2633     0.008689
    +#>  ds 3     m1   28     10.6  1.149e+01  -0.88902 1.2633    -0.703717
    +#>  ds 3     m1   60      7.5  9.295e+00  -1.79500 1.1445    -1.568351
    +#>  ds 3     m1   60      8.6  9.295e+00  -0.69500 1.1445    -0.607245
    +#>  ds 3     m1   90      7.3  7.017e+00   0.28305 1.0377     0.272775
    +#>  ds 3     m1   90      8.1  7.017e+00   1.08305 1.0377     1.043720
    +#>  ds 3     m1  120      5.3  5.087e+00   0.21272 0.9645     0.220547
    +#>  ds 3     m1  120      3.8  5.087e+00  -1.28728 0.9645    -1.334660
    +#>  ds 4 parent    0    104.7  1.011e+02   3.60049 8.0554     0.446965
    +#>  ds 4 parent    0     88.3  1.011e+02 -12.79951 8.0554    -1.588930
    +#>  ds 4 parent    1     94.2  9.755e+01  -3.35176 7.7762    -0.431030
    +#>  ds 4 parent    1     94.6  9.755e+01  -2.95176 7.7762    -0.379591
    +#>  ds 4 parent    3     78.1  9.095e+01 -12.85198 7.2570    -1.770981
    +#>  ds 4 parent    3     96.5  9.095e+01   5.54802 7.2570     0.764508
    +#>  ds 4 parent    7     76.2  7.949e+01  -3.29267 6.3569    -0.517966
    +#>  ds 4 parent    7     77.8  7.949e+01  -1.69267 6.3569    -0.266272
    +#>  ds 4 parent   14     70.8  6.384e+01   6.95621 5.1321     1.355423
    +#>  ds 4 parent   14     67.3  6.384e+01   3.45621 5.1321     0.673445
    +#>  ds 4 parent   28     43.1  4.345e+01  -0.35291 3.5515    -0.099370
    +#>  ds 4 parent   28     45.1  4.345e+01   1.64709 3.5515     0.463771
    +#>  ds 4 parent   60     21.3  2.137e+01  -0.07478 1.9063    -0.039229
    +#>  ds 4 parent   60     23.5  2.137e+01   2.12522 1.9063     1.114813
    +#>  ds 4 parent   90     11.8  1.205e+01  -0.24925 1.2957    -0.192375
    +#>  ds 4 parent   90     12.1  1.205e+01   0.05075 1.2957     0.039168
    +#>  ds 4 parent  120      7.0  6.967e+00   0.03315 1.0356     0.032013
    +#>  ds 4 parent  120      6.2  6.967e+00  -0.76685 1.0356    -0.740510
    +#>  ds 4     m1    0      1.6  1.421e-13   1.60000 0.8763     1.825856
    +#>  ds 4     m1    1      0.9  7.250e-01   0.17503 0.8782     0.199310
    +#>  ds 4     m1    3      3.7  2.038e+00   1.66201 0.8910     1.865236
    +#>  ds 4     m1    3      2.0  2.038e+00  -0.03799 0.8910    -0.042637
    +#>  ds 4     m1    7      3.6  4.186e+00  -0.58623 0.9369    -0.625692
    +#>  ds 4     m1    7      3.8  4.186e+00  -0.38623 0.9369    -0.412230
    +#>  ds 4     m1   14      7.1  6.752e+00   0.34768 1.0266     0.338666
    +#>  ds 4     m1   14      6.6  6.752e+00  -0.15232 1.0266    -0.148372
    +#>  ds 4     m1   28      9.5  9.034e+00   0.46628 1.1313     0.412159
    +#>  ds 4     m1   28      9.3  9.034e+00   0.26628 1.1313     0.235373
    +#>  ds 4     m1   60      8.3  8.634e+00  -0.33359 1.1115    -0.300112
    +#>  ds 4     m1   60      9.0  8.634e+00   0.36641 1.1115     0.329645
    +#>  ds 4     m1   90      6.6  6.671e+00  -0.07091 1.0233    -0.069295
    +#>  ds 4     m1   90      7.7  6.671e+00   1.02909 1.0233     1.005691
    +#>  ds 4     m1  120      3.7  4.823e+00  -1.12301 0.9559    -1.174763
    +#>  ds 4     m1  120      3.5  4.823e+00  -1.32301 0.9559    -1.383979
    +#>  ds 5 parent    0    110.4  1.011e+02   9.30049 8.0554     1.154563
    +#>  ds 5 parent    0    112.1  1.011e+02  11.00049 8.0554     1.365601
    +#>  ds 5 parent    1     93.5  9.440e+01  -0.90098 7.5282    -0.119681
    +#>  ds 5 parent    1     91.0  9.440e+01  -3.40098 7.5282    -0.451764
    +#>  ds 5 parent    3     71.0  8.287e+01 -11.86698 6.6217    -1.792122
    +#>  ds 5 parent    3     89.7  8.287e+01   6.83302 6.6217     1.031907
    +#>  ds 5 parent    7     60.4  6.562e+01  -5.22329 5.2711    -0.990936
    +#>  ds 5 parent    7     59.1  6.562e+01  -6.52329 5.2711    -1.237566
    +#>  ds 5 parent   14     56.5  4.739e+01   9.10588 3.8548     2.362225
    +#>  ds 5 parent   14     47.0  4.739e+01  -0.39412 3.8548    -0.102240
    +#>  ds 5 parent   28     30.2  3.118e+01  -0.98128 2.6206    -0.374451
    +#>  ds 5 parent   28     23.9  3.118e+01  -7.28128 2.6206    -2.778500
    +#>  ds 5 parent   60     17.0  1.804e+01  -1.03959 1.6761    -0.620224
    +#>  ds 5 parent   60     18.7  1.804e+01   0.66041 1.6761     0.394008
    +#>  ds 5 parent   90     11.3  1.165e+01  -0.35248 1.2727    -0.276958
    +#>  ds 5 parent   90     11.9  1.165e+01   0.24752 1.2727     0.194488
    +#>  ds 5 parent  120      9.0  7.556e+00   1.44368 1.0612     1.360449
    +#>  ds 5 parent  120      8.1  7.556e+00   0.54368 1.0612     0.512338
    +#>  ds 5     m1    0      0.7 -1.421e-14   0.70000 0.8763     0.798812
    +#>  ds 5     m1    1      3.0  3.160e+00  -0.15979 0.9113    -0.175340
    +#>  ds 5     m1    1      2.6  3.160e+00  -0.55979 0.9113    -0.614254
    +#>  ds 5     m1    3      5.1  8.448e+00  -3.34789 1.1026    -3.036487
    +#>  ds 5     m1    3      7.5  8.448e+00  -0.94789 1.1026    -0.859720
    +#>  ds 5     m1    7     16.5  1.581e+01   0.68760 1.5286     0.449839
    +#>  ds 5     m1    7     19.0  1.581e+01   3.18760 1.5286     2.085373
    +#>  ds 5     m1   14     22.9  2.218e+01   0.71983 1.9632     0.366658
    +#>  ds 5     m1   14     23.2  2.218e+01   1.01983 1.9632     0.519469
    +#>  ds 5     m1   28     22.2  2.425e+01  -2.05105 2.1113    -0.971479
    +#>  ds 5     m1   28     24.4  2.425e+01   0.14895 2.1113     0.070552
    +#>  ds 5     m1   60     15.5  1.876e+01  -3.25968 1.7250    -1.889646
    +#>  ds 5     m1   60     19.8  1.876e+01   1.04032 1.7250     0.603074
    +#>  ds 5     m1   90     14.9  1.365e+01   1.25477 1.3914     0.901806
    +#>  ds 5     m1   90     14.2  1.365e+01   0.55477 1.3914     0.398714
    +#>  ds 5     m1  120     10.9  9.726e+00   1.17443 1.1667     1.006587
    +#>  ds 5     m1  120     10.4  9.726e+00   0.67443 1.1667     0.578044
    +# Add a correlation between random effects of g and k2
    +cov_model_3 <- f_saem_dfop_sfo_2$so@model@covariance.model
    +cov_model_3["log_k2", "g_qlogis"] <- 1
    +cov_model_3["g_qlogis", "log_k2"] <- 1
    +f_saem_dfop_sfo_3 <- update(f_saem_dfop_sfo,
    +  covariance.model = cov_model_3)
    +intervals(f_saem_dfop_sfo_3)
    +#> Approximate 95% confidence intervals
    +#> 
    +#>  Fixed effects:
    +#>                      lower         est.        upper
    +#> parent_0       98.42519529 101.51623115 104.60726702
    +#> k_m1            0.01505059   0.01662123   0.01835577
    +#> f_parent_to_m1  0.20100222   0.27477835   0.36332008
    +#> k1              0.07347479   0.10139028   0.13991179
    +#> k2              0.01469861   0.01771120   0.02134125
    +#> g               0.35506898   0.46263682   0.57379888
    +#> 
    +#>  Random effects:
    +#>                             lower       est.     upper
    +#> sd(f_parent_qlogis)    0.16472883  0.4435866 0.7224443
    +#> sd(log_k1)             0.05323856  0.2981783 0.5431180
    +#> sd(log_k2)             0.05013379  0.1912531 0.3323723
    +#> sd(g_qlogis)           0.04710647  0.3997298 0.7523531
    +#> corr(log_k2,g_qlogis) -1.31087397 -0.5845703 0.1417334
    +#> 
    +#>  
    +#>          lower       est.      upper
    +#> a.1 0.67769608 0.87421677 1.07073746
    +#> b.1 0.06525119 0.07925135 0.09325151
    +# The correlation does not improve the fit judged by AIC and BIC, although
    +# the likelihood is higher with the additional parameter
    +anova(f_saem_dfop_sfo, f_saem_dfop_sfo_2, f_saem_dfop_sfo_3)
    +#> Data: 171 observations of 2 variable(s) grouped in 5 datasets
    +#> 
    +#>                   npar    AIC    BIC     Lik
    +#> f_saem_dfop_sfo_2   12 806.91 802.23 -391.46
    +#> f_saem_dfop_sfo_3   13 807.96 802.88 -390.98
    +#> f_saem_dfop_sfo     14 810.83 805.36 -391.41
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/summary_listing.html b/docs/dev/reference/summary_listing.html new file mode 100644 index 00000000..6e1bad37 --- /dev/null +++ b/docs/dev/reference/summary_listing.html @@ -0,0 +1,119 @@ + +Display the output of a summary function according to the output format — summary_listing • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function is intended for use in a R markdown code chunk with the chunk +option results = "asis".

    +
    + +
    +

    Usage

    +
    summary_listing(object, caption = NULL, label = NULL, clearpage = TRUE)
    +
    +tex_listing(object, caption = NULL, label = NULL, clearpage = TRUE)
    +
    +html_listing(object, caption = NULL)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    The object for which the summary is to be listed

    + + +
    caption
    +

    An optional caption

    + + +
    label
    +

    An optional label, ignored in html output

    + + +
    clearpage
    +

    Should a new page be started after the listing? Ignored in html output

    + +
    + +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/synthetic_data_for_UBA_2014-1.png b/docs/dev/reference/synthetic_data_for_UBA_2014-1.png new file mode 100644 index 00000000..c08d231d Binary files /dev/null and b/docs/dev/reference/synthetic_data_for_UBA_2014-1.png differ diff --git a/docs/dev/reference/synthetic_data_for_UBA_2014.html b/docs/dev/reference/synthetic_data_for_UBA_2014.html new file mode 100644 index 00000000..9080c32b --- /dev/null +++ b/docs/dev/reference/synthetic_data_for_UBA_2014.html @@ -0,0 +1,413 @@ + +Synthetic datasets for one parent compound with two metabolites — synthetic_data_for_UBA_2014 • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The 12 datasets were generated using four different models and three different + variance components. The four models are either the SFO or the DFOP model with either + two sequential or two parallel metabolites.

    +

    Variance component 'a' is based on a normal distribution with standard deviation of 3, + Variance component 'b' is also based on a normal distribution, but with a standard deviation of 7. + Variance component 'c' is based on the error model from Rocke and Lorenzato (1995), with the + minimum standard deviation (for small y values) of 0.5, and a proportionality constant of 0.07 + for the increase of the standard deviation with y. Note that this is a simplified version + of the error model proposed by Rocke and Lorenzato (1995), as in their model the error of the + measured values approximates lognormal distribution for high values, whereas we are using + normally distributed error components all along.

    +

    Initial concentrations for metabolites and all values where adding the variance component resulted + in a value below the assumed limit of detection of 0.1 were set to NA.

    +

    As an example, the first dataset has the title SFO_lin_a and is based on the SFO model + with two sequential metabolites (linear pathway), with added variance component 'a'.

    +

    Compare also the code in the example section to see the degradation models.

    +
    + +
    +

    Usage

    +
    synthetic_data_for_UBA_2014
    +
    + +
    +

    Format

    +

    A list containing twelve datasets as an R6 class defined by mkinds, + each containing, among others, the following components

    title
    +

    The name of the dataset, e.g. SFO_lin_a

    + +
    data
    +

    A data frame with the data in the form expected by mkinfit

    + + +
    +
    +

    Source

    +

    Ranke (2014) Prüfung und Validierung von Modellierungssoftware als Alternative + zu ModelMaker 4.0, Umweltbundesamt Projektnummer 27452

    +

    Rocke, David M. und Lorenzato, Stefan (1995) A two-component model for + measurement error in analytical chemistry. Technometrics 37(2), 176-184.

    +
    + +
    +

    Examples

    +
    # \dontrun{
    +# The data have been generated using the following kinetic models
    +m_synth_SFO_lin <- mkinmod(parent = list(type = "SFO", to = "M1"),
    +                           M1 = list(type = "SFO", to = "M2"),
    +                           M2 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +
    +m_synth_SFO_par <- mkinmod(parent = list(type = "SFO", to = c("M1", "M2"),
    +                                         sink = FALSE),
    +                           M1 = list(type = "SFO"),
    +                           M2 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +m_synth_DFOP_lin <- mkinmod(parent = list(type = "DFOP", to = "M1"),
    +                            M1 = list(type = "SFO", to = "M2"),
    +                            M2 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +m_synth_DFOP_par <- mkinmod(parent = list(type = "DFOP", to = c("M1", "M2"),
    +                                          sink = FALSE),
    +                            M1 = list(type = "SFO"),
    +                            M2 = list(type = "SFO"), use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +# The model predictions without intentional error were generated as follows
    +sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
    +
    +d_synth_SFO_lin <- mkinpredict(m_synth_SFO_lin,
    +                               c(k_parent = 0.7, f_parent_to_M1 = 0.8,
    +                                 k_M1 = 0.3, f_M1_to_M2 = 0.7,
    +                                 k_M2 = 0.02),
    +                               c(parent = 100, M1 = 0, M2 = 0),
    +                               sampling_times)
    +
    +d_synth_DFOP_lin <- mkinpredict(m_synth_DFOP_lin,
    +                                c(k1 = 0.2, k2 = 0.02, g = 0.5,
    +                                  f_parent_to_M1 = 0.5, k_M1 = 0.3,
    +                                  f_M1_to_M2 = 0.7, k_M2 = 0.02),
    +                                 c(parent = 100, M1 = 0, M2 = 0),
    +                                 sampling_times)
    +
    +d_synth_SFO_par <- mkinpredict(m_synth_SFO_par,
    +                               c(k_parent = 0.2,
    +                                 f_parent_to_M1 = 0.8, k_M1 = 0.01,
    +                                 f_parent_to_M2 = 0.2, k_M2 = 0.02),
    +                                 c(parent = 100, M1 = 0, M2 = 0),
    +                                 sampling_times)
    +
    +d_synth_DFOP_par <- mkinpredict(m_synth_DFOP_par,
    +                               c(k1 = 0.3, k2 = 0.02, g = 0.7,
    +                                 f_parent_to_M1 = 0.6, k_M1 = 0.04,
    +                                 f_parent_to_M2 = 0.4, k_M2 = 0.01),
    +                                 c(parent = 100, M1 = 0, M2 = 0),
    +                                 sampling_times)
    +
    +# Construct names for datasets with errors
    +d_synth_names = paste0("d_synth_", c("SFO_lin", "SFO_par",
    +                                     "DFOP_lin", "DFOP_par"))
    +
    +# Original function used or adding errors. The add_err function now published
    +# with this package is a slightly generalised version where the names of
    +# secondary compartments that should have an initial value of zero (M1 and M2
    +# in this case) are not hardcoded any more.
    +# add_err = function(d, sdfunc, LOD = 0.1, reps = 2, seed = 123456789)
    +# {
    +#   set.seed(seed)
    +#   d_long = mkin_wide_to_long(d, time = "time")
    +#   d_rep = data.frame(lapply(d_long, rep, each = 2))
    +#   d_rep$value = rnorm(length(d_rep$value), d_rep$value, sdfunc(d_rep$value))
    +#
    +#   d_rep[d_rep$time == 0 & d_rep$name %in% c("M1", "M2"), "value"] <- 0
    +#   d_NA <- transform(d_rep, value = ifelse(value < LOD, NA, value))
    +#   d_NA$value <- round(d_NA$value, 1)
    +#   return(d_NA)
    +# }
    +
    +# The following is the simplified version of the two-component model of Rocke
    +# and Lorenzato (1995)
    +sdfunc_twocomp = function(value, sd_low, rsd_high) {
    +  sqrt(sd_low^2 + value^2 * rsd_high^2)
    +}
    +
    +# Add the errors.
    +for (d_synth_name in d_synth_names)
    +{
    +  d_synth = get(d_synth_name)
    +  assign(paste0(d_synth_name, "_a"), add_err(d_synth, function(value) 3))
    +  assign(paste0(d_synth_name, "_b"), add_err(d_synth, function(value) 7))
    +  assign(paste0(d_synth_name, "_c"), add_err(d_synth,
    +                           function(value) sdfunc_twocomp(value, 0.5, 0.07)))
    +
    +}
    +
    +d_synth_err_names = c(
    +  paste(rep(d_synth_names, each = 3), letters[1:3], sep = "_")
    +)
    +
    +# This is just one example of an evaluation using the kinetic model used for
    +# the generation of the data
    +  fit <- mkinfit(m_synth_SFO_lin, synthetic_data_for_UBA_2014[[1]]$data,
    +                 quiet = TRUE)
    +  plot_sep(fit)
    +
    +  summary(fit)
    +#> mkin version used for fitting:    1.2.10 
    +#> R version used for fitting:       4.4.2 
    +#> Date of fit:     Fri Feb 14 07:34:43 2025 
    +#> Date of summary: Fri Feb 14 07:34:43 2025 
    +#> 
    +#> Equations:
    +#> d_parent/dt = - k_parent * parent
    +#> d_M1/dt = + f_parent_to_M1 * k_parent * parent - k_M1 * M1
    +#> d_M2/dt = + f_M1_to_M2 * k_M1 * M1 - k_M2 * M2
    +#> 
    +#> Model predictions using solution type deSolve 
    +#> 
    +#> Fitted using 848 model solutions performed in 0.17 s
    +#> 
    +#> Error model: Constant variance 
    +#> 
    +#> Error model algorithm: OLS 
    +#> 
    +#> Starting values for parameters to be optimised:
    +#>                   value   type
    +#> parent_0       101.3500  state
    +#> k_parent         0.1000 deparm
    +#> k_M1             0.1001 deparm
    +#> k_M2             0.1002 deparm
    +#> f_parent_to_M1   0.5000 deparm
    +#> f_M1_to_M2       0.5000 deparm
    +#> 
    +#> Starting values for the transformed parameters actually optimised:
    +#>                      value lower upper
    +#> parent_0        101.350000  -Inf   Inf
    +#> log_k_parent     -2.302585  -Inf   Inf
    +#> log_k_M1         -2.301586  -Inf   Inf
    +#> log_k_M2         -2.300587  -Inf   Inf
    +#> f_parent_qlogis   0.000000  -Inf   Inf
    +#> f_M1_qlogis       0.000000  -Inf   Inf
    +#> 
    +#> Fixed parameter values:
    +#>      value  type
    +#> M1_0     0 state
    +#> M2_0     0 state
    +#> 
    +#> Results:
    +#> 
    +#>        AIC      BIC    logLik
    +#>   188.7274 200.3723 -87.36368
    +#> 
    +#> Optimised, transformed parameters with symmetric confidence intervals:
    +#>                 Estimate Std. Error   Lower    Upper
    +#> parent_0        102.1000    1.57000 98.8600 105.3000
    +#> log_k_parent     -0.3020    0.03885 -0.3812  -0.2229
    +#> log_k_M1         -1.2070    0.07123 -1.3520  -1.0620
    +#> log_k_M2         -3.9010    0.06571 -4.0350  -3.7670
    +#> f_parent_qlogis   1.2010    0.23530  0.7216   1.6800
    +#> f_M1_qlogis       0.9589    0.24890  0.4520   1.4660
    +#> sigma             2.2730    0.25740  1.7490   2.7970
    +#> 
    +#> Parameter correlation:
    +#>                   parent_0 log_k_parent   log_k_M1   log_k_M2 f_parent_qlogis
    +#> parent_0         1.000e+00    3.933e-01 -1.605e-01  2.819e-02      -4.624e-01
    +#> log_k_parent     3.933e-01    1.000e+00 -4.082e-01  7.166e-02      -5.682e-01
    +#> log_k_M1        -1.605e-01   -4.082e-01  1.000e+00 -3.929e-01       7.478e-01
    +#> log_k_M2         2.819e-02    7.166e-02 -3.929e-01  1.000e+00      -2.658e-01
    +#> f_parent_qlogis -4.624e-01   -5.682e-01  7.478e-01 -2.658e-01       1.000e+00
    +#> f_M1_qlogis      1.614e-01    4.102e-01 -8.109e-01  5.419e-01      -8.605e-01
    +#> sigma           -1.377e-08    7.536e-10  1.089e-08 -4.422e-08       7.124e-09
    +#>                 f_M1_qlogis      sigma
    +#> parent_0          1.614e-01 -1.377e-08
    +#> log_k_parent      4.102e-01  7.536e-10
    +#> log_k_M1         -8.109e-01  1.089e-08
    +#> log_k_M2          5.419e-01 -4.422e-08
    +#> f_parent_qlogis  -8.605e-01  7.124e-09
    +#> f_M1_qlogis       1.000e+00 -2.685e-08
    +#> sigma            -2.685e-08  1.000e+00
    +#> 
    +#> Backtransformed parameters:
    +#> Confidence intervals for internally transformed parameters are asymmetric.
    +#> t-test (unrealistically) based on the assumption of normal distribution
    +#> for estimators of untransformed parameters.
    +#>                 Estimate t value    Pr(>t)    Lower     Upper
    +#> parent_0       102.10000  65.000 7.281e-36 98.86000 105.30000
    +#> k_parent         0.73930  25.740 2.948e-23  0.68310   0.80020
    +#> k_M1             0.29920  14.040 1.577e-15  0.25880   0.34590
    +#> k_M2             0.02023  15.220 1.653e-16  0.01769   0.02312
    +#> f_parent_to_M1   0.76870  18.370 7.295e-19  0.67300   0.84290
    +#> f_M1_to_M2       0.72290  14.500 6.418e-16  0.61110   0.81240
    +#> sigma            2.27300   8.832 2.161e-10  1.74900   2.79700
    +#> 
    +#> FOCUS Chi2 error levels in percent:
    +#>          err.min n.optim df
    +#> All data   8.454       6 17
    +#> parent     8.660       2  6
    +#> M1        10.583       2  5
    +#> M2         3.586       2  6
    +#> 
    +#> Resulting formation fractions:
    +#>                 ff
    +#> parent_M1   0.7687
    +#> parent_sink 0.2313
    +#> M1_M2       0.7229
    +#> M1_sink     0.2771
    +#> 
    +#> Estimated disappearance times:
    +#>           DT50    DT90
    +#> parent  0.9376   3.114
    +#> M1      2.3170   7.697
    +#> M2     34.2689 113.839
    +#> 
    +#> Data:
    +#>  time variable observed  predicted residual
    +#>     0   parent    101.5  1.021e+02 -0.56248
    +#>     0   parent    101.2  1.021e+02 -0.86248
    +#>     1   parent     53.9  4.873e+01  5.17118
    +#>     1   parent     47.5  4.873e+01 -1.22882
    +#>     3   parent     10.4  1.111e+01 -0.70773
    +#>     3   parent      7.6  1.111e+01 -3.50773
    +#>     7   parent      1.1  5.772e-01  0.52283
    +#>     7   parent      0.3  5.772e-01 -0.27717
    +#>    14   parent      3.5  3.264e-03  3.49674
    +#>    28   parent      3.2  1.045e-07  3.20000
    +#>    90   parent      0.6  9.532e-10  0.60000
    +#>   120   parent      3.5 -5.940e-10  3.50000
    +#>     1       M1     36.4  3.479e+01  1.61088
    +#>     1       M1     37.4  3.479e+01  2.61088
    +#>     3       M1     34.3  3.937e+01 -5.07027
    +#>     3       M1     39.8  3.937e+01  0.42973
    +#>     7       M1     15.1  1.549e+01 -0.38715
    +#>     7       M1     17.8  1.549e+01  2.31285
    +#>    14       M1      5.8  1.995e+00  3.80469
    +#>    14       M1      1.2  1.995e+00 -0.79531
    +#>    60       M1      0.5  2.111e-06  0.50000
    +#>    90       M1      3.2 -9.672e-10  3.20000
    +#>   120       M1      1.5  7.670e-10  1.50000
    +#>   120       M1      0.6  7.670e-10  0.60000
    +#>     1       M2      4.8  4.455e+00  0.34517
    +#>     3       M2     20.9  2.153e+01 -0.62527
    +#>     3       M2     19.3  2.153e+01 -2.22527
    +#>     7       M2     42.0  4.192e+01  0.07941
    +#>     7       M2     43.1  4.192e+01  1.17941
    +#>    14       M2     49.4  4.557e+01  3.83353
    +#>    14       M2     44.3  4.557e+01 -1.26647
    +#>    28       M2     34.6  3.547e+01 -0.87275
    +#>    28       M2     33.0  3.547e+01 -2.47275
    +#>    60       M2     18.8  1.858e+01  0.21837
    +#>    60       M2     17.6  1.858e+01 -0.98163
    +#>    90       M2     10.6  1.013e+01  0.47130
    +#>    90       M2     10.8  1.013e+01  0.67130
    +#>   120       M2      9.8  5.521e+00  4.27893
    +#>   120       M2      3.3  5.521e+00 -2.22107
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/test_data_from_UBA_2014-1.png b/docs/dev/reference/test_data_from_UBA_2014-1.png new file mode 100644 index 00000000..db29d16d Binary files /dev/null and b/docs/dev/reference/test_data_from_UBA_2014-1.png differ diff --git a/docs/dev/reference/test_data_from_UBA_2014-2.png b/docs/dev/reference/test_data_from_UBA_2014-2.png new file mode 100644 index 00000000..2bfb77f7 Binary files /dev/null and b/docs/dev/reference/test_data_from_UBA_2014-2.png differ diff --git a/docs/dev/reference/test_data_from_UBA_2014.html b/docs/dev/reference/test_data_from_UBA_2014.html new file mode 100644 index 00000000..0d6b8105 --- /dev/null +++ b/docs/dev/reference/test_data_from_UBA_2014.html @@ -0,0 +1,195 @@ + +Three experimental datasets from two water sediment systems and one soil — test_data_from_UBA_2014 • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The datasets were used for the comparative validation of several kinetic evaluation + software packages (Ranke, 2014).

    +
    + +
    +

    Usage

    +
    test_data_from_UBA_2014
    +
    + +
    +

    Format

    +

    A list containing three datasets as an R6 class defined by mkinds. + Each dataset has, among others, the following components

    title
    +

    The name of the dataset, e.g. UBA_2014_WS_river

    + +
    data
    +

    A data frame with the data in the form expected by mkinfit

    + + +
    +
    +

    Source

    +

    Ranke (2014) Prüfung und Validierung von Modellierungssoftware als Alternative + zu ModelMaker 4.0, Umweltbundesamt Projektnummer 27452

    +
    + +
    +

    Examples

    +
      # \dontrun{
    +  # This is a level P-II evaluation of the dataset according to the FOCUS kinetics
    +  # guidance. Due to the strong correlation of the parameter estimates, the
    +  # covariance matrix is not returned. Note that level P-II evaluations are
    +  # generally considered deprecated due to the frequent occurrence of such
    +  # large parameter correlations, among other reasons (e.g. the adequacy of the
    +  # model).
    +  m_ws <- mkinmod(parent_w = mkinsub("SFO", "parent_s"),
    +                  parent_s = mkinsub("SFO", "parent_w"))
    +#> Temporary DLL for differentials generated and loaded
    +  f_river <- mkinfit(m_ws, test_data_from_UBA_2014[[1]]$data, quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +  plot_sep(f_river)
    +
    +
    +  summary(f_river)$bpar
    +#>                           Estimate se_notrans    t value       Pr(>t)
    +#> parent_w_0             95.98567441 2.16285684 44.3791159 1.245593e-17
    +#> k_parent_w              0.42068803 0.05573864  7.5475120 8.752928e-07
    +#> k_parent_s              0.07419672 0.10108562  0.7339987 2.371337e-01
    +#> f_parent_w_to_parent_s  0.14336920 0.05809346  2.4679062 1.305295e-02
    +#> f_parent_s_to_parent_w  1.00000000 3.13868615  0.3186046 3.772097e-01
    +#> sigma                   2.98287858 0.68923267  4.3278253 2.987160e-04
    +#>                              Lower       Upper
    +#> parent_w_0             91.48420501 100.4871438
    +#> k_parent_w              0.36593946   0.4836276
    +#> k_parent_s              0.02289956   0.2404043
    +#> f_parent_w_to_parent_s  0.08180934   0.2391848
    +#> f_parent_s_to_parent_w  0.00000000   1.0000000
    +#> sigma                   2.00184022   3.9639169
    +  mkinerrmin(f_river)
    +#>             err.min n.optim df
    +#> All data 0.09246946       5  6
    +#> parent_w 0.06377096       3  3
    +#> parent_s 0.20882325       2  3
    +
    +  # This is the evaluation used for the validation of software packages
    +  # in the expertise from 2014
    +  m_soil <- mkinmod(parent = mkinsub("SFO", c("M1", "M2")),
    +                    M1 = mkinsub("SFO", "M3"),
    +                    M2 = mkinsub("SFO", "M3"),
    +                    M3 = mkinsub("SFO"),
    +                    use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +  f_soil <- mkinfit(m_soil, test_data_from_UBA_2014[[3]]$data, quiet = TRUE)
    +#> Warning: Observations with value of zero were removed from the data
    +  plot_sep(f_soil, lpos = c("topright", "topright", "topright", "bottomright"))
    +
    +  summary(f_soil)$bpar
    +#>                   Estimate  se_notrans    t value       Pr(>t)        Lower
    +#> parent_0       76.55425650 0.859186398 89.1008711 1.113861e-26 74.755959420
    +#> k_parent        0.12081956 0.004601918 26.2541722 1.077359e-16  0.111561575
    +#> k_M1            0.84258615 0.806159719  1.0451851 1.545266e-01  0.113779564
    +#> k_M2            0.04210880 0.017083034  2.4649483 1.170188e-02  0.018013857
    +#> k_M3            0.01122918 0.007245855  1.5497385 6.885051e-02  0.002909431
    +#> f_parent_to_M1  0.32240200 0.240783878  1.3389684 9.819070e-02           NA
    +#> f_parent_to_M2  0.16099855 0.033691952  4.7785463 6.531136e-05           NA
    +#> f_M1_to_M3      0.27921507 0.269423709  1.0363419 1.565266e-01  0.022978202
    +#> f_M2_to_M3      0.55641252 0.595119937  0.9349586 1.807707e-01  0.008002509
    +#> sigma           1.14005399 0.149696423  7.6157731 1.727024e-07  0.826735778
    +#>                      Upper
    +#> parent_0       78.35255358
    +#> k_parent        0.13084582
    +#> k_M1            6.23970946
    +#> k_M2            0.09843260
    +#> k_M3            0.04333992
    +#> f_parent_to_M1          NA
    +#> f_parent_to_M2          NA
    +#> f_M1_to_M3      0.86450778
    +#> f_M2_to_M3      0.99489895
    +#> sigma           1.45337221
    +  mkinerrmin(f_soil)
    +#>             err.min n.optim df
    +#> All data 0.09649963       9 20
    +#> parent   0.04721283       2  6
    +#> M1       0.26551208       2  5
    +#> M2       0.20327575       2  5
    +#> M3       0.05196550       3  4
    +  # }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/tex_listing.html b/docs/dev/reference/tex_listing.html new file mode 100644 index 00000000..779fff4c --- /dev/null +++ b/docs/dev/reference/tex_listing.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/transform_odeparms.html b/docs/dev/reference/transform_odeparms.html new file mode 100644 index 00000000..42125012 --- /dev/null +++ b/docs/dev/reference/transform_odeparms.html @@ -0,0 +1,293 @@ + +Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms • mkin + Skip to contents + + +
    +
    +
    + +
    +

    The transformations are intended to map parameters that should only take on +restricted values to the full scale of real numbers. For kinetic rate +constants and other parameters that can only take on positive values, a +simple log transformation is used. For compositional parameters, such as the +formations fractions that should always sum up to 1 and can not be negative, +the ilr transformation is used.

    +
    + +
    +

    Usage

    +
    transform_odeparms(
    +  parms,
    +  mkinmod,
    +  transform_rates = TRUE,
    +  transform_fractions = TRUE
    +)
    +
    +backtransform_odeparms(
    +  transparms,
    +  mkinmod,
    +  transform_rates = TRUE,
    +  transform_fractions = TRUE
    +)
    +
    + +
    +

    Arguments

    + + +
    parms
    +

    Parameters of kinetic models as used in the differential +equations.

    + + +
    mkinmod
    +

    The kinetic model of class mkinmod, containing +the names of the model variables that are needed for grouping the +formation fractions before ilr transformation, the parameter +names and the information if the pathway to sink is included in the model.

    + + +
    transform_rates
    +

    Boolean specifying if kinetic rate constants should +be transformed in the model specification used in the fitting for better +compliance with the assumption of normal distribution of the estimator. If +TRUE, also alpha and beta parameters of the FOMC model are +log-transformed, as well as k1 and k2 rate constants for the DFOP and HS +models and the break point tb of the HS model.

    + + +
    transform_fractions
    +

    Boolean specifying if formation fractions +constants should be transformed in the model specification used in the +fitting for better compliance with the assumption of normal distribution +of the estimator. The default (TRUE) is to do transformations. +The g parameter of the DFOP model is also seen as a fraction. +If a single fraction is transformed (g parameter of DFOP or only a single +target variable e.g. a single metabolite plus a pathway to sink), a +logistic transformation is used stats::qlogis(). In other cases, i.e. if +two or more formation fractions need to be transformed whose sum cannot +exceed one, the ilr transformation is used.

    + + +
    transparms
    +

    Transformed parameters of kinetic models as used in the +fitting procedure.

    + +
    +
    +

    Value

    +

    A vector of transformed or backtransformed parameters

    +
    +
    +

    Details

    +

    The transformation of sets of formation fractions is fragile, as it supposes +the same ordering of the components in forward and backward transformation. +This is no problem for the internal use in mkinfit.

    +
    +
    +

    Author

    +

    Johannes Ranke

    +
    + +
    +

    Examples

    +
    
    +SFO_SFO <- mkinmod(
    +  parent = list(type = "SFO", to = "m1", sink = TRUE),
    +  m1 = list(type = "SFO"), use_of_ff = "min")
    +#> Temporary DLL for differentials generated and loaded
    +
    +# Fit the model to the FOCUS example dataset D using defaults
    +FOCUS_D <- subset(FOCUS_2006_D, value != 0) # remove zero values to avoid warning
    +fit <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE)
    +fit.s <- summary(fit)
    +# Transformed and backtransformed parameters
    +print(fit.s$par, 3)
    +#>                   Estimate Std. Error Lower  Upper
    +#> parent_0             99.60     1.5702 96.40 102.79
    +#> log_k_parent_sink    -3.04     0.0763 -3.19  -2.88
    +#> log_k_parent_m1      -2.98     0.0403 -3.06  -2.90
    +#> log_k_m1_sink        -5.25     0.1332 -5.52  -4.98
    +#> sigma                 3.13     0.3585  2.40   3.85
    +print(fit.s$bpar, 3)
    +#>               Estimate se_notrans t value   Pr(>t)    Lower    Upper
    +#> parent_0      99.59848    1.57022   63.43 2.30e-36 96.40384 102.7931
    +#> k_parent_sink  0.04792    0.00365   13.11 6.13e-15  0.04103   0.0560
    +#> k_parent_m1    0.05078    0.00205   24.80 3.27e-23  0.04678   0.0551
    +#> k_m1_sink      0.00526    0.00070    7.51 6.16e-09  0.00401   0.0069
    +#> sigma          3.12550    0.35852    8.72 2.24e-10  2.39609   3.8549
    +
    +# \dontrun{
    +# Compare to the version without transforming rate parameters (does not work
    +# with analytical solution, we get NA values for m1 in predictions)
    +fit.2 <- mkinfit(SFO_SFO, FOCUS_D, transform_rates = FALSE,
    +  solution_type = "deSolve", quiet = TRUE)
    +fit.2.s <- summary(fit.2)
    +print(fit.2.s$par, 3)
    +#>               Estimate Std. Error    Lower    Upper
    +#> parent_0      99.59848    1.57022 96.40384 1.03e+02
    +#> k_parent_sink  0.04792    0.00365  0.04049 5.54e-02
    +#> k_parent_m1    0.05078    0.00205  0.04661 5.49e-02
    +#> k_m1_sink      0.00526    0.00070  0.00384 6.69e-03
    +#> sigma          3.12550    0.35852  2.39609 3.85e+00
    +print(fit.2.s$bpar, 3)
    +#>               Estimate se_notrans t value   Pr(>t)    Lower    Upper
    +#> parent_0      99.59848    1.57022   63.43 2.30e-36 96.40384 1.03e+02
    +#> k_parent_sink  0.04792    0.00365   13.11 6.13e-15  0.04049 5.54e-02
    +#> k_parent_m1    0.05078    0.00205   24.80 3.27e-23  0.04661 5.49e-02
    +#> k_m1_sink      0.00526    0.00070    7.51 6.16e-09  0.00384 6.69e-03
    +#> sigma          3.12550    0.35852    8.72 2.24e-10  2.39609 3.85e+00
    +# }
    +
    +initials <- fit$start$value
    +names(initials) <- rownames(fit$start)
    +transformed <- fit$start_transformed$value
    +names(transformed) <- rownames(fit$start_transformed)
    +transform_odeparms(initials, SFO_SFO)
    +#>          parent_0 log_k_parent_sink   log_k_parent_m1     log_k_m1_sink 
    +#>        100.750000         -2.302585         -2.301586         -2.300587 
    +backtransform_odeparms(transformed, SFO_SFO)
    +#>      parent_0 k_parent_sink   k_parent_m1     k_m1_sink 
    +#>      100.7500        0.1000        0.1001        0.1002 
    +
    +# \dontrun{
    +# The case of formation fractions (this is now the default)
    +SFO_SFO.ff <- mkinmod(
    +  parent = list(type = "SFO", to = "m1", sink = TRUE),
    +  m1 = list(type = "SFO"),
    +  use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +fit.ff <- mkinfit(SFO_SFO.ff, FOCUS_D, quiet = TRUE)
    +fit.ff.s <- summary(fit.ff)
    +print(fit.ff.s$par, 3)
    +#>                 Estimate Std. Error  Lower  Upper
    +#> parent_0         99.5985     1.5702 96.404 102.79
    +#> log_k_parent     -2.3157     0.0409 -2.399  -2.23
    +#> log_k_m1         -5.2475     0.1332 -5.518  -4.98
    +#> f_parent_qlogis   0.0579     0.0893 -0.124   0.24
    +#> sigma             3.1255     0.3585  2.396   3.85
    +print(fit.ff.s$bpar, 3)
    +#>                Estimate se_notrans t value   Pr(>t)    Lower    Upper
    +#> parent_0       99.59848    1.57022   63.43 2.30e-36 96.40383 102.7931
    +#> k_parent        0.09870    0.00403   24.47 4.96e-23  0.09082   0.1073
    +#> k_m1            0.00526    0.00070    7.51 6.16e-09  0.00401   0.0069
    +#> f_parent_to_m1  0.51448    0.02230   23.07 3.10e-22  0.46912   0.5596
    +#> sigma           3.12550    0.35852    8.72 2.24e-10  2.39609   3.8549
    +initials <- c("f_parent_to_m1" = 0.5)
    +transformed <- transform_odeparms(initials, SFO_SFO.ff)
    +backtransform_odeparms(transformed, SFO_SFO.ff)
    +#> f_parent_to_m1 
    +#>            0.5 
    +
    +# And without sink
    +SFO_SFO.ff.2 <- mkinmod(
    +  parent = list(type = "SFO", to = "m1", sink = FALSE),
    +  m1 = list(type = "SFO"),
    +  use_of_ff = "max")
    +#> Temporary DLL for differentials generated and loaded
    +
    +
    +fit.ff.2 <- mkinfit(SFO_SFO.ff.2, FOCUS_D, quiet = TRUE)
    +fit.ff.2.s <- summary(fit.ff.2)
    +print(fit.ff.2.s$par, 3)
    +#>              Estimate Std. Error Lower Upper
    +#> parent_0        84.79      3.012 78.67 90.91
    +#> log_k_parent    -2.76      0.082 -2.92 -2.59
    +#> log_k_m1        -4.21      0.123 -4.46 -3.96
    +#> sigma            8.22      0.943  6.31 10.14
    +print(fit.ff.2.s$bpar, 3)
    +#>          Estimate se_notrans t value   Pr(>t)   Lower  Upper
    +#> parent_0  84.7916    3.01203   28.15 1.92e-25 78.6704 90.913
    +#> k_parent   0.0635    0.00521   12.19 2.91e-14  0.0538  0.075
    +#> k_m1       0.0148    0.00182    8.13 8.81e-10  0.0115  0.019
    +#> sigma      8.2229    0.94323    8.72 1.73e-10  6.3060 10.140
    +# }
    +
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/update.mkinfit-1.png b/docs/dev/reference/update.mkinfit-1.png new file mode 100644 index 00000000..bc818a4c Binary files /dev/null and b/docs/dev/reference/update.mkinfit-1.png differ diff --git a/docs/dev/reference/update.mkinfit-2.png b/docs/dev/reference/update.mkinfit-2.png new file mode 100644 index 00000000..bbd2b9b7 Binary files /dev/null and b/docs/dev/reference/update.mkinfit-2.png differ diff --git a/docs/dev/reference/update.mkinfit.html b/docs/dev/reference/update.mkinfit.html new file mode 100644 index 00000000..e83fe3d2 --- /dev/null +++ b/docs/dev/reference/update.mkinfit.html @@ -0,0 +1,138 @@ + +Update an mkinfit model with different arguments — update.mkinfit • mkin + Skip to contents + + +
    +
    +
    + +
    +

    This function will return an updated mkinfit object. The fitted degradation +model parameters from the old fit are used as starting values for the +updated fit. Values specified as 'parms.ini' and/or 'state.ini' will +override these starting values.

    +
    + +
    +

    Usage

    +
    # S3 method for class 'mkinfit'
    +update(object, ..., evaluate = TRUE)
    +
    + +
    +

    Arguments

    + + +
    object
    +

    An mkinfit object to be updated

    + + +
    ...
    +

    Arguments to mkinfit that should replace +the arguments from the original call. Arguments set to NULL will +remove arguments given in the original call

    + + +
    evaluate
    +

    Should the call be evaluated or returned as a call

    + +
    + +
    +

    Examples

    +
    # \dontrun{
    +fit <- mkinfit("SFO", subset(FOCUS_2006_D, value != 0), quiet = TRUE)
    +parms(fit)
    +#>    parent_0    k_parent       sigma 
    +#> 99.44423885  0.09793574  3.39632469 
    +plot_err(fit)
    +
    +fit_2 <- update(fit, error_model = "tc")
    +parms(fit_2)
    +#>     parent_0     k_parent    sigma_low     rsd_high 
    +#> 1.008549e+02 1.005665e-01 3.752222e-03 6.763434e-02 
    +plot_err(fit_2)
    +
    +# }
    +
    +
    +
    + + +
    + + + +
    + + + + + + + diff --git a/docs/dev/reference/update.nlme.mmkin.html b/docs/dev/reference/update.nlme.mmkin.html new file mode 100644 index 00000000..dc3bfe09 --- /dev/null +++ b/docs/dev/reference/update.nlme.mmkin.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/which.best.default.html b/docs/dev/reference/which.best.default.html new file mode 100644 index 00000000..06f15f0c --- /dev/null +++ b/docs/dev/reference/which.best.default.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/reference/which.best.html b/docs/dev/reference/which.best.html new file mode 100644 index 00000000..06f15f0c --- /dev/null +++ b/docs/dev/reference/which.best.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/dev/search.json b/docs/dev/search.json new file mode 100644 index 00000000..fb7dc6a1 --- /dev/null +++ b/docs/dev/search.json @@ -0,0 +1 @@ +[{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"laboratory-data-l1","dir":"Articles","previous_headings":"","what":"Laboratory Data L1","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":"following code defines example dataset L1 FOCUS kinetics report, p. 284: use assumptions simple first order (SFO), case declining rate constant time (FOMC) case two different phases kinetics (DFOP). detailed discussion models, please see FOCUS kinetics report. Since mkin version 0.9-32 (July 2014), can use shorthand notation like \"SFO\" parent degradation models. following two lines fit model produce summary report model fit. covers numerical analysis given FOCUS report. plot fit obtained plot function mkinfit objects. residual plot can easily obtained comparison, FOMC model fitted well, χ2\\chi^2 error level checked. get warning default optimisation algorithm Port converge, indication model overparameterised, .e. contains many parameters ill-defined consequence. fact, due higher number parameters, lower number degrees freedom fit, χ2\\chi^2 error level actually higher FOMC model (3.6%) SFO model (3.4%). Additionally, parameters log_alpha log_beta internally fitted model excessive confidence intervals, span 25 orders magnitude (!) backtransformed scale alpha beta. Also, t-test significant difference zero indicate significant difference, p-values greater 0.1, finally, parameter correlation log_alpha log_beta 1.000, clearly indicating model overparameterised. χ2\\chi^2 error levels reported Appendix 3 Appendix 7 FOCUS kinetics report rounded integer percentages partly deviate one percentage point results calculated mkin. reason known. However, mkin gives χ2\\chi^2 error levels kinfit package calculation routines kinfit package extensively compared results obtained KinGUI software, documented kinfit package vignette. KinGUI first widely used standard package field. Also, calculation χ2\\chi^2 error levels compared KinGUII, CAKE DegKin manager project sponsored German Umweltbundesamt (Ranke 2014).","code":"library(\"mkin\", quietly = TRUE) FOCUS_2006_L1 = data.frame( t = rep(c(0, 1, 2, 3, 5, 7, 14, 21, 30), each = 2), parent = c(88.3, 91.4, 85.6, 84.5, 78.9, 77.6, 72.0, 71.9, 50.3, 59.4, 47.0, 45.1, 27.7, 27.3, 10.0, 10.4, 2.9, 4.0)) FOCUS_2006_L1_mkin <- mkin_wide_to_long(FOCUS_2006_L1) m.L1.SFO <- mkinfit(\"SFO\", FOCUS_2006_L1_mkin, quiet = TRUE) summary(m.L1.SFO) ## mkin version used for fitting: 1.2.10 ## R version used for fitting: 4.4.2 ## Date of fit: Fri Feb 14 08:59:11 2025 ## Date of summary: Fri Feb 14 08:59:11 2025 ## ## Equations: ## d_parent/dt = - k_parent * parent ## ## Model predictions using solution type analytical ## ## Fitted using 133 model solutions performed in 0.01 s ## ## Error model: Constant variance ## ## Error model algorithm: OLS ## ## Starting values for parameters to be optimised: ## value type ## parent_0 89.85 state ## k_parent 0.10 deparm ## ## Starting values for the transformed parameters actually optimised: ## value lower upper ## parent_0 89.850000 -Inf Inf ## log_k_parent -2.302585 -Inf Inf ## ## Fixed parameter values: ## None ## ## Results: ## ## AIC BIC logLik ## 93.88778 96.5589 -43.94389 ## ## Optimised, transformed parameters with symmetric confidence intervals: ## Estimate Std. Error Lower Upper ## parent_0 92.470 1.28200 89.740 95.200 ## log_k_parent -2.347 0.03763 -2.428 -2.267 ## sigma 2.780 0.46330 1.792 3.767 ## ## Parameter correlation: ## parent_0 log_k_parent sigma ## parent_0 1.000e+00 6.186e-01 -1.516e-09 ## log_k_parent 6.186e-01 1.000e+00 -3.124e-09 ## sigma -1.516e-09 -3.124e-09 1.000e+00 ## ## Backtransformed parameters: ## Confidence intervals for internally transformed parameters are asymmetric. ## t-test (unrealistically) based on the assumption of normal distribution ## for estimators of untransformed parameters. ## Estimate t value Pr(>t) Lower Upper ## parent_0 92.47000 72.13 8.824e-21 89.74000 95.2000 ## k_parent 0.09561 26.57 2.487e-14 0.08824 0.1036 ## sigma 2.78000 6.00 1.216e-05 1.79200 3.7670 ## ## FOCUS Chi2 error levels in percent: ## err.min n.optim df ## All data 3.424 2 7 ## parent 3.424 2 7 ## ## Estimated disappearance times: ## DT50 DT90 ## parent 7.249 24.08 ## ## Data: ## time variable observed predicted residual ## 0 parent 88.3 92.471 -4.1710 ## 0 parent 91.4 92.471 -1.0710 ## 1 parent 85.6 84.039 1.5610 ## 1 parent 84.5 84.039 0.4610 ## 2 parent 78.9 76.376 2.5241 ## 2 parent 77.6 76.376 1.2241 ## 3 parent 72.0 69.412 2.5884 ## 3 parent 71.9 69.412 2.4884 ## 5 parent 50.3 57.330 -7.0301 ## 5 parent 59.4 57.330 2.0699 ## 7 parent 47.0 47.352 -0.3515 ## 7 parent 45.1 47.352 -2.2515 ## 14 parent 27.7 24.247 3.4528 ## 14 parent 27.3 24.247 3.0528 ## 21 parent 10.0 12.416 -2.4163 ## 21 parent 10.4 12.416 -2.0163 ## 30 parent 2.9 5.251 -2.3513 ## 30 parent 4.0 5.251 -1.2513 plot(m.L1.SFO, show_errmin = TRUE, main = \"FOCUS L1 - SFO\") mkinresplot(m.L1.SFO, ylab = \"Observed\", xlab = \"Time\") m.L1.FOMC <- mkinfit(\"FOMC\", FOCUS_2006_L1_mkin, quiet=TRUE) ## Warning in mkinfit(\"FOMC\", FOCUS_2006_L1_mkin, quiet = TRUE): Optimisation did not converge: ## false convergence (8) plot(m.L1.FOMC, show_errmin = TRUE, main = \"FOCUS L1 - FOMC\") summary(m.L1.FOMC, data = FALSE) ## Warning in sqrt(diag(covar)): NaNs produced ## Warning in cov2cor(ans$covar): diag(V) had non-positive or NA entries; the ## non-finite result may be dubious ## mkin version used for fitting: 1.2.10 ## R version used for fitting: 4.4.2 ## Date of fit: Fri Feb 14 08:59:11 2025 ## Date of summary: Fri Feb 14 08:59:11 2025 ## ## Equations: ## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent ## ## Model predictions using solution type analytical ## ## Fitted using 342 model solutions performed in 0.023 s ## ## Error model: Constant variance ## ## Error model algorithm: OLS ## ## Starting values for parameters to be optimised: ## value type ## parent_0 89.85 state ## alpha 1.00 deparm ## beta 10.00 deparm ## ## Starting values for the transformed parameters actually optimised: ## value lower upper ## parent_0 89.850000 -Inf Inf ## log_alpha 0.000000 -Inf Inf ## log_beta 2.302585 -Inf Inf ## ## Fixed parameter values: ## None ## ## ## Warning(s): ## Optimisation did not converge: ## false convergence (8) ## ## Results: ## ## AIC BIC logLik ## 95.88782 99.44931 -43.94391 ## ## Optimised, transformed parameters with symmetric confidence intervals: ## Estimate Std. Error Lower Upper ## parent_0 92.47 1.2820 89.720 95.220 ## log_alpha 13.20 NaN NaN NaN ## log_beta 15.54 NaN NaN NaN ## sigma 2.78 0.4607 1.792 3.768 ## ## Parameter correlation: ## parent_0 log_alpha log_beta sigma ## parent_0 1.000000 NaN NaN 0.000603 ## log_alpha NaN 1 NaN NaN ## log_beta NaN NaN 1 NaN ## sigma 0.000603 NaN NaN 1.000000 ## ## Backtransformed parameters: ## Confidence intervals for internally transformed parameters are asymmetric. ## t-test (unrealistically) based on the assumption of normal distribution ## for estimators of untransformed parameters. ## Estimate t value Pr(>t) Lower Upper ## parent_0 9.247e+01 NA NA 89.720 95.220 ## alpha 5.386e+05 NA NA NA NA ## beta 5.633e+06 NA NA NA NA ## sigma 2.780e+00 NA NA 1.792 3.768 ## ## FOCUS Chi2 error levels in percent: ## err.min n.optim df ## All data 3.619 3 6 ## parent 3.619 3 6 ## ## Estimated disappearance times: ## DT50 DT90 DT50back ## parent 7.249 24.08 7.249"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"laboratory-data-l2","dir":"Articles","previous_headings":"","what":"Laboratory Data L2","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":"following code defines example dataset L2 FOCUS kinetics report, p. 287:","code":"FOCUS_2006_L2 = data.frame( t = rep(c(0, 1, 3, 7, 14, 28), each = 2), parent = c(96.1, 91.8, 41.4, 38.7, 19.3, 22.3, 4.6, 4.6, 2.6, 1.2, 0.3, 0.6)) FOCUS_2006_L2_mkin <- mkin_wide_to_long(FOCUS_2006_L2)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"sfo-fit-for-l2","dir":"Articles","previous_headings":"Laboratory Data L2","what":"SFO fit for L2","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":", SFO model fitted result plotted. residual plot can obtained simply adding argument show_residuals plot command. χ2\\chi^2 error level 14% suggests model fit well. also obvious plots fit, included residual plot. FOCUS kinetics report, stated apparent systematic error observed residual plot measured DT90 (approximately day 5), underestimation beyond point. may add difficult judge random nature residuals just three samplings days 0, 1 3. Also, clear priori consistent underestimation approximate DT90 irrelevant. However, can rationalised fact FOCUS fate models generally implement SFO kinetics.","code":"m.L2.SFO <- mkinfit(\"SFO\", FOCUS_2006_L2_mkin, quiet=TRUE) plot(m.L2.SFO, show_residuals = TRUE, show_errmin = TRUE, main = \"FOCUS L2 - SFO\")"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"fomc-fit-for-l2","dir":"Articles","previous_headings":"Laboratory Data L2","what":"FOMC fit for L2","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":"comparison, FOMC model fitted well, χ2\\chi^2 error level checked. error level χ2\\chi^2 test passes much lower case. Therefore, FOMC model provides better description data, less experimental error assumed order explain data.","code":"m.L2.FOMC <- mkinfit(\"FOMC\", FOCUS_2006_L2_mkin, quiet = TRUE) plot(m.L2.FOMC, show_residuals = TRUE, main = \"FOCUS L2 - FOMC\") summary(m.L2.FOMC, data = FALSE) ## mkin version used for fitting: 1.2.10 ## R version used for fitting: 4.4.2 ## Date of fit: Fri Feb 14 08:59:12 2025 ## Date of summary: Fri Feb 14 08:59:12 2025 ## ## Equations: ## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent ## ## Model predictions using solution type analytical ## ## Fitted using 239 model solutions performed in 0.015 s ## ## Error model: Constant variance ## ## Error model algorithm: OLS ## ## Starting values for parameters to be optimised: ## value type ## parent_0 93.95 state ## alpha 1.00 deparm ## beta 10.00 deparm ## ## Starting values for the transformed parameters actually optimised: ## value lower upper ## parent_0 93.950000 -Inf Inf ## log_alpha 0.000000 -Inf Inf ## log_beta 2.302585 -Inf Inf ## ## Fixed parameter values: ## None ## ## Results: ## ## AIC BIC logLik ## 61.78966 63.72928 -26.89483 ## ## Optimised, transformed parameters with symmetric confidence intervals: ## Estimate Std. Error Lower Upper ## parent_0 93.7700 1.6130 90.05000 97.4900 ## log_alpha 0.3180 0.1559 -0.04149 0.6776 ## log_beta 0.2102 0.2493 -0.36460 0.7850 ## sigma 2.2760 0.4645 1.20500 3.3470 ## ## Parameter correlation: ## parent_0 log_alpha log_beta sigma ## parent_0 1.000e+00 -1.151e-01 -2.085e-01 -7.436e-09 ## log_alpha -1.151e-01 1.000e+00 9.741e-01 -1.617e-07 ## log_beta -2.085e-01 9.741e-01 1.000e+00 -1.386e-07 ## sigma -7.436e-09 -1.617e-07 -1.386e-07 1.000e+00 ## ## Backtransformed parameters: ## Confidence intervals for internally transformed parameters are asymmetric. ## t-test (unrealistically) based on the assumption of normal distribution ## for estimators of untransformed parameters. ## Estimate t value Pr(>t) Lower Upper ## parent_0 93.770 58.120 4.267e-12 90.0500 97.490 ## alpha 1.374 6.414 1.030e-04 0.9594 1.969 ## beta 1.234 4.012 1.942e-03 0.6945 2.192 ## sigma 2.276 4.899 5.977e-04 1.2050 3.347 ## ## FOCUS Chi2 error levels in percent: ## err.min n.optim df ## All data 6.205 3 3 ## parent 6.205 3 3 ## ## Estimated disappearance times: ## DT50 DT90 DT50back ## parent 0.8092 5.356 1.612"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"dfop-fit-for-l2","dir":"Articles","previous_headings":"Laboratory Data L2","what":"DFOP fit for L2","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":"Fitting four parameter DFOP model reduces χ2\\chi^2 error level. , DFOP model clearly best-fit model dataset L2 based chi^2 error level criterion.","code":"m.L2.DFOP <- mkinfit(\"DFOP\", FOCUS_2006_L2_mkin, quiet = TRUE) plot(m.L2.DFOP, show_residuals = TRUE, show_errmin = TRUE, main = \"FOCUS L2 - DFOP\") summary(m.L2.DFOP, data = FALSE) ## mkin version used for fitting: 1.2.10 ## R version used for fitting: 4.4.2 ## Date of fit: Fri Feb 14 08:59:12 2025 ## Date of summary: Fri Feb 14 08:59:12 2025 ## ## Equations: ## d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * ## time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) ## * parent ## ## Model predictions using solution type analytical ## ## Fitted using 581 model solutions performed in 0.042 s ## ## Error model: Constant variance ## ## Error model algorithm: OLS ## ## Starting values for parameters to be optimised: ## value type ## parent_0 93.95 state ## k1 0.10 deparm ## k2 0.01 deparm ## g 0.50 deparm ## ## Starting values for the transformed parameters actually optimised: ## value lower upper ## parent_0 93.950000 -Inf Inf ## log_k1 -2.302585 -Inf Inf ## log_k2 -4.605170 -Inf Inf ## g_qlogis 0.000000 -Inf Inf ## ## Fixed parameter values: ## None ## ## Results: ## ## AIC BIC logLik ## 52.36695 54.79148 -21.18347 ## ## Optimised, transformed parameters with symmetric confidence intervals: ## Estimate Std. Error Lower Upper ## parent_0 93.950 9.998e-01 91.5900 96.3100 ## log_k1 3.113 1.849e+03 -4369.0000 4375.0000 ## log_k2 -1.088 6.285e-02 -1.2370 -0.9394 ## g_qlogis -0.399 9.946e-02 -0.6342 -0.1638 ## sigma 1.414 2.886e-01 0.7314 2.0960 ## ## Parameter correlation: ## parent_0 log_k1 log_k2 g_qlogis sigma ## parent_0 1.000e+00 6.763e-07 -8.944e-10 2.665e-01 -1.083e-09 ## log_k1 6.763e-07 1.000e+00 1.112e-04 -2.187e-04 -1.027e-05 ## log_k2 -8.944e-10 1.112e-04 1.000e+00 -7.903e-01 9.464e-09 ## g_qlogis 2.665e-01 -2.187e-04 -7.903e-01 1.000e+00 -1.532e-08 ## sigma -1.083e-09 -1.027e-05 9.464e-09 -1.532e-08 1.000e+00 ## ## Backtransformed parameters: ## Confidence intervals for internally transformed parameters are asymmetric. ## t-test (unrealistically) based on the assumption of normal distribution ## for estimators of untransformed parameters. ## Estimate t value Pr(>t) Lower Upper ## parent_0 93.9500 9.397e+01 2.036e-12 91.5900 96.3100 ## k1 22.4900 5.533e-04 4.998e-01 0.0000 Inf ## k2 0.3369 1.591e+01 4.697e-07 0.2904 0.3909 ## g 0.4016 1.680e+01 3.238e-07 0.3466 0.4591 ## sigma 1.4140 4.899e+00 8.776e-04 0.7314 2.0960 ## ## FOCUS Chi2 error levels in percent: ## err.min n.optim df ## All data 2.53 4 2 ## parent 2.53 4 2 ## ## Estimated disappearance times: ## DT50 DT90 DT50back DT50_k1 DT50_k2 ## parent 0.5335 5.311 1.599 0.03083 2.058"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"laboratory-data-l3","dir":"Articles","previous_headings":"","what":"Laboratory Data L3","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":"following code defines example dataset L3 FOCUS kinetics report, p. 290.","code":"FOCUS_2006_L3 = data.frame( t = c(0, 3, 7, 14, 30, 60, 91, 120), parent = c(97.8, 60, 51, 43, 35, 22, 15, 12)) FOCUS_2006_L3_mkin <- mkin_wide_to_long(FOCUS_2006_L3)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"fit-multiple-models","dir":"Articles","previous_headings":"Laboratory Data L3","what":"Fit multiple models","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":"mkin version 0.9-39 (June 2015), can fit several models one datasets one call function mmkin. datasets passed list, case named list holding L3 dataset prepared . χ2\\chi^2 error level 21% well plot suggest SFO model fit well. FOMC model performs better, error level χ2\\chi^2 test passes 7%. Fitting four parameter DFOP model reduces χ2\\chi^2 error level considerably.","code":"# Only use one core here, not to offend the CRAN checks mm.L3 <- mmkin(c(\"SFO\", \"FOMC\", \"DFOP\"), cores = 1, list(\"FOCUS L3\" = FOCUS_2006_L3_mkin), quiet = TRUE) plot(mm.L3)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"accessing-mmkin-objects","dir":"Articles","previous_headings":"Laboratory Data L3","what":"Accessing mmkin objects","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":"objects returned mmkin arranged like matrix, models row index datasets column index. can extract summary plot e.g. DFOP fit, using square brackets indexing result use summary plot functions working mkinfit objects. , look model plot, confidence intervals parameters correlation matrix suggest parameter estimates reliable, DFOP model can used best-fit model based χ2\\chi^2 error level criterion laboratory data L3. also example standard t-test parameter g_ilr misleading, tests significant difference zero. case, zero appears correct value parameter, confidence interval backtransformed parameter g quite narrow.","code":"summary(mm.L3[[\"DFOP\", 1]]) ## mkin version used for fitting: 1.2.10 ## R version used for fitting: 4.4.2 ## Date of fit: Fri Feb 14 08:59:12 2025 ## Date of summary: Fri Feb 14 08:59:12 2025 ## ## Equations: ## d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * ## time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) ## * parent ## ## Model predictions using solution type analytical ## ## Fitted using 376 model solutions performed in 0.024 s ## ## Error model: Constant variance ## ## Error model algorithm: OLS ## ## Starting values for parameters to be optimised: ## value type ## parent_0 97.80 state ## k1 0.10 deparm ## k2 0.01 deparm ## g 0.50 deparm ## ## Starting values for the transformed parameters actually optimised: ## value lower upper ## parent_0 97.800000 -Inf Inf ## log_k1 -2.302585 -Inf Inf ## log_k2 -4.605170 -Inf Inf ## g_qlogis 0.000000 -Inf Inf ## ## Fixed parameter values: ## None ## ## Results: ## ## AIC BIC logLik ## 32.97732 33.37453 -11.48866 ## ## Optimised, transformed parameters with symmetric confidence intervals: ## Estimate Std. Error Lower Upper ## parent_0 97.7500 1.01900 94.5000 101.000000 ## log_k1 -0.6612 0.10050 -0.9812 -0.341300 ## log_k2 -4.2860 0.04322 -4.4230 -4.148000 ## g_qlogis -0.1739 0.05270 -0.3416 -0.006142 ## sigma 1.0170 0.25430 0.2079 1.827000 ## ## Parameter correlation: ## parent_0 log_k1 log_k2 g_qlogis sigma ## parent_0 1.000e+00 1.732e-01 2.282e-02 4.009e-01 -9.696e-08 ## log_k1 1.732e-01 1.000e+00 4.945e-01 -5.809e-01 7.148e-07 ## log_k2 2.282e-02 4.945e-01 1.000e+00 -6.812e-01 1.022e-06 ## g_qlogis 4.009e-01 -5.809e-01 -6.812e-01 1.000e+00 -7.930e-07 ## sigma -9.696e-08 7.148e-07 1.022e-06 -7.930e-07 1.000e+00 ## ## Backtransformed parameters: ## Confidence intervals for internally transformed parameters are asymmetric. ## t-test (unrealistically) based on the assumption of normal distribution ## for estimators of untransformed parameters. ## Estimate t value Pr(>t) Lower Upper ## parent_0 97.75000 95.960 1.248e-06 94.50000 101.00000 ## k1 0.51620 9.947 1.081e-03 0.37490 0.71090 ## k2 0.01376 23.140 8.840e-05 0.01199 0.01579 ## g 0.45660 34.920 2.581e-05 0.41540 0.49850 ## sigma 1.01700 4.000 1.400e-02 0.20790 1.82700 ## ## FOCUS Chi2 error levels in percent: ## err.min n.optim df ## All data 2.225 4 4 ## parent 2.225 4 4 ## ## Estimated disappearance times: ## DT50 DT90 DT50back DT50_k1 DT50_k2 ## parent 7.464 123 37.03 1.343 50.37 ## ## Data: ## time variable observed predicted residual ## 0 parent 97.8 97.75 0.05396 ## 3 parent 60.0 60.45 -0.44933 ## 7 parent 51.0 49.44 1.56338 ## 14 parent 43.0 43.84 -0.83632 ## 30 parent 35.0 35.15 -0.14707 ## 60 parent 22.0 23.26 -1.25919 ## 91 parent 15.0 15.18 -0.18181 ## 120 parent 12.0 10.19 1.81395 plot(mm.L3[[\"DFOP\", 1]], show_errmin = TRUE)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html","id":"laboratory-data-l4","dir":"Articles","previous_headings":"","what":"Laboratory Data L4","title":"Example evaluation of FOCUS Laboratory Data L1 to L3","text":"following code defines example dataset L4 FOCUS kinetics report, p. 293: Fits SFO FOMC models, plots summaries produced : χ2\\chi^2 error level 3.3% well plot suggest SFO model fits well. error level χ2\\chi^2 test passes slightly lower FOMC model. However, difference appears negligible.","code":"FOCUS_2006_L4 = data.frame( t = c(0, 3, 7, 14, 30, 60, 91, 120), parent = c(96.6, 96.3, 94.3, 88.8, 74.9, 59.9, 53.5, 49.0)) FOCUS_2006_L4_mkin <- mkin_wide_to_long(FOCUS_2006_L4) # Only use one core here, not to offend the CRAN checks mm.L4 <- mmkin(c(\"SFO\", \"FOMC\"), cores = 1, list(\"FOCUS L4\" = FOCUS_2006_L4_mkin), quiet = TRUE) plot(mm.L4) summary(mm.L4[[\"SFO\", 1]], data = FALSE) ## mkin version used for fitting: 1.2.10 ## R version used for fitting: 4.4.2 ## Date of fit: Fri Feb 14 08:59:13 2025 ## Date of summary: Fri Feb 14 08:59:13 2025 ## ## Equations: ## d_parent/dt = - k_parent * parent ## ## Model predictions using solution type analytical ## ## Fitted using 142 model solutions performed in 0.01 s ## ## Error model: Constant variance ## ## Error model algorithm: OLS ## ## Starting values for parameters to be optimised: ## value type ## parent_0 96.6 state ## k_parent 0.1 deparm ## ## Starting values for the transformed parameters actually optimised: ## value lower upper ## parent_0 96.600000 -Inf Inf ## log_k_parent -2.302585 -Inf Inf ## ## Fixed parameter values: ## None ## ## Results: ## ## AIC BIC logLik ## 47.12133 47.35966 -20.56067 ## ## Optimised, transformed parameters with symmetric confidence intervals: ## Estimate Std. Error Lower Upper ## parent_0 96.440 1.69900 92.070 100.800 ## log_k_parent -5.030 0.07059 -5.211 -4.848 ## sigma 3.162 0.79050 1.130 5.194 ## ## Parameter correlation: ## parent_0 log_k_parent sigma ## parent_0 1.000e+00 5.938e-01 3.430e-07 ## log_k_parent 5.938e-01 1.000e+00 5.885e-07 ## sigma 3.430e-07 5.885e-07 1.000e+00 ## ## Backtransformed parameters: ## Confidence intervals for internally transformed parameters are asymmetric. ## t-test (unrealistically) based on the assumption of normal distribution ## for estimators of untransformed parameters. ## Estimate t value Pr(>t) Lower Upper ## parent_0 96.440000 56.77 1.604e-08 92.070000 1.008e+02 ## k_parent 0.006541 14.17 1.578e-05 0.005455 7.842e-03 ## sigma 3.162000 4.00 5.162e-03 1.130000 5.194e+00 ## ## FOCUS Chi2 error levels in percent: ## err.min n.optim df ## All data 3.287 2 6 ## parent 3.287 2 6 ## ## Estimated disappearance times: ## DT50 DT90 ## parent 106 352 summary(mm.L4[[\"FOMC\", 1]], data = FALSE) ## mkin version used for fitting: 1.2.10 ## R version used for fitting: 4.4.2 ## Date of fit: Fri Feb 14 08:59:13 2025 ## Date of summary: Fri Feb 14 08:59:13 2025 ## ## Equations: ## d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent ## ## Model predictions using solution type analytical ## ## Fitted using 224 model solutions performed in 0.013 s ## ## Error model: Constant variance ## ## Error model algorithm: OLS ## ## Starting values for parameters to be optimised: ## value type ## parent_0 96.6 state ## alpha 1.0 deparm ## beta 10.0 deparm ## ## Starting values for the transformed parameters actually optimised: ## value lower upper ## parent_0 96.600000 -Inf Inf ## log_alpha 0.000000 -Inf Inf ## log_beta 2.302585 -Inf Inf ## ## Fixed parameter values: ## None ## ## Results: ## ## AIC BIC logLik ## 40.37255 40.69032 -16.18628 ## ## Optimised, transformed parameters with symmetric confidence intervals: ## Estimate Std. Error Lower Upper ## parent_0 99.1400 1.2670 95.6300 102.7000 ## log_alpha -0.3506 0.2616 -1.0770 0.3756 ## log_beta 4.1740 0.3938 3.0810 5.2670 ## sigma 1.8300 0.4575 0.5598 3.1000 ## ## Parameter correlation: ## parent_0 log_alpha log_beta sigma ## parent_0 1.000e+00 -4.696e-01 -5.543e-01 -2.447e-07 ## log_alpha -4.696e-01 1.000e+00 9.889e-01 2.198e-08 ## log_beta -5.543e-01 9.889e-01 1.000e+00 4.923e-08 ## sigma -2.447e-07 2.198e-08 4.923e-08 1.000e+00 ## ## Backtransformed parameters: ## Confidence intervals for internally transformed parameters are asymmetric. ## t-test (unrealistically) based on the assumption of normal distribution ## for estimators of untransformed parameters. ## Estimate t value Pr(>t) Lower Upper ## parent_0 99.1400 78.250 7.993e-08 95.6300 102.700 ## alpha 0.7042 3.823 9.365e-03 0.3407 1.456 ## beta 64.9800 2.540 3.201e-02 21.7800 193.900 ## sigma 1.8300 4.000 8.065e-03 0.5598 3.100 ## ## FOCUS Chi2 error levels in percent: ## err.min n.optim df ## All data 2.029 3 5 ## parent 2.029 3 5 ## ## Estimated disappearance times: ## DT50 DT90 DT50back ## parent 108.9 1644 494.9"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/mkin.html","id":"abstract","dir":"Articles","previous_headings":"","what":"Abstract","title":"Short introduction to mkin","text":"regulatory evaluation chemical substances like plant protection products (pesticides), biocides chemicals, degradation data play important role. evaluation pesticide degradation experiments, detailed guidance developed, based nonlinear optimisation. R add-package mkin implements fitting models recommended guidance within R calculates statistical measures data series within one compartments, parent metabolites.","code":"library(\"mkin\", quietly = TRUE) # Define the kinetic model m_SFO_SFO_SFO <- mkinmod(parent = mkinsub(\"SFO\", \"M1\"), M1 = mkinsub(\"SFO\", \"M2\"), M2 = mkinsub(\"SFO\"), use_of_ff = \"max\", quiet = TRUE) # Produce model predictions using some arbitrary parameters sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) d_SFO_SFO_SFO <- mkinpredict(m_SFO_SFO_SFO, c(k_parent = 0.03, f_parent_to_M1 = 0.5, k_M1 = log(2)/100, f_M1_to_M2 = 0.9, k_M2 = log(2)/50), c(parent = 100, M1 = 0, M2 = 0), sampling_times) # Generate a dataset by adding normally distributed errors with # standard deviation 3, for two replicates at each sampling time d_SFO_SFO_SFO_err <- add_err(d_SFO_SFO_SFO, reps = 2, sdfunc = function(x) 3, n = 1, seed = 123456789 ) # Fit the model to the dataset f_SFO_SFO_SFO <- mkinfit(m_SFO_SFO_SFO, d_SFO_SFO_SFO_err[[1]], quiet = TRUE) # Plot the results separately for parent and metabolites plot_sep(f_SFO_SFO_SFO, lpos = c(\"topright\", \"bottomright\", \"bottomright\"))"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/mkin.html","id":"background","dir":"Articles","previous_headings":"","what":"Background","title":"Short introduction to mkin","text":"mkin package (J. Ranke 2021) implements approach degradation kinetics recommended kinetics report provided FOrum Co-ordination pesticide fate models USe (FOCUS Work Group Degradation Kinetics 2006, 2014). covers data series describing decline one compound, data series transformation products (commonly termed metabolites) data series one compartment. possible include back reactions. Therefore, equilibrium reactions equilibrium partitioning can specified, although often leads overparameterisation model. first mkin code published 2010, commonly used tools fitting complex kinetic degradation models experimental data KinGUI (Schäfer et al. 2007), MATLAB based tool graphical user interface specifically tailored task included output proposed FOCUS Kinetics Workgroup, ModelMaker, general purpose compartment based tool providing infrastructure fitting dynamic simulation models based differential equations data. ‘mkin’ code first uploaded BerliOS development platform. taken , version control history imported R-Forge site (see e.g. initial commit 11 May 2010), code still updated. time, R package FME (Flexible Modelling Environment) (Soetaert Petzoldt 2010) already available, provided good basis developing package specifically tailored task. remaining challenge make easy possible users (including author vignette) specify system differential equations include output requested FOCUS guidance, χ2\\chi^2 error level defined guidance. Also, mkin introduced using analytical solutions parent kinetics improved optimization speed. Later, Eigenvalue based solutions introduced mkin case linear differential equations (.e. FOMC DFOP models used parent compound), greatly improving optimization speed cases. , become somehow obsolete, use compiled code described gives even faster execution times. possibility specify back-reactions biphasic model (SFORB) metabolites present mkin beginning.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/mkin.html","id":"derived-software-tools","dir":"Articles","previous_headings":"Background","what":"Derived software tools","title":"Short introduction to mkin","text":"Soon publication mkin, two derived tools published, namely KinGUII (developed Bayer Crop Science) CAKE (commissioned Tessella Syngenta), added graphical user interface (GUI), added fitting iteratively reweighted least squares (IRLS) characterisation likely parameter distributions Markov Chain Monte Carlo (MCMC) sampling. CAKE focuses smooth use experience, sacrificing flexibility model definition, originally allowing two primary metabolites parallel. current version 3.4 CAKE released May 2020 uses scheme six metabolites flexible arrangement supports biphasic modelling metabolites, support back-reactions (non-instantaneous equilibria). KinGUI offers even flexible widget specifying complex kinetic models. Back-reactions (non-instantaneous equilibria) supported early , 2014, simple first-order models specified transformation products. Starting KinGUII version 2.1, biphasic modelling metabolites also available KinGUII. graphical user interface (GUI) recently brought decent degree maturity browser based GUI named gmkin. Please see documentation page manual information. comparison scope, usability numerical results obtained tools recently published Johannes Ranke, Wöltjen, Meinecke (2018).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/mkin.html","id":"unique-features","dir":"Articles","previous_headings":"","what":"Unique features","title":"Short introduction to mkin","text":"Currently, main unique features available mkin speed increase using compiled code compiler present, parallel model fitting multicore machines using mmkin function, estimation parameter confidence intervals based transformed parameters (see ) possibility use two-component error model iteratively reweighted least squares fitting different variances variable introduced Gao et al. (2011) available mkin since version 0.9-22. release 0.9.49.5, IRLS algorithm complemented direct step-wise maximisation likelihood function, makes possible fit variance variable error model also two-component error model inspired error models developed analytical chemistry (Johannes Ranke Meinecke 2019).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/mkin.html","id":"internal-parameter-transformations","dir":"Articles","previous_headings":"","what":"Internal parameter transformations","title":"Short introduction to mkin","text":"rate constants, log transformation used, proposed Bates Watts (1988, 77, 149). Approximate intervals constructed transformed rate constants (compare Bates Watts 1988, 135), .e. logarithms. Confidence intervals rate constants obtained using appropriate backtransformation using exponential function. first version mkin allowing specifying models using formation fractions, home-made reparameterisation used order ensure sum formation fractions exceed unity. method still used current version KinGUII (v2.1 April 2014), modification allows fixing pathway sink zero. CAKE uses penalties objective function order enforce constraint. 2012, alternative reparameterisation formation fractions proposed together René Lehmann (J. Ranke Lehmann 2012), based isometric logratio transformation (ILR). aim improve validity linear approximation objective function parameter estimation procedure well subsequent calculation parameter confidence intervals. current version mkin, logit transformation used parameters bound 0 1, g parameter DFOP model.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/mkin.html","id":"confidence-intervals-based-on-transformed-parameters","dir":"Articles","previous_headings":"Internal parameter transformations","what":"Confidence intervals based on transformed parameters","title":"Short introduction to mkin","text":"first attempt providing improved parameter confidence intervals introduced mkin 2013, confidence intervals obtained FME transformed parameters simply backtransformed one one yield asymmetric confidence intervals backtransformed parameters. However, 1:1 relation rate constants model transformed parameters fitted model, parameters obtained isometric logratio transformation calculated set formation fractions quantify paths compounds formed specific parent compound, 1:1 relation exists. Therefore, parameter confidence intervals formation fractions obtained method appear valid case single transformation product, currently logit transformation used formation fraction. confidence intervals obtained backtransformation cases 1:1 relation transformed original parameter exist considered author vignette accurate obtained using re-estimation Hessian matrix backtransformation, implemented FME package.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/mkin.html","id":"parameter-t-test-based-on-untransformed-parameters","dir":"Articles","previous_headings":"Internal parameter transformations","what":"Parameter t-test based on untransformed parameters","title":"Short introduction to mkin","text":"standard output many nonlinear regression software packages includes results test significant difference zero parameters. test also recommended check validity rate constants FOCUS guidance (FOCUS Work Group Degradation Kinetics 2014, 96ff). argued precondition test, .e. normal distribution estimator parameters, fulfilled case nonlinear regression (J. Ranke Lehmann 2015). However, test commonly used industry, consultants national authorities order decide reliability parameter estimates, based FOCUS guidance mentioned . Therefore, results one-sided t-test included summary output mkin. reasonable test significant difference transformed parameters (e.g. log(k)log(k)) zero, t-test calculated based model definition parameter transformation, .e. similar way packages apply internal parameter transformation. note included mkin output, pointing fact t-test based unjustified assumption normal distribution parameter estimators.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"introduction","dir":"Articles > Prebuilt","previous_headings":"","what":"Introduction","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"purpose document test demonstrate nonlinear hierarchical models (NLHM) based parent degradation models SFO, FOMC, DFOP HS, serial formation two metabolites can fitted mkin package. assembled course work package 1.2 Project Number 173340 (Application nonlinear hierarchical models kinetic evaluation chemical degradation data) German Environment Agency carried 2022 2023. mkin package used version 1.2.10 currently development. newly introduced functionality used simplification excluding random effects set fits based related set fits reduced model, documentation starting parameters fit, starting parameters saem fits now listed summary. saemix package used backend fitting NLHM, also loaded make convergence plot function available. document processed knitr package, also provides kable function used improve display tabular data R markdown documents. parallel processing, parallel package used.","code":"library(mkin) library(knitr) library(saemix) library(parallel) n_cores <- detectCores() # We need to start a new cluster after defining a compiled model that is # saved as a DLL to the user directory, therefore we define a function # This is used again after defining the pathway model start_cluster <- function(n_cores) { if (Sys.info()[\"sysname\"] == \"Windows\") { ret <- makePSOCKcluster(n_cores) } else { ret <- makeForkCluster(n_cores) } return(ret) } cl <- start_cluster(n_cores)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"test-data","dir":"Articles > Prebuilt","previous_headings":"Introduction","what":"Test data","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"example data taken final addendum DAR 2014 distributed mkin package. Residue data time step normalisation factors read using function read_spreadsheet mkin package. function also performs time step normalisation. following tables show covariate data 5 datasets read spreadsheet file. Covariate data Dataset Nambsheim Dataset Tama Dataset Gross-Umstadt Dataset Sassafras Dataset Lleida","code":"data_file <- system.file( \"testdata\", \"cyantraniliprole_soil_efsa_2014.xlsx\", package = \"mkin\") cyan_ds <- read_spreadsheet(data_file, parent_only = FALSE) pH <- attr(cyan_ds, \"covariates\") kable(pH, caption = \"Covariate data\") for (ds_name in names(cyan_ds)) { print( kable(mkin_long_to_wide(cyan_ds[[ds_name]]), caption = paste(\"Dataset\", ds_name), booktabs = TRUE, row.names = FALSE)) cat(\"\\n\\\\clearpage\\n\") }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"parent-only-evaluations","dir":"Articles > Prebuilt","previous_headings":"","what":"Parent only evaluations","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"pathway fits long run times, evaluations parent data performed first, order determine hierarchical parent degradation model random effects degradation model parameters ill-defined. fits converged successfully. almost models, random effect initial concentration parent compound ill-defined. biexponential models DFOP SFORB, random effect one additional parameter ill-defined two-component error model used. Model comparison based AIC BIC indicates two-component error model preferable parent models exception DFOP. lowest AIC BIC values obtained FOMC model, followed SFORB DFOP.","code":"cyan_sep_const <- mmkin(c(\"SFO\", \"FOMC\", \"DFOP\", \"SFORB\", \"HS\"), cyan_ds, quiet = TRUE, cores = n_cores) cyan_sep_tc <- update(cyan_sep_const, error_model = \"tc\") cyan_saem_full <- mhmkin(list(cyan_sep_const, cyan_sep_tc)) status(cyan_saem_full) |> kable() illparms(cyan_saem_full) |> kable() anova(cyan_saem_full) |> kable(digits = 1) stopCluster(cl)"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"evaluations-with-pathway-established-previously","dir":"Articles > Prebuilt","previous_headings":"Pathway fits","what":"Evaluations with pathway established previously","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"test technical feasibility coupling relevant parent degradation models different transformation pathway models, list mkinmod models set . EU evaluation, parallel formation metabolites JCZ38 J9Z38 secondary formation metabolite JSE76 JCZ38 used. obtain suitable starting values NLHM fits, separate pathway fits performed datasets. separate fits converged successfully. biggest convergence problems seen using HS model constant variance. hierarchical pathway fits, random effects quantified corresponding parent data analyses excluded. code , output illparms function parent fits used argument no_random_effect mhmkin function. possibility introduced mkin version 1.2.2 currently development. status information individual fits shows fits completed successfully. matrix entries Fth FO indicate Fisher Information Matrix inverted fixed effects (theta) random effects (Omega), respectively. affected fits, ill-defined parameters determined using illparms function, relies Fisher Information Matrix. model comparisons suggest pathway fits using DFOP SFORB parent compound provide best fit. two parent model, successful fits shown . Plots fits parent models shown Appendix. DFOP pathway fit two-component error SFORB pathway fit two-component error closer graphical analysis Figures shows residues transformation product JCZ38 soils Tama Nambsheim observed later time points strongly systematically underestimated.","code":"if (!dir.exists(\"cyan_dlls\")) dir.create(\"cyan_dlls\") cyan_path_1 <- list( sfo_path_1 = mkinmod( cyan = mkinsub(\"SFO\", c(\"JCZ38\", \"J9Z38\")), JCZ38 = mkinsub(\"SFO\", \"JSE76\"), J9Z38 = mkinsub(\"SFO\"), JSE76 = mkinsub(\"SFO\"), quiet = TRUE, name = \"sfo_path_1\", dll_dir = \"cyan_dlls\", overwrite = TRUE), fomc_path_1 = mkinmod( cyan = mkinsub(\"FOMC\", c(\"JCZ38\", \"J9Z38\")), JCZ38 = mkinsub(\"SFO\", \"JSE76\"), J9Z38 = mkinsub(\"SFO\"), JSE76 = mkinsub(\"SFO\"), quiet = TRUE, name = \"fomc_path_1\", dll_dir = \"cyan_dlls\", overwrite = TRUE), dfop_path_1 = mkinmod( cyan = mkinsub(\"DFOP\", c(\"JCZ38\", \"J9Z38\")), JCZ38 = mkinsub(\"SFO\", \"JSE76\"), J9Z38 = mkinsub(\"SFO\"), JSE76 = mkinsub(\"SFO\"), quiet = TRUE, name = \"dfop_path_1\", dll_dir = \"cyan_dlls\", overwrite = TRUE), sforb_path_1 = mkinmod( cyan = mkinsub(\"SFORB\", c(\"JCZ38\", \"J9Z38\")), JCZ38 = mkinsub(\"SFO\", \"JSE76\"), J9Z38 = mkinsub(\"SFO\"), JSE76 = mkinsub(\"SFO\"), quiet = TRUE, name = \"sforb_path_1\", dll_dir = \"cyan_dlls\", overwrite = TRUE), hs_path_1 = mkinmod( cyan = mkinsub(\"HS\", c(\"JCZ38\", \"J9Z38\")), JCZ38 = mkinsub(\"SFO\", \"JSE76\"), J9Z38 = mkinsub(\"SFO\"), JSE76 = mkinsub(\"SFO\"), quiet = TRUE, name = \"hs_path_1\", dll_dir = \"cyan_dlls\", overwrite = TRUE) ) cl_path_1 <- start_cluster(n_cores) f_sep_1_const <- mmkin( cyan_path_1, cyan_ds, error_model = \"const\", cluster = cl_path_1, quiet = TRUE) status(f_sep_1_const) |> kable() f_sep_1_tc <- update(f_sep_1_const, error_model = \"tc\") status(f_sep_1_tc) |> kable() f_saem_1 <- mhmkin(list(f_sep_1_const, f_sep_1_tc), no_random_effect = illparms(cyan_saem_full), cluster = cl_path_1) status(f_saem_1) |> kable() illparms(f_saem_1) |> kable() anova(f_saem_1[, \"const\"]) |> kable(digits = 1) anova(f_saem_1[1:4, ]) |> kable(digits = 1) plot(f_saem_1[[\"dfop_path_1\", \"tc\"]]) plot(f_saem_1[[\"sforb_path_1\", \"tc\"]]) stopCluster(cl_path_1)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"alternative-pathway-fits","dir":"Articles > Prebuilt","previous_headings":"Pathway fits","what":"Alternative pathway fits","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"improve fit JCZ38, back-reaction JSE76 JCZ38 introduced alternative version transformation pathway, analogy back-reaction K5A78 K5A77. pairs transformation products pairs organic acid corresponding amide (Addendum 2014, p. 109). FOMC provided best fit parent, biexponential models DFOP SFORB provided best initial pathway fits, three parent models used alternative pathway fits. Using constant variance, separate fits converge exception fits Sassafras soil data. Using two-component error model, separate fits converge exception alternative pathway fit DFOP used parent Sassafras dataset. hierarchical fits alternative pathway completed successfully, exception model using FOMC parent compound constant variance error model. biphasic fits (DFOP SFORB parent compound), random effects formation fractions pathways JCZ38 JSE76, reverse pathway JSE76 JCZ38 ill-defined. variants using biexponential models DFOP SFORB parent compound two-component error model give lowest AIC BIC values plotted . Compared original pathway, AIC BIC values indicate large improvement. confirmed plots, show metabolite JCZ38 fitted much better model. FOMC pathway fit two-component error, alternative pathway DFOP pathway fit two-component error, alternative pathway SFORB pathway fit two-component error, alternative pathway","code":"cyan_path_2 <- list( fomc_path_2 = mkinmod( cyan = mkinsub(\"FOMC\", c(\"JCZ38\", \"J9Z38\")), JCZ38 = mkinsub(\"SFO\", \"JSE76\"), J9Z38 = mkinsub(\"SFO\"), JSE76 = mkinsub(\"SFO\", \"JCZ38\"), name = \"fomc_path_2\", quiet = TRUE, dll_dir = \"cyan_dlls\", overwrite = TRUE ), dfop_path_2 = mkinmod( cyan = mkinsub(\"DFOP\", c(\"JCZ38\", \"J9Z38\")), JCZ38 = mkinsub(\"SFO\", \"JSE76\"), J9Z38 = mkinsub(\"SFO\"), JSE76 = mkinsub(\"SFO\", \"JCZ38\"), name = \"dfop_path_2\", quiet = TRUE, dll_dir = \"cyan_dlls\", overwrite = TRUE ), sforb_path_2 = mkinmod( cyan = mkinsub(\"SFORB\", c(\"JCZ38\", \"J9Z38\")), JCZ38 = mkinsub(\"SFO\", \"JSE76\"), J9Z38 = mkinsub(\"SFO\"), JSE76 = mkinsub(\"SFO\", \"JCZ38\"), name = \"sforb_path_2\", quiet = TRUE, dll_dir = \"cyan_dlls\", overwrite = TRUE ) ) cl_path_2 <- start_cluster(n_cores) f_sep_2_const <- mmkin( cyan_path_2, cyan_ds, error_model = \"const\", cluster = cl_path_2, quiet = TRUE) status(f_sep_2_const) |> kable() f_sep_2_tc <- update(f_sep_2_const, error_model = \"tc\") status(f_sep_2_tc) |> kable() f_saem_2 <- mhmkin(list(f_sep_2_const, f_sep_2_tc), no_random_effect = illparms(cyan_saem_full[2:4, ]), cluster = cl_path_2) status(f_saem_2) |> kable() illparms(f_saem_2) |> kable() anova(f_saem_2[, \"tc\"]) |> kable(digits = 1) anova(f_saem_2[2:3,]) |> kable(digits = 1) plot(f_saem_2[[\"fomc_path_2\", \"tc\"]]) plot(f_saem_2[[\"dfop_path_2\", \"tc\"]]) plot(f_saem_2[[\"sforb_path_2\", \"tc\"]])"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"refinement-of-alternative-pathway-fits","dir":"Articles > Prebuilt","previous_headings":"Pathway fits","what":"Refinement of alternative pathway fits","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"ill-defined random effects identified parent fits pathway fits, excluded final evaluations . purpose, list character vectors created can indexed row column indices, contains degradation parameter names random effects excluded hierarchical fits contained f_saem_2. exception FOMC pathway fit constant variance, updated fits completed successfully. However, Fisher Information Matrix fixed effects (Fth) inverted, confidence intervals optimised parameters available. AIC BIC values best fit (DFOP pathway fit two-component error) lower previous fits alternative pathway, practical value refined evaluations limited confidence intervals obtained.","code":"no_ranef <- matrix(list(), nrow = 3, ncol = 2, dimnames = dimnames(f_saem_2)) no_ranef[[\"fomc_path_2\", \"const\"]] <- c(\"log_beta\", \"f_JCZ38_qlogis\", \"f_JSE76_qlogis\") no_ranef[[\"fomc_path_2\", \"tc\"]] <- c(\"cyan_0\", \"f_JCZ38_qlogis\", \"f_JSE76_qlogis\") no_ranef[[\"dfop_path_2\", \"const\"]] <- c(\"cyan_0\", \"f_JCZ38_qlogis\", \"f_JSE76_qlogis\") no_ranef[[\"dfop_path_2\", \"tc\"]] <- c(\"cyan_0\", \"log_k1\", \"f_JCZ38_qlogis\", \"f_JSE76_qlogis\") no_ranef[[\"sforb_path_2\", \"const\"]] <- c(\"cyan_free_0\", \"f_JCZ38_qlogis\", \"f_JSE76_qlogis\") no_ranef[[\"sforb_path_2\", \"tc\"]] <- c(\"cyan_free_0\", \"log_k_cyan_free_bound\", \"f_JCZ38_qlogis\", \"f_JSE76_qlogis\") clusterExport(cl_path_2, \"no_ranef\") f_saem_3 <- update(f_saem_2, no_random_effect = no_ranef, cluster = cl_path_2) status(f_saem_3) |> kable() illparms(f_saem_3) |> kable() anova(f_saem_3[, \"tc\"]) |> kable(digits = 1) anova(f_saem_3[2:3,]) |> kable(digits = 1) stopCluster(cl_path_2)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"conclusion","dir":"Articles > Prebuilt","previous_headings":"","what":"Conclusion","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"demonstrated relatively complex transformation pathway parallel formation two primary metabolites one secondary metabolite can fitted even data individual datasets quite different partly cover formation phase. run times pathway fits several hours, limiting practical feasibility iterative refinements based ill-defined parameters alternative checks parameter identifiability based multistart runs.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"acknowledgements","dir":"Articles > Prebuilt","previous_headings":"","what":"Acknowledgements","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"helpful comments Janina Wöltjen German Environment Agency gratefully acknowledged.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"plots-of-fits-that-were-not-refined-further","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Plots of fits that were not refined further","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"SFO pathway fit two-component error FOMC pathway fit two-component error HS pathway fit two-component error","code":"plot(f_saem_1[[\"sfo_path_1\", \"tc\"]]) plot(f_saem_1[[\"fomc_path_1\", \"tc\"]]) plot(f_saem_1[[\"sforb_path_1\", \"tc\"]])"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"pathway-1","dir":"Articles > Prebuilt","previous_headings":"Appendix > Hierarchical fit listings","what":"Pathway 1","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"Hierarchical SFO path 1 fit constant variance Hierarchical SFO path 1 fit two-component error Hierarchical FOMC path 1 fit constant variance Hierarchical FOMC path 1 fit two-component error Hierarchical DFOP path 1 fit constant variance Hierarchical DFOP path 1 fit two-component error Hierarchical SFORB path 1 fit constant variance Hierarchical SFORB path 1 fit two-component error Hierarchical HS path 1 fit constant variance","code":"saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:42:26 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - k_cyan * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * k_cyan * cyan - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_to_J9Z38 * k_cyan * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 437.151 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_0 log_k_cyan log_k_JCZ38 log_k_J9Z38 log_k_JSE76 95.3304 -3.8459 -3.1305 -5.0678 -5.3196 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis 0.8158 23.5335 11.8774 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_cyan log_k_JCZ38 log_k_J9Z38 log_k_JSE76 cyan_0 4.797 0.0000 0.000 0.000 0.0000 log_k_cyan 0.000 0.9619 0.000 0.000 0.0000 log_k_JCZ38 0.000 0.0000 2.139 0.000 0.0000 log_k_J9Z38 0.000 0.0000 0.000 1.639 0.0000 log_k_JSE76 0.000 0.0000 0.000 0.000 0.7894 f_cyan_ilr_1 0.000 0.0000 0.000 0.000 0.0000 f_cyan_ilr_2 0.000 0.0000 0.000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.0000 0.000 0.000 0.0000 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis cyan_0 0.0000 0.000 0.00 log_k_cyan 0.0000 0.000 0.00 log_k_JCZ38 0.0000 0.000 0.00 log_k_J9Z38 0.0000 0.000 0.00 log_k_JSE76 0.0000 0.000 0.00 f_cyan_ilr_1 0.7714 0.000 0.00 f_cyan_ilr_2 0.0000 9.247 0.00 f_JCZ38_qlogis 0.0000 0.000 16.61 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2693 2687 -1331 Optimised parameters: est. lower upper cyan_0 95.1279 9.354e+01 9.671e+01 log_k_cyan -3.8527 -4.367e+00 -3.338e+00 log_k_JCZ38 -3.0381 -4.187e+00 -1.889e+00 log_k_J9Z38 -5.0095 -5.623e+00 -4.396e+00 log_k_JSE76 -5.3357 -6.025e+00 -4.646e+00 f_cyan_ilr_1 0.8050 5.174e-01 1.093e+00 f_cyan_ilr_2 12.4820 -1.050e+06 1.051e+06 f_JCZ38_qlogis 1.2912 3.561e-01 2.226e+00 a.1 4.8393 NA NA SD.log_k_cyan 0.5840 NA NA SD.log_k_JCZ38 1.2740 NA NA SD.log_k_J9Z38 0.3172 NA NA SD.log_k_JSE76 0.5677 NA NA SD.f_cyan_ilr_1 0.2623 NA NA SD.f_cyan_ilr_2 1.3724 NA NA SD.f_JCZ38_qlogis 0.1464 NA NA Correlation is not available Random effects: est. lower upper SD.log_k_cyan 0.5840 NA NA SD.log_k_JCZ38 1.2740 NA NA SD.log_k_J9Z38 0.3172 NA NA SD.log_k_JSE76 0.5677 NA NA SD.f_cyan_ilr_1 0.2623 NA NA SD.f_cyan_ilr_2 1.3724 NA NA SD.f_JCZ38_qlogis 0.1464 NA NA Variance model: est. lower upper a.1 4.839 NA NA Backtransformed parameters: est. lower upper cyan_0 95.127935 93.542456 96.713413 k_cyan 0.021221 0.012687 0.035497 k_JCZ38 0.047924 0.015189 0.151213 k_J9Z38 0.006674 0.003612 0.012332 k_JSE76 0.004817 0.002417 0.009601 f_cyan_to_JCZ38 0.757402 NA NA f_cyan_to_J9Z38 0.242597 NA NA f_JCZ38_to_JSE76 0.784347 0.588098 0.902582 Resulting formation fractions: ff cyan_JCZ38 7.574e-01 cyan_J9Z38 2.426e-01 cyan_sink 9.839e-08 JCZ38_JSE76 7.843e-01 JCZ38_sink 2.157e-01 Estimated disappearance times: DT50 DT90 cyan 32.66 108.50 JCZ38 14.46 48.05 J9Z38 103.86 345.00 JSE76 143.91 478.04 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:42:06 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - k_cyan * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * k_cyan * cyan - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_to_J9Z38 * k_cyan * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 417.143 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_0 log_k_cyan log_k_JCZ38 log_k_J9Z38 log_k_JSE76 96.0039 -3.8907 -3.1276 -5.0069 -4.9367 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis 0.7937 22.3422 17.8932 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_cyan log_k_JCZ38 log_k_J9Z38 log_k_JSE76 cyan_0 4.859 0.000 0.00 0.00 0.0000 log_k_cyan 0.000 0.962 0.00 0.00 0.0000 log_k_JCZ38 0.000 0.000 2.04 0.00 0.0000 log_k_J9Z38 0.000 0.000 0.00 1.72 0.0000 log_k_JSE76 0.000 0.000 0.00 0.00 0.9076 f_cyan_ilr_1 0.000 0.000 0.00 0.00 0.0000 f_cyan_ilr_2 0.000 0.000 0.00 0.00 0.0000 f_JCZ38_qlogis 0.000 0.000 0.00 0.00 0.0000 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis cyan_0 0.0000 0.000 0.00 log_k_cyan 0.0000 0.000 0.00 log_k_JCZ38 0.0000 0.000 0.00 log_k_J9Z38 0.0000 0.000 0.00 log_k_JSE76 0.0000 0.000 0.00 f_cyan_ilr_1 0.7598 0.000 0.00 f_cyan_ilr_2 0.0000 8.939 0.00 f_JCZ38_qlogis 0.0000 0.000 14.49 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2658 2651 -1312 Optimised parameters: est. lower upper cyan_0 94.81681 NA NA log_k_cyan -3.91558 NA NA log_k_JCZ38 -3.12715 NA NA log_k_J9Z38 -5.04840 NA NA log_k_JSE76 -5.10443 NA NA f_cyan_ilr_1 0.80760 NA NA f_cyan_ilr_2 48.66960 NA NA f_JCZ38_qlogis 3.03397 NA NA a.1 3.93879 NA NA b.1 0.08057 NA NA SD.log_k_cyan 0.58921 NA NA SD.log_k_JCZ38 1.29813 NA NA SD.log_k_J9Z38 0.68372 NA NA SD.log_k_JSE76 0.35128 NA NA SD.f_cyan_ilr_1 0.38352 NA NA SD.f_cyan_ilr_2 4.98884 NA NA SD.f_JCZ38_qlogis 1.75636 NA NA Correlation is not available Random effects: est. lower upper SD.log_k_cyan 0.5892 NA NA SD.log_k_JCZ38 1.2981 NA NA SD.log_k_J9Z38 0.6837 NA NA SD.log_k_JSE76 0.3513 NA NA SD.f_cyan_ilr_1 0.3835 NA NA SD.f_cyan_ilr_2 4.9888 NA NA SD.f_JCZ38_qlogis 1.7564 NA NA Variance model: est. lower upper a.1 3.93879 NA NA b.1 0.08057 NA NA Backtransformed parameters: est. lower upper cyan_0 94.81681 NA NA k_cyan 0.01993 NA NA k_JCZ38 0.04384 NA NA k_J9Z38 0.00642 NA NA k_JSE76 0.00607 NA NA f_cyan_to_JCZ38 0.75807 NA NA f_cyan_to_J9Z38 0.24193 NA NA f_JCZ38_to_JSE76 0.95409 NA NA Resulting formation fractions: ff cyan_JCZ38 0.75807 cyan_J9Z38 0.24193 cyan_sink 0.00000 JCZ38_JSE76 0.95409 JCZ38_sink 0.04591 Estimated disappearance times: DT50 DT90 cyan 34.78 115.54 JCZ38 15.81 52.52 J9Z38 107.97 358.68 JSE76 114.20 379.35 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:42:57 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - (alpha/beta) * 1/((time/beta) + 1) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * (alpha/beta) * 1/((time/beta) + 1) * cyan - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_to_J9Z38 * (alpha/beta) * 1/((time/beta) + 1) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 468.609 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 101.2314 -3.3680 -5.1108 -5.9416 0.7144 f_cyan_ilr_2 f_JCZ38_qlogis log_alpha log_beta 7.0229 14.9234 -0.1791 2.9811 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 5.416 0.000 0.0 0.000 0.0000 log_k_JCZ38 0.000 2.439 0.0 0.000 0.0000 log_k_J9Z38 0.000 0.000 1.7 0.000 0.0000 log_k_JSE76 0.000 0.000 0.0 1.856 0.0000 f_cyan_ilr_1 0.000 0.000 0.0 0.000 0.7164 f_cyan_ilr_2 0.000 0.000 0.0 0.000 0.0000 f_JCZ38_qlogis 0.000 0.000 0.0 0.000 0.0000 log_alpha 0.000 0.000 0.0 0.000 0.0000 log_beta 0.000 0.000 0.0 0.000 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis log_alpha log_beta cyan_0 0.00 0.00 0.0000 0.0000 log_k_JCZ38 0.00 0.00 0.0000 0.0000 log_k_J9Z38 0.00 0.00 0.0000 0.0000 log_k_JSE76 0.00 0.00 0.0000 0.0000 f_cyan_ilr_1 0.00 0.00 0.0000 0.0000 f_cyan_ilr_2 11.57 0.00 0.0000 0.0000 f_JCZ38_qlogis 0.00 18.81 0.0000 0.0000 log_alpha 0.00 0.00 0.4144 0.0000 log_beta 0.00 0.00 0.0000 0.5077 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2428 2421 -1196 Optimised parameters: est. lower upper cyan_0 101.1664 98.51265 103.8202 log_k_JCZ38 -3.3883 -4.78250 -1.9941 log_k_J9Z38 -5.3087 -5.91564 -4.7017 log_k_JSE76 -6.1313 -7.30061 -4.9619 f_cyan_ilr_1 0.7456 0.43782 1.0534 f_cyan_ilr_2 0.8181 0.24956 1.3866 f_JCZ38_qlogis 2.0467 0.61165 3.4817 log_alpha -0.2391 -0.62806 0.1499 log_beta 2.8739 2.67664 3.0711 a.1 3.4160 3.17960 3.6525 SD.cyan_0 2.4355 0.40399 4.4671 SD.log_k_JCZ38 1.5654 0.57311 2.5576 SD.log_k_J9Z38 0.4645 -0.06533 0.9943 SD.log_k_JSE76 0.9841 0.10738 1.8609 SD.f_cyan_ilr_1 0.3285 0.10546 0.5515 SD.f_cyan_ilr_2 0.2276 -0.38711 0.8424 SD.f_JCZ38_qlogis 0.8340 -0.20970 1.8777 SD.log_alpha 0.4250 0.16017 0.6898 Correlation: cyan_0 l__JCZ3 l__J9Z3 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 log_lph log_k_JCZ38 -0.0159 log_k_J9Z38 -0.0546 0.0080 log_k_JSE76 -0.0337 0.0016 0.0074 f_cyan_ilr_1 -0.0095 0.0194 -0.1573 0.0003 f_cyan_ilr_2 -0.2733 0.0799 0.3059 0.0263 0.0125 f_JCZ38_qlogis 0.0755 -0.0783 -0.0516 0.1222 -0.1155 -0.5231 log_alpha -0.0567 0.0120 0.0351 0.0189 0.0040 0.0829 -0.0502 log_beta -0.2980 0.0461 0.1382 0.0758 0.0209 0.4079 -0.2053 0.2759 Random effects: est. lower upper SD.cyan_0 2.4355 0.40399 4.4671 SD.log_k_JCZ38 1.5654 0.57311 2.5576 SD.log_k_J9Z38 0.4645 -0.06533 0.9943 SD.log_k_JSE76 0.9841 0.10738 1.8609 SD.f_cyan_ilr_1 0.3285 0.10546 0.5515 SD.f_cyan_ilr_2 0.2276 -0.38711 0.8424 SD.f_JCZ38_qlogis 0.8340 -0.20970 1.8777 SD.log_alpha 0.4250 0.16017 0.6898 Variance model: est. lower upper a.1 3.416 3.18 3.652 Backtransformed parameters: est. lower upper cyan_0 1.012e+02 9.851e+01 103.82023 k_JCZ38 3.377e-02 8.375e-03 0.13614 k_J9Z38 4.948e-03 2.697e-03 0.00908 k_JSE76 2.174e-03 6.751e-04 0.00700 f_cyan_to_JCZ38 6.389e-01 NA NA f_cyan_to_J9Z38 2.226e-01 NA NA f_JCZ38_to_JSE76 8.856e-01 6.483e-01 0.97016 alpha 7.873e-01 5.336e-01 1.16166 beta 1.771e+01 1.454e+01 21.56509 Resulting formation fractions: ff cyan_JCZ38 0.6389 cyan_J9Z38 0.2226 cyan_sink 0.1385 JCZ38_JSE76 0.8856 JCZ38_sink 0.1144 Estimated disappearance times: DT50 DT90 DT50back cyan 25.00 312.06 93.94 JCZ38 20.53 68.19 NA J9Z38 140.07 465.32 NA JSE76 318.86 1059.22 NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:42:50 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - (alpha/beta) * 1/((time/beta) + 1) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * (alpha/beta) * 1/((time/beta) + 1) * cyan - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_to_J9Z38 * (alpha/beta) * 1/((time/beta) + 1) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 460.309 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 101.13294 -3.32499 -5.09097 -5.93566 0.71359 f_cyan_ilr_2 f_JCZ38_qlogis log_alpha log_beta 10.30315 14.62272 -0.09633 3.10634 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 5.649 0.000 0.00 0.00 0.0000 log_k_JCZ38 0.000 2.319 0.00 0.00 0.0000 log_k_J9Z38 0.000 0.000 1.73 0.00 0.0000 log_k_JSE76 0.000 0.000 0.00 1.86 0.0000 f_cyan_ilr_1 0.000 0.000 0.00 0.00 0.7183 f_cyan_ilr_2 0.000 0.000 0.00 0.00 0.0000 f_JCZ38_qlogis 0.000 0.000 0.00 0.00 0.0000 log_alpha 0.000 0.000 0.00 0.00 0.0000 log_beta 0.000 0.000 0.00 0.00 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis log_alpha log_beta cyan_0 0.00 0.00 0.0000 0.0000 log_k_JCZ38 0.00 0.00 0.0000 0.0000 log_k_J9Z38 0.00 0.00 0.0000 0.0000 log_k_JSE76 0.00 0.00 0.0000 0.0000 f_cyan_ilr_1 0.00 0.00 0.0000 0.0000 f_cyan_ilr_2 12.85 0.00 0.0000 0.0000 f_JCZ38_qlogis 0.00 18.54 0.0000 0.0000 log_alpha 0.00 0.00 0.3142 0.0000 log_beta 0.00 0.00 0.0000 0.7333 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2424 2416 -1193 Optimised parameters: est. lower upper cyan_0 100.65667 NA NA log_k_JCZ38 -3.45782 NA NA log_k_J9Z38 -5.23476 NA NA log_k_JSE76 -5.71827 NA NA f_cyan_ilr_1 0.68389 NA NA f_cyan_ilr_2 0.61027 NA NA f_JCZ38_qlogis 116.27482 NA NA log_alpha -0.14484 NA NA log_beta 3.03220 NA NA a.1 3.11051 NA NA b.1 0.04508 NA NA SD.log_k_JCZ38 1.39961 NA NA SD.log_k_J9Z38 0.57920 NA NA SD.log_k_JSE76 0.68364 NA NA SD.f_cyan_ilr_1 0.31477 NA NA SD.f_cyan_ilr_2 0.37716 NA NA SD.f_JCZ38_qlogis 5.52695 NA NA SD.log_alpha 0.22823 NA NA SD.log_beta 0.39161 NA NA Correlation is not available Random effects: est. lower upper SD.log_k_JCZ38 1.3996 NA NA SD.log_k_J9Z38 0.5792 NA NA SD.log_k_JSE76 0.6836 NA NA SD.f_cyan_ilr_1 0.3148 NA NA SD.f_cyan_ilr_2 0.3772 NA NA SD.f_JCZ38_qlogis 5.5270 NA NA SD.log_alpha 0.2282 NA NA SD.log_beta 0.3916 NA NA Variance model: est. lower upper a.1 3.11051 NA NA b.1 0.04508 NA NA Backtransformed parameters: est. lower upper cyan_0 1.007e+02 NA NA k_JCZ38 3.150e-02 NA NA k_J9Z38 5.328e-03 NA NA k_JSE76 3.285e-03 NA NA f_cyan_to_JCZ38 5.980e-01 NA NA f_cyan_to_J9Z38 2.273e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 NA NA alpha 8.652e-01 NA NA beta 2.074e+01 NA NA Resulting formation fractions: ff cyan_JCZ38 0.5980 cyan_J9Z38 0.2273 cyan_sink 0.1746 JCZ38_JSE76 1.0000 JCZ38_sink 0.0000 Estimated disappearance times: DT50 DT90 DT50back cyan 25.48 276.2 83.15 JCZ38 22.01 73.1 NA J9Z38 130.09 432.2 NA JSE76 210.98 700.9 NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:43:33 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 504.014 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 102.0643 -3.4008 -5.0024 -5.8612 0.6855 f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 g_qlogis 1.2366 13.6901 -1.8641 -4.5063 -0.6468 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 4.466 0.000 0.000 0.000 0.0000 log_k_JCZ38 0.000 2.382 0.000 0.000 0.0000 log_k_J9Z38 0.000 0.000 1.595 0.000 0.0000 log_k_JSE76 0.000 0.000 0.000 1.245 0.0000 f_cyan_ilr_1 0.000 0.000 0.000 0.000 0.6852 f_cyan_ilr_2 0.000 0.000 0.000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.000 0.000 0.000 0.0000 log_k1 0.000 0.000 0.000 0.000 0.0000 log_k2 0.000 0.000 0.000 0.000 0.0000 g_qlogis 0.000 0.000 0.000 0.000 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 g_qlogis cyan_0 0.00 0.00 0.0000 0.0000 0.000 log_k_JCZ38 0.00 0.00 0.0000 0.0000 0.000 log_k_J9Z38 0.00 0.00 0.0000 0.0000 0.000 log_k_JSE76 0.00 0.00 0.0000 0.0000 0.000 f_cyan_ilr_1 0.00 0.00 0.0000 0.0000 0.000 f_cyan_ilr_2 1.28 0.00 0.0000 0.0000 0.000 f_JCZ38_qlogis 0.00 16.08 0.0000 0.0000 0.000 log_k1 0.00 0.00 0.9866 0.0000 0.000 log_k2 0.00 0.00 0.0000 0.5953 0.000 g_qlogis 0.00 0.00 0.0000 0.0000 1.583 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2403 2395 -1182 Optimised parameters: est. lower upper cyan_0 102.5565 NA NA log_k_JCZ38 -3.4729 NA NA log_k_J9Z38 -5.1533 NA NA log_k_JSE76 -5.6669 NA NA f_cyan_ilr_1 0.6665 NA NA f_cyan_ilr_2 0.5191 NA NA f_JCZ38_qlogis 37.0113 NA NA log_k1 -1.8497 NA NA log_k2 -4.4931 NA NA g_qlogis -0.6383 NA NA a.1 3.2397 NA NA SD.log_k_JCZ38 1.4286 NA NA SD.log_k_J9Z38 0.5312 NA NA SD.log_k_JSE76 0.6627 NA NA SD.f_cyan_ilr_1 0.3013 NA NA SD.f_cyan_ilr_2 0.2980 NA NA SD.f_JCZ38_qlogis 0.1637 NA NA SD.log_k1 0.5069 NA NA SD.log_k2 0.3828 NA NA SD.g_qlogis 0.8641 NA NA Correlation is not available Random effects: est. lower upper SD.log_k_JCZ38 1.4286 NA NA SD.log_k_J9Z38 0.5312 NA NA SD.log_k_JSE76 0.6627 NA NA SD.f_cyan_ilr_1 0.3013 NA NA SD.f_cyan_ilr_2 0.2980 NA NA SD.f_JCZ38_qlogis 0.1637 NA NA SD.log_k1 0.5069 NA NA SD.log_k2 0.3828 NA NA SD.g_qlogis 0.8641 NA NA Variance model: est. lower upper a.1 3.24 NA NA Backtransformed parameters: est. lower upper cyan_0 1.026e+02 NA NA k_JCZ38 3.103e-02 NA NA k_J9Z38 5.780e-03 NA NA k_JSE76 3.459e-03 NA NA f_cyan_to_JCZ38 5.813e-01 NA NA f_cyan_to_J9Z38 2.265e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 NA NA k1 1.573e-01 NA NA k2 1.119e-02 NA NA g 3.456e-01 NA NA Resulting formation fractions: ff cyan_JCZ38 0.5813 cyan_J9Z38 0.2265 cyan_sink 0.1922 JCZ38_JSE76 1.0000 JCZ38_sink 0.0000 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 cyan 25.23 167.94 50.55 4.407 61.97 JCZ38 22.34 74.22 NA NA NA J9Z38 119.92 398.36 NA NA NA JSE76 200.41 665.76 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:46:07 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 658.043 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 101.3964 -3.3626 -4.9792 -5.8727 0.6814 f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 g_qlogis 6.8713 13.6901 -1.9222 -4.5035 -0.7172 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 5.317 0.000 0.000 0.000 0.0000 log_k_JCZ38 0.000 2.272 0.000 0.000 0.0000 log_k_J9Z38 0.000 0.000 1.633 0.000 0.0000 log_k_JSE76 0.000 0.000 0.000 1.271 0.0000 f_cyan_ilr_1 0.000 0.000 0.000 0.000 0.6839 f_cyan_ilr_2 0.000 0.000 0.000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.000 0.000 0.000 0.0000 log_k1 0.000 0.000 0.000 0.000 0.0000 log_k2 0.000 0.000 0.000 0.000 0.0000 g_qlogis 0.000 0.000 0.000 0.000 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 g_qlogis cyan_0 0.00 0.00 0.0000 0.0000 0.000 log_k_JCZ38 0.00 0.00 0.0000 0.0000 0.000 log_k_J9Z38 0.00 0.00 0.0000 0.0000 0.000 log_k_JSE76 0.00 0.00 0.0000 0.0000 0.000 f_cyan_ilr_1 0.00 0.00 0.0000 0.0000 0.000 f_cyan_ilr_2 11.95 0.00 0.0000 0.0000 0.000 f_JCZ38_qlogis 0.00 16.08 0.0000 0.0000 0.000 log_k1 0.00 0.00 0.9496 0.0000 0.000 log_k2 0.00 0.00 0.0000 0.5846 0.000 g_qlogis 0.00 0.00 0.0000 0.0000 1.719 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2398 2390 -1179 Optimised parameters: est. lower upper cyan_0 100.69709 NA NA log_k_JCZ38 -3.46669 NA NA log_k_J9Z38 -5.05076 NA NA log_k_JSE76 -5.55558 NA NA f_cyan_ilr_1 0.66045 NA NA f_cyan_ilr_2 0.84275 NA NA f_JCZ38_qlogis 64.22404 NA NA log_k1 -2.17715 NA NA log_k2 -4.55002 NA NA g_qlogis -0.55920 NA NA a.1 2.95785 NA NA b.1 0.04456 NA NA SD.log_k_JCZ38 1.39881 NA NA SD.log_k_J9Z38 0.67788 NA NA SD.log_k_JSE76 0.52603 NA NA SD.f_cyan_ilr_1 0.32490 NA NA SD.f_cyan_ilr_2 0.53923 NA NA SD.f_JCZ38_qlogis 2.75576 NA NA SD.log_k2 0.30694 NA NA SD.g_qlogis 0.83619 NA NA Correlation is not available Random effects: est. lower upper SD.log_k_JCZ38 1.3988 NA NA SD.log_k_J9Z38 0.6779 NA NA SD.log_k_JSE76 0.5260 NA NA SD.f_cyan_ilr_1 0.3249 NA NA SD.f_cyan_ilr_2 0.5392 NA NA SD.f_JCZ38_qlogis 2.7558 NA NA SD.log_k2 0.3069 NA NA SD.g_qlogis 0.8362 NA NA Variance model: est. lower upper a.1 2.95785 NA NA b.1 0.04456 NA NA Backtransformed parameters: est. lower upper cyan_0 1.007e+02 NA NA k_JCZ38 3.122e-02 NA NA k_J9Z38 6.404e-03 NA NA k_JSE76 3.866e-03 NA NA f_cyan_to_JCZ38 6.187e-01 NA NA f_cyan_to_J9Z38 2.431e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 NA NA k1 1.134e-01 NA NA k2 1.057e-02 NA NA g 3.637e-01 NA NA Resulting formation fractions: ff cyan_JCZ38 0.6187 cyan_J9Z38 0.2431 cyan_sink 0.1382 JCZ38_JSE76 1.0000 JCZ38_sink 0.0000 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 cyan 26.35 175.12 52.72 6.114 65.6 JCZ38 22.20 73.75 NA NA NA J9Z38 108.23 359.53 NA NA NA JSE76 179.30 595.62 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:43:36 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound * cyan_free + k_cyan_bound_free * cyan_bound d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free * cyan_bound d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 507.042 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_free_0 log_k_cyan_free log_k_cyan_free_bound 102.0643 -2.8987 -2.7077 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 -3.4717 -3.4008 -5.0024 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 -5.8613 0.6855 1.2366 f_JCZ38_qlogis 13.7395 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_free_0 log_k_cyan_free log_k_cyan_free_bound cyan_free_0 4.466 0.0000 0.000 log_k_cyan_free 0.000 0.6158 0.000 log_k_cyan_free_bound 0.000 0.0000 1.463 log_k_cyan_bound_free 0.000 0.0000 0.000 log_k_JCZ38 0.000 0.0000 0.000 log_k_J9Z38 0.000 0.0000 0.000 log_k_JSE76 0.000 0.0000 0.000 f_cyan_ilr_1 0.000 0.0000 0.000 f_cyan_ilr_2 0.000 0.0000 0.000 f_JCZ38_qlogis 0.000 0.0000 0.000 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76 cyan_free_0 0.000 0.000 0.000 0.000 log_k_cyan_free 0.000 0.000 0.000 0.000 log_k_cyan_free_bound 0.000 0.000 0.000 0.000 log_k_cyan_bound_free 1.058 0.000 0.000 0.000 log_k_JCZ38 0.000 2.382 0.000 0.000 log_k_J9Z38 0.000 0.000 1.595 0.000 log_k_JSE76 0.000 0.000 0.000 1.245 f_cyan_ilr_1 0.000 0.000 0.000 0.000 f_cyan_ilr_2 0.000 0.000 0.000 0.000 f_JCZ38_qlogis 0.000 0.000 0.000 0.000 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis cyan_free_0 0.0000 0.00 0.00 log_k_cyan_free 0.0000 0.00 0.00 log_k_cyan_free_bound 0.0000 0.00 0.00 log_k_cyan_bound_free 0.0000 0.00 0.00 log_k_JCZ38 0.0000 0.00 0.00 log_k_J9Z38 0.0000 0.00 0.00 log_k_JSE76 0.0000 0.00 0.00 f_cyan_ilr_1 0.6852 0.00 0.00 f_cyan_ilr_2 0.0000 1.28 0.00 f_JCZ38_qlogis 0.0000 0.00 16.13 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2401 2394 -1181 Optimised parameters: est. lower upper cyan_free_0 102.8136 NA NA log_k_cyan_free -2.7935 NA NA log_k_cyan_free_bound -2.5440 NA NA log_k_cyan_bound_free -3.4303 NA NA log_k_JCZ38 -3.5010 NA NA log_k_J9Z38 -5.1226 NA NA log_k_JSE76 -5.6314 NA NA f_cyan_ilr_1 0.6609 NA NA f_cyan_ilr_2 0.5085 NA NA f_JCZ38_qlogis 44.0153 NA NA a.1 3.2318 NA NA SD.log_k_cyan_free 0.3211 NA NA SD.log_k_cyan_free_bound 0.8408 NA NA SD.log_k_cyan_bound_free 0.5724 NA NA SD.log_k_JCZ38 1.4925 NA NA SD.log_k_J9Z38 0.5816 NA NA SD.log_k_JSE76 0.6037 NA NA SD.f_cyan_ilr_1 0.3115 NA NA SD.f_cyan_ilr_2 0.3436 NA NA SD.f_JCZ38_qlogis 4.8937 NA NA Correlation is not available Random effects: est. lower upper SD.log_k_cyan_free 0.3211 NA NA SD.log_k_cyan_free_bound 0.8408 NA NA SD.log_k_cyan_bound_free 0.5724 NA NA SD.log_k_JCZ38 1.4925 NA NA SD.log_k_J9Z38 0.5816 NA NA SD.log_k_JSE76 0.6037 NA NA SD.f_cyan_ilr_1 0.3115 NA NA SD.f_cyan_ilr_2 0.3436 NA NA SD.f_JCZ38_qlogis 4.8937 NA NA Variance model: est. lower upper a.1 3.232 NA NA Backtransformed parameters: est. lower upper cyan_free_0 1.028e+02 NA NA k_cyan_free 6.120e-02 NA NA k_cyan_free_bound 7.855e-02 NA NA k_cyan_bound_free 3.238e-02 NA NA k_JCZ38 3.017e-02 NA NA k_J9Z38 5.961e-03 NA NA k_JSE76 3.584e-03 NA NA f_cyan_free_to_JCZ38 5.784e-01 NA NA f_cyan_free_to_J9Z38 2.271e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 NA NA Estimated Eigenvalues of SFORB model(s): cyan_b1 cyan_b2 cyan_g 0.15973 0.01241 0.33124 Resulting formation fractions: ff cyan_free_JCZ38 0.5784 cyan_free_J9Z38 0.2271 cyan_free_sink 0.1945 cyan_free 1.0000 JCZ38_JSE76 1.0000 JCZ38_sink 0.0000 Estimated disappearance times: DT50 DT90 DT50back DT50_cyan_b1 DT50_cyan_b2 cyan 24.51 153.18 46.11 4.34 55.87 JCZ38 22.98 76.33 NA NA NA J9Z38 116.28 386.29 NA NA NA JSE76 193.42 642.53 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:46:14 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound * cyan_free + k_cyan_bound_free * cyan_bound d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free * cyan_bound d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 664.11 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_free_0 log_k_cyan_free log_k_cyan_free_bound 101.3964 -2.9881 -2.7949 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 -3.4376 -3.3626 -4.9792 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 -5.8727 0.6814 6.7399 f_JCZ38_qlogis 13.7395 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_free_0 log_k_cyan_free log_k_cyan_free_bound cyan_free_0 5.317 0.0000 0.000 log_k_cyan_free 0.000 0.7301 0.000 log_k_cyan_free_bound 0.000 0.0000 1.384 log_k_cyan_bound_free 0.000 0.0000 0.000 log_k_JCZ38 0.000 0.0000 0.000 log_k_J9Z38 0.000 0.0000 0.000 log_k_JSE76 0.000 0.0000 0.000 f_cyan_ilr_1 0.000 0.0000 0.000 f_cyan_ilr_2 0.000 0.0000 0.000 f_JCZ38_qlogis 0.000 0.0000 0.000 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76 cyan_free_0 0.000 0.000 0.000 0.000 log_k_cyan_free 0.000 0.000 0.000 0.000 log_k_cyan_free_bound 0.000 0.000 0.000 0.000 log_k_cyan_bound_free 1.109 0.000 0.000 0.000 log_k_JCZ38 0.000 2.272 0.000 0.000 log_k_J9Z38 0.000 0.000 1.633 0.000 log_k_JSE76 0.000 0.000 0.000 1.271 f_cyan_ilr_1 0.000 0.000 0.000 0.000 f_cyan_ilr_2 0.000 0.000 0.000 0.000 f_JCZ38_qlogis 0.000 0.000 0.000 0.000 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis cyan_free_0 0.0000 0.00 0.00 log_k_cyan_free 0.0000 0.00 0.00 log_k_cyan_free_bound 0.0000 0.00 0.00 log_k_cyan_bound_free 0.0000 0.00 0.00 log_k_JCZ38 0.0000 0.00 0.00 log_k_J9Z38 0.0000 0.00 0.00 log_k_JSE76 0.0000 0.00 0.00 f_cyan_ilr_1 0.6838 0.00 0.00 f_cyan_ilr_2 0.0000 11.69 0.00 f_JCZ38_qlogis 0.0000 0.00 16.13 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2400 2392 -1180 Optimised parameters: est. lower upper cyan_free_0 100.56004 NA NA log_k_cyan_free -3.12657 NA NA log_k_cyan_free_bound -3.16825 NA NA log_k_cyan_bound_free -3.66003 NA NA log_k_JCZ38 -3.47278 NA NA log_k_J9Z38 -5.06823 NA NA log_k_JSE76 -5.54327 NA NA f_cyan_ilr_1 0.66631 NA NA f_cyan_ilr_2 0.82898 NA NA f_JCZ38_qlogis 38.31115 NA NA a.1 2.98352 NA NA b.1 0.04388 NA NA SD.log_k_cyan_free 0.49145 NA NA SD.log_k_cyan_bound_free 0.27347 NA NA SD.log_k_JCZ38 1.41193 NA NA SD.log_k_J9Z38 0.66073 NA NA SD.log_k_JSE76 0.55885 NA NA SD.f_cyan_ilr_1 0.33020 NA NA SD.f_cyan_ilr_2 0.51367 NA NA SD.f_JCZ38_qlogis 5.52122 NA NA Correlation is not available Random effects: est. lower upper SD.log_k_cyan_free 0.4914 NA NA SD.log_k_cyan_bound_free 0.2735 NA NA SD.log_k_JCZ38 1.4119 NA NA SD.log_k_J9Z38 0.6607 NA NA SD.log_k_JSE76 0.5589 NA NA SD.f_cyan_ilr_1 0.3302 NA NA SD.f_cyan_ilr_2 0.5137 NA NA SD.f_JCZ38_qlogis 5.5212 NA NA Variance model: est. lower upper a.1 2.98352 NA NA b.1 0.04388 NA NA Backtransformed parameters: est. lower upper cyan_free_0 1.006e+02 NA NA k_cyan_free 4.387e-02 NA NA k_cyan_free_bound 4.208e-02 NA NA k_cyan_bound_free 2.573e-02 NA NA k_JCZ38 3.103e-02 NA NA k_J9Z38 6.294e-03 NA NA k_JSE76 3.914e-03 NA NA f_cyan_free_to_JCZ38 6.188e-01 NA NA f_cyan_free_to_J9Z38 2.412e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 NA NA Estimated Eigenvalues of SFORB model(s): cyan_b1 cyan_b2 cyan_g 0.10044 0.01124 0.36580 Resulting formation fractions: ff cyan_free_JCZ38 0.6188 cyan_free_J9Z38 0.2412 cyan_free_sink 0.1400 cyan_free 1.0000 JCZ38_JSE76 1.0000 JCZ38_sink 0.0000 Estimated disappearance times: DT50 DT90 DT50back DT50_cyan_b1 DT50_cyan_b2 cyan 26.05 164.4 49.48 6.901 61.67 JCZ38 22.34 74.2 NA NA NA J9Z38 110.14 365.9 NA NA NA JSE76 177.11 588.3 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:43:42 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - ifelse(time <= tb, k1, k2) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * ifelse(time <= tb, k1, k2) * cyan - k_JCZ38 * JCZ38 d_J9Z38/dt = + f_cyan_to_J9Z38 * ifelse(time <= tb, k1, k2) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 512.818 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 102.8845 -3.4495 -4.9355 -5.6040 0.6468 f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 log_tb 1.2396 9.7220 -2.9079 -4.1810 1.7813 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 5.406 0.00 0.00 0.000 0.0000 log_k_JCZ38 0.000 2.33 0.00 0.000 0.0000 log_k_J9Z38 0.000 0.00 1.59 0.000 0.0000 log_k_JSE76 0.000 0.00 0.00 1.013 0.0000 f_cyan_ilr_1 0.000 0.00 0.00 0.000 0.6367 f_cyan_ilr_2 0.000 0.00 0.00 0.000 0.0000 f_JCZ38_qlogis 0.000 0.00 0.00 0.000 0.0000 log_k1 0.000 0.00 0.00 0.000 0.0000 log_k2 0.000 0.00 0.00 0.000 0.0000 log_tb 0.000 0.00 0.00 0.000 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis log_k1 log_k2 log_tb cyan_0 0.000 0.00 0.0000 0.0000 0.0000 log_k_JCZ38 0.000 0.00 0.0000 0.0000 0.0000 log_k_J9Z38 0.000 0.00 0.0000 0.0000 0.0000 log_k_JSE76 0.000 0.00 0.0000 0.0000 0.0000 f_cyan_ilr_1 0.000 0.00 0.0000 0.0000 0.0000 f_cyan_ilr_2 2.038 0.00 0.0000 0.0000 0.0000 f_JCZ38_qlogis 0.000 10.33 0.0000 0.0000 0.0000 log_k1 0.000 0.00 0.7006 0.0000 0.0000 log_k2 0.000 0.00 0.0000 0.8928 0.0000 log_tb 0.000 0.00 0.0000 0.0000 0.6773 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2427 2419 -1194 Optimised parameters: est. lower upper cyan_0 101.9660 1.005e+02 1.035e+02 log_k_JCZ38 -3.4698 -4.716e+00 -2.224e+00 log_k_J9Z38 -5.0947 -5.740e+00 -4.450e+00 log_k_JSE76 -5.5977 -6.321e+00 -4.875e+00 f_cyan_ilr_1 0.6595 3.734e-01 9.456e-01 f_cyan_ilr_2 0.5905 1.664e-01 1.015e+00 f_JCZ38_qlogis 25.8627 -4.224e+05 4.225e+05 log_k1 -3.0884 -3.453e+00 -2.723e+00 log_k2 -4.3877 -4.778e+00 -3.998e+00 log_tb 2.3057 1.715e+00 2.896e+00 a.1 3.3228 NA NA SD.log_k_JCZ38 1.4071 NA NA SD.log_k_J9Z38 0.5774 NA NA SD.log_k_JSE76 0.6214 NA NA SD.f_cyan_ilr_1 0.3058 NA NA SD.f_cyan_ilr_2 0.3470 NA NA SD.f_JCZ38_qlogis 0.0644 NA NA SD.log_k1 0.3994 NA NA SD.log_k2 0.4373 NA NA SD.log_tb 0.6419 NA NA Correlation is not available Random effects: est. lower upper SD.log_k_JCZ38 1.4071 NA NA SD.log_k_J9Z38 0.5774 NA NA SD.log_k_JSE76 0.6214 NA NA SD.f_cyan_ilr_1 0.3058 NA NA SD.f_cyan_ilr_2 0.3470 NA NA SD.f_JCZ38_qlogis 0.0644 NA NA SD.log_k1 0.3994 NA NA SD.log_k2 0.4373 NA NA SD.log_tb 0.6419 NA NA Variance model: est. lower upper a.1 3.323 NA NA Backtransformed parameters: est. lower upper cyan_0 1.020e+02 1.005e+02 1.035e+02 k_JCZ38 3.112e-02 8.951e-03 1.082e-01 k_J9Z38 6.129e-03 3.216e-03 1.168e-02 k_JSE76 3.706e-03 1.798e-03 7.639e-03 f_cyan_to_JCZ38 5.890e-01 NA NA f_cyan_to_J9Z38 2.318e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 0.000e+00 1.000e+00 k1 4.558e-02 3.164e-02 6.565e-02 k2 1.243e-02 8.417e-03 1.835e-02 tb 1.003e+01 5.557e+00 1.811e+01 Resulting formation fractions: ff cyan_JCZ38 5.890e-01 cyan_J9Z38 2.318e-01 cyan_sink 1.793e-01 JCZ38_JSE76 1.000e+00 JCZ38_sink 5.861e-12 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 cyan 29.02 158.51 47.72 15.21 55.77 JCZ38 22.27 73.98 NA NA NA J9Z38 113.09 375.69 NA NA NA JSE76 187.01 621.23 NA NA NA"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"pathway-2","dir":"Articles > Prebuilt","previous_headings":"Appendix > Hierarchical fit listings","what":"Pathway 2","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"Hierarchical FOMC path 2 fit two-component error Hierarchical DFOP path 2 fit constant variance Hierarchical DFOP path 2 fit two-component error Hierarchical SFORB path 2 fit constant variance Hierarchical SFORB path 2 fit two-component error","code":"saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:54:36 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - (alpha/beta) * 1/((time/beta) + 1) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * (alpha/beta) * 1/((time/beta) + 1) * cyan - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_to_J9Z38 * (alpha/beta) * 1/((time/beta) + 1) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 491.928 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 102.4477 -1.8631 -5.1087 -2.5114 0.6826 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_alpha log_beta 4.7944 15.9616 13.1566 -0.1564 2.9781 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 7.701 0.000 0.000 0.000 0.0000 log_k_JCZ38 0.000 1.448 0.000 0.000 0.0000 log_k_J9Z38 0.000 0.000 1.724 0.000 0.0000 log_k_JSE76 0.000 0.000 0.000 3.659 0.0000 f_cyan_ilr_1 0.000 0.000 0.000 0.000 0.6356 f_cyan_ilr_2 0.000 0.000 0.000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.000 0.000 0.000 0.0000 f_JSE76_qlogis 0.000 0.000 0.000 0.000 0.0000 log_alpha 0.000 0.000 0.000 0.000 0.0000 log_beta 0.000 0.000 0.000 0.000 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_alpha log_beta cyan_0 0.00 0.00 0.00 0.0000 0.0000 log_k_JCZ38 0.00 0.00 0.00 0.0000 0.0000 log_k_J9Z38 0.00 0.00 0.00 0.0000 0.0000 log_k_JSE76 0.00 0.00 0.00 0.0000 0.0000 f_cyan_ilr_1 0.00 0.00 0.00 0.0000 0.0000 f_cyan_ilr_2 10.32 0.00 0.00 0.0000 0.0000 f_JCZ38_qlogis 0.00 12.23 0.00 0.0000 0.0000 f_JSE76_qlogis 0.00 0.00 14.99 0.0000 0.0000 log_alpha 0.00 0.00 0.00 0.3924 0.0000 log_beta 0.00 0.00 0.00 0.0000 0.5639 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2249 2241 -1104 Optimised parameters: est. lower upper cyan_0 101.55265 9.920e+01 103.9059 log_k_JCZ38 -2.32302 -2.832e+00 -1.8142 log_k_J9Z38 -5.13082 -5.942e+00 -4.3199 log_k_JSE76 -3.01756 -4.262e+00 -1.7736 f_cyan_ilr_1 0.70850 3.657e-01 1.0513 f_cyan_ilr_2 0.95775 2.612e-01 1.6543 f_JCZ38_qlogis 3.86105 9.248e-01 6.7973 f_JSE76_qlogis 7.51583 -1.120e+02 127.0392 log_alpha -0.15308 -4.508e-01 0.1446 log_beta 2.99165 2.711e+00 3.2720 a.1 2.04034 1.843e+00 2.2382 b.1 0.06924 5.749e-02 0.0810 SD.log_k_JCZ38 0.50818 1.390e-01 0.8774 SD.log_k_J9Z38 0.86597 2.652e-01 1.4667 SD.log_k_JSE76 1.38092 4.864e-01 2.2754 SD.f_cyan_ilr_1 0.38204 1.354e-01 0.6286 SD.f_cyan_ilr_2 0.55129 7.198e-02 1.0306 SD.f_JCZ38_qlogis 1.88457 1.711e-02 3.7520 SD.f_JSE76_qlogis 2.64018 -2.450e+03 2454.9447 SD.log_alpha 0.31860 1.047e-01 0.5325 SD.log_beta 0.24195 1.273e-02 0.4712 Correlation: cyan_0 l__JCZ3 l__J9Z3 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 f_JSE76 log_k_JCZ38 -0.0235 log_k_J9Z38 -0.0442 0.0047 log_k_JSE76 -0.0023 0.0966 0.0006 f_cyan_ilr_1 -0.0032 0.0070 -0.0536 -0.0001 f_cyan_ilr_2 -0.5189 0.0452 0.1152 0.0013 -0.0304 f_JCZ38_qlogis 0.1088 -0.0848 -0.0240 0.0040 -0.0384 -0.2303 f_JSE76_qlogis -0.0545 0.1315 0.0195 0.0020 0.0252 0.1737 -0.5939 log_alpha -0.0445 0.0056 0.0261 0.0019 -0.0055 0.0586 -0.0239 -0.0284 log_beta -0.2388 0.0163 0.0566 0.0040 -0.0078 0.2183 -0.0714 -0.0332 log_lph log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_alpha log_beta 0.2135 Random effects: est. lower upper SD.log_k_JCZ38 0.5082 1.390e-01 0.8774 SD.log_k_J9Z38 0.8660 2.652e-01 1.4667 SD.log_k_JSE76 1.3809 4.864e-01 2.2754 SD.f_cyan_ilr_1 0.3820 1.354e-01 0.6286 SD.f_cyan_ilr_2 0.5513 7.198e-02 1.0306 SD.f_JCZ38_qlogis 1.8846 1.711e-02 3.7520 SD.f_JSE76_qlogis 2.6402 -2.450e+03 2454.9447 SD.log_alpha 0.3186 1.047e-01 0.5325 SD.log_beta 0.2420 1.273e-02 0.4712 Variance model: est. lower upper a.1 2.04034 1.84252 2.238 b.1 0.06924 0.05749 0.081 Backtransformed parameters: est. lower upper cyan_0 1.016e+02 9.920e+01 103.9059 k_JCZ38 9.798e-02 5.890e-02 0.1630 k_J9Z38 5.912e-03 2.627e-03 0.0133 k_JSE76 4.892e-02 1.410e-02 0.1697 f_cyan_to_JCZ38 6.432e-01 NA NA f_cyan_to_J9Z38 2.362e-01 NA NA f_JCZ38_to_JSE76 9.794e-01 7.160e-01 0.9989 f_JSE76_to_JCZ38 9.995e-01 2.268e-49 1.0000 alpha 8.581e-01 6.371e-01 1.1556 beta 1.992e+01 1.505e+01 26.3646 Resulting formation fractions: ff cyan_JCZ38 0.6432301 cyan_J9Z38 0.2361657 cyan_sink 0.1206042 JCZ38_JSE76 0.9793879 JCZ38_sink 0.0206121 JSE76_JCZ38 0.9994559 JSE76_sink 0.0005441 Estimated disappearance times: DT50 DT90 DT50back cyan 24.759 271.61 81.76 JCZ38 7.075 23.50 NA J9Z38 117.249 389.49 NA JSE76 14.169 47.07 NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:55:32 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 548.554 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 102.4380 -2.3107 -5.3123 -3.7120 0.6757 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 1.1439 13.1194 12.3492 -1.9317 -4.4557 g_qlogis -0.5644 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 4.591 0.0000 0.000 0.0 0.0000 log_k_JCZ38 0.000 0.7966 0.000 0.0 0.0000 log_k_J9Z38 0.000 0.0000 1.561 0.0 0.0000 log_k_JSE76 0.000 0.0000 0.000 0.8 0.0000 f_cyan_ilr_1 0.000 0.0000 0.000 0.0 0.6349 f_cyan_ilr_2 0.000 0.0000 0.000 0.0 0.0000 f_JCZ38_qlogis 0.000 0.0000 0.000 0.0 0.0000 f_JSE76_qlogis 0.000 0.0000 0.000 0.0 0.0000 log_k1 0.000 0.0000 0.000 0.0 0.0000 log_k2 0.000 0.0000 0.000 0.0 0.0000 g_qlogis 0.000 0.0000 0.000 0.0 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 cyan_0 0.000 0.00 0.00 0.000 0.0000 log_k_JCZ38 0.000 0.00 0.00 0.000 0.0000 log_k_J9Z38 0.000 0.00 0.00 0.000 0.0000 log_k_JSE76 0.000 0.00 0.00 0.000 0.0000 f_cyan_ilr_1 0.000 0.00 0.00 0.000 0.0000 f_cyan_ilr_2 1.797 0.00 0.00 0.000 0.0000 f_JCZ38_qlogis 0.000 13.86 0.00 0.000 0.0000 f_JSE76_qlogis 0.000 0.00 13.91 0.000 0.0000 log_k1 0.000 0.00 0.00 1.106 0.0000 log_k2 0.000 0.00 0.00 0.000 0.6141 g_qlogis 0.000 0.00 0.00 0.000 0.0000 g_qlogis cyan_0 0.000 log_k_JCZ38 0.000 log_k_J9Z38 0.000 log_k_JSE76 0.000 f_cyan_ilr_1 0.000 f_cyan_ilr_2 0.000 f_JCZ38_qlogis 0.000 f_JSE76_qlogis 0.000 log_k1 0.000 log_k2 0.000 g_qlogis 1.595 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2288 2280 -1122 Optimised parameters: est. lower upper cyan_0 102.7204 1.014e+02 1.040e+02 log_k_JCZ38 -2.8925 -4.044e+00 -1.741e+00 log_k_J9Z38 -5.1430 -5.828e+00 -4.457e+00 log_k_JSE76 -3.5577 -4.174e+00 -2.941e+00 f_cyan_ilr_1 0.6929 3.788e-01 1.007e+00 f_cyan_ilr_2 0.6066 5.342e-02 1.160e+00 f_JCZ38_qlogis 9.8071 -2.819e+03 2.838e+03 f_JSE76_qlogis 2.2229 5.684e-01 3.877e+00 log_k1 -1.9339 -2.609e+00 -1.258e+00 log_k2 -4.4709 -4.935e+00 -4.007e+00 g_qlogis -0.4987 -1.373e+00 3.757e-01 a.1 2.7368 2.545e+00 2.928e+00 SD.log_k_JCZ38 1.2747 4.577e-01 2.092e+00 SD.log_k_J9Z38 0.6758 1.418e-01 1.210e+00 SD.log_k_JSE76 0.5869 1.169e-01 1.057e+00 SD.f_cyan_ilr_1 0.3392 1.161e-01 5.622e-01 SD.f_cyan_ilr_2 0.4200 8.501e-02 7.550e-01 SD.f_JCZ38_qlogis 0.8511 -1.137e+06 1.137e+06 SD.f_JSE76_qlogis 0.3767 -5.238e-01 1.277e+00 SD.log_k1 0.7475 2.601e-01 1.235e+00 SD.log_k2 0.5179 1.837e-01 8.521e-01 SD.g_qlogis 0.9817 3.553e-01 1.608e+00 Correlation: cyan_0 l__JCZ3 l__J9Z3 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 f_JSE76 log_k_JCZ38 -0.0351 log_k_J9Z38 -0.0541 0.0043 log_k_JSE76 -0.0078 0.0900 -0.0014 f_cyan_ilr_1 -0.0249 0.0268 -0.0962 0.0000 f_cyan_ilr_2 -0.3560 0.0848 0.1545 -0.0022 0.0463 f_JCZ38_qlogis 0.2005 -0.1226 -0.0347 0.0514 -0.1840 -0.5906 f_JSE76_qlogis -0.1638 0.1307 0.0266 0.0001 0.1645 0.5181 -0.9297 log_k1 0.0881 -0.0071 0.0005 -0.0070 -0.0064 -0.0346 0.0316 -0.0341 log_k2 0.0238 -0.0003 0.0082 -0.0022 -0.0017 -0.0017 -0.0002 -0.0076 g_qlogis 0.0198 -0.0002 -0.0109 0.0034 0.0017 -0.0176 0.0044 0.0051 log_k1 log_k2 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 0.0276 g_qlogis -0.0283 -0.0309 Random effects: est. lower upper SD.log_k_JCZ38 1.2747 4.577e-01 2.092e+00 SD.log_k_J9Z38 0.6758 1.418e-01 1.210e+00 SD.log_k_JSE76 0.5869 1.169e-01 1.057e+00 SD.f_cyan_ilr_1 0.3392 1.161e-01 5.622e-01 SD.f_cyan_ilr_2 0.4200 8.501e-02 7.550e-01 SD.f_JCZ38_qlogis 0.8511 -1.137e+06 1.137e+06 SD.f_JSE76_qlogis 0.3767 -5.238e-01 1.277e+00 SD.log_k1 0.7475 2.601e-01 1.235e+00 SD.log_k2 0.5179 1.837e-01 8.521e-01 SD.g_qlogis 0.9817 3.553e-01 1.608e+00 Variance model: est. lower upper a.1 2.737 2.545 2.928 Backtransformed parameters: est. lower upper cyan_0 102.72037 1.014e+02 104.00464 k_JCZ38 0.05544 1.752e-02 0.17539 k_J9Z38 0.00584 2.942e-03 0.01159 k_JSE76 0.02850 1.539e-02 0.05279 f_cyan_to_JCZ38 0.59995 NA NA f_cyan_to_J9Z38 0.22519 NA NA f_JCZ38_to_JSE76 0.99994 0.000e+00 1.00000 f_JSE76_to_JCZ38 0.90229 6.384e-01 0.97971 k1 0.14459 7.357e-02 0.28414 k2 0.01144 7.192e-03 0.01819 g 0.37784 2.021e-01 0.59284 Resulting formation fractions: ff cyan_JCZ38 5.999e-01 cyan_J9Z38 2.252e-01 cyan_sink 1.749e-01 JCZ38_JSE76 9.999e-01 JCZ38_sink 5.506e-05 JSE76_JCZ38 9.023e-01 JSE76_sink 9.771e-02 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 cyan 21.93 159.83 48.11 4.794 60.6 JCZ38 12.50 41.53 NA NA NA J9Z38 118.69 394.27 NA NA NA JSE76 24.32 80.78 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:57:56 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 691.67 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 101.7393 -1.4493 -5.0118 -2.1269 0.6720 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 7.3362 13.4423 13.2659 -2.0061 -4.5527 g_qlogis -0.5806 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 5.604 0.00 0.000 0.000 0.0000 log_k_JCZ38 0.000 2.77 0.000 0.000 0.0000 log_k_J9Z38 0.000 0.00 1.662 0.000 0.0000 log_k_JSE76 0.000 0.00 0.000 5.021 0.0000 f_cyan_ilr_1 0.000 0.00 0.000 0.000 0.6519 f_cyan_ilr_2 0.000 0.00 0.000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.00 0.000 0.000 0.0000 f_JSE76_qlogis 0.000 0.00 0.000 0.000 0.0000 log_k1 0.000 0.00 0.000 0.000 0.0000 log_k2 0.000 0.00 0.000 0.000 0.0000 g_qlogis 0.000 0.00 0.000 0.000 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 cyan_0 0.00 0.00 0.00 0.0000 0.0000 log_k_JCZ38 0.00 0.00 0.00 0.0000 0.0000 log_k_J9Z38 0.00 0.00 0.00 0.0000 0.0000 log_k_JSE76 0.00 0.00 0.00 0.0000 0.0000 f_cyan_ilr_1 0.00 0.00 0.00 0.0000 0.0000 f_cyan_ilr_2 13.37 0.00 0.00 0.0000 0.0000 f_JCZ38_qlogis 0.00 14.21 0.00 0.0000 0.0000 f_JSE76_qlogis 0.00 0.00 14.58 0.0000 0.0000 log_k1 0.00 0.00 0.00 0.8453 0.0000 log_k2 0.00 0.00 0.00 0.0000 0.5969 g_qlogis 0.00 0.00 0.00 0.0000 0.0000 g_qlogis cyan_0 0.00 log_k_JCZ38 0.00 log_k_J9Z38 0.00 log_k_JSE76 0.00 f_cyan_ilr_1 0.00 f_cyan_ilr_2 0.00 f_JCZ38_qlogis 0.00 f_JSE76_qlogis 0.00 log_k1 0.00 log_k2 0.00 g_qlogis 1.69 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2234 2226 -1095 Optimised parameters: est. lower upper cyan_0 101.25496 99.14662 103.36331 log_k_JCZ38 -2.55593 -3.32972 -1.78215 log_k_J9Z38 -5.07103 -5.85423 -4.28783 log_k_JSE76 -3.25468 -4.17577 -2.33360 f_cyan_ilr_1 0.70139 0.35924 1.04355 f_cyan_ilr_2 1.07712 0.17789 1.97636 f_JCZ38_qlogis 3.57483 0.05990 7.08976 f_JSE76_qlogis 4.54884 -7.25628 16.35395 log_k1 -2.38201 -2.51639 -2.24763 log_k2 -4.66741 -4.91865 -4.41617 g_qlogis -0.28446 -1.14192 0.57300 a.1 2.05925 1.86481 2.25369 b.1 0.06172 0.05062 0.07282 SD.log_k_JCZ38 0.81137 0.25296 1.36977 SD.log_k_J9Z38 0.83542 0.25395 1.41689 SD.log_k_JSE76 0.97903 0.30100 1.65707 SD.f_cyan_ilr_1 0.37878 0.13374 0.62382 SD.f_cyan_ilr_2 0.67274 0.10102 1.24446 SD.f_JCZ38_qlogis 1.35327 -0.42359 3.13012 SD.f_JSE76_qlogis 1.43956 -19.14972 22.02884 SD.log_k2 0.25329 0.07521 0.43138 SD.g_qlogis 0.95167 0.35149 1.55184 Correlation: cyan_0 l__JCZ3 l__J9Z3 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 f_JSE76 log_k_JCZ38 -0.0265 log_k_J9Z38 -0.0392 0.0024 log_k_JSE76 0.0011 0.1220 -0.0016 f_cyan_ilr_1 -0.0161 0.0217 -0.0552 0.0034 f_cyan_ilr_2 -0.4718 0.0829 0.1102 0.0042 0.0095 f_JCZ38_qlogis 0.1609 -0.1318 -0.0277 0.0081 -0.1040 -0.4559 f_JSE76_qlogis -0.1289 0.1494 0.0219 0.0012 0.1004 0.4309 -0.8543 log_k1 0.2618 -0.0739 -0.0167 -0.0148 -0.0444 -0.2768 0.3518 -0.3818 log_k2 0.0603 -0.0217 0.0174 -0.0058 -0.0197 -0.0533 0.0923 -0.1281 g_qlogis 0.0362 0.0115 -0.0111 0.0040 0.0095 -0.0116 -0.0439 0.0651 log_k1 log_k2 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 0.3269 g_qlogis -0.1656 -0.0928 Random effects: est. lower upper SD.log_k_JCZ38 0.8114 0.25296 1.3698 SD.log_k_J9Z38 0.8354 0.25395 1.4169 SD.log_k_JSE76 0.9790 0.30100 1.6571 SD.f_cyan_ilr_1 0.3788 0.13374 0.6238 SD.f_cyan_ilr_2 0.6727 0.10102 1.2445 SD.f_JCZ38_qlogis 1.3533 -0.42359 3.1301 SD.f_JSE76_qlogis 1.4396 -19.14972 22.0288 SD.log_k2 0.2533 0.07521 0.4314 SD.g_qlogis 0.9517 0.35149 1.5518 Variance model: est. lower upper a.1 2.05925 1.86481 2.25369 b.1 0.06172 0.05062 0.07282 Backtransformed parameters: est. lower upper cyan_0 1.013e+02 9.915e+01 103.36331 k_JCZ38 7.762e-02 3.580e-02 0.16828 k_J9Z38 6.276e-03 2.868e-03 0.01373 k_JSE76 3.859e-02 1.536e-02 0.09695 f_cyan_to_JCZ38 6.520e-01 NA NA f_cyan_to_J9Z38 2.418e-01 NA NA f_JCZ38_to_JSE76 9.727e-01 5.150e-01 0.99917 f_JSE76_to_JCZ38 9.895e-01 7.052e-04 1.00000 k1 9.236e-02 8.075e-02 0.10565 k2 9.397e-03 7.309e-03 0.01208 g 4.294e-01 2.420e-01 0.63945 Resulting formation fractions: ff cyan_JCZ38 0.65203 cyan_J9Z38 0.24181 cyan_sink 0.10616 JCZ38_JSE76 0.97274 JCZ38_sink 0.02726 JSE76_JCZ38 0.98953 JSE76_sink 0.01047 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 cyan 24.26 185.34 55.79 7.504 73.77 JCZ38 8.93 29.66 NA NA NA J9Z38 110.45 366.89 NA NA NA JSE76 17.96 59.66 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:55:26 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound * cyan_free + k_cyan_bound_free * cyan_bound d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free * cyan_bound d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 542.162 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_free_0 log_k_cyan_free log_k_cyan_free_bound 102.4395 -2.7673 -2.8942 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 -3.6201 -2.3107 -5.3123 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 -3.7120 0.6754 1.1448 f_JCZ38_qlogis f_JSE76_qlogis 14.8408 15.4734 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_free_0 log_k_cyan_free log_k_cyan_free_bound cyan_free_0 4.589 0.0000 0.00 log_k_cyan_free 0.000 0.4849 0.00 log_k_cyan_free_bound 0.000 0.0000 1.62 log_k_cyan_bound_free 0.000 0.0000 0.00 log_k_JCZ38 0.000 0.0000 0.00 log_k_J9Z38 0.000 0.0000 0.00 log_k_JSE76 0.000 0.0000 0.00 f_cyan_ilr_1 0.000 0.0000 0.00 f_cyan_ilr_2 0.000 0.0000 0.00 f_JCZ38_qlogis 0.000 0.0000 0.00 f_JSE76_qlogis 0.000 0.0000 0.00 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76 cyan_free_0 0.000 0.0000 0.000 0.0 log_k_cyan_free 0.000 0.0000 0.000 0.0 log_k_cyan_free_bound 0.000 0.0000 0.000 0.0 log_k_cyan_bound_free 1.197 0.0000 0.000 0.0 log_k_JCZ38 0.000 0.7966 0.000 0.0 log_k_J9Z38 0.000 0.0000 1.561 0.0 log_k_JSE76 0.000 0.0000 0.000 0.8 f_cyan_ilr_1 0.000 0.0000 0.000 0.0 f_cyan_ilr_2 0.000 0.0000 0.000 0.0 f_JCZ38_qlogis 0.000 0.0000 0.000 0.0 f_JSE76_qlogis 0.000 0.0000 0.000 0.0 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis cyan_free_0 0.0000 0.000 0.0 0.00 log_k_cyan_free 0.0000 0.000 0.0 0.00 log_k_cyan_free_bound 0.0000 0.000 0.0 0.00 log_k_cyan_bound_free 0.0000 0.000 0.0 0.00 log_k_JCZ38 0.0000 0.000 0.0 0.00 log_k_J9Z38 0.0000 0.000 0.0 0.00 log_k_JSE76 0.0000 0.000 0.0 0.00 f_cyan_ilr_1 0.6349 0.000 0.0 0.00 f_cyan_ilr_2 0.0000 1.797 0.0 0.00 f_JCZ38_qlogis 0.0000 0.000 15.6 0.00 f_JSE76_qlogis 0.0000 0.000 0.0 17.52 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2283 2275 -1120 Optimised parameters: est. lower upper cyan_free_0 102.6517 101.40815 103.8952 log_k_cyan_free -2.8729 -3.18649 -2.5593 log_k_cyan_free_bound -2.7803 -3.60525 -1.9552 log_k_cyan_bound_free -3.5845 -4.16644 -3.0026 log_k_JCZ38 -2.3411 -2.89698 -1.7852 log_k_J9Z38 -5.2487 -6.01271 -4.4847 log_k_JSE76 -3.0259 -4.28274 -1.7690 f_cyan_ilr_1 0.7289 0.38214 1.0756 f_cyan_ilr_2 0.6891 0.18277 1.1954 f_JCZ38_qlogis 4.2162 0.47015 7.9622 f_JSE76_qlogis 5.8911 -20.19088 31.9730 a.1 2.7159 2.52587 2.9060 SD.log_k_cyan_free 0.3354 0.10979 0.5610 SD.log_k_cyan_free_bound 0.9061 0.30969 1.5025 SD.log_k_cyan_bound_free 0.6376 0.21229 1.0628 SD.log_k_JCZ38 0.5499 0.14533 0.9545 SD.log_k_J9Z38 0.7457 0.15106 1.3404 SD.log_k_JSE76 1.3822 0.47329 2.2912 SD.f_cyan_ilr_1 0.3820 0.13280 0.6313 SD.f_cyan_ilr_2 0.4317 0.06803 0.7953 SD.f_JCZ38_qlogis 1.8258 -0.25423 3.9059 SD.f_JSE76_qlogis 2.2348 -83.33679 87.8065 Correlation: cyn_f_0 lg_k_c_ lg_k_cyn_f_ lg_k_cyn_b_ l__JCZ3 l__J9Z3 log_k_cyan_free 0.1944 log_k_cyan_free_bound 0.0815 0.0814 log_k_cyan_bound_free 0.0106 0.0426 0.0585 log_k_JCZ38 -0.0231 -0.0106 -0.0089 -0.0051 log_k_J9Z38 -0.0457 -0.0108 0.0019 0.0129 0.0032 log_k_JSE76 -0.0054 -0.0024 -0.0017 -0.0005 0.1108 0.0009 f_cyan_ilr_1 0.0051 -0.0005 -0.0035 -0.0056 0.0131 -0.0967 f_cyan_ilr_2 -0.3182 -0.0771 -0.0309 -0.0038 0.0680 0.1643 f_JCZ38_qlogis 0.0834 0.0369 0.0302 0.0172 -0.1145 -0.0204 f_JSE76_qlogis -0.0553 -0.0365 -0.0441 -0.0414 0.1579 0.0175 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 log_k_cyan_free log_k_cyan_free_bound log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 -0.0002 f_cyan_ilr_2 0.0020 -0.0415 f_JCZ38_qlogis 0.0052 -0.0665 -0.3437 f_JSE76_qlogis 0.0066 0.0635 0.3491 -0.7487 Random effects: est. lower upper SD.log_k_cyan_free 0.3354 0.10979 0.5610 SD.log_k_cyan_free_bound 0.9061 0.30969 1.5025 SD.log_k_cyan_bound_free 0.6376 0.21229 1.0628 SD.log_k_JCZ38 0.5499 0.14533 0.9545 SD.log_k_J9Z38 0.7457 0.15106 1.3404 SD.log_k_JSE76 1.3822 0.47329 2.2912 SD.f_cyan_ilr_1 0.3820 0.13280 0.6313 SD.f_cyan_ilr_2 0.4317 0.06803 0.7953 SD.f_JCZ38_qlogis 1.8258 -0.25423 3.9059 SD.f_JSE76_qlogis 2.2348 -83.33679 87.8065 Variance model: est. lower upper a.1 2.716 2.526 2.906 Backtransformed parameters: est. lower upper cyan_free_0 1.027e+02 1.014e+02 103.89517 k_cyan_free 5.654e-02 4.132e-02 0.07736 k_cyan_free_bound 6.202e-02 2.718e-02 0.14153 k_cyan_bound_free 2.775e-02 1.551e-02 0.04966 k_JCZ38 9.622e-02 5.519e-02 0.16777 k_J9Z38 5.254e-03 2.447e-03 0.01128 k_JSE76 4.852e-02 1.380e-02 0.17051 f_cyan_free_to_JCZ38 6.197e-01 5.643e-01 0.84429 f_cyan_free_to_J9Z38 2.211e-01 5.643e-01 0.84429 f_JCZ38_to_JSE76 9.855e-01 6.154e-01 0.99965 f_JSE76_to_JCZ38 9.972e-01 1.703e-09 1.00000 Estimated Eigenvalues of SFORB model(s): cyan_b1 cyan_b2 cyan_g 0.13466 0.01165 0.36490 Resulting formation fractions: ff cyan_free_JCZ38 0.619745 cyan_free_J9Z38 0.221083 cyan_free_sink 0.159172 cyan_free 1.000000 JCZ38_JSE76 0.985460 JCZ38_sink 0.014540 JSE76_JCZ38 0.997244 JSE76_sink 0.002756 Estimated disappearance times: DT50 DT90 DT50back DT50_cyan_b1 DT50_cyan_b2 cyan 23.293 158.67 47.77 5.147 59.5 JCZ38 7.203 23.93 NA NA NA J9Z38 131.918 438.22 NA NA NA JSE76 14.287 47.46 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 07:58:06 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound * cyan_free + k_cyan_bound_free * cyan_bound d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free * cyan_bound d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 701.582 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_free_0 log_k_cyan_free log_k_cyan_free_bound 101.7511 -2.8370 -3.0162 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 -3.6600 -2.2988 -5.3129 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 -3.6991 0.6722 4.8596 f_JCZ38_qlogis f_JSE76_qlogis 13.4678 14.2149 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_free_0 log_k_cyan_free log_k_cyan_free_bound cyan_free_0 5.629 0.000 0.000 log_k_cyan_free 0.000 0.446 0.000 log_k_cyan_free_bound 0.000 0.000 1.449 log_k_cyan_bound_free 0.000 0.000 0.000 log_k_JCZ38 0.000 0.000 0.000 log_k_J9Z38 0.000 0.000 0.000 log_k_JSE76 0.000 0.000 0.000 f_cyan_ilr_1 0.000 0.000 0.000 f_cyan_ilr_2 0.000 0.000 0.000 f_JCZ38_qlogis 0.000 0.000 0.000 f_JSE76_qlogis 0.000 0.000 0.000 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76 cyan_free_0 0.000 0.0000 0.000 0.0000 log_k_cyan_free 0.000 0.0000 0.000 0.0000 log_k_cyan_free_bound 0.000 0.0000 0.000 0.0000 log_k_cyan_bound_free 1.213 0.0000 0.000 0.0000 log_k_JCZ38 0.000 0.7801 0.000 0.0000 log_k_J9Z38 0.000 0.0000 1.575 0.0000 log_k_JSE76 0.000 0.0000 0.000 0.8078 f_cyan_ilr_1 0.000 0.0000 0.000 0.0000 f_cyan_ilr_2 0.000 0.0000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.0000 0.000 0.0000 f_JSE76_qlogis 0.000 0.0000 0.000 0.0000 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis cyan_free_0 0.0000 0.000 0.00 0.00 log_k_cyan_free 0.0000 0.000 0.00 0.00 log_k_cyan_free_bound 0.0000 0.000 0.00 0.00 log_k_cyan_bound_free 0.0000 0.000 0.00 0.00 log_k_JCZ38 0.0000 0.000 0.00 0.00 log_k_J9Z38 0.0000 0.000 0.00 0.00 log_k_JSE76 0.0000 0.000 0.00 0.00 f_cyan_ilr_1 0.6518 0.000 0.00 0.00 f_cyan_ilr_2 0.0000 9.981 0.00 0.00 f_JCZ38_qlogis 0.0000 0.000 14.26 0.00 f_JSE76_qlogis 0.0000 0.000 0.00 16.17 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2240 2231 -1098 Optimised parameters: est. lower upper cyan_free_0 100.73014 9.873e+01 1.027e+02 log_k_cyan_free -3.19634 -3.641e+00 -2.752e+00 log_k_cyan_free_bound -3.43533 -3.674e+00 -3.197e+00 log_k_cyan_bound_free -3.83282 -4.163e+00 -3.503e+00 log_k_JCZ38 -2.51065 -3.225e+00 -1.796e+00 log_k_J9Z38 -5.02539 -5.825e+00 -4.226e+00 log_k_JSE76 -3.24777 -4.163e+00 -2.333e+00 f_cyan_ilr_1 0.70640 3.562e-01 1.057e+00 f_cyan_ilr_2 1.42704 3.170e-01 2.537e+00 f_JCZ38_qlogis 2.84779 1.042e+00 4.654e+00 f_JSE76_qlogis 8.63674 -6.407e+02 6.580e+02 a.1 2.07082 1.877e+00 2.265e+00 b.1 0.06227 5.098e-02 7.355e-02 SD.log_k_cyan_free 0.49674 1.865e-01 8.069e-01 SD.log_k_cyan_bound_free 0.28537 6.809e-02 5.027e-01 SD.log_k_JCZ38 0.74846 2.305e-01 1.266e+00 SD.log_k_J9Z38 0.86077 2.713e-01 1.450e+00 SD.log_k_JSE76 0.97613 3.030e-01 1.649e+00 SD.f_cyan_ilr_1 0.38994 1.382e-01 6.417e-01 SD.f_cyan_ilr_2 0.82869 3.917e-02 1.618e+00 SD.f_JCZ38_qlogis 1.05000 -2.808e-02 2.128e+00 SD.f_JSE76_qlogis 0.44681 -3.985e+05 3.985e+05 Correlation: cyn_f_0 lg_k_c_ lg_k_cyn_f_ lg_k_cyn_b_ l__JCZ3 l__J9Z3 log_k_cyan_free 0.0936 log_k_cyan_free_bound 0.1302 0.1627 log_k_cyan_bound_free 0.0029 0.0525 0.5181 log_k_JCZ38 -0.0116 -0.0077 -0.0430 -0.0236 log_k_J9Z38 -0.0192 -0.0077 -0.0048 0.0229 -0.0005 log_k_JSE76 0.0007 -0.0020 -0.0134 -0.0072 0.1225 -0.0016 f_cyan_ilr_1 -0.0118 -0.0027 -0.0132 -0.0118 0.0127 -0.0505 f_cyan_ilr_2 -0.4643 -0.0762 -0.1245 0.0137 0.0497 0.1003 f_JCZ38_qlogis 0.0710 0.0371 0.1826 0.0925 -0.0869 -0.0130 f_JSE76_qlogis -0.0367 -0.0270 -0.2274 -0.1865 0.1244 0.0098 l__JSE7 f_cy__1 f_cy__2 f_JCZ38 log_k_cyan_free log_k_cyan_free_bound log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 0.0036 f_cyan_ilr_2 0.0050 -0.0201 f_JCZ38_qlogis 0.0142 -0.0529 -0.2698 f_JSE76_qlogis 0.0064 0.0345 0.2015 -0.7058 Random effects: est. lower upper SD.log_k_cyan_free 0.4967 1.865e-01 8.069e-01 SD.log_k_cyan_bound_free 0.2854 6.809e-02 5.027e-01 SD.log_k_JCZ38 0.7485 2.305e-01 1.266e+00 SD.log_k_J9Z38 0.8608 2.713e-01 1.450e+00 SD.log_k_JSE76 0.9761 3.030e-01 1.649e+00 SD.f_cyan_ilr_1 0.3899 1.382e-01 6.417e-01 SD.f_cyan_ilr_2 0.8287 3.917e-02 1.618e+00 SD.f_JCZ38_qlogis 1.0500 -2.808e-02 2.128e+00 SD.f_JSE76_qlogis 0.4468 -3.985e+05 3.985e+05 Variance model: est. lower upper a.1 2.07082 1.87680 2.26483 b.1 0.06227 0.05098 0.07355 Backtransformed parameters: est. lower upper cyan_free_0 1.007e+02 9.873e+01 102.72898 k_cyan_free 4.091e-02 2.623e-02 0.06382 k_cyan_free_bound 3.221e-02 2.537e-02 0.04090 k_cyan_bound_free 2.165e-02 1.557e-02 0.03011 k_JCZ38 8.122e-02 3.975e-02 0.16594 k_J9Z38 6.569e-03 2.954e-03 0.01461 k_JSE76 3.886e-02 1.556e-02 0.09703 f_cyan_free_to_JCZ38 6.785e-01 6.102e-01 0.97309 f_cyan_free_to_J9Z38 2.498e-01 6.102e-01 0.97309 f_JCZ38_to_JSE76 9.452e-01 7.392e-01 0.99056 f_JSE76_to_JCZ38 9.998e-01 5.580e-279 1.00000 Estimated Eigenvalues of SFORB model(s): cyan_b1 cyan_b2 cyan_g 0.08426 0.01051 0.41220 Resulting formation fractions: ff cyan_free_JCZ38 0.6784541 cyan_free_J9Z38 0.2498405 cyan_free_sink 0.0717054 cyan_free 1.0000000 JCZ38_JSE76 0.9452043 JCZ38_sink 0.0547957 JSE76_JCZ38 0.9998226 JSE76_sink 0.0001774 Estimated disappearance times: DT50 DT90 DT50back DT50_cyan_b1 DT50_cyan_b2 cyan 25.237 168.51 50.73 8.226 65.95 JCZ38 8.535 28.35 NA NA NA J9Z38 105.517 350.52 NA NA NA JSE76 17.837 59.25 NA NA NA"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"pathway-2-refined-fits","dir":"Articles > Prebuilt","previous_headings":"Appendix > Hierarchical fit listings","what":"Pathway 2, refined fits","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"Hierarchical FOMC path 2 fit reduced random effects, two-component error Hierarchical DFOP path 2 fit reduced random effects, constant variance Hierarchical DFOP path 2 fit reduced random effects, two-component error Hierarchical SFORB path 2 fit reduced random effects, constant variance Hierarchical SFORB path 2 fit reduced random effects, two-component error","code":"saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:11:01 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - (alpha/beta) * 1/((time/beta) + 1) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * (alpha/beta) * 1/((time/beta) + 1) * cyan - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_to_J9Z38 * (alpha/beta) * 1/((time/beta) + 1) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 773.693 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 102.4477 -1.8631 -5.1087 -2.5114 0.6826 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_alpha log_beta 4.7944 15.9616 13.1566 -0.1564 2.9781 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 7.701 0.000 0.000 0.000 0.0000 log_k_JCZ38 0.000 1.448 0.000 0.000 0.0000 log_k_J9Z38 0.000 0.000 1.724 0.000 0.0000 log_k_JSE76 0.000 0.000 0.000 3.659 0.0000 f_cyan_ilr_1 0.000 0.000 0.000 0.000 0.6356 f_cyan_ilr_2 0.000 0.000 0.000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.000 0.000 0.000 0.0000 f_JSE76_qlogis 0.000 0.000 0.000 0.000 0.0000 log_alpha 0.000 0.000 0.000 0.000 0.0000 log_beta 0.000 0.000 0.000 0.000 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_alpha log_beta cyan_0 0.00 0.00 0.00 0.0000 0.0000 log_k_JCZ38 0.00 0.00 0.00 0.0000 0.0000 log_k_J9Z38 0.00 0.00 0.00 0.0000 0.0000 log_k_JSE76 0.00 0.00 0.00 0.0000 0.0000 f_cyan_ilr_1 0.00 0.00 0.00 0.0000 0.0000 f_cyan_ilr_2 10.32 0.00 0.00 0.0000 0.0000 f_JCZ38_qlogis 0.00 12.23 0.00 0.0000 0.0000 f_JSE76_qlogis 0.00 0.00 14.99 0.0000 0.0000 log_alpha 0.00 0.00 0.00 0.3924 0.0000 log_beta 0.00 0.00 0.00 0.0000 0.5639 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2249 2242 -1106 Optimised parameters: est. lower upper cyan_0 101.24524 NA NA log_k_JCZ38 -2.85375 NA NA log_k_J9Z38 -5.07729 NA NA log_k_JSE76 -3.53511 NA NA f_cyan_ilr_1 0.67478 NA NA f_cyan_ilr_2 0.97152 NA NA f_JCZ38_qlogis 213.48001 NA NA f_JSE76_qlogis 2.02040 NA NA log_alpha -0.11041 NA NA log_beta 3.06575 NA NA a.1 2.05279 1.85495 2.2506 b.1 0.07116 0.05912 0.0832 SD.log_k_JCZ38 1.21713 0.44160 1.9927 SD.log_k_J9Z38 0.88268 0.27541 1.4900 SD.log_k_JSE76 0.59452 0.15005 1.0390 SD.f_cyan_ilr_1 0.35370 0.12409 0.5833 SD.f_cyan_ilr_2 0.78186 0.18547 1.3782 SD.log_alpha 0.27781 0.08168 0.4739 SD.log_beta 0.32608 0.06490 0.5873 Correlation is not available Random effects: est. lower upper SD.log_k_JCZ38 1.2171 0.44160 1.9927 SD.log_k_J9Z38 0.8827 0.27541 1.4900 SD.log_k_JSE76 0.5945 0.15005 1.0390 SD.f_cyan_ilr_1 0.3537 0.12409 0.5833 SD.f_cyan_ilr_2 0.7819 0.18547 1.3782 SD.log_alpha 0.2778 0.08168 0.4739 SD.log_beta 0.3261 0.06490 0.5873 Variance model: est. lower upper a.1 2.05279 1.85495 2.2506 b.1 0.07116 0.05912 0.0832 Backtransformed parameters: est. lower upper cyan_0 1.012e+02 NA NA k_JCZ38 5.763e-02 NA NA k_J9Z38 6.237e-03 NA NA k_JSE76 2.916e-02 NA NA f_cyan_to_JCZ38 6.354e-01 NA NA f_cyan_to_J9Z38 2.447e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 NA NA f_JSE76_to_JCZ38 8.829e-01 NA NA alpha 8.955e-01 NA NA beta 2.145e+01 NA NA Resulting formation fractions: ff cyan_JCZ38 0.6354 cyan_J9Z38 0.2447 cyan_sink 0.1200 JCZ38_JSE76 1.0000 JCZ38_sink 0.0000 JSE76_JCZ38 0.8829 JSE76_sink 0.1171 Estimated disappearance times: DT50 DT90 DT50back cyan 25.07 259.21 78.03 JCZ38 12.03 39.96 NA J9Z38 111.14 369.19 NA JSE76 23.77 78.98 NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:12:27 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 859.906 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 102.4380 -2.3107 -5.3123 -3.7120 0.6757 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 1.1439 13.1194 12.3492 -1.9317 -4.4557 g_qlogis -0.5644 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 4.591 0.0000 0.000 0.0 0.0000 log_k_JCZ38 0.000 0.7966 0.000 0.0 0.0000 log_k_J9Z38 0.000 0.0000 1.561 0.0 0.0000 log_k_JSE76 0.000 0.0000 0.000 0.8 0.0000 f_cyan_ilr_1 0.000 0.0000 0.000 0.0 0.6349 f_cyan_ilr_2 0.000 0.0000 0.000 0.0 0.0000 f_JCZ38_qlogis 0.000 0.0000 0.000 0.0 0.0000 f_JSE76_qlogis 0.000 0.0000 0.000 0.0 0.0000 log_k1 0.000 0.0000 0.000 0.0 0.0000 log_k2 0.000 0.0000 0.000 0.0 0.0000 g_qlogis 0.000 0.0000 0.000 0.0 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 cyan_0 0.000 0.00 0.00 0.000 0.0000 log_k_JCZ38 0.000 0.00 0.00 0.000 0.0000 log_k_J9Z38 0.000 0.00 0.00 0.000 0.0000 log_k_JSE76 0.000 0.00 0.00 0.000 0.0000 f_cyan_ilr_1 0.000 0.00 0.00 0.000 0.0000 f_cyan_ilr_2 1.797 0.00 0.00 0.000 0.0000 f_JCZ38_qlogis 0.000 13.86 0.00 0.000 0.0000 f_JSE76_qlogis 0.000 0.00 13.91 0.000 0.0000 log_k1 0.000 0.00 0.00 1.106 0.0000 log_k2 0.000 0.00 0.00 0.000 0.6141 g_qlogis 0.000 0.00 0.00 0.000 0.0000 g_qlogis cyan_0 0.000 log_k_JCZ38 0.000 log_k_J9Z38 0.000 log_k_JSE76 0.000 f_cyan_ilr_1 0.000 f_cyan_ilr_2 0.000 f_JCZ38_qlogis 0.000 f_JSE76_qlogis 0.000 log_k1 0.000 log_k2 0.000 g_qlogis 1.595 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2282 2274 -1121 Optimised parameters: est. lower upper cyan_0 102.6036 NA NA log_k_JCZ38 -2.9348 NA NA log_k_J9Z38 -5.1617 NA NA log_k_JSE76 -3.6396 NA NA f_cyan_ilr_1 0.6991 NA NA f_cyan_ilr_2 0.6341 NA NA f_JCZ38_qlogis 4232.3011 NA NA f_JSE76_qlogis 1.9658 NA NA log_k1 -1.9503 NA NA log_k2 -4.4745 NA NA g_qlogis -0.4967 NA NA a.1 2.7461 2.59274 2.8994 SD.log_k_JCZ38 1.3178 0.47602 2.1596 SD.log_k_J9Z38 0.7022 0.15061 1.2538 SD.log_k_JSE76 0.6566 0.15613 1.1570 SD.f_cyan_ilr_1 0.3409 0.11666 0.5652 SD.f_cyan_ilr_2 0.4385 0.09482 0.7821 SD.log_k1 0.7381 0.25599 1.2202 SD.log_k2 0.5133 0.18152 0.8450 SD.g_qlogis 0.9866 0.35681 1.6164 Correlation is not available Random effects: est. lower upper SD.log_k_JCZ38 1.3178 0.47602 2.1596 SD.log_k_J9Z38 0.7022 0.15061 1.2538 SD.log_k_JSE76 0.6566 0.15613 1.1570 SD.f_cyan_ilr_1 0.3409 0.11666 0.5652 SD.f_cyan_ilr_2 0.4385 0.09482 0.7821 SD.log_k1 0.7381 0.25599 1.2202 SD.log_k2 0.5133 0.18152 0.8450 SD.g_qlogis 0.9866 0.35681 1.6164 Variance model: est. lower upper a.1 2.746 2.593 2.899 Backtransformed parameters: est. lower upper cyan_0 1.026e+02 NA NA k_JCZ38 5.314e-02 NA NA k_J9Z38 5.732e-03 NA NA k_JSE76 2.626e-02 NA NA f_cyan_to_JCZ38 6.051e-01 NA NA f_cyan_to_J9Z38 2.251e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 NA NA f_JSE76_to_JCZ38 8.772e-01 NA NA k1 1.422e-01 NA NA k2 1.140e-02 NA NA g 3.783e-01 NA NA Resulting formation fractions: ff cyan_JCZ38 0.6051 cyan_J9Z38 0.2251 cyan_sink 0.1698 JCZ38_JSE76 1.0000 JCZ38_sink 0.0000 JSE76_JCZ38 0.8772 JSE76_sink 0.1228 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 cyan 22.05 160.35 48.27 4.873 60.83 JCZ38 13.04 43.33 NA NA NA J9Z38 120.93 401.73 NA NA NA JSE76 26.39 87.68 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:12:54 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan d_JCZ38/dt = + f_cyan_to_JCZ38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_to_J9Z38 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * cyan - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 886.298 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 101.7393 -1.4493 -5.0118 -2.1269 0.6720 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 7.3362 13.4423 13.2659 -2.0061 -4.5527 g_qlogis -0.5806 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_0 log_k_JCZ38 log_k_J9Z38 log_k_JSE76 f_cyan_ilr_1 cyan_0 5.604 0.00 0.000 0.000 0.0000 log_k_JCZ38 0.000 2.77 0.000 0.000 0.0000 log_k_J9Z38 0.000 0.00 1.662 0.000 0.0000 log_k_JSE76 0.000 0.00 0.000 5.021 0.0000 f_cyan_ilr_1 0.000 0.00 0.000 0.000 0.6519 f_cyan_ilr_2 0.000 0.00 0.000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.00 0.000 0.000 0.0000 f_JSE76_qlogis 0.000 0.00 0.000 0.000 0.0000 log_k1 0.000 0.00 0.000 0.000 0.0000 log_k2 0.000 0.00 0.000 0.000 0.0000 g_qlogis 0.000 0.00 0.000 0.000 0.0000 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis log_k1 log_k2 cyan_0 0.00 0.00 0.00 0.0000 0.0000 log_k_JCZ38 0.00 0.00 0.00 0.0000 0.0000 log_k_J9Z38 0.00 0.00 0.00 0.0000 0.0000 log_k_JSE76 0.00 0.00 0.00 0.0000 0.0000 f_cyan_ilr_1 0.00 0.00 0.00 0.0000 0.0000 f_cyan_ilr_2 13.37 0.00 0.00 0.0000 0.0000 f_JCZ38_qlogis 0.00 14.21 0.00 0.0000 0.0000 f_JSE76_qlogis 0.00 0.00 14.58 0.0000 0.0000 log_k1 0.00 0.00 0.00 0.8453 0.0000 log_k2 0.00 0.00 0.00 0.0000 0.5969 g_qlogis 0.00 0.00 0.00 0.0000 0.0000 g_qlogis cyan_0 0.00 log_k_JCZ38 0.00 log_k_J9Z38 0.00 log_k_JSE76 0.00 f_cyan_ilr_1 0.00 f_cyan_ilr_2 0.00 f_JCZ38_qlogis 0.00 f_JSE76_qlogis 0.00 log_k1 0.00 log_k2 0.00 g_qlogis 1.69 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2237 2229 -1099 Optimised parameters: est. lower upper cyan_0 101.00243 NA NA log_k_JCZ38 -2.80828 NA NA log_k_J9Z38 -5.04449 NA NA log_k_JSE76 -3.66981 NA NA f_cyan_ilr_1 0.72564 NA NA f_cyan_ilr_2 1.37978 NA NA f_JCZ38_qlogis 1.98726 NA NA f_JSE76_qlogis 414.80884 NA NA log_k1 -2.38601 NA NA log_k2 -4.63632 NA NA g_qlogis -0.33920 NA NA a.1 2.10837 1.91261 2.30413 b.1 0.06223 0.05085 0.07361 SD.log_k_JCZ38 1.30902 0.48128 2.13675 SD.log_k_J9Z38 0.83882 0.25790 1.41974 SD.log_k_JSE76 0.58104 0.14201 1.02008 SD.f_cyan_ilr_1 0.35421 0.12398 0.58443 SD.f_cyan_ilr_2 0.79373 0.12007 1.46739 SD.log_k2 0.27476 0.08557 0.46394 SD.g_qlogis 0.96170 0.35463 1.56878 Correlation is not available Random effects: est. lower upper SD.log_k_JCZ38 1.3090 0.48128 2.1367 SD.log_k_J9Z38 0.8388 0.25790 1.4197 SD.log_k_JSE76 0.5810 0.14201 1.0201 SD.f_cyan_ilr_1 0.3542 0.12398 0.5844 SD.f_cyan_ilr_2 0.7937 0.12007 1.4674 SD.log_k2 0.2748 0.08557 0.4639 SD.g_qlogis 0.9617 0.35463 1.5688 Variance model: est. lower upper a.1 2.10837 1.91261 2.30413 b.1 0.06223 0.05085 0.07361 Backtransformed parameters: est. lower upper cyan_0 1.010e+02 NA NA k_JCZ38 6.031e-02 NA NA k_J9Z38 6.445e-03 NA NA k_JSE76 2.548e-02 NA NA f_cyan_to_JCZ38 6.808e-01 NA NA f_cyan_to_J9Z38 2.440e-01 NA NA f_JCZ38_to_JSE76 8.795e-01 NA NA f_JSE76_to_JCZ38 1.000e+00 NA NA k1 9.200e-02 NA NA k2 9.693e-03 NA NA g 4.160e-01 NA NA Resulting formation fractions: ff cyan_JCZ38 0.68081 cyan_J9Z38 0.24398 cyan_sink 0.07521 JCZ38_JSE76 0.87945 JCZ38_sink 0.12055 JSE76_JCZ38 1.00000 JSE76_sink 0.00000 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 cyan 25.00 182.05 54.8 7.535 71.51 JCZ38 11.49 38.18 NA NA NA J9Z38 107.55 357.28 NA NA NA JSE76 27.20 90.36 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:12:32 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound * cyan_free + k_cyan_bound_free * cyan_bound d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free * cyan_bound d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 865.121 s Using 300, 100 iterations and 10 chains Variance model: Constant variance Starting values for degradation parameters: cyan_free_0 log_k_cyan_free log_k_cyan_free_bound 102.4395 -2.7673 -2.8942 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 -3.6201 -2.3107 -5.3123 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 -3.7120 0.6754 1.1448 f_JCZ38_qlogis f_JSE76_qlogis 14.8408 15.4734 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_free_0 log_k_cyan_free log_k_cyan_free_bound cyan_free_0 4.589 0.0000 0.00 log_k_cyan_free 0.000 0.4849 0.00 log_k_cyan_free_bound 0.000 0.0000 1.62 log_k_cyan_bound_free 0.000 0.0000 0.00 log_k_JCZ38 0.000 0.0000 0.00 log_k_J9Z38 0.000 0.0000 0.00 log_k_JSE76 0.000 0.0000 0.00 f_cyan_ilr_1 0.000 0.0000 0.00 f_cyan_ilr_2 0.000 0.0000 0.00 f_JCZ38_qlogis 0.000 0.0000 0.00 f_JSE76_qlogis 0.000 0.0000 0.00 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76 cyan_free_0 0.000 0.0000 0.000 0.0 log_k_cyan_free 0.000 0.0000 0.000 0.0 log_k_cyan_free_bound 0.000 0.0000 0.000 0.0 log_k_cyan_bound_free 1.197 0.0000 0.000 0.0 log_k_JCZ38 0.000 0.7966 0.000 0.0 log_k_J9Z38 0.000 0.0000 1.561 0.0 log_k_JSE76 0.000 0.0000 0.000 0.8 f_cyan_ilr_1 0.000 0.0000 0.000 0.0 f_cyan_ilr_2 0.000 0.0000 0.000 0.0 f_JCZ38_qlogis 0.000 0.0000 0.000 0.0 f_JSE76_qlogis 0.000 0.0000 0.000 0.0 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis cyan_free_0 0.0000 0.000 0.0 0.00 log_k_cyan_free 0.0000 0.000 0.0 0.00 log_k_cyan_free_bound 0.0000 0.000 0.0 0.00 log_k_cyan_bound_free 0.0000 0.000 0.0 0.00 log_k_JCZ38 0.0000 0.000 0.0 0.00 log_k_J9Z38 0.0000 0.000 0.0 0.00 log_k_JSE76 0.0000 0.000 0.0 0.00 f_cyan_ilr_1 0.6349 0.000 0.0 0.00 f_cyan_ilr_2 0.0000 1.797 0.0 0.00 f_JCZ38_qlogis 0.0000 0.000 15.6 0.00 f_JSE76_qlogis 0.0000 0.000 0.0 17.52 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2280 2272 -1120 Optimised parameters: est. lower upper cyan_free_0 102.6532 NA NA log_k_cyan_free -2.8547 NA NA log_k_cyan_free_bound -2.7004 NA NA log_k_cyan_bound_free -3.5078 NA NA log_k_JCZ38 -2.9255 NA NA log_k_J9Z38 -5.1089 NA NA log_k_JSE76 -3.6263 NA NA f_cyan_ilr_1 0.6873 NA NA f_cyan_ilr_2 0.6498 NA NA f_JCZ38_qlogis 3624.2149 NA NA f_JSE76_qlogis 1.9991 NA NA a.1 2.7472 2.55559 2.9388 SD.log_k_cyan_free 0.3227 0.10296 0.5423 SD.log_k_cyan_free_bound 0.8757 0.29525 1.4562 SD.log_k_cyan_bound_free 0.6128 0.20220 1.0233 SD.log_k_JCZ38 1.3431 0.48474 2.2014 SD.log_k_J9Z38 0.6881 0.14714 1.2291 SD.log_k_JSE76 0.6461 0.15321 1.1390 SD.f_cyan_ilr_1 0.3361 0.11376 0.5585 SD.f_cyan_ilr_2 0.4286 0.08419 0.7730 Correlation is not available Random effects: est. lower upper SD.log_k_cyan_free 0.3227 0.10296 0.5423 SD.log_k_cyan_free_bound 0.8757 0.29525 1.4562 SD.log_k_cyan_bound_free 0.6128 0.20220 1.0233 SD.log_k_JCZ38 1.3431 0.48474 2.2014 SD.log_k_J9Z38 0.6881 0.14714 1.2291 SD.log_k_JSE76 0.6461 0.15321 1.1390 SD.f_cyan_ilr_1 0.3361 0.11376 0.5585 SD.f_cyan_ilr_2 0.4286 0.08419 0.7730 Variance model: est. lower upper a.1 2.747 2.556 2.939 Backtransformed parameters: est. lower upper cyan_free_0 1.027e+02 NA NA k_cyan_free 5.758e-02 NA NA k_cyan_free_bound 6.718e-02 NA NA k_cyan_bound_free 2.996e-02 NA NA k_JCZ38 5.364e-02 NA NA k_J9Z38 6.042e-03 NA NA k_JSE76 2.662e-02 NA NA f_cyan_free_to_JCZ38 6.039e-01 NA NA f_cyan_free_to_J9Z38 2.285e-01 NA NA f_JCZ38_to_JSE76 1.000e+00 NA NA f_JSE76_to_JCZ38 8.807e-01 NA NA Estimated Eigenvalues of SFORB model(s): cyan_b1 cyan_b2 cyan_g 0.1426 0.0121 0.3484 Resulting formation fractions: ff cyan_free_JCZ38 0.6039 cyan_free_J9Z38 0.2285 cyan_free_sink 0.1676 cyan_free 1.0000 JCZ38_JSE76 1.0000 JCZ38_sink 0.0000 JSE76_JCZ38 0.8807 JSE76_sink 0.1193 Estimated disappearance times: DT50 DT90 DT50back DT50_cyan_b1 DT50_cyan_b2 cyan 23.84 154.95 46.65 4.86 57.31 JCZ38 12.92 42.93 NA NA NA J9Z38 114.71 381.07 NA NA NA JSE76 26.04 86.51 NA NA NA saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:12:36 2025 Date of summary: Fri Feb 14 08:12:55 2025 Equations: d_cyan_free/dt = - k_cyan_free * cyan_free - k_cyan_free_bound * cyan_free + k_cyan_bound_free * cyan_bound d_cyan_bound/dt = + k_cyan_free_bound * cyan_free - k_cyan_bound_free * cyan_bound d_JCZ38/dt = + f_cyan_free_to_JCZ38 * k_cyan_free * cyan_free - k_JCZ38 * JCZ38 + f_JSE76_to_JCZ38 * k_JSE76 * JSE76 d_J9Z38/dt = + f_cyan_free_to_J9Z38 * k_cyan_free * cyan_free - k_J9Z38 * J9Z38 d_JSE76/dt = + f_JCZ38_to_JSE76 * k_JCZ38 * JCZ38 - k_JSE76 * JSE76 Data: 433 observations of 4 variable(s) grouped in 5 datasets Model predictions using solution type deSolve Fitted in 868.952 s Using 300, 100 iterations and 10 chains Variance model: Two-component variance function Starting values for degradation parameters: cyan_free_0 log_k_cyan_free log_k_cyan_free_bound 101.7511 -2.8370 -3.0162 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 -3.6600 -2.2988 -5.3129 log_k_JSE76 f_cyan_ilr_1 f_cyan_ilr_2 -3.6991 0.6722 4.8596 f_JCZ38_qlogis f_JSE76_qlogis 13.4678 14.2149 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): cyan_free_0 log_k_cyan_free log_k_cyan_free_bound cyan_free_0 5.629 0.000 0.000 log_k_cyan_free 0.000 0.446 0.000 log_k_cyan_free_bound 0.000 0.000 1.449 log_k_cyan_bound_free 0.000 0.000 0.000 log_k_JCZ38 0.000 0.000 0.000 log_k_J9Z38 0.000 0.000 0.000 log_k_JSE76 0.000 0.000 0.000 f_cyan_ilr_1 0.000 0.000 0.000 f_cyan_ilr_2 0.000 0.000 0.000 f_JCZ38_qlogis 0.000 0.000 0.000 f_JSE76_qlogis 0.000 0.000 0.000 log_k_cyan_bound_free log_k_JCZ38 log_k_J9Z38 log_k_JSE76 cyan_free_0 0.000 0.0000 0.000 0.0000 log_k_cyan_free 0.000 0.0000 0.000 0.0000 log_k_cyan_free_bound 0.000 0.0000 0.000 0.0000 log_k_cyan_bound_free 1.213 0.0000 0.000 0.0000 log_k_JCZ38 0.000 0.7801 0.000 0.0000 log_k_J9Z38 0.000 0.0000 1.575 0.0000 log_k_JSE76 0.000 0.0000 0.000 0.8078 f_cyan_ilr_1 0.000 0.0000 0.000 0.0000 f_cyan_ilr_2 0.000 0.0000 0.000 0.0000 f_JCZ38_qlogis 0.000 0.0000 0.000 0.0000 f_JSE76_qlogis 0.000 0.0000 0.000 0.0000 f_cyan_ilr_1 f_cyan_ilr_2 f_JCZ38_qlogis f_JSE76_qlogis cyan_free_0 0.0000 0.000 0.00 0.00 log_k_cyan_free 0.0000 0.000 0.00 0.00 log_k_cyan_free_bound 0.0000 0.000 0.00 0.00 log_k_cyan_bound_free 0.0000 0.000 0.00 0.00 log_k_JCZ38 0.0000 0.000 0.00 0.00 log_k_J9Z38 0.0000 0.000 0.00 0.00 log_k_JSE76 0.0000 0.000 0.00 0.00 f_cyan_ilr_1 0.6518 0.000 0.00 0.00 f_cyan_ilr_2 0.0000 9.981 0.00 0.00 f_JCZ38_qlogis 0.0000 0.000 14.26 0.00 f_JSE76_qlogis 0.0000 0.000 0.00 16.17 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 2241 2233 -1101 Optimised parameters: est. lower upper cyan_free_0 100.95469 NA NA log_k_cyan_free -3.18706 NA NA log_k_cyan_free_bound -3.38455 NA NA log_k_cyan_bound_free -3.75788 NA NA log_k_JCZ38 -2.77024 NA NA log_k_J9Z38 -5.03665 NA NA log_k_JSE76 -3.60289 NA NA f_cyan_ilr_1 0.72263 NA NA f_cyan_ilr_2 1.45352 NA NA f_JCZ38_qlogis 2.00778 NA NA f_JSE76_qlogis 941.58570 NA NA a.1 2.11130 1.91479 2.30780 b.1 0.06299 0.05152 0.07445 SD.log_k_cyan_free 0.50098 0.18805 0.81390 SD.log_k_cyan_bound_free 0.31671 0.08467 0.54875 SD.log_k_JCZ38 1.25865 0.45932 2.05798 SD.log_k_J9Z38 0.86833 0.27222 1.46444 SD.log_k_JSE76 0.59325 0.14711 1.03940 SD.f_cyan_ilr_1 0.35705 0.12521 0.58890 SD.f_cyan_ilr_2 0.88541 0.13797 1.63286 Correlation is not available Random effects: est. lower upper SD.log_k_cyan_free 0.5010 0.18805 0.8139 SD.log_k_cyan_bound_free 0.3167 0.08467 0.5487 SD.log_k_JCZ38 1.2587 0.45932 2.0580 SD.log_k_J9Z38 0.8683 0.27222 1.4644 SD.log_k_JSE76 0.5933 0.14711 1.0394 SD.f_cyan_ilr_1 0.3571 0.12521 0.5889 SD.f_cyan_ilr_2 0.8854 0.13797 1.6329 Variance model: est. lower upper a.1 2.11130 1.91479 2.30780 b.1 0.06299 0.05152 0.07445 Backtransformed parameters: est. lower upper cyan_free_0 1.010e+02 NA NA k_cyan_free 4.129e-02 NA NA k_cyan_free_bound 3.389e-02 NA NA k_cyan_bound_free 2.333e-02 NA NA k_JCZ38 6.265e-02 NA NA k_J9Z38 6.495e-03 NA NA k_JSE76 2.724e-02 NA NA f_cyan_free_to_JCZ38 6.844e-01 NA NA f_cyan_free_to_J9Z38 2.463e-01 NA NA f_JCZ38_to_JSE76 8.816e-01 NA NA f_JSE76_to_JCZ38 1.000e+00 NA NA Estimated Eigenvalues of SFORB model(s): cyan_b1 cyan_b2 cyan_g 0.08751 0.01101 0.39586 Resulting formation fractions: ff cyan_free_JCZ38 0.68444 cyan_free_J9Z38 0.24633 cyan_free_sink 0.06923 cyan_free 1.00000 JCZ38_JSE76 0.88161 JCZ38_sink 0.11839 JSE76_JCZ38 1.00000 JSE76_sink 0.00000 Estimated disappearance times: DT50 DT90 DT50back DT50_cyan_b1 DT50_cyan_b2 cyan 25.36 163.36 49.18 7.921 62.95 JCZ38 11.06 36.75 NA NA NA J9Z38 106.71 354.49 NA NA NA JSE76 25.44 84.51 NA NA NA"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"session-info","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Session info","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"","code":"R version 4.4.2 (2024-10-31) Platform: x86_64-pc-linux-gnu Running under: Debian GNU/Linux 12 (bookworm) Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0 locale: [1] LC_CTYPE=de_DE.UTF-8 LC_NUMERIC=C [3] LC_TIME=de_DE.UTF-8 LC_COLLATE=de_DE.UTF-8 [5] LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=de_DE.UTF-8 [7] LC_PAPER=de_DE.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C time zone: Europe/Berlin tzcode source: system (glibc) attached base packages: [1] parallel stats graphics grDevices utils datasets methods [8] base other attached packages: [1] rmarkdown_2.29 nvimcom_0.9-167 saemix_3.3 npde_3.5 [5] knitr_1.49 mkin_1.2.10 loaded via a namespace (and not attached): [1] sass_0.4.9 utf8_1.2.4 generics_0.1.3 lattice_0.22-6 [5] digest_0.6.37 magrittr_2.0.3 evaluate_1.0.1 grid_4.4.2 [9] fastmap_1.2.0 cellranger_1.1.0 jsonlite_1.8.9 processx_3.8.4 [13] pkgbuild_1.4.5 deSolve_1.40 mclust_6.1.1 ps_1.8.1 [17] gridExtra_2.3 fansi_1.0.6 scales_1.3.0 codetools_0.2-20 [21] textshaping_0.4.1 jquerylib_0.1.4 cli_3.6.3 rlang_1.1.4 [25] munsell_0.5.1 cachem_1.1.0 yaml_2.3.10 inline_0.3.20 [29] tools_4.4.2 dplyr_1.1.4 colorspace_2.1-1 ggplot2_3.5.1 [33] vctrs_0.6.5 R6_2.5.1 zoo_1.8-12 lifecycle_1.0.4 [37] fs_1.6.5 htmlwidgets_1.6.4 MASS_7.3-61 ragg_1.3.3 [41] callr_3.7.6 pkgconfig_2.0.3 desc_1.4.3 pkgdown_2.1.1 [45] pillar_1.9.0 bslib_0.8.0 gtable_0.3.6 glue_1.8.0 [49] systemfonts_1.1.0 xfun_0.49 tibble_3.2.1 lmtest_0.9-40 [53] tidyselect_1.2.1 htmltools_0.5.8.1 nlme_3.1-166 compiler_4.4.2 [57] readxl_1.4.3"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html","id":"hardware-info","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Hardware info","title":"Testing hierarchical pathway kinetics with residue data on cyantraniliprole","text":"","code":"CPU model: AMD Ryzen 9 7950X 16-Core Processor MemTotal: 64927788 kB"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"introduction","dir":"Articles > Prebuilt","previous_headings":"","what":"Introduction","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"purpose document demonstrate nonlinear hierarchical models (NLHM) based parent degradation models SFO, FOMC, DFOP HS can fitted mkin package. assembled course work package 1.1 Project Number 173340 (Application nonlinear hierarchical models kinetic evaluation chemical degradation data) German Environment Agency carried 2022 2023. mkin package used version 1.2.10. contains test data functions used evaluations. saemix package used backend fitting NLHM, also loaded make convergence plot function available. document processed knitr package, also provides kable function used improve display tabular data R markdown documents. parallel processing, parallel package used.","code":"library(mkin) library(knitr) library(saemix) library(parallel) n_cores <- detectCores() if (Sys.info()[\"sysname\"] == \"Windows\") { cl <- makePSOCKcluster(n_cores) } else { cl <- makeForkCluster(n_cores) }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"data","dir":"Articles > Prebuilt","previous_headings":"","what":"Data","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"test data available mkin package object class mkindsg (mkin dataset group) identifier dimethenamid_2018. following preprocessing steps still necessary: data available enantiomer dimethenamid-P (DMTAP) renamed substance name data racemic mixture dimethenamid (DMTA). reason difference degradation behaviour identified EU risk assessment. data transformation products unnecessary columns discarded observation times dataset multiplied corresponding normalisation factor also available dataset, order make possible describe datasets single set parameters independent temperature Finally, datasets observed soil (Elliot 1 Elliot 2) combined, resulting dimethenamid (DMTA) data six soils. following commented R code performs preprocessing. following tables show 6 datasets. Dataset Calke Dataset Borstel Dataset Flaach Dataset BBA 2.2 Dataset BBA 2.3 Dataset Elliot","code":"# Apply a function to each of the seven datasets in the mkindsg object to create a list dmta_ds <- lapply(1:7, function(i) { ds_i <- dimethenamid_2018$ds[[i]]$data # Get a dataset ds_i[ds_i$name == \"DMTAP\", \"name\"] <- \"DMTA\" # Rename DMTAP to DMTA ds_i <- subset(ds_i, name == \"DMTA\", c(\"name\", \"time\", \"value\")) # Select data ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i] # Normalise time ds_i # Return the dataset }) # Use dataset titles as names for the list elements names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title) # Combine data for Elliot soil to obtain a named list with six elements dmta_ds[[\"Elliot\"]] <- rbind(dmta_ds[[\"Elliot 1\"]], dmta_ds[[\"Elliot 2\"]]) # dmta_ds[[\"Elliot 1\"]] <- NULL dmta_ds[[\"Elliot 2\"]] <- NULL for (ds_name in names(dmta_ds)) { print(kable(mkin_long_to_wide(dmta_ds[[ds_name]]), caption = paste(\"Dataset\", ds_name), label = paste0(\"tab:\", ds_name), booktabs = TRUE)) cat(\"\\n\\\\clearpage\\n\") }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"separate-evaluations","dir":"Articles > Prebuilt","previous_headings":"","what":"Separate evaluations","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"order obtain suitable starting parameters NLHM fits, separate fits four models data soil generated using mmkin function mkin package. first step, constant variance assumed. Convergence checked status function. table , OK indicates convergence, C indicates failure converge. separate fits constant variance converged, sole exception HS fit BBA 2.2 data. prepare fitting NLHM using two-component error model, separate fits updated assuming two-component error. Using two-component error model, one fit converge constant variance converge, non-SFO fits failed converge.","code":"deg_mods <- c(\"SFO\", \"FOMC\", \"DFOP\", \"HS\") f_sep_const <- mmkin( deg_mods, dmta_ds, error_model = \"const\", quiet = TRUE) status(f_sep_const) |> kable() f_sep_tc <- update(f_sep_const, error_model = \"tc\") status(f_sep_tc) |> kable()"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"hierarchichal-model-fits","dir":"Articles > Prebuilt","previous_headings":"","what":"Hierarchichal model fits","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"following code fits eight versions hierarchical models data, using SFO, FOMC, DFOP HS parent compound, using either constant variance two-component error error model. default parameter distribution model mkin allows variation degradation parameters across assumed population soils. words, degradation parameter associated random effect first step. mhmkin function makes possible fit eight versions parallel (given sufficient number computing cores available) save execution time. Convergence plots summaries fits shown appendix. output status function shows fits terminated successfully. AIC BIC values show biphasic models DFOP HS give best fits. DFOP model preferred , better mechanistic basis batch experiments constant incubation conditions. Also, shows lowest AIC BIC values first set fits combined two-component error model. Therefore, DFOP model selected refinements fits aim make model fully identifiable.","code":"f_saem <- mhmkin(list(f_sep_const, f_sep_tc), transformations = \"saemix\") status(f_saem) |> kable() anova(f_saem) |> kable(digits = 1)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"parameter-identifiability-based-on-the-fisher-information-matrix","dir":"Articles > Prebuilt","previous_headings":"Hierarchichal model fits","what":"Parameter identifiability based on the Fisher Information Matrix","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"Using illparms function, ill-defined statistical model parameters standard deviations degradation parameters population error model parameters can found. According illparms function, fitted standard deviation second kinetic rate constant k2 ill-defined DFOP fits. suggests different values obtained standard deviation using different starting values. thus identified overparameterisation addressed removing random effect k2 parameter model. resulting fit, checked whether still ill-defined parameters, case. , refined model compared previous best model. model without random effect k2 reduced version previous model. Therefore, models nested can compared using likelihood ratio test. achieved argument test = TRUE anova function. AIC BIC criteria lower removal ill-defined random effect k2. p value likelihood ratio test much greater 0.05, indicating model higher likelihood (model random effects degradation parameters f_saem[[\"DFOP\", \"tc\"]]) fit significantly better model lower likelihood (reduced model f_saem_dfop_tc_no_ranef_k2). Therefore, AIC, BIC likelihood ratio test suggest use reduced model. convergence fit checked visually. Convergence plot NLHM DFOP fit two-component error without random effect ‘k2’ parameters appear converged satisfactory degree. final fit plotted using plot method mkin package. Plot final NLHM DFOP fit Finally, summary report fit produced.","code":"illparms(f_saem) |> kable() f_saem_dfop_tc_no_ranef_k2 <- update(f_saem[[\"DFOP\", \"tc\"]], no_random_effect = \"k2\") illparms(f_saem_dfop_tc_no_ranef_k2) anova(f_saem[[\"DFOP\", \"tc\"]], f_saem_dfop_tc_no_ranef_k2, test = TRUE) |> kable(format.args = list(digits = 4)) plot(f_saem_dfop_tc_no_ranef_k2) summary(f_saem_dfop_tc_no_ranef_k2) saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:19 2025 Date of summary: Fri Feb 14 08:13:19 2025 Equations: d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 4.154 s Using 300, 100 iterations and 9 chains Variance model: Two-component variance function Starting values for degradation parameters: DMTA_0 k1 k2 g 98.71186 0.08675 0.01374 0.93491 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 k1 k2 g DMTA_0 98.71 0 0 0 k1 0.00 1 0 0 k2 0.00 0 1 0 g 0.00 0 0 1 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 663.7 661.8 -322.9 Optimised parameters: est. lower upper DMTA_0 98.256267 96.286112 100.22642 k1 0.064037 0.033281 0.09479 k2 0.008469 0.006002 0.01094 g 0.954167 0.914460 0.99387 a.1 1.061795 0.878608 1.24498 b.1 0.029550 0.022593 0.03651 SD.DMTA_0 2.068581 0.427178 3.70998 SD.k1 0.598285 0.258235 0.93833 SD.g 1.016689 0.360061 1.67332 Correlation: DMTA_0 k1 k2 k1 0.0213 k2 0.0541 0.0344 g -0.0521 -0.0286 -0.2744 Random effects: est. lower upper SD.DMTA_0 2.0686 0.4272 3.7100 SD.k1 0.5983 0.2582 0.9383 SD.g 1.0167 0.3601 1.6733 Variance model: est. lower upper a.1 1.06180 0.87861 1.24498 b.1 0.02955 0.02259 0.03651 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 DMTA 11.45 41.32 12.44 10.82 81.85"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"alternative-check-of-parameter-identifiability","dir":"Articles > Prebuilt","previous_headings":"Hierarchichal model fits","what":"Alternative check of parameter identifiability","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"parameter check used illparms function based quadratic approximation likelihood surface near optimum, calculated using Fisher Information Matrix (FIM). alternative way check parameter identifiability (Duchesne et al. 2021) based multistart approach recently implemented mkin. graph shows boxplots parameters obtained 50 runs saem algorithm different parameter combinations, sampled range parameters obtained individual datasets fitted separately using nonlinear regression. Scaled parameters multistart runs, full model graph clearly confirms lack identifiability variance k2 full model. overparameterisation model also indicates lack identifiability variance parameter g. parameter boxplots multistart runs reduced model shown indicate runs give similar results, regardless starting parameters. Scaled parameters multistart runs, reduced model parameters top 25% fits shown (based feature introduced mkin 1.2.2 currently development), scatter even less shown . Scaled parameters multistart runs, reduced model, fits top 25% likelihood values","code":"f_saem_dfop_tc_multi <- multistart(f_saem[[\"DFOP\", \"tc\"]], n = 50, cores = 15) par(mar = c(6.1, 4.1, 2.1, 2.1)) parplot(f_saem_dfop_tc_multi, lpos = \"bottomright\", ylim = c(0.3, 10), las = 2) f_saem_dfop_tc_no_ranef_k2_multi <- multistart(f_saem_dfop_tc_no_ranef_k2, n = 50, cores = 15) par(mar = c(6.1, 4.1, 2.1, 2.1)) parplot(f_saem_dfop_tc_no_ranef_k2_multi, ylim = c(0.5, 2), las = 2, lpos = \"bottomright\") par(mar = c(6.1, 4.1, 2.1, 2.1)) parplot(f_saem_dfop_tc_no_ranef_k2_multi, ylim = c(0.5, 2), las = 2, llquant = 0.25, lpos = \"bottomright\")"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"conclusions","dir":"Articles > Prebuilt","previous_headings":"","what":"Conclusions","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"Fitting four parent degradation models SFO, FOMC, DFOP HS part hierarchical model fits two different error models normal distributions transformed degradation parameters works without technical problems. biphasic models DFOP HS gave best fit data, default parameter distribution model fully identifiable. Removing random effect second kinetic rate constant DFOP model resulted reduced model fully identifiable showed lowest values model selection criteria AIC BIC. reliability identification model parameters confirmed using multiple starting values.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"acknowledgements","dir":"Articles > Prebuilt","previous_headings":"","what":"Acknowledgements","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"helpful comments Janina Wöltjen German Environment Agency gratefully acknowledged.","code":""},{"path":[]},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"hierarchical-model-fit-listings","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Hierarchical model fit listings","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"Hierarchical mkin fit SFO model error model const Hierarchical mkin fit SFO model error model tc Hierarchical mkin fit FOMC model error model const Hierarchical mkin fit FOMC model error model tc Hierarchical mkin fit DFOP model error model const Hierarchical mkin fit DFOP model error model tc Hierarchical mkin fit HS model error model const Hierarchical mkin fit HS model error model tc","code":"saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:11 2025 Date of summary: Fri Feb 14 08:14:22 2025 Equations: d_DMTA/dt = - k_DMTA * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 0.869 s Using 300, 100 iterations and 9 chains Variance model: Constant variance Starting values for degradation parameters: DMTA_0 k_DMTA 97.2953 0.0566 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 k_DMTA DMTA_0 97.3 0 k_DMTA 0.0 1 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 796.3 795.3 -393.2 Optimised parameters: est. lower upper DMTA_0 97.28130 95.71113 98.8515 k_DMTA 0.05665 0.02909 0.0842 a.1 2.66442 2.35579 2.9731 SD.DMTA_0 1.54776 0.15447 2.9411 SD.k_DMTA 0.60690 0.26248 0.9513 Correlation: DMTA_0 k_DMTA 0.0168 Random effects: est. lower upper SD.DMTA_0 1.5478 0.1545 2.9411 SD.k_DMTA 0.6069 0.2625 0.9513 Variance model: est. lower upper a.1 2.664 2.356 2.973 Estimated disappearance times: DT50 DT90 DMTA 12.24 40.65 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:13 2025 Date of summary: Fri Feb 14 08:14:22 2025 Equations: d_DMTA/dt = - k_DMTA * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 2.423 s Using 300, 100 iterations and 9 chains Variance model: Two-component variance function Starting values for degradation parameters: DMTA_0 k_DMTA 96.99175 0.05603 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 k_DMTA DMTA_0 96.99 0 k_DMTA 0.00 1 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 798.3 797.1 -393.2 Optimised parameters: est. lower upper DMTA_0 97.271822 95.70316 98.84049 k_DMTA 0.056638 0.02911 0.08417 a.1 2.660081 2.27492 3.04525 b.1 0.001665 -0.14451 0.14784 SD.DMTA_0 1.545520 0.14301 2.94803 SD.k_DMTA 0.606422 0.26227 0.95057 Correlation: DMTA_0 k_DMTA 0.0169 Random effects: est. lower upper SD.DMTA_0 1.5455 0.1430 2.9480 SD.k_DMTA 0.6064 0.2623 0.9506 Variance model: est. lower upper a.1 2.660081 2.2749 3.0452 b.1 0.001665 -0.1445 0.1478 Estimated disappearance times: DT50 DT90 DMTA 12.24 40.65 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:11 2025 Date of summary: Fri Feb 14 08:14:22 2025 Equations: d_DMTA/dt = - (alpha/beta) * 1/((time/beta) + 1) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 1.228 s Using 300, 100 iterations and 9 chains Variance model: Constant variance Starting values for degradation parameters: DMTA_0 alpha beta 98.292 9.909 156.341 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 alpha beta DMTA_0 98.29 0 0 alpha 0.00 1 0 beta 0.00 0 1 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 734.2 732.7 -360.1 Optimised parameters: est. lower upper DMTA_0 98.3435 96.9033 99.784 alpha 7.2007 2.5889 11.812 beta 112.8745 34.8816 190.867 a.1 2.0459 1.8054 2.286 SD.DMTA_0 1.4795 0.2717 2.687 SD.alpha 0.6396 0.1509 1.128 SD.beta 0.6874 0.1587 1.216 Correlation: DMTA_0 alpha alpha -0.1125 beta -0.1227 0.3632 Random effects: est. lower upper SD.DMTA_0 1.4795 0.2717 2.687 SD.alpha 0.6396 0.1509 1.128 SD.beta 0.6874 0.1587 1.216 Variance model: est. lower upper a.1 2.046 1.805 2.286 Estimated disappearance times: DT50 DT90 DT50back DMTA 11.41 42.53 12.8 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:13 2025 Date of summary: Fri Feb 14 08:14:22 2025 Equations: d_DMTA/dt = - (alpha/beta) * 1/((time/beta) + 1) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 2.87 s Using 300, 100 iterations and 9 chains Variance model: Two-component variance function Starting values for degradation parameters: DMTA_0 alpha beta 98.772 4.663 92.597 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 alpha beta DMTA_0 98.77 0 0 alpha 0.00 1 0 beta 0.00 0 1 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 720.7 719.1 -352.4 Optimised parameters: est. lower upper DMTA_0 99.10577 97.33296 100.87859 alpha 5.46260 2.52199 8.40321 beta 81.66080 30.46664 132.85497 a.1 1.50219 1.25801 1.74636 b.1 0.02893 0.02048 0.03739 SD.DMTA_0 1.61887 -0.03843 3.27618 SD.alpha 0.58145 0.17364 0.98925 SD.beta 0.68205 0.21108 1.15302 Correlation: DMTA_0 alpha alpha -0.1321 beta -0.1430 0.2467 Random effects: est. lower upper SD.DMTA_0 1.6189 -0.03843 3.2762 SD.alpha 0.5814 0.17364 0.9892 SD.beta 0.6821 0.21108 1.1530 Variance model: est. lower upper a.1 1.50219 1.25801 1.74636 b.1 0.02893 0.02048 0.03739 Estimated disappearance times: DT50 DT90 DT50back DMTA 11.05 42.81 12.89 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:12 2025 Date of summary: Fri Feb 14 08:14:22 2025 Equations: d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 1.843 s Using 300, 100 iterations and 9 chains Variance model: Constant variance Starting values for degradation parameters: DMTA_0 k1 k2 g 98.64383 0.09211 0.02999 0.76814 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 k1 k2 g DMTA_0 98.64 0 0 0 k1 0.00 1 0 0 k2 0.00 0 1 0 g 0.00 0 0 1 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 711.8 710 -346.9 Optimised parameters: est. lower upper DMTA_0 98.092481 96.573899 99.61106 k1 0.062499 0.030336 0.09466 k2 0.009065 -0.005133 0.02326 g 0.948967 0.862080 1.03586 a.1 1.821671 1.604774 2.03857 SD.DMTA_0 1.677785 0.472066 2.88350 SD.k1 0.634962 0.270788 0.99914 SD.k2 1.033498 -0.205994 2.27299 SD.g 1.710046 0.428642 2.99145 Correlation: DMTA_0 k1 k2 k1 0.0246 k2 0.0491 0.0953 g -0.0552 -0.0889 -0.4795 Random effects: est. lower upper SD.DMTA_0 1.678 0.4721 2.8835 SD.k1 0.635 0.2708 0.9991 SD.k2 1.033 -0.2060 2.2730 SD.g 1.710 0.4286 2.9914 Variance model: est. lower upper a.1 1.822 1.605 2.039 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 DMTA 11.79 42.8 12.88 11.09 76.46 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:14 2025 Date of summary: Fri Feb 14 08:14:22 2025 Equations: d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 3.469 s Using 300, 100 iterations and 9 chains Variance model: Two-component variance function Starting values for degradation parameters: DMTA_0 k1 k2 g 98.71186 0.08675 0.01374 0.93491 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 k1 k2 g DMTA_0 98.71 0 0 0 k1 0.00 1 0 0 k2 0.00 0 1 0 g 0.00 0 0 1 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 665.7 663.6 -322.9 Optimised parameters: est. lower upper DMTA_0 98.347470 96.380815 100.31413 k1 0.064524 0.034279 0.09477 k2 0.008304 0.005843 0.01076 g 0.952128 0.909578 0.99468 a.1 1.068907 0.883665 1.25415 b.1 0.029265 0.022318 0.03621 SD.DMTA_0 2.065796 0.427951 3.70364 SD.k1 0.583703 0.251796 0.91561 SD.k2 0.004167 -7.831228 7.83956 SD.g 1.064450 0.397479 1.73142 Correlation: DMTA_0 k1 k2 k1 0.0223 k2 0.0568 0.0394 g -0.0464 -0.0269 -0.2713 Random effects: est. lower upper SD.DMTA_0 2.065796 0.4280 3.7036 SD.k1 0.583703 0.2518 0.9156 SD.k2 0.004167 -7.8312 7.8396 SD.g 1.064450 0.3975 1.7314 Variance model: est. lower upper a.1 1.06891 0.88367 1.25415 b.1 0.02927 0.02232 0.03621 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 DMTA 11.39 41.36 12.45 10.74 83.48 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:12 2025 Date of summary: Fri Feb 14 08:14:22 2025 Equations: d_DMTA/dt = - ifelse(time <= tb, k1, k2) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 1.698 s Using 300, 100 iterations and 9 chains Variance model: Constant variance Starting values for degradation parameters: DMTA_0 k1 k2 tb 97.82176 0.06931 0.02997 11.13945 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 k1 k2 tb DMTA_0 97.82 0 0 0 k1 0.00 1 0 0 k2 0.00 0 1 0 tb 0.00 0 0 1 Starting values for error model parameters: a.1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 714 712.1 -348 Optimised parameters: est. lower upper DMTA_0 98.16102 96.47747 99.84456 k1 0.07876 0.05261 0.10491 k2 0.02227 0.01706 0.02747 tb 13.99089 -7.40049 35.38228 a.1 1.82305 1.60700 2.03910 SD.DMTA_0 1.88413 0.56204 3.20622 SD.k1 0.34292 0.10482 0.58102 SD.k2 0.19851 0.01718 0.37985 SD.tb 1.68168 0.58064 2.78272 Correlation: DMTA_0 k1 k2 k1 0.0142 k2 0.0001 -0.0025 tb 0.0165 -0.1256 -0.0301 Random effects: est. lower upper SD.DMTA_0 1.8841 0.56204 3.2062 SD.k1 0.3429 0.10482 0.5810 SD.k2 0.1985 0.01718 0.3798 SD.tb 1.6817 0.58064 2.7827 Variance model: est. lower upper a.1 1.823 1.607 2.039 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 DMTA 8.801 67.91 20.44 8.801 31.13 saemix version used for fitting: 3.3 mkin version used for pre-fitting: 1.2.10 R version used for fitting: 4.4.2 Date of fit: Fri Feb 14 08:13:13 2025 Date of summary: Fri Feb 14 08:14:22 2025 Equations: d_DMTA/dt = - ifelse(time <= tb, k1, k2) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Model predictions using solution type analytical Fitted in 3.307 s Using 300, 100 iterations and 9 chains Variance model: Two-component variance function Starting values for degradation parameters: DMTA_0 k1 k2 tb 98.45190 0.07525 0.02576 19.19375 Fixed degradation parameter values: None Starting values for random effects (square root of initial entries in omega): DMTA_0 k1 k2 tb DMTA_0 98.45 0 0 0 k1 0.00 1 0 0 k2 0.00 0 1 0 tb 0.00 0 0 1 Starting values for error model parameters: a.1 b.1 1 1 Results: Likelihood computed by importance sampling AIC BIC logLik 667.1 665 -323.6 Optimised parameters: est. lower upper DMTA_0 97.76571 95.81350 99.71791 k1 0.05855 0.03080 0.08630 k2 0.02337 0.01664 0.03010 tb 31.09638 29.38289 32.80987 a.1 1.08835 0.90059 1.27611 b.1 0.02964 0.02261 0.03667 SD.DMTA_0 2.04877 0.42553 3.67200 SD.k1 0.59166 0.25621 0.92711 SD.k2 0.30698 0.09561 0.51835 SD.tb 0.01274 -0.10915 0.13464 Correlation: DMTA_0 k1 k2 k1 0.0160 k2 -0.0070 -0.0024 tb -0.0668 -0.0103 -0.2013 Random effects: est. lower upper SD.DMTA_0 2.04877 0.42553 3.6720 SD.k1 0.59166 0.25621 0.9271 SD.k2 0.30698 0.09561 0.5183 SD.tb 0.01274 -0.10915 0.1346 Variance model: est. lower upper a.1 1.08835 0.90059 1.27611 b.1 0.02964 0.02261 0.03667 Estimated disappearance times: DT50 DT90 DT50back DT50_k1 DT50_k2 DMTA 11.84 51.71 15.57 11.84 29.66"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"hierarchical-model-convergence-plots","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Hierarchical model convergence plots","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"Convergence plot NLHM SFO fit constant variance Convergence plot NLHM SFO fit two-component error Convergence plot NLHM FOMC fit constant variance Convergence plot NLHM FOMC fit two-component error Convergence plot NLHM DFOP fit constant variance Convergence plot NLHM DFOP fit two-component error Convergence plot NLHM HS fit constant variance Convergence plot NLHM HS fit two-component error","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"session-info","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Session info","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"","code":"R version 4.4.2 (2024-10-31) Platform: x86_64-pc-linux-gnu Running under: Debian GNU/Linux 12 (bookworm) Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0 locale: [1] LC_CTYPE=de_DE.UTF-8 LC_NUMERIC=C [3] LC_TIME=de_DE.UTF-8 LC_COLLATE=de_DE.UTF-8 [5] LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=de_DE.UTF-8 [7] LC_PAPER=de_DE.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C time zone: Europe/Berlin tzcode source: system (glibc) attached base packages: [1] parallel stats graphics grDevices utils datasets methods [8] base other attached packages: [1] rmarkdown_2.29 nvimcom_0.9-167 saemix_3.3 npde_3.5 [5] knitr_1.49 mkin_1.2.10 loaded via a namespace (and not attached): [1] gtable_0.3.6 jsonlite_1.8.9 dplyr_1.1.4 compiler_4.4.2 [5] tidyselect_1.2.1 gridExtra_2.3 jquerylib_0.1.4 systemfonts_1.1.0 [9] scales_1.3.0 textshaping_0.4.1 yaml_2.3.10 fastmap_1.2.0 [13] lattice_0.22-6 ggplot2_3.5.1 R6_2.5.1 generics_0.1.3 [17] lmtest_0.9-40 MASS_7.3-61 htmlwidgets_1.6.4 tibble_3.2.1 [21] desc_1.4.3 munsell_0.5.1 bslib_0.8.0 pillar_1.9.0 [25] rlang_1.1.4 utf8_1.2.4 cachem_1.1.0 xfun_0.49 [29] fs_1.6.5 sass_0.4.9 cli_3.6.3 pkgdown_2.1.1 [33] magrittr_2.0.3 digest_0.6.37 grid_4.4.2 mclust_6.1.1 [37] lifecycle_1.0.4 nlme_3.1-166 vctrs_0.6.5 evaluate_1.0.1 [41] glue_1.8.0 codetools_0.2-20 ragg_1.3.3 zoo_1.8-12 [45] fansi_1.0.6 colorspace_2.1-1 pkgconfig_2.0.3 tools_4.4.2 [49] htmltools_0.5.8.1"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html","id":"hardware-info","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Hardware info","title":"Testing hierarchical parent degradation kinetics with residue data on dimethenamid and dimethenamid-P","text":"","code":"CPU model: AMD Ryzen 9 7950X 16-Core Processor MemTotal: 64927788 kB"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"introduction","dir":"Articles > Prebuilt","previous_headings":"","what":"Introduction","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"purpose document test demonstrate nonlinear hierarchical models (NLHM) based parent degradation models SFO, FOMC, DFOP HS, parallel formation two metabolites can fitted mkin package. assembled course work package 1.2 Project Number 173340 (Application nonlinear hierarchical models kinetic evaluation chemical degradation data) German Environment Agency carried 2022 2023. mkin package used version 1.2.10, currently development. contains test data, functions used evaluations. saemix package used backend fitting NLHM, also loaded make convergence plot function available. document processed knitr package, also provides kable function used improve display tabular data R markdown documents. parallel processing, parallel package used.","code":"library(mkin) library(knitr) library(saemix) library(parallel) n_cores <- detectCores() # We need to start a new cluster after defining a compiled model that is # saved as a DLL to the user directory, therefore we define a function # This is used again after defining the pathway model start_cluster <- function(n_cores) { if (Sys.info()[\"sysname\"] == \"Windows\") { ret <- makePSOCKcluster(n_cores) } else { ret <- makeForkCluster(n_cores) } return(ret) }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"data","dir":"Articles > Prebuilt","previous_headings":"","what":"Data","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"test data available mkin package object class mkindsg (mkin dataset group) identifier dimethenamid_2018. following preprocessing steps done document. data available enantiomer dimethenamid-P (DMTAP) renamed substance name data racemic mixture dimethenamid (DMTA). reason difference degradation behaviour identified EU risk assessment. Unnecessary columns discarded observation times dataset multiplied corresponding normalisation factor also available dataset, order make possible describe datasets single set parameters independent temperature Finally, datasets observed soil (Elliot 1 Elliot 2) combined, resulting dimethenamid (DMTA) data six soils. following commented R code performs preprocessing. following tables show 6 datasets. Dataset Calke Dataset Borstel Dataset Flaach Dataset BBA 2.2 Dataset BBA 2.3 Dataset Elliot","code":"# Apply a function to each of the seven datasets in the mkindsg object to create a list dmta_ds <- lapply(1:7, function(i) { ds_i <- dimethenamid_2018$ds[[i]]$data # Get a dataset ds_i[ds_i$name == \"DMTAP\", \"name\"] <- \"DMTA\" # Rename DMTAP to DMTA ds_i <- subset(ds_i, select = c(\"name\", \"time\", \"value\")) # Select data ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i] # Normalise time ds_i # Return the dataset }) # Use dataset titles as names for the list elements names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title) # Combine data for Elliot soil to obtain a named list with six elements dmta_ds[[\"Elliot\"]] <- rbind(dmta_ds[[\"Elliot 1\"]], dmta_ds[[\"Elliot 2\"]]) # dmta_ds[[\"Elliot 1\"]] <- NULL dmta_ds[[\"Elliot 2\"]] <- NULL for (ds_name in names(dmta_ds)) { print( kable(mkin_long_to_wide(dmta_ds[[ds_name]]), caption = paste(\"Dataset\", ds_name), booktabs = TRUE, row.names = FALSE)) cat(\"\\n\\\\clearpage\\n\") }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"separate-evaluations","dir":"Articles > Prebuilt","previous_headings":"","what":"Separate evaluations","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"first step obtain suitable starting parameters NLHM fits, separate fits several variants pathway model used previously (Ranke et al. 2021), varying kinetic model parent compound. SFORB model often provides faster convergence DFOP model, can sometimes fitted DFOP model results errors, included set parent models tested . separate pathway fits SFO FOMC parent constant variance converged (status OK). fits DFOP SFORB parent converged well. fits HS parent converge default settings. two-component error model, set fits convergence problems slightly different, convergence problems appearing different data sets applying DFOP SFORB model additional convergence problems using FOMC model parent.","code":"if (!dir.exists(\"dmta_dlls\")) dir.create(\"dmta_dlls\") m_sfo_path_1 <- mkinmod( DMTA = mkinsub(\"SFO\", c(\"M23\", \"M27\", \"M31\")), M23 = mkinsub(\"SFO\"), M27 = mkinsub(\"SFO\"), M31 = mkinsub(\"SFO\", \"M27\", sink = FALSE), name = \"m_sfo_path\", dll_dir = \"dmta_dlls\", unload = TRUE, overwrite = TRUE, quiet = TRUE ) m_fomc_path_1 <- mkinmod( DMTA = mkinsub(\"FOMC\", c(\"M23\", \"M27\", \"M31\")), M23 = mkinsub(\"SFO\"), M27 = mkinsub(\"SFO\"), M31 = mkinsub(\"SFO\", \"M27\", sink = FALSE), name = \"m_fomc_path\", dll_dir = \"dmta_dlls\", unload = TRUE, overwrite = TRUE, quiet = TRUE ) m_dfop_path_1 <- mkinmod( DMTA = mkinsub(\"DFOP\", c(\"M23\", \"M27\", \"M31\")), M23 = mkinsub(\"SFO\"), M27 = mkinsub(\"SFO\"), M31 = mkinsub(\"SFO\", \"M27\", sink = FALSE), name = \"m_dfop_path\", dll_dir = \"dmta_dlls\", unload = TRUE, overwrite = TRUE, quiet = TRUE ) m_sforb_path_1 <- mkinmod( DMTA = mkinsub(\"SFORB\", c(\"M23\", \"M27\", \"M31\")), M23 = mkinsub(\"SFO\"), M27 = mkinsub(\"SFO\"), M31 = mkinsub(\"SFO\", \"M27\", sink = FALSE), name = \"m_sforb_path\", dll_dir = \"dmta_dlls\", unload = TRUE, overwrite = TRUE, quiet = TRUE ) m_hs_path_1 <- mkinmod( DMTA = mkinsub(\"HS\", c(\"M23\", \"M27\", \"M31\")), M23 = mkinsub(\"SFO\"), M27 = mkinsub(\"SFO\"), M31 = mkinsub(\"SFO\", \"M27\", sink = FALSE), name = \"m_hs_path\", dll_dir = \"dmta_dlls\", unload = TRUE, overwrite = TRUE, quiet = TRUE ) cl <- start_cluster(n_cores) deg_mods_1 <- list( sfo_path_1 = m_sfo_path_1, fomc_path_1 = m_fomc_path_1, dfop_path_1 = m_dfop_path_1, sforb_path_1 = m_sforb_path_1, hs_path_1 = m_hs_path_1) sep_1_const <- mmkin( deg_mods_1, dmta_ds, error_model = \"const\", quiet = TRUE) status(sep_1_const) |> kable() sep_1_tc <- update(sep_1_const, error_model = \"tc\") status(sep_1_tc) |> kable()"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"hierarchichal-model-fits","dir":"Articles > Prebuilt","previous_headings":"","what":"Hierarchichal model fits","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"following code fits two sets corresponding hierarchical models data, one assuming constant variance, one assuming two-component error. run time fits around two hours five year old hardware. recent hardware upgrade fits complete less twenty minutes. According status function, fits terminated successfully. goodness--fit models compared, warning obtained, indicating likelihood pathway fit SFORB parent compound constant variance calculated importance sampling (method ‘’). default method AIC BIC comparisons based, variant included model comparison table. Comparing goodness--fit remaining models, HS model model two-component error provides best fit. However, batch experiments performed constant conditions experiments evaluated , reason assume discontinuity, SFORB model preferable mechanistic viewpoint. addition, information criteria AIC BIC similar HS SFORB. Therefore, SFORB model selected refinements.","code":"saem_1 <- mhmkin(list(sep_1_const, sep_1_tc)) status(saem_1) |> kable() anova(saem_1) |> kable(digits = 1)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"parameter-identifiability-based-on-the-fisher-information-matrix","dir":"Articles > Prebuilt","previous_headings":"Hierarchichal model fits","what":"Parameter identifiability based on the Fisher Information Matrix","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"Using illparms function, ill-defined statistical model parameters standard deviations degradation parameters population error model parameters can found. using constant variance, ill-defined variance parameters identified illparms function degradation models. using two-component error model, one ill-defined variance parameter variants except variant using DFOP parent compound. selected combination SFORB pathway model two-component error, random effect rate constant reversibly bound DMTA free DMTA (k_DMTA_bound_free) well-defined. Therefore, fit updated without assuming random effect parameter. expected, ill-defined parameters remain. model comparison shows reduced model preferable. convergence plot refined fit shown . parameters, example f_DMTA_ilr_1 f_DMTA_ilr_2, .e. two parameters determining formation fractions parallel formation three metabolites, movement parameters still visible second phase algorithm. However, amplitude movement range amplitude towards end first phase. Therefore, likely increase iterations improve parameter estimates much, proposed fit acceptable. numeric convergence criterion implemented saemix.","code":"illparms(saem_1) |> kable() saem_sforb_path_1_tc_reduced <- update(saem_1[[\"sforb_path_1\", \"tc\"]], no_random_effect = \"log_k_DMTA_bound_free\") illparms(saem_sforb_path_1_tc_reduced) anova(saem_1[[\"sforb_path_1\", \"tc\"]], saem_sforb_path_1_tc_reduced) |> kable(digits = 1) plot(saem_sforb_path_1_tc_reduced$so, plot.type = \"convergence\")"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"alternative-check-of-parameter-identifiability","dir":"Articles > Prebuilt","previous_headings":"Hierarchichal model fits","what":"Alternative check of parameter identifiability","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"alternative check parameter identifiability (Duchesne et al. 2021), multistart runs performed basis refined fit shown . 32 fits initiated, 17 terminated without error. reason wide variation starting parameters combination parameter variation used SAEM algorithm leads parameter combinations degradation model numerical integration routine cope . variation initial parameters, model fits take two times time original fit. Parameter boxplots multistart runs succeeded However, visual analysis boxplot parameters obtained successful fits confirms results sufficiently independent starting parameters, remaining ill-defined parameters.","code":"saem_sforb_path_1_tc_reduced_multi <- multistart(saem_sforb_path_1_tc_reduced, n = 32, cores = 10) (subscript) logical subscript too long print(saem_sforb_path_1_tc_reduced_multi) object with 32 fits: E OK 7 25 OK: Fit terminated successfully E: Error par(mar = c(12.1, 4.1, 2.1, 2.1)) parplot(saem_sforb_path_1_tc_reduced_multi, ylim = c(0.5, 2), las = 2)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"plots-of-selected-fits","dir":"Articles > Prebuilt","previous_headings":"","what":"Plots of selected fits","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"SFORB pathway fits full reduced parameter distribution model shown . SFORB pathway fit two-component error SFORB pathway fit two-component error, reduced parameter model Plots remaining fits listings successful fits shown Appendix.","code":"plot(saem_1[[\"sforb_path_1\", \"tc\"]]) plot(saem_sforb_path_1_tc_reduced) stopCluster(cl)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"conclusions","dir":"Articles > Prebuilt","previous_headings":"","what":"Conclusions","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"Pathway fits SFO, FOMC, DFOP, SFORB HS models parent compound successfully performed.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"acknowledgements","dir":"Articles > Prebuilt","previous_headings":"","what":"Acknowledgements","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"helpful comments Janina Wöltjen German Environment Agency earlier versions document gratefully acknowledged.","code":""},{"path":[]},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"plots-of-hierarchical-fits-not-selected-for-refinement","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Plots of hierarchical fits not selected for refinement","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"SFO pathway fit two-component error FOMC pathway fit two-component error HS pathway fit two-component error","code":"plot(saem_1[[\"sfo_path_1\", \"tc\"]]) plot(saem_1[[\"fomc_path_1\", \"tc\"]]) plot(saem_1[[\"sforb_path_1\", \"tc\"]])"},{"path":[]},{"path":[]},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"session-info","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Session info","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"","code":"R version 4.4.2 (2024-10-31) Platform: x86_64-pc-linux-gnu Running under: Debian GNU/Linux 12 (bookworm) Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0 locale: [1] LC_CTYPE=de_DE.UTF-8 LC_NUMERIC=C [3] LC_TIME=de_DE.UTF-8 LC_COLLATE=de_DE.UTF-8 [5] LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=de_DE.UTF-8 [7] LC_PAPER=de_DE.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C time zone: Europe/Berlin tzcode source: system (glibc) attached base packages: [1] parallel stats graphics grDevices utils datasets methods [8] base other attached packages: [1] rmarkdown_2.29 nvimcom_0.9-167 saemix_3.3 npde_3.5 [5] knitr_1.49 mkin_1.2.10 loaded via a namespace (and not attached): [1] sass_0.4.9 utf8_1.2.4 generics_0.1.3 lattice_0.22-6 [5] digest_0.6.37 magrittr_2.0.3 evaluate_1.0.1 grid_4.4.2 [9] fastmap_1.2.0 jsonlite_1.8.9 processx_3.8.4 pkgbuild_1.4.5 [13] deSolve_1.40 mclust_6.1.1 ps_1.8.1 gridExtra_2.3 [17] fansi_1.0.6 scales_1.3.0 codetools_0.2-20 textshaping_0.4.1 [21] jquerylib_0.1.4 cli_3.6.3 rlang_1.1.4 munsell_0.5.1 [25] cachem_1.1.0 yaml_2.3.10 inline_0.3.20 tools_4.4.2 [29] dplyr_1.1.4 colorspace_2.1-1 ggplot2_3.5.1 vctrs_0.6.5 [33] R6_2.5.1 zoo_1.8-12 lifecycle_1.0.4 fs_1.6.5 [37] htmlwidgets_1.6.4 MASS_7.3-61 ragg_1.3.3 pkgconfig_2.0.3 [41] desc_1.4.3 callr_3.7.6 pkgdown_2.1.1 pillar_1.9.0 [45] bslib_0.8.0 gtable_0.3.6 glue_1.8.0 systemfonts_1.1.0 [49] xfun_0.49 tibble_3.2.1 lmtest_0.9-40 tidyselect_1.2.1 [53] htmltools_0.5.8.1 nlme_3.1-166 compiler_4.4.2"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html","id":"hardware-info","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Hardware info","title":"Testing hierarchical pathway kinetics with residue data on dimethenamid and dimethenamid-P","text":"","code":"CPU model: AMD Ryzen 9 7950X 16-Core Processor MemTotal: 64927788 kB"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"introduction","dir":"Articles > Prebuilt","previous_headings":"","what":"Introduction","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"purpose document test demonstrate nonlinear hierarchical models (NLHM) based parent degradation models SFO, FOMC, DFOP HS can fitted mkin package, also considering influence covariates like soil pH different degradation parameters. case studies, SFORB parameterisation biexponential decline shown advantages DFOP parameterisation, SFORB included list tested models well. mkin package used version 1.2.10, contains functions used evaluations. saemix package used backend fitting NLHM, also loaded make convergence plot function available. document processed knitr package, also provides kable function used improve display tabular data R markdown documents. parallel processing, parallel package used.","code":"library(mkin) library(knitr) library(saemix) library(parallel) n_cores <- detectCores() if (Sys.info()[\"sysname\"] == \"Windows\") { cl <- makePSOCKcluster(n_cores) } else { cl <- makeForkCluster(n_cores) }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"test-data","dir":"Articles > Prebuilt","previous_headings":"Introduction","what":"Test data","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"following tables show covariate data 18 datasets read spreadsheet file. Covariate data Dataset Richmond Dataset Richmond 2 Dataset ERTC Dataset Toulouse Dataset Picket Piece Dataset 721 Dataset 722 Dataset 723 Dataset 724 Dataset 725 Dataset 727 Dataset 728 Dataset 729 Dataset 730 Dataset 731 Dataset 732 Dataset 741 Dataset 742","code":"data_file <- system.file( \"testdata\", \"mesotrione_soil_efsa_2016.xlsx\", package = \"mkin\") meso_ds <- read_spreadsheet(data_file, parent_only = TRUE) pH <- attr(meso_ds, \"covariates\") kable(pH, caption = \"Covariate data\") for (ds_name in names(meso_ds)) { print( kable(mkin_long_to_wide(meso_ds[[ds_name]]), caption = paste(\"Dataset\", ds_name), booktabs = TRUE, row.names = FALSE)) }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"separate-evaluations","dir":"Articles > Prebuilt","previous_headings":"","what":"Separate evaluations","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"order obtain suitable starting parameters NLHM fits, separate fits five models data soil generated using mmkin function mkin package. first step, constant variance assumed. Convergence checked status function. tables , OK indicates convergence C indicates failure converge. separate fits constant variance converged, exception two FOMC fits, one SFORB fit one HS fit. two-component error model, set fits converge larger, convergence problems appearing number non-SFO fits.","code":"deg_mods <- c(\"SFO\", \"FOMC\", \"DFOP\", \"SFORB\", \"HS\") f_sep_const <- mmkin( deg_mods, meso_ds, error_model = \"const\", cluster = cl, quiet = TRUE) status(f_sep_const[, 1:5]) |> kable() status(f_sep_const[, 6:18]) |> kable() f_sep_tc <- update(f_sep_const, error_model = \"tc\") status(f_sep_tc[, 1:5]) |> kable() status(f_sep_tc[, 6:18]) |> kable()"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"hierarchical-model-fits-without-covariate-effect","dir":"Articles > Prebuilt","previous_headings":"","what":"Hierarchical model fits without covariate effect","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"following code fits hierarchical kinetic models ten combinations five different degradation models two different error models parallel. fits terminate without errors (status OK). model comparisons show fits constant variance consistently preferable corresponding fits two-component error data. confirmed fact parameter b.1 (relative standard deviation fits obtained saemix package), ill-defined fits. obtaining fits well-defined random effects, update set fits, excluding random effects ill-defined according illparms function. updated fits terminate without errors. ill-defined errors remain fits constant variance.","code":"f_saem_1 <- mhmkin(list(f_sep_const, f_sep_tc), cluster = cl) status(f_saem_1) |> kable() anova(f_saem_1) |> kable(digits = 1) illparms(f_saem_1) |> kable() f_saem_2 <- update(f_saem_1, no_random_effect = illparms(f_saem_1)) status(f_saem_2) |> kable() illparms(f_saem_2) |> kable()"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"hierarchical-model-fits-with-covariate-effect","dir":"Articles > Prebuilt","previous_headings":"","what":"Hierarchical model fits with covariate effect","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"following sections, hierarchical fits including model influence pH selected degradation parameters shown parent models. Constant variance selected error model based fits without covariate effects. Random effects ill-defined fits without pH influence excluded. potential influence soil pH included parameters well-defined random effect, experience shown parameters significant pH effect found.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"sfo","dir":"Articles > Prebuilt","previous_headings":"Hierarchical model fits with covariate effect","what":"SFO","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"parameter showing pH influence table beta_pH(log_k_meso). confidence interval include zero, indicating influence soil pH log degradation rate constant significantly greater zero. comparison SFO fit without covariate effect confirms considering soil pH improves model, comparison AIC BIC likelihood ratio test. Endpoints model covariates default calculated median covariate values. quantile can adapted, specific covariate value can given shown .","code":"sfo_pH <- saem(f_sep_const[\"SFO\", ], no_random_effect = \"meso_0\", covariates = pH, covariate_models = list(log_k_meso ~ pH)) summary(sfo_pH)$confint_trans |> kable(digits = 2) anova(f_saem_2[[\"SFO\", \"const\"]], sfo_pH, test = TRUE) Data: 116 observations of 1 variable(s) grouped in 18 datasets npar AIC BIC Lik Chisq Df Pr(>Chisq) f_saem_2[[\"SFO\", \"const\"]] 4 797.56 801.12 -394.78 sfo_pH 5 783.09 787.54 -386.54 16.473 1 4.934e-05 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 plot(sfo_pH) endpoints(sfo_pH) $covariates pH 50% 5.75 $distimes DT50 DT90 meso 18.52069 61.52441 endpoints(sfo_pH, covariate_quantile = 0.9) $covariates pH 90% 7.13 $distimes DT50 DT90 meso 8.237019 27.36278 endpoints(sfo_pH, covariates = c(pH = 7.0)) $covariates pH User 7 $distimes DT50 DT90 meso 8.89035 29.5331"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"fomc","dir":"Articles > Prebuilt","previous_headings":"Hierarchical model fits with covariate effect","what":"FOMC","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"case SFO, confidence interval slope parameter (beta_pH(log_alpha)) quantifying influence soil pH include zero, model comparison clearly indicates model covariate influence preferable. However, random effect alpha well-defined inclusion covariate effect (confidence interval SD.log_alpha includes zero). Therefore, model updated without random effect, ill-defined parameters remain. Model comparison indicates including pH dependence significantly improves fit, reduced model covariate influence results preferable FOMC fit.","code":"fomc_pH <- saem(f_sep_const[\"FOMC\", ], no_random_effect = \"meso_0\", covariates = pH, covariate_models = list(log_alpha ~ pH)) summary(fomc_pH)$confint_trans |> kable(digits = 2) illparms(fomc_pH) [1] \"sd(log_alpha)\" fomc_pH_2 <- update(fomc_pH, no_random_effect = c(\"meso_0\", \"log_alpha\")) illparms(fomc_pH_2) anova(f_saem_2[[\"FOMC\", \"const\"]], fomc_pH, fomc_pH_2, test = TRUE) Data: 116 observations of 1 variable(s) grouped in 18 datasets npar AIC BIC Lik Chisq Df Pr(>Chisq) f_saem_2[[\"FOMC\", \"const\"]] 5 783.25 787.71 -386.63 fomc_pH_2 6 767.49 772.83 -377.75 17.762 1 2.503e-05 *** fomc_pH 7 770.07 776.30 -378.04 0.000 1 1 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 summary(fomc_pH_2)$confint_trans |> kable(digits = 2) plot(fomc_pH_2) endpoints(fomc_pH_2) $covariates pH 50% 5.75 $distimes DT50 DT90 DT50back meso 17.30248 82.91343 24.95943 endpoints(fomc_pH_2, covariates = c(pH = 7)) $covariates pH User 7 $distimes DT50 DT90 DT50back meso 6.986239 27.02927 8.136621"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"dfop","dir":"Articles > Prebuilt","previous_headings":"Hierarchical model fits with covariate effect","what":"DFOP","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"DFOP fits without covariate effects, random effects two degradation parameters (k2 g) identifiable. fit pH dependent degradation parameters obtained excluding random effects refined DFOP fit without covariate influence, including covariate models two identifiable parameters k2 g. corresponding parameters influence soil pH beta_pH(log_k2) influence soil pH k2, beta_pH(g_qlogis) influence g. Confidence intervals neither include zero, indicating significant difference zero. However, random effect g now ill-defined. fit updated without ill-defined random effect. Now, slope parameter pH effect g ill-defined. Therefore, another attempt made without corresponding covariate model. random effect g ill-defined, fit repeated without . ill-defined parameters remain, model comparison suggests previous model dfop_pH_2 two pH dependent parameters preferable, based information criteria well based likelihood ratio test. focussing parameter identifiability using test confidence interval includes zero, dfop_pH_4 still preferred model. However, kept mind parameter confidence intervals constructed using simple linearisation likelihood. confidence interval random effect g marginally includes zero, suggested acceptable, dfop_pH_2 can considered preferable model.","code":"summary(f_saem_2[[\"DFOP\", \"const\"]])$confint_trans |> kable(digits = 2) dfop_pH <- saem(f_sep_const[\"DFOP\", ], no_random_effect = c(\"meso_0\", \"log_k1\"), covariates = pH, covariate_models = list(log_k2 ~ pH, g_qlogis ~ pH)) summary(dfop_pH)$confint_trans |> kable(digits = 2) illparms(dfop_pH) [1] \"sd(g_qlogis)\" dfop_pH_2 <- update(dfop_pH, no_random_effect = c(\"meso_0\", \"log_k1\", \"g_qlogis\")) illparms(dfop_pH_2) [1] \"beta_pH(g_qlogis)\" dfop_pH_3 <- saem(f_sep_const[\"DFOP\", ], no_random_effect = c(\"meso_0\", \"log_k1\"), covariates = pH, covariate_models = list(log_k2 ~ pH)) illparms(dfop_pH_3) [1] \"sd(g_qlogis)\" dfop_pH_4 <- update(dfop_pH_3, no_random_effect = c(\"meso_0\", \"log_k1\", \"g_qlogis\")) illparms(dfop_pH_4) anova(f_saem_2[[\"DFOP\", \"const\"]], dfop_pH, dfop_pH_2, dfop_pH_3, dfop_pH_4) Data: 116 observations of 1 variable(s) grouped in 18 datasets npar AIC BIC Lik f_saem_2[[\"DFOP\", \"const\"]] 7 782.94 789.18 -384.47 dfop_pH_4 7 767.35 773.58 -376.68 dfop_pH_2 8 765.14 772.26 -374.57 dfop_pH_3 8 769.00 776.12 -376.50 dfop_pH 9 769.10 777.11 -375.55 anova(dfop_pH_2, dfop_pH_4, test = TRUE) Data: 116 observations of 1 variable(s) grouped in 18 datasets npar AIC BIC Lik Chisq Df Pr(>Chisq) dfop_pH_4 7 767.35 773.58 -376.68 dfop_pH_2 8 765.14 772.26 -374.57 4.2153 1 0.04006 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 plot(dfop_pH_2) endpoints(dfop_pH_2) $covariates pH 50% 5.75 $distimes DT50 DT90 DT50back DT50_k1 DT50_k2 meso 18.36876 73.51841 22.13125 4.191901 23.98672 endpoints(dfop_pH_2, covariates = c(pH = 7)) $covariates pH User 7 $distimes DT50 DT90 DT50back DT50_k1 DT50_k2 meso 8.346428 28.34437 8.532507 4.191901 8.753618"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"sforb","dir":"Articles > Prebuilt","previous_headings":"Hierarchical model fits with covariate effect","what":"SFORB","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"confidence interval beta_pH(log_k_meso_bound_free) includes zero, indicating influence soil pH k_meso_bound_free reliably quantified. Also, confidence interval random effect parameter (SD.log_k_meso_bound_free) includes zero. Using illparms function, ill-defined parameters can found conveniently. remove ill-defined parameters, second variant SFORB model pH influence fitted. ill-defined parameters remain. model comparison SFORB fits includes refined model without covariate effect, versions SFORB fit covariate effect. first model including pH influence preferable based information criteria likelihood ratio test. However, fully identifiable, second model selected.","code":"sforb_pH <- saem(f_sep_const[\"SFORB\", ], no_random_effect = c(\"meso_free_0\", \"log_k_meso_free_bound\"), covariates = pH, covariate_models = list(log_k_meso_free ~ pH, log_k_meso_bound_free ~ pH)) summary(sforb_pH)$confint_trans |> kable(digits = 2) illparms(sforb_pH) [1] \"sd(log_k_meso_bound_free)\" \"beta_pH(log_k_meso_bound_free)\" sforb_pH_2 <- update(sforb_pH, no_random_effect = c(\"meso_free_0\", \"log_k_meso_free_bound\", \"log_k_meso_bound_free\"), covariate_models = list(log_k_meso_free ~ pH)) illparms(sforb_pH_2) anova(f_saem_2[[\"SFORB\", \"const\"]], sforb_pH, sforb_pH_2, test = TRUE) Data: 116 observations of 1 variable(s) grouped in 18 datasets npar AIC BIC Lik Chisq Df Pr(>Chisq) f_saem_2[[\"SFORB\", \"const\"]] 7 783.40 789.63 -384.70 sforb_pH_2 7 770.94 777.17 -378.47 12.4616 0 sforb_pH 9 768.81 776.83 -375.41 6.1258 2 0.04675 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 summary(sforb_pH_2)$confint_trans |> kable(digits = 2) plot(sforb_pH_2) endpoints(sforb_pH_2) $covariates pH 50% 5.75 $ff meso_free 1 $SFORB meso_b1 meso_b2 meso_g 0.09735824 0.02631699 0.31602120 $distimes DT50 DT90 DT50back DT50_meso_b1 DT50_meso_b2 meso 16.86549 73.15824 22.02282 7.119554 26.33839 endpoints(sforb_pH_2, covariates = c(pH = 7)) $covariates pH User 7 $ff meso_free 1 $SFORB meso_b1 meso_b2 meso_g 0.13315233 0.03795988 0.61186191 $distimes DT50 DT90 DT50back DT50_meso_b1 DT50_meso_b2 meso 7.932495 36.93311 11.11797 5.205671 18.26"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"hs","dir":"Articles > Prebuilt","previous_headings":"Hierarchical model fits with covariate effect","what":"HS","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"According output illparms function, random effect break time tb reliably quantified, neither can influence soil pH tb. fit repeated without corresponding covariate model, ill-defined parameters remain. Model comparison confirms model preferable fit without covariate influence, also first version covariate influence.","code":"hs_pH <- saem(f_sep_const[\"HS\", ], no_random_effect = c(\"meso_0\"), covariates = pH, covariate_models = list(log_k1 ~ pH, log_k2 ~ pH, log_tb ~ pH)) summary(hs_pH)$confint_trans |> kable(digits = 2) illparms(hs_pH) [1] \"sd(log_tb)\" \"beta_pH(log_tb)\" hs_pH_2 <- update(hs_pH, covariate_models = list(log_k1 ~ pH, log_k2 ~ pH)) illparms(hs_pH_2) anova(f_saem_2[[\"HS\", \"const\"]], hs_pH, hs_pH_2, test = TRUE) Data: 116 observations of 1 variable(s) grouped in 18 datasets npar AIC BIC Lik Chisq Df Pr(>Chisq) f_saem_2[[\"HS\", \"const\"]] 8 780.08 787.20 -382.04 hs_pH_2 10 766.47 775.37 -373.23 17.606 2 0.0001503 *** hs_pH 11 769.80 779.59 -373.90 0.000 1 1.0000000 --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 summary(hs_pH_2)$confint_trans |> kable(digits = 2) plot(hs_pH_2) endpoints(hs_pH_2) $covariates pH 50% 5.75 $distimes DT50 DT90 DT50back DT50_k1 DT50_k2 meso 14.68725 82.45287 24.82079 14.68725 29.29299 endpoints(hs_pH_2, covariates = c(pH = 7)) $covariates pH User 7 $distimes DT50 DT90 DT50back DT50_k1 DT50_k2 meso 8.298536 38.85371 11.69613 8.298536 15.71561"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"comparison-across-parent-models","dir":"Articles > Prebuilt","previous_headings":"Hierarchical model fits with covariate effect","what":"Comparison across parent models","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"model reduction models pH influence, compared . DFOP model pH influence k2 g random effect k2 finally selected best fit. endpoints resulting model listed . Please refer Appendix detailed listing.","code":"anova(sfo_pH, fomc_pH_2, dfop_pH_2, dfop_pH_4, sforb_pH_2, hs_pH_2) Data: 116 observations of 1 variable(s) grouped in 18 datasets npar AIC BIC Lik sfo_pH 5 783.09 787.54 -386.54 fomc_pH_2 6 767.49 772.83 -377.75 dfop_pH_4 7 767.35 773.58 -376.68 sforb_pH_2 7 770.94 777.17 -378.47 dfop_pH_2 8 765.14 772.26 -374.57 hs_pH_2 10 766.47 775.37 -373.23 endpoints(dfop_pH_2) $covariates pH 50% 5.75 $distimes DT50 DT90 DT50back DT50_k1 DT50_k2 meso 18.36876 73.51841 22.13125 4.191901 23.98672 endpoints(dfop_pH_2, covariates = c(pH = 7)) $covariates pH User 7 $distimes DT50 DT90 DT50back DT50_k1 DT50_k2 meso 8.346428 28.34437 8.532507 4.191901 8.753618"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"conclusions","dir":"Articles > Prebuilt","previous_headings":"","what":"Conclusions","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"evaluations demonstrate covariate effects can included types parent degradation models. models can refined make fully identifiable.","code":""},{"path":[]},{"path":[]},{"path":[]},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"session-info","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Session info","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"","code":"R version 4.4.2 (2024-10-31) Platform: x86_64-pc-linux-gnu Running under: Debian GNU/Linux 12 (bookworm) Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0 locale: [1] LC_CTYPE=de_DE.UTF-8 LC_NUMERIC=C [3] LC_TIME=de_DE.UTF-8 LC_COLLATE=de_DE.UTF-8 [5] LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=de_DE.UTF-8 [7] LC_PAPER=de_DE.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C time zone: Europe/Berlin tzcode source: system (glibc) attached base packages: [1] parallel stats graphics grDevices utils datasets methods [8] base other attached packages: [1] rmarkdown_2.29 nvimcom_0.9-167 saemix_3.3 npde_3.5 [5] knitr_1.49 mkin_1.2.10 loaded via a namespace (and not attached): [1] sass_0.4.9 utf8_1.2.4 generics_0.1.3 lattice_0.22-6 [5] digest_0.6.37 magrittr_2.0.3 evaluate_1.0.1 grid_4.4.2 [9] fastmap_1.2.0 cellranger_1.1.0 jsonlite_1.8.9 mclust_6.1.1 [13] gridExtra_2.3 fansi_1.0.6 scales_1.3.0 codetools_0.2-20 [17] textshaping_0.4.1 jquerylib_0.1.4 cli_3.6.3 rlang_1.1.4 [21] munsell_0.5.1 cachem_1.1.0 yaml_2.3.10 tools_4.4.2 [25] dplyr_1.1.4 colorspace_2.1-1 ggplot2_3.5.1 vctrs_0.6.5 [29] R6_2.5.1 zoo_1.8-12 lifecycle_1.0.4 fs_1.6.5 [33] htmlwidgets_1.6.4 MASS_7.3-61 ragg_1.3.3 pkgconfig_2.0.3 [37] desc_1.4.3 pkgdown_2.1.1 pillar_1.9.0 bslib_0.8.0 [41] gtable_0.3.6 glue_1.8.0 systemfonts_1.1.0 xfun_0.49 [45] tibble_3.2.1 lmtest_0.9-40 tidyselect_1.2.1 htmltools_0.5.8.1 [49] nlme_3.1-166 compiler_4.4.2 readxl_1.4.3"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html","id":"hardware-info","dir":"Articles > Prebuilt","previous_headings":"Appendix","what":"Hardware info","title":"Testing covariate modelling in hierarchical parent degradation kinetics with residue data on mesotrione","text":"","code":"CPU model: AMD Ryzen 9 7950X 16-Core Processor MemTotal: 64927788 kB"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/FOCUS_Z.html","id":"the-data","dir":"Articles > Web_only","previous_headings":"","what":"The data","title":"Example evaluation of FOCUS dataset Z","text":"following code defines example dataset Appendix 7 FOCUS kinetics report (FOCUS Work Group Degradation Kinetics 2014, 354).","code":"library(mkin, quietly = TRUE) LOD = 0.5 FOCUS_2006_Z = data.frame( t = c(0, 0.04, 0.125, 0.29, 0.54, 1, 2, 3, 4, 7, 10, 14, 21, 42, 61, 96, 124), Z0 = c(100, 81.7, 70.4, 51.1, 41.2, 6.6, 4.6, 3.9, 4.6, 4.3, 6.8, 2.9, 3.5, 5.3, 4.4, 1.2, 0.7), Z1 = c(0, 18.3, 29.6, 46.3, 55.1, 65.7, 39.1, 36, 15.3, 5.6, 1.1, 1.6, 0.6, 0.5 * LOD, NA, NA, NA), Z2 = c(0, NA, 0.5 * LOD, 2.6, 3.8, 15.3, 37.2, 31.7, 35.6, 14.5, 0.8, 2.1, 1.9, 0.5 * LOD, NA, NA, NA), Z3 = c(0, NA, NA, NA, NA, 0.5 * LOD, 9.2, 13.1, 22.3, 28.4, 32.5, 25.2, 17.2, 4.8, 4.5, 2.8, 4.4)) FOCUS_2006_Z_mkin <- mkin_wide_to_long(FOCUS_2006_Z)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/FOCUS_Z.html","id":"parent-and-one-metabolite","dir":"Articles > Web_only","previous_headings":"","what":"Parent and one metabolite","title":"Example evaluation of FOCUS dataset Z","text":"next step set models used kinetic analysis. simultaneous fit parent first metabolite usually straightforward, Step 1 (SFO parent ) skipped . start model 2a, formation decline metabolite Z1 pathway parent directly sink included (default mkin). obvious parameter summary (component summary), kinetic rate constant parent compound Z sink small t-test parameter suggests significantly different zero. suggests, agreement analysis FOCUS kinetics report, simplify model removing pathway sink. similar result can obtained formation fractions used model formulation: , ilr transformed formation fraction fitted model takes large value, backtransformed formation fraction parent Z Z1 practically unity. , covariance matrix used calculation confidence intervals returned model overparameterised. simplified model obtained removing pathway sink. following, use parameterisation formation fractions order able compare results FOCUS guidance, makes easier use parameters obtained previous fit adding metabolite. one transformation product Z0 pathway sink, formation fraction internally fixed unity.","code":"Z.2a <- mkinmod(Z0 = mkinsub(\"SFO\", \"Z1\"), Z1 = mkinsub(\"SFO\")) ## Temporary DLL for differentials generated and loaded m.Z.2a <- mkinfit(Z.2a, FOCUS_2006_Z_mkin, quiet = TRUE) ## Warning in mkinfit(Z.2a, FOCUS_2006_Z_mkin, quiet = TRUE): Observations with ## value of zero were removed from the data plot_sep(m.Z.2a) summary(m.Z.2a, data = FALSE)$bpar ## Estimate se_notrans t value Pr(>t) Lower Upper ## Z0_0 97.01488 3.301084 29.3888 3.2971e-21 91.66556 102.3642 ## k_Z0 2.23601 0.207078 10.7979 3.3309e-11 1.95303 2.5600 ## k_Z1 0.48212 0.063265 7.6207 2.8154e-08 0.40341 0.5762 ## f_Z0_to_Z1 1.00000 0.094764 10.5525 5.3560e-11 0.00000 1.0000 ## sigma 4.80411 0.635638 7.5579 3.2592e-08 3.52677 6.0815 Z.2a.ff <- mkinmod(Z0 = mkinsub(\"SFO\", \"Z1\"), Z1 = mkinsub(\"SFO\"), use_of_ff = \"max\") ## Temporary DLL for differentials generated and loaded m.Z.2a.ff <- mkinfit(Z.2a.ff, FOCUS_2006_Z_mkin, quiet = TRUE) ## Warning in mkinfit(Z.2a.ff, FOCUS_2006_Z_mkin, quiet = TRUE): Observations with ## value of zero were removed from the data plot_sep(m.Z.2a.ff) summary(m.Z.2a.ff, data = FALSE)$bpar ## Estimate se_notrans t value Pr(>t) Lower Upper ## Z0_0 97.01488 3.301084 29.3888 3.2971e-21 91.66556 102.3642 ## k_Z0 2.23601 0.207078 10.7979 3.3309e-11 1.95303 2.5600 ## k_Z1 0.48212 0.063265 7.6207 2.8154e-08 0.40341 0.5762 ## f_Z0_to_Z1 1.00000 0.094764 10.5525 5.3560e-11 0.00000 1.0000 ## sigma 4.80411 0.635638 7.5579 3.2592e-08 3.52677 6.0815 Z.3 <- mkinmod(Z0 = mkinsub(\"SFO\", \"Z1\", sink = FALSE), Z1 = mkinsub(\"SFO\"), use_of_ff = \"max\") ## Temporary DLL for differentials generated and loaded m.Z.3 <- mkinfit(Z.3, FOCUS_2006_Z_mkin, quiet = TRUE) ## Warning in mkinfit(Z.3, FOCUS_2006_Z_mkin, quiet = TRUE): Observations with ## value of zero were removed from the data plot_sep(m.Z.3) summary(m.Z.3, data = FALSE)$bpar ## Estimate se_notrans t value Pr(>t) Lower Upper ## Z0_0 97.01488 2.597342 37.352 2.0106e-24 91.67597 102.3538 ## k_Z0 2.23601 0.146904 15.221 9.1477e-15 1.95354 2.5593 ## k_Z1 0.48212 0.041727 11.554 4.8268e-12 0.40355 0.5760 ## sigma 4.80411 0.620208 7.746 1.6110e-08 3.52925 6.0790"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/FOCUS_Z.html","id":"metabolites-z2-and-z3","dir":"Articles > Web_only","previous_headings":"","what":"Metabolites Z2 and Z3","title":"Example evaluation of FOCUS dataset Z","text":"suggested FOCUS report, pathway sink removed metabolite Z1 well next step. step appears questionable basis results, followed purpose comparison. Also, FOCUS report, assumed additional empirical evidence Z1 quickly exclusively hydrolyses Z2. Finally, metabolite Z3 added model. use optimised differential equation parameter values previous fit order accelerate optimization. fit corresponds final result chosen Appendix 7 FOCUS report. Confidence intervals returned mkin based internally transformed parameters, however.","code":"Z.5 <- mkinmod(Z0 = mkinsub(\"SFO\", \"Z1\", sink = FALSE), Z1 = mkinsub(\"SFO\", \"Z2\", sink = FALSE), Z2 = mkinsub(\"SFO\"), use_of_ff = \"max\") ## Temporary DLL for differentials generated and loaded m.Z.5 <- mkinfit(Z.5, FOCUS_2006_Z_mkin, quiet = TRUE) ## Warning in mkinfit(Z.5, FOCUS_2006_Z_mkin, quiet = TRUE): Observations with ## value of zero were removed from the data plot_sep(m.Z.5) Z.FOCUS <- mkinmod(Z0 = mkinsub(\"SFO\", \"Z1\", sink = FALSE), Z1 = mkinsub(\"SFO\", \"Z2\", sink = FALSE), Z2 = mkinsub(\"SFO\", \"Z3\"), Z3 = mkinsub(\"SFO\"), use_of_ff = \"max\") ## Temporary DLL for differentials generated and loaded m.Z.FOCUS <- mkinfit(Z.FOCUS, FOCUS_2006_Z_mkin, parms.ini = m.Z.5$bparms.ode, quiet = TRUE) ## Warning in mkinfit(Z.FOCUS, FOCUS_2006_Z_mkin, parms.ini = m.Z.5$bparms.ode, : ## Observations with value of zero were removed from the data ## Warning in mkinfit(Z.FOCUS, FOCUS_2006_Z_mkin, parms.ini = m.Z.5$bparms.ode, : Optimisation did not converge: ## false convergence (8) plot_sep(m.Z.FOCUS) summary(m.Z.FOCUS, data = FALSE)$bpar ## Estimate se_notrans t value Pr(>t) Lower Upper ## Z0_0 96.842440 1.994291 48.5598 4.0226e-42 92.830421 100.854459 ## k_Z0 2.215425 0.118457 18.7023 1.0404e-23 1.989490 2.467019 ## k_Z1 0.478307 0.028257 16.9272 6.2332e-22 0.424709 0.538669 ## k_Z2 0.451642 0.042139 10.7178 1.6304e-14 0.374348 0.544894 ## k_Z3 0.058692 0.015245 3.8499 1.7803e-04 0.034804 0.098975 ## f_Z2_to_Z3 0.471483 0.058348 8.0806 9.6585e-11 0.357720 0.588287 ## sigma 3.984431 0.383402 10.3923 4.5576e-14 3.213126 4.755737 endpoints(m.Z.FOCUS) ## $ff ## Z2_Z3 Z2_sink ## 0.47148 0.52852 ## ## $distimes ## DT50 DT90 ## Z0 0.31287 1.0393 ## Z1 1.44917 4.8140 ## Z2 1.53473 5.0983 ## Z3 11.80991 39.2317"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/FOCUS_Z.html","id":"using-the-sforb-model","dir":"Articles > Web_only","previous_headings":"","what":"Using the SFORB model","title":"Example evaluation of FOCUS dataset Z","text":"FOCUS report states, certain tailing time course metabolite Z3. Also, time course parent compound fitted well using SFO model, residues certain low level remain. Therefore, additional model offered , using single first-order reversible binding (SFORB) model metabolite Z3. expected, χ2\\chi^2 error level lower metabolite Z3 using model graphical fit Z3 improved. However, covariance matrix returned. Therefore, stepwise model building performed starting stage parent two metabolites, starting assumption model fit parent compound can improved using SFORB model. results much better representation behaviour parent compound Z0. Finally, Z3 added well. models appear overparameterised (covariance matrix returned) sink Z1 left models. error level fit, especially metabolite Z3, can improved SFORB model chosen metabolite, model capable representing tailing metabolite decline phase. summary view backtransformed parameters shows get confidence intervals due overparameterisation. optimized excessively small, seems reasonable fix zero. expected, residual plots Z0 Z3 random case SFO model shown . conclusion, model proposed best-fit model dataset Appendix 7 FOCUS report. graphical representation confidence intervals can finally obtained. endpoints obtained model clear degradation rate Z3 towards end experiment low DT50_Z3_b2 (second Eigenvalue system two differential equations representing SFORB system Z3, corresponding slower rate constant DFOP model) reported infinity. However, appears feature data.","code":"Z.mkin.1 <- mkinmod(Z0 = mkinsub(\"SFO\", \"Z1\", sink = FALSE), Z1 = mkinsub(\"SFO\", \"Z2\", sink = FALSE), Z2 = mkinsub(\"SFO\", \"Z3\"), Z3 = mkinsub(\"SFORB\")) ## Temporary DLL for differentials generated and loaded m.Z.mkin.1 <- mkinfit(Z.mkin.1, FOCUS_2006_Z_mkin, quiet = TRUE) ## Warning in mkinfit(Z.mkin.1, FOCUS_2006_Z_mkin, quiet = TRUE): Observations ## with value of zero were removed from the data plot_sep(m.Z.mkin.1) summary(m.Z.mkin.1, data = FALSE)$cov.unscaled ## NULL Z.mkin.3 <- mkinmod(Z0 = mkinsub(\"SFORB\", \"Z1\", sink = FALSE), Z1 = mkinsub(\"SFO\", \"Z2\", sink = FALSE), Z2 = mkinsub(\"SFO\")) ## Temporary DLL for differentials generated and loaded m.Z.mkin.3 <- mkinfit(Z.mkin.3, FOCUS_2006_Z_mkin, quiet = TRUE) ## Warning in mkinfit(Z.mkin.3, FOCUS_2006_Z_mkin, quiet = TRUE): Observations ## with value of zero were removed from the data plot_sep(m.Z.mkin.3) Z.mkin.4 <- mkinmod(Z0 = mkinsub(\"SFORB\", \"Z1\", sink = FALSE), Z1 = mkinsub(\"SFO\", \"Z2\", sink = FALSE), Z2 = mkinsub(\"SFO\", \"Z3\"), Z3 = mkinsub(\"SFO\")) ## Temporary DLL for differentials generated and loaded m.Z.mkin.4 <- mkinfit(Z.mkin.4, FOCUS_2006_Z_mkin, parms.ini = m.Z.mkin.3$bparms.ode, quiet = TRUE) ## Warning in mkinfit(Z.mkin.4, FOCUS_2006_Z_mkin, parms.ini = ## m.Z.mkin.3$bparms.ode, : Observations with value of zero were removed from the ## data plot_sep(m.Z.mkin.4) Z.mkin.5 <- mkinmod(Z0 = mkinsub(\"SFORB\", \"Z1\", sink = FALSE), Z1 = mkinsub(\"SFO\", \"Z2\", sink = FALSE), Z2 = mkinsub(\"SFO\", \"Z3\"), Z3 = mkinsub(\"SFORB\")) ## Temporary DLL for differentials generated and loaded m.Z.mkin.5 <- mkinfit(Z.mkin.5, FOCUS_2006_Z_mkin, parms.ini = m.Z.mkin.4$bparms.ode[1:4], quiet = TRUE) ## Warning in mkinfit(Z.mkin.5, FOCUS_2006_Z_mkin, parms.ini = ## m.Z.mkin.4$bparms.ode[1:4], : Observations with value of zero were removed from ## the data plot_sep(m.Z.mkin.5) m.Z.mkin.5a <- mkinfit(Z.mkin.5, FOCUS_2006_Z_mkin, parms.ini = c(m.Z.mkin.5$bparms.ode[1:7], k_Z3_bound_free = 0), fixed_parms = \"k_Z3_bound_free\", quiet = TRUE) ## Warning in mkinfit(Z.mkin.5, FOCUS_2006_Z_mkin, parms.ini = ## c(m.Z.mkin.5$bparms.ode[1:7], : Observations with value of zero were removed ## from the data plot_sep(m.Z.mkin.5a) mkinparplot(m.Z.mkin.5a) endpoints(m.Z.mkin.5a) ## $ff ## Z0_free Z2_Z3 Z2_sink Z3_free ## 1.00000 0.53656 0.46344 1.00000 ## ## $SFORB ## Z0_b1 Z0_b2 Z0_g Z3_b1 Z3_b2 Z3_g ## 2.4471342 0.0075124 0.9519866 0.0800071 0.0000000 0.9347816 ## ## $distimes ## DT50 DT90 DT50back DT50_Z0_b1 DT50_Z0_b2 DT50_Z3_b1 DT50_Z3_b2 ## Z0 0.3043 1.1848 0.35666 0.28325 92.267 NA NA ## Z1 1.5148 5.0320 NA NA NA NA NA ## Z2 1.6414 5.4526 NA NA NA NA NA ## Z3 NA NA NA NA NA 8.6636 Inf"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"introduction","dir":"Articles > Web_only","previous_headings":"","what":"Introduction","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"document, example evaluations provided Attachment 1 SOP US EPA using NAFTA guidance (US EPA 2015) repeated using mkin. original evaluations reported attachment performed using PestDF version 0.8.4. Note PestDF 0.8.13 version distributed US EPA website today (2019-02-26). datasets now distributed mkin package.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"examples-where-dfop-did-not-converge-with-pestdf-0-8-4","dir":"Articles > Web_only","previous_headings":"","what":"Examples where DFOP did not converge with PestDF 0.8.4","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"attachment 1, reported DFOP model converge datasets PestDF 0.8.4 used. four datasets, DFOP model can fitted mkin (see ). negative half-life given PestDF 0.8.4 fits appears result bug. results two models (SFO IORE) .","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-5-upper-panel","dir":"Articles > Web_only","previous_headings":"Examples where DFOP did not converge with PestDF 0.8.4","what":"Example on page 5, upper panel","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"","code":"p5a <- nafta(NAFTA_SOP_Attachment[[\"p5a\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p5a) print(p5a) ## Sums of squares: ## SFO IORE DFOP ## 465.21753 56.27506 32.06401 ## ## Critical sum of squares for checking the SFO model: ## [1] 64.4304 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 95.8401 4.67e-21 92.245 99.4357 ## k_parent 0.0102 3.92e-12 0.009 0.0117 ## sigma 4.8230 3.81e-06 3.214 6.4318 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 1.01e+02 NA 9.91e+01 1.02e+02 ## k__iore_parent 1.54e-05 NA 4.08e-06 5.84e-05 ## N_parent 2.57e+00 NA 2.25e+00 2.89e+00 ## sigma 1.68e+00 NA 1.12e+00 2.24e+00 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 9.99e+01 1.41e-26 98.8116 101.0810 ## k1 2.67e-02 5.05e-06 0.0243 0.0295 ## k2 3.41e-12 5.00e-01 0.0000 Inf ## g 6.47e-01 3.67e-06 0.6248 0.6677 ## sigma 1.27e+00 8.91e-06 0.8395 1.6929 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 67.7 2.25e+02 6.77e+01 ## IORE 58.2 1.07e+03 3.22e+02 ## DFOP 55.5 3.70e+11 2.03e+11 ## ## Representative half-life: ## [1] 321.51"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-5-lower-panel","dir":"Articles > Web_only","previous_headings":"Examples where DFOP did not converge with PestDF 0.8.4","what":"Example on page 5, lower panel","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"","code":"p5b <- nafta(NAFTA_SOP_Attachment[[\"p5b\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p5b) print(p5b) ## Sums of squares: ## SFO IORE DFOP ## 94.81123 10.10936 7.55871 ## ## Critical sum of squares for checking the SFO model: ## [1] 11.77879 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 96.497 2.32e-24 94.85271 98.14155 ## k_parent 0.008 3.42e-14 0.00737 0.00869 ## sigma 2.295 1.22e-05 1.47976 3.11036 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 9.85e+01 1.17e-28 9.79e+01 9.92e+01 ## k__iore_parent 1.53e-04 6.50e-03 7.21e-05 3.26e-04 ## N_parent 1.94e+00 5.88e-13 1.76e+00 2.12e+00 ## sigma 7.49e-01 1.63e-05 4.82e-01 1.02e+00 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 9.84e+01 1.24e-27 97.8078 98.9187 ## k1 1.55e-02 4.10e-04 0.0143 0.0167 ## k2 9.07e-12 5.00e-01 0.0000 Inf ## g 6.89e-01 2.92e-03 0.6626 0.7142 ## sigma 6.48e-01 2.38e-05 0.4147 0.8813 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 86.6 2.88e+02 8.66e+01 ## IORE 85.5 7.17e+02 2.16e+02 ## DFOP 83.6 1.25e+11 7.64e+10 ## ## Representative half-life: ## [1] 215.87"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-6","dir":"Articles > Web_only","previous_headings":"Examples where DFOP did not converge with PestDF 0.8.4","what":"Example on page 6","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"","code":"p6 <- nafta(NAFTA_SOP_Attachment[[\"p6\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p6) print(p6) ## Sums of squares: ## SFO IORE DFOP ## 188.45361 51.00699 42.46931 ## ## Critical sum of squares for checking the SFO model: ## [1] 58.39888 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 94.7759 7.29e-24 92.3478 97.2039 ## k_parent 0.0179 8.02e-16 0.0166 0.0194 ## sigma 3.0696 3.81e-06 2.0456 4.0936 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 97.12446 2.63e-26 95.62461 98.62431 ## k__iore_parent 0.00252 1.95e-03 0.00134 0.00472 ## N_parent 1.49587 4.07e-13 1.33896 1.65279 ## sigma 1.59698 5.05e-06 1.06169 2.13227 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 9.66e+01 1.57e-25 95.3476 97.8979 ## k1 2.55e-02 7.33e-06 0.0233 0.0278 ## k2 3.84e-11 5.00e-01 0.0000 Inf ## g 8.61e-01 7.55e-06 0.8314 0.8867 ## sigma 1.46e+00 6.93e-06 0.9661 1.9483 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 38.6 1.28e+02 3.86e+01 ## IORE 34.0 1.77e+02 5.32e+01 ## DFOP 34.1 8.50e+09 1.80e+10 ## ## Representative half-life: ## [1] 53.17"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-7","dir":"Articles > Web_only","previous_headings":"Examples where DFOP did not converge with PestDF 0.8.4","what":"Example on page 7","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"","code":"p7 <- nafta(NAFTA_SOP_Attachment[[\"p7\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p7) print(p7) ## Sums of squares: ## SFO IORE DFOP ## 3661.661 3195.030 3174.145 ## ## Critical sum of squares for checking the SFO model: ## [1] 3334.194 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 96.41796 4.80e-53 93.32245 99.51347 ## k_parent 0.00735 7.64e-21 0.00641 0.00843 ## sigma 7.94557 1.83e-15 6.46713 9.42401 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 9.92e+01 NA 9.55e+01 1.03e+02 ## k__iore_parent 1.60e-05 NA 1.45e-07 1.77e-03 ## N_parent 2.45e+00 NA 1.35e+00 3.54e+00 ## sigma 7.42e+00 NA 6.04e+00 8.80e+00 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 9.89e+01 9.44e-49 95.4640 102.2573 ## k1 1.81e-02 1.75e-01 0.0116 0.0281 ## k2 3.62e-10 5.00e-01 0.0000 Inf ## g 6.06e-01 2.19e-01 0.4826 0.7178 ## sigma 7.40e+00 2.97e-15 6.0201 8.7754 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 94.3 3.13e+02 9.43e+01 ## IORE 96.7 1.51e+03 4.55e+02 ## DFOP 96.4 3.79e+09 1.92e+09 ## ## Representative half-life: ## [1] 454.55"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-8","dir":"Articles > Web_only","previous_headings":"Examples where the representative half-life deviates from the observed DT50","what":"Example on page 8","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"dataset, IORE fit converge default starting values used mkin IORE model used. Therefore, lower value rate constant used .","code":"p8 <- nafta(NAFTA_SOP_Attachment[[\"p8\"]], parms.ini = c(k__iore_parent = 1e-3)) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p8) print(p8) ## Sums of squares: ## SFO IORE DFOP ## 1996.9408 444.9237 547.5616 ## ## Critical sum of squares for checking the SFO model: ## [1] 477.4924 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 88.16549 6.53e-29 83.37344 92.95754 ## k_parent 0.00803 1.67e-13 0.00674 0.00957 ## sigma 7.44786 4.17e-10 5.66209 9.23363 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 9.77e+01 7.03e-35 9.44e+01 1.01e+02 ## k__iore_parent 6.14e-05 3.20e-02 2.12e-05 1.78e-04 ## N_parent 2.27e+00 4.23e-18 2.00e+00 2.54e+00 ## sigma 3.52e+00 5.36e-10 2.67e+00 4.36e+00 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 95.70619 8.99e-32 91.87941 99.53298 ## k1 0.02500 5.25e-04 0.01422 0.04394 ## k2 0.00273 6.84e-03 0.00125 0.00597 ## g 0.58835 2.84e-06 0.36595 0.77970 ## sigma 3.90001 6.94e-10 2.96260 4.83741 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 86.3 287 86.3 ## IORE 53.4 668 201.0 ## DFOP 55.6 517 253.0 ## ## Representative half-life: ## [1] 201.03"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-9-upper-panel","dir":"Articles > Web_only","previous_headings":"Examples where SFO was not selected for an abiotic study","what":"Example on page 9, upper panel","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"example, residuals SFO indicate lack fit model, even abiotic experiment, data suggest simple exponential decline.","code":"p9a <- nafta(NAFTA_SOP_Attachment[[\"p9a\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p9a) print(p9a) ## Sums of squares: ## SFO IORE DFOP ## 839.35238 88.57064 9.93363 ## ## Critical sum of squares for checking the SFO model: ## [1] 105.5678 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 88.1933 3.06e-12 79.9447 96.4419 ## k_parent 0.0409 2.07e-07 0.0324 0.0516 ## sigma 7.2429 3.92e-05 4.4768 10.0090 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 9.89e+01 1.12e-16 9.54e+01 1.02e+02 ## k__iore_parent 1.93e-05 1.13e-01 3.49e-06 1.06e-04 ## N_parent 2.91e+00 1.45e-09 2.50e+00 3.32e+00 ## sigma 2.35e+00 5.31e-05 1.45e+00 3.26e+00 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 9.85e+01 2.54e-20 97.390 99.672 ## k1 1.38e-01 3.52e-05 0.131 0.146 ## k2 9.02e-13 5.00e-01 0.000 Inf ## g 6.52e-01 8.13e-06 0.642 0.661 ## sigma 7.88e-01 6.13e-02 0.481 1.095 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 16.9 5.63e+01 1.69e+01 ## IORE 11.6 3.37e+02 1.01e+02 ## DFOP 10.5 1.38e+12 7.68e+11 ## ## Representative half-life: ## [1] 101.43"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-9-lower-panel","dir":"Articles > Web_only","previous_headings":"Examples where SFO was not selected for an abiotic study","what":"Example on page 9, lower panel","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":", mkin gives longer slow DT50 DFOP model (17.8 days) PestDF (13.5 days). Presumably, related fact PestDF gives negative value proportion fast degradation 0 1, inclusive. parameter called f PestDF g mkin. mkin, restricted interval 0 1.","code":"p9b <- nafta(NAFTA_SOP_Attachment[[\"p9b\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p9b) print(p9b) ## Sums of squares: ## SFO IORE DFOP ## 35.64867 23.22334 35.64867 ## ## Critical sum of squares for checking the SFO model: ## [1] 28.54188 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 94.7123 2.15e-19 93.178 96.2464 ## k_parent 0.0389 4.47e-14 0.037 0.0408 ## sigma 1.5957 1.28e-04 0.932 2.2595 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 93.863 2.32e-18 92.4565 95.269 ## k__iore_parent 0.127 1.85e-02 0.0504 0.321 ## N_parent 0.711 1.88e-05 0.4843 0.937 ## sigma 1.288 1.76e-04 0.7456 1.830 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 94.7123 1.61e-16 93.1355 96.2891 ## k1 0.0389 1.08e-04 0.0266 0.0569 ## k2 0.0389 2.24e-04 0.0255 0.0592 ## g 0.5256 5.00e-01 0.0000 1.0000 ## sigma 1.5957 2.50e-04 0.9135 2.2779 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 17.8 59.2 17.8 ## IORE 18.4 49.2 14.8 ## DFOP 17.8 59.2 17.8 ## ## Representative half-life: ## [1] 14.8"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-10","dir":"Articles > Web_only","previous_headings":"Examples where SFO was not selected for an abiotic study","what":"Example on page 10","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":", value N given IORE model, data suggests faster decline towards end experiment, appears physically rather unlikely case photolysis study. seems PestDF constrain N values zero, thus slight difference IORE model parameters PestDF mkin.","code":"p10 <- nafta(NAFTA_SOP_Attachment[[\"p10\"]]) ## Warning in sqrt(diag(covar_notrans)): NaNs produced ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p10) print(p10) ## Sums of squares: ## SFO IORE DFOP ## 899.4089 336.4348 899.4089 ## ## Critical sum of squares for checking the SFO model: ## [1] 413.4841 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 101.7315 6.42e-11 91.9259 111.5371 ## k_parent 0.0495 1.70e-07 0.0404 0.0607 ## sigma 8.0152 1.28e-04 4.6813 11.3491 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 96.86 3.32e-12 90.848 102.863 ## k__iore_parent 2.96 7.91e-02 0.687 12.761 ## N_parent 0.00 5.00e-01 -0.372 0.372 ## sigma 4.90 1.77e-04 2.837 6.968 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 101.7315 1.41e-09 91.6534 111.810 ## k1 0.0495 3.04e-03 0.0188 0.131 ## k2 0.0495 4.92e-04 0.0197 0.124 ## g 0.4487 NaN 0.0000 1.000 ## sigma 8.0152 2.50e-04 4.5886 11.442 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 14.0 46.5 14.00 ## IORE 16.4 29.4 8.86 ## DFOP 14.0 46.5 14.00 ## ## Representative half-life: ## [1] 8.86"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-11","dir":"Articles > Web_only","previous_headings":"The DT50 was not observed during the study","what":"Example on page 11","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"case, DFOP fit reported PestDF resulted negative value slower rate constant, possible mkin. results agreement.","code":"p11 <- nafta(NAFTA_SOP_Attachment[[\"p11\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p11) print(p11) ## Sums of squares: ## SFO IORE DFOP ## 579.6805 204.7932 144.7783 ## ## Critical sum of squares for checking the SFO model: ## [1] 251.6944 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 96.15820 4.83e-13 90.24934 1.02e+02 ## k_parent 0.00321 4.71e-05 0.00222 4.64e-03 ## sigma 6.43473 1.28e-04 3.75822 9.11e+00 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 1.05e+02 NA 9.90e+01 1.10e+02 ## k__iore_parent 3.11e-17 NA 1.35e-20 7.18e-14 ## N_parent 8.36e+00 NA 6.62e+00 1.01e+01 ## sigma 3.82e+00 NA 2.21e+00 5.44e+00 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 1.05e+02 9.47e-13 99.9990 109.1224 ## k1 4.41e-02 5.95e-03 0.0296 0.0658 ## k2 9.94e-13 5.00e-01 0.0000 Inf ## g 3.22e-01 1.45e-03 0.2814 0.3650 ## sigma 3.22e+00 3.52e-04 1.8410 4.5906 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 2.16e+02 7.18e+02 2.16e+02 ## IORE 9.73e+02 1.37e+08 4.11e+07 ## DFOP 3.07e+11 1.93e+12 6.98e+11 ## ## Representative half-life: ## [1] 41148169"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"n-is-less-than-1-and-the-dfop-rate-constants-are-like-the-sfo-rate-constant","dir":"Articles > Web_only","previous_headings":"","what":"N is less than 1 and the DFOP rate constants are like the SFO rate constant","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"following three examples, results obtained mkin reported PestDF. case page 10, N values 1 deemed unrealistic appear result overparameterisation.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-12-upper-panel","dir":"Articles > Web_only","previous_headings":"N is less than 1 and the DFOP rate constants are like the SFO rate constant","what":"Example on page 12, upper panel","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"","code":"p12a <- nafta(NAFTA_SOP_Attachment[[\"p12a\"]]) ## Warning in summary.mkinfit(x): Could not calculate correlation; no covariance ## matrix ## Warning in sqrt(diag(covar_notrans)): NaNs produced ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p12a) print(p12a) ## Sums of squares: ## SFO IORE DFOP ## 695.4440 220.0685 695.4440 ## ## Critical sum of squares for checking the SFO model: ## [1] 270.4679 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 100.521 8.75e-12 92.461 108.581 ## k_parent 0.124 3.61e-08 0.104 0.148 ## sigma 7.048 1.28e-04 4.116 9.980 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 96.823 NA NA NA ## k__iore_parent 2.436 NA NA NA ## N_parent 0.263 NA NA NA ## sigma 3.965 NA NA NA ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 100.521 2.74e-10 92.2366 108.805 ## k1 0.124 2.53e-05 0.0908 0.170 ## k2 0.124 2.52e-02 0.0456 0.339 ## g 0.793 NaN 0.0000 1.000 ## sigma 7.048 2.50e-04 4.0349 10.061 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 5.58 18.5 5.58 ## IORE 6.49 13.2 3.99 ## DFOP 5.58 18.5 5.58 ## ## Representative half-life: ## [1] 3.99"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-12-lower-panel","dir":"Articles > Web_only","previous_headings":"N is less than 1 and the DFOP rate constants are like the SFO rate constant","what":"Example on page 12, lower panel","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"","code":"p12b <- nafta(NAFTA_SOP_Attachment[[\"p12b\"]]) ## Warning in sqrt(diag(covar)): NaNs produced ## Warning in qt(alpha/2, rdf): NaNs produced ## Warning in qt(1 - alpha/2, rdf): NaNs produced ## Warning in pt(abs(tval), rdf, lower.tail = FALSE): NaNs produced ## Warning in cov2cor(ans$covar): diag(V) had non-positive or NA entries; the ## non-finite result may be dubious ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p12b) print(p12b) ## Sums of squares: ## SFO IORE DFOP ## 58.90242 19.06353 58.90242 ## ## Critical sum of squares for checking the SFO model: ## [1] 51.51756 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 97.6840 0.00039 85.9388 109.4292 ## k_parent 0.0589 0.00261 0.0431 0.0805 ## sigma 3.4323 0.04356 -1.2377 8.1023 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 95.523 0.0055 74.539157 116.51 ## k__iore_parent 0.333 0.1433 0.000717 154.57 ## N_parent 0.568 0.0677 -0.989464 2.13 ## sigma 1.953 0.0975 -5.893100 9.80 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 97.6840 NaN NaN NaN ## k1 0.0589 NaN NA NA ## k2 0.0589 NaN NA NA ## g 0.6473 NaN NA NA ## sigma 3.4323 NaN NaN NaN ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 11.8 39.1 11.80 ## IORE 12.9 31.4 9.46 ## DFOP 11.8 39.1 11.80 ## ## Representative half-life: ## [1] 9.46"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"example-on-page-13","dir":"Articles > Web_only","previous_headings":"N is less than 1 and the DFOP rate constants are like the SFO rate constant","what":"Example on page 13","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"","code":"p13 <- nafta(NAFTA_SOP_Attachment[[\"p13\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p13) print(p13) ## Sums of squares: ## SFO IORE DFOP ## 174.5971 142.3951 174.5971 ## ## Critical sum of squares for checking the SFO model: ## [1] 172.131 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 92.73500 5.99e-17 89.61936 95.85065 ## k_parent 0.00258 2.42e-09 0.00223 0.00299 ## sigma 3.41172 7.07e-05 2.05455 4.76888 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 91.6016 6.34e-16 88.53086 94.672 ## k__iore_parent 0.0396 2.36e-01 0.00207 0.759 ## N_parent 0.3541 1.46e-01 -0.35153 1.060 ## sigma 3.0811 9.64e-05 1.84296 4.319 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 92.73500 NA 8.95e+01 95.92118 ## k1 0.00258 NA 4.18e-04 0.01592 ## k2 0.00258 NA 1.75e-03 0.00381 ## g 0.16452 NA 0.00e+00 1.00000 ## sigma 3.41172 NA 2.02e+00 4.79960 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 269 892 269 ## IORE 261 560 169 ## DFOP 269 892 269 ## ## Representative half-life: ## [1] 168.51"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"dt50-not-observed-in-the-study-and-dfop-problems-in-pestdf","dir":"Articles > Web_only","previous_headings":"","what":"DT50 not observed in the study and DFOP problems in PestDF","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"slower rate constant reported PestDF negative, physically realistic, possible mkin. fits give results mkin PestDF.","code":"p14 <- nafta(NAFTA_SOP_Attachment[[\"p14\"]]) ## Warning in sqrt(diag(covar)): NaNs produced ## Warning in cov2cor(ans$covar): diag(V) had non-positive or NA entries; the ## non-finite result may be dubious ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p14) print(p14) ## Sums of squares: ## SFO IORE DFOP ## 48.43249 28.67746 27.26248 ## ## Critical sum of squares for checking the SFO model: ## [1] 32.83337 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 99.47124 2.06e-30 98.42254 1.01e+02 ## k_parent 0.00279 3.75e-15 0.00256 3.04e-03 ## sigma 1.55616 3.81e-06 1.03704 2.08e+00 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 1.00e+02 NA NaN NaN ## k__iore_parent 9.44e-08 NA NaN NaN ## N_parent 3.31e+00 NA NaN NaN ## sigma 1.20e+00 NA 0.796 1.6 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 1.00e+02 2.96e-28 99.40280 101.2768 ## k1 9.53e-03 1.20e-01 0.00638 0.0143 ## k2 5.21e-12 5.00e-01 0.00000 Inf ## g 3.98e-01 2.19e-01 0.30481 0.4998 ## sigma 1.17e+00 7.68e-06 0.77406 1.5610 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 2.48e+02 8.25e+02 2.48e+02 ## IORE 4.34e+02 2.22e+04 6.70e+03 ## DFOP 3.55e+10 3.44e+11 1.33e+11 ## ## Representative half-life: ## [1] 6697.44"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"n-is-less-than-1-and-dfop-fraction-parameter-is-below-zero","dir":"Articles > Web_only","previous_headings":"","what":"N is less than 1 and DFOP fraction parameter is below zero","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"mkin, IORE fit affected (deemed unrealistic), fraction parameter DFOP model restricted interval 0 1 mkin. SFO fits give results mkin PestDF.","code":"p15a <- nafta(NAFTA_SOP_Attachment[[\"p15a\"]]) ## Warning in sqrt(diag(covar)): NaNs produced ## Warning in cov2cor(ans$covar): diag(V) had non-positive or NA entries; the ## non-finite result may be dubious ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p15a) print(p15a) ## Sums of squares: ## SFO IORE DFOP ## 245.5248 135.0132 245.5248 ## ## Critical sum of squares for checking the SFO model: ## [1] 165.9335 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 97.96751 2.00e-15 94.32049 101.615 ## k_parent 0.00952 4.93e-09 0.00824 0.011 ## sigma 4.18778 1.28e-04 2.44588 5.930 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 95.874 2.94e-15 92.937 98.811 ## k__iore_parent 0.629 2.11e-01 0.044 8.982 ## N_parent 0.000 5.00e-01 -0.642 0.642 ## sigma 3.105 1.78e-04 1.795 4.416 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 97.96751 2.85e-13 94.21913 101.7159 ## k1 0.00952 6.28e-02 0.00260 0.0349 ## k2 0.00952 1.27e-04 0.00652 0.0139 ## g 0.21241 5.00e-01 NA NA ## sigma 4.18778 2.50e-04 2.39747 5.9781 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 72.8 242 72.8 ## IORE 76.3 137 41.3 ## DFOP 72.8 242 72.8 ## ## Representative half-life: ## [1] 41.33 p15b <- nafta(NAFTA_SOP_Attachment[[\"p15b\"]]) ## Warning in summary.mkinfit(x): Could not calculate correlation; no covariance ## matrix ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The half-life obtained from the IORE model may be used plot(p15b) print(p15b) ## Sums of squares: ## SFO IORE DFOP ## 106.91629 68.55574 106.91629 ## ## Critical sum of squares for checking the SFO model: ## [1] 84.25618 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 1.01e+02 3.06e-17 98.31594 1.03e+02 ## k_parent 4.86e-03 2.48e-10 0.00435 5.42e-03 ## sigma 2.76e+00 1.28e-04 1.61402 3.91e+00 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 99.83 1.81e-16 97.51348 102.14 ## k__iore_parent 0.38 3.22e-01 0.00352 41.05 ## N_parent 0.00 5.00e-01 -1.07696 1.08 ## sigma 2.21 2.57e-04 1.23245 3.19 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 1.01e+02 NA NA NA ## k1 4.86e-03 NA NA NA ## k2 4.86e-03 NA NA NA ## g 1.88e-01 NA NA NA ## sigma 2.76e+00 NA NA NA ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 143 474 143.0 ## IORE 131 236 71.2 ## DFOP 143 474 143.0 ## ## Representative half-life: ## [1] 71.18"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"the-dfop-fraction-parameter-is-greater-than-1","dir":"Articles > Web_only","previous_headings":"","what":"The DFOP fraction parameter is greater than 1","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"PestDF, DFOP fit seems stuck local minimum, mkin finds solution much lower χ2\\chi^2 error level. half-life slower rate constant DFOP model larger IORE derived half-life, NAFTA recommendation obtained mkin use DFOP representative half-life 8.9 days.","code":"p16 <- nafta(NAFTA_SOP_Attachment[[\"p16\"]]) ## The SFO model is rejected as S_SFO is equal or higher than the critical value S_c ## The representative half-life of the IORE model is longer than the one corresponding ## to the terminal degradation rate found with the DFOP model. ## The representative half-life obtained from the DFOP model may be used plot(p16) print(p16) ## Sums of squares: ## SFO IORE DFOP ## 3831.804 2062.008 1550.980 ## ## Critical sum of squares for checking the SFO model: ## [1] 2247.348 ## ## Parameters: ## $SFO ## Estimate Pr(>t) Lower Upper ## parent_0 71.953 2.33e-13 60.509 83.40 ## k_parent 0.159 4.86e-05 0.102 0.25 ## sigma 11.302 1.25e-08 8.308 14.30 ## ## $IORE ## Estimate Pr(>t) Lower Upper ## parent_0 8.74e+01 2.48e-16 7.72e+01 97.52972 ## k__iore_parent 4.55e-04 2.16e-01 3.48e-05 0.00595 ## N_parent 2.70e+00 1.21e-08 1.99e+00 3.40046 ## sigma 8.29e+00 1.61e-08 6.09e+00 10.49062 ## ## $DFOP ## Estimate Pr(>t) Lower Upper ## parent_0 88.5333 7.40e-18 79.9836 97.083 ## k1 18.8461 5.00e-01 0.0000 Inf ## k2 0.0776 1.41e-05 0.0518 0.116 ## g 0.4733 1.41e-09 0.3674 0.582 ## sigma 7.1902 2.11e-08 5.2785 9.102 ## ## ## DTx values: ## DT50 DT90 DT50_rep ## SFO 4.35 14.4 4.35 ## IORE 1.48 32.1 9.67 ## DFOP 0.67 21.4 8.93 ## ## Representative half-life: ## [1] 8.93"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html","id":"conclusions","dir":"Articles > Web_only","previous_headings":"","what":"Conclusions","title":"Evaluation of example datasets from Attachment 1 to the US EPA SOP for the NAFTA guidance","text":"results obtained mkin deviate results obtained PestDF either cases one interpretive rules apply, .e. IORE parameter N less one DFOP k values obtained PestDF equal SFO k values, cases DFOP model converge, often lead negative rate constants returned PestDF. Therefore, mkin appears suitable kinetic evaluations according NAFTA guidance.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/benchmarks.html","id":"test-cases","dir":"Articles > Web_only","previous_headings":"","what":"Test cases","title":"Benchmark timings for mkin","text":"Parent : One metabolite: Two metabolites, synthetic data:","code":"FOCUS_C <- FOCUS_2006_C FOCUS_D <- subset(FOCUS_2006_D, value != 0) parent_datasets <- list(FOCUS_C, FOCUS_D) t1 <- system.time(mmkin_bench(c(\"SFO\", \"FOMC\", \"DFOP\", \"HS\"), parent_datasets))[[\"elapsed\"]] t2 <- system.time(mmkin_bench(c(\"SFO\", \"FOMC\", \"DFOP\", \"HS\"), parent_datasets, error_model = \"tc\"))[[\"elapsed\"]] SFO_SFO <- mkinmod( parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\")) FOMC_SFO <- mkinmod( parent = mkinsub(\"FOMC\", \"m1\"), m1 = mkinsub(\"SFO\")) DFOP_SFO <- mkinmod( parent = mkinsub(\"FOMC\", \"m1\"), # erroneously used FOMC twice, not fixed for consistency m1 = mkinsub(\"SFO\")) t3 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D)))[[\"elapsed\"]] t4 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D), error_model = \"tc\"))[[\"elapsed\"]] t5 <- system.time(mmkin_bench(list(SFO_SFO, FOMC_SFO, DFOP_SFO), list(FOCUS_D), error_model = \"obs\"))[[\"elapsed\"]] m_synth_SFO_lin <- mkinmod(parent = mkinsub(\"SFO\", \"M1\"), M1 = mkinsub(\"SFO\", \"M2\"), M2 = mkinsub(\"SFO\"), use_of_ff = \"max\", quiet = TRUE) m_synth_DFOP_par <- mkinmod(parent = mkinsub(\"DFOP\", c(\"M1\", \"M2\")), M1 = mkinsub(\"SFO\"), M2 = mkinsub(\"SFO\"), use_of_ff = \"max\", quiet = TRUE) SFO_lin_a <- synthetic_data_for_UBA_2014[[1]]$data DFOP_par_c <- synthetic_data_for_UBA_2014[[12]]$data t6 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a)))[[\"elapsed\"]] t7 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c)))[[\"elapsed\"]] t8 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a), error_model = \"tc\"))[[\"elapsed\"]] t9 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c), error_model = \"tc\"))[[\"elapsed\"]] t10 <- system.time(mmkin_bench(list(m_synth_SFO_lin), list(SFO_lin_a), error_model = \"obs\"))[[\"elapsed\"]] t11 <- system.time(mmkin_bench(list(m_synth_DFOP_par), list(DFOP_par_c), error_model = \"obs\"))[[\"elapsed\"]]"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/benchmarks.html","id":"results","dir":"Articles > Web_only","previous_headings":"","what":"Results","title":"Benchmark timings for mkin","text":"Benchmarks available error models shown. intended improving mkin, comparing CPUs operating systems. trademarks belong respective owners.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/benchmarks.html","id":"parent-only","dir":"Articles > Web_only","previous_headings":"Results","what":"Parent only","title":"Benchmark timings for mkin","text":"Constant variance (t1) two-component error model (t2) four models fitted two datasets, .e. eight fits test.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/benchmarks.html","id":"one-metabolite","dir":"Articles > Web_only","previous_headings":"Results","what":"One metabolite","title":"Benchmark timings for mkin","text":"Constant variance (t3), two-component error model (t4), variance variable (t5) three models fitted one dataset, .e. three fits test.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/benchmarks.html","id":"two-metabolites","dir":"Articles > Web_only","previous_headings":"Results","what":"Two metabolites","title":"Benchmark timings for mkin","text":"Constant variance (t6 t7), two-component error model (t8 t9), variance variable (t10 t11) one model fitted one dataset, .e. one fit test.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/compiled_models.html","id":"how-to-benefit-from-compiled-models","dir":"Articles > Web_only","previous_headings":"","what":"How to benefit from compiled models","title":"Performance benefit by using compiled model definitions in mkin","text":"using mkin version equal greater 0.9-36 C compiler available, see message model compiled autogenerated C code defining model using mkinmod. Starting version 0.9.49.9, mkinmod() function checks presence compiler using previous versions, used Sys.(\"gcc\") check. Linux, need essential build tools like make gcc clang installed. Debian based linux distributions, pulled installing build-essential package. MacOS, use personally, reports compiler available default. Windows, need install Rtools path bin directory PATH variable. need modify PATH variable installing Rtools. Instead, recommend put line .Rprofile startup file. just text file R code executed R session starts. named .Rprofile located home directory, generally Documents folder. can check location home directory used R issuing","code":"pkgbuild::has_compiler() Sys.setenv(PATH = paste(\"C:/Rtools/bin\", Sys.getenv(\"PATH\"), sep=\";\")) Sys.getenv(\"HOME\")"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/compiled_models.html","id":"comparison-with-other-solution-methods","dir":"Articles > Web_only","previous_headings":"","what":"Comparison with other solution methods","title":"Performance benefit by using compiled model definitions in mkin","text":"First, build simple degradation model parent compound one metabolite, remove zero values dataset. can compare performance Eigenvalue based solution compiled version R implementation differential equations using benchmark package. output code, warnings zero removed FOCUS D dataset suppressed. Since mkin version 0.9.49.11, analytical solution also implemented, included tests . see using compiled model factor 10 faster using deSolve without compiled code.","code":"library(\"mkin\", quietly = TRUE) SFO_SFO <- mkinmod( parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\")) ## Temporary DLL for differentials generated and loaded FOCUS_D <- subset(FOCUS_2006_D, value != 0) if (require(rbenchmark)) { b.1 <- benchmark( \"deSolve, not compiled\" = mkinfit(SFO_SFO, FOCUS_D, solution_type = \"deSolve\", use_compiled = FALSE, quiet = TRUE), \"Eigenvalue based\" = mkinfit(SFO_SFO, FOCUS_D, solution_type = \"eigen\", quiet = TRUE), \"deSolve, compiled\" = mkinfit(SFO_SFO, FOCUS_D, solution_type = \"deSolve\", quiet = TRUE), \"analytical\" = mkinfit(SFO_SFO, FOCUS_D, solution_type = \"analytical\", use_compiled = FALSE, quiet = TRUE), replications = 1, order = \"relative\", columns = c(\"test\", \"replications\", \"relative\", \"elapsed\")) print(b.1) } else { print(\"R package rbenchmark is not available\") } ## test replications relative elapsed ## 4 analytical 1 1.000 0.102 ## 3 deSolve, compiled 1 1.324 0.135 ## 2 Eigenvalue based 1 1.706 0.174 ## 1 deSolve, not compiled 1 22.627 2.308"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/compiled_models.html","id":"model-without-analytical-solution","dir":"Articles > Web_only","previous_headings":"","what":"Model without analytical solution","title":"Performance benefit by using compiled model definitions in mkin","text":"evaluation also taken example section mkinfit. analytical solution available system, now Eigenvalue based solution possible, deSolve using without compiled code available. get performance benefit factor 24 using version differential equation model compiled C code! vignette built mkin 1.2.10 ","code":"if (require(rbenchmark)) { FOMC_SFO <- mkinmod( parent = mkinsub(\"FOMC\", \"m1\"), m1 = mkinsub( \"SFO\")) b.2 <- benchmark( \"deSolve, not compiled\" = mkinfit(FOMC_SFO, FOCUS_D, use_compiled = FALSE, quiet = TRUE), \"deSolve, compiled\" = mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE), replications = 1, order = \"relative\", columns = c(\"test\", \"replications\", \"relative\", \"elapsed\")) print(b.2) factor_FOMC_SFO <- round(b.2[\"1\", \"relative\"]) } else { factor_FOMC_SFO <- NA print(\"R package benchmark is not available\") } ## Temporary DLL for differentials generated and loaded ## test replications relative elapsed ## 2 deSolve, compiled 1 1.000 0.170 ## 1 deSolve, not compiled 1 23.865 4.057 ## R version 4.4.2 (2024-10-31) ## Platform: x86_64-pc-linux-gnu ## Running under: Debian GNU/Linux 12 (bookworm) ## CPU model: AMD Ryzen 9 7950X 16-Core Processor"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"introduction","dir":"Articles > Web_only","previous_headings":"","what":"Introduction","title":"Example evaluations of the dimethenamid data from 2018","text":"first analysis data analysed presented recent journal article nonlinear mixed-effects models degradation kinetics (Ranke et al. 2021). analysis based nlme package development version saemix package unpublished time. Meanwhile, version 3.0 saemix package available CRAN repository. Also, turned error handling Borstel data mkin package time, leading duplication data points soil. dataset mkin package corrected, interface saemix mkin package updated use released version. vignette intended present date analysis data, using corrected dataset released versions mkin saemix.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"data","dir":"Articles > Web_only","previous_headings":"","what":"Data","title":"Example evaluations of the dimethenamid data from 2018","text":"Residue data forming basis endpoints derived conclusion peer review pesticide risk assessment dimethenamid-P published European Food Safety Authority (EFSA) 2018 (EFSA 2018) transcribed risk assessment report (Rapporteur Member State Germany, Co-Rapporteur Member State Bulgaria 2018) can downloaded Open EFSA repository https://open.efsa.europa.eu/study-inventory/EFSA-Q-2014-00716. data available mkin package. following code (hidden default, please use button right show ) treats data available racemic mixture dimethenamid (DMTA) enantiomer dimethenamid-P (DMTAP) way, difference degradation behaviour identified EU risk assessment. observation times dataset multiplied corresponding normalisation factor also available dataset, order make possible describe datasets single set parameters. Also, datasets observed soil merged, resulting dimethenamid (DMTA) data six soils.","code":"library(mkin, quietly = TRUE) dmta_ds <- lapply(1:7, function(i) { ds_i <- dimethenamid_2018$ds[[i]]$data ds_i[ds_i$name == \"DMTAP\", \"name\"] <- \"DMTA\" ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i] ds_i }) names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title) dmta_ds[[\"Elliot\"]] <- rbind(dmta_ds[[\"Elliot 1\"]], dmta_ds[[\"Elliot 2\"]]) dmta_ds[[\"Elliot 1\"]] <- NULL dmta_ds[[\"Elliot 2\"]] <- NULL"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"parent-degradation","dir":"Articles > Web_only","previous_headings":"","what":"Parent degradation","title":"Example evaluations of the dimethenamid data from 2018","text":"evaluate observed degradation parent compound using simple exponential decline (SFO) biexponential decline (DFOP), using constant variance (const) two-component variance (tc) error models.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"separate-evaluations","dir":"Articles > Web_only","previous_headings":"Parent degradation","what":"Separate evaluations","title":"Example evaluations of the dimethenamid data from 2018","text":"first step, get visual impression fit different models, separate evaluations soil using mmkin function mkin package: plot individual SFO fits shown suggests least datasets degradation slows towards later time points, scatter residuals error smaller smaller values (panel right): Using biexponential decline (DFOP) results slightly random scatter residuals: population curve (bold line) plot results taking mean individual transformed parameters, .e. log k1 log k2, well logit g parameter DFOP model). , procedure result parameters represent degradation well, datasets fitted value k2 extremely close zero, leading log k2 value dominates average. alleviated rate constants pass t-test significant difference zero (untransformed scale) considered averaging: visually much satisfactory, average procedure introduce bias, results individual fits enter population curve weight. nonlinear mixed-effects models can help treating datasets equally fitting parameter distribution model together degradation model error model (see ). remaining trend residuals higher higher predicted residues reduced using two-component error model: However, note case using error model, fits Flaach BBA 2.3 datasets appear ill-defined, indicated fact converge:","code":"f_parent_mkin_const <- mmkin(c(\"SFO\", \"DFOP\"), dmta_ds, error_model = \"const\", quiet = TRUE) f_parent_mkin_tc <- mmkin(c(\"SFO\", \"DFOP\"), dmta_ds, error_model = \"tc\", quiet = TRUE) plot(mixed(f_parent_mkin_const[\"SFO\", ])) plot(mixed(f_parent_mkin_const[\"DFOP\", ])) plot(mixed(f_parent_mkin_const[\"DFOP\", ]), test_log_parms = TRUE) plot(mixed(f_parent_mkin_tc[\"DFOP\", ]), test_log_parms = TRUE) print(f_parent_mkin_tc[\"DFOP\", ]) object Status of individual fits: dataset model Calke Borstel Flaach BBA 2.2 BBA 2.3 Elliot DFOP OK OK OK OK C OK C: Optimisation did not converge: iteration limit reached without convergence (10) OK: No warnings"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"nonlinear-mixed-effects-models","dir":"Articles > Web_only","previous_headings":"Parent degradation","what":"Nonlinear mixed-effects models","title":"Example evaluations of the dimethenamid data from 2018","text":"Instead taking model selection decision individual fits, fit nonlinear mixed-effects models (using different fitting algorithms implemented different packages) model selection using available data time. order make sure decisions unduly influenced type algorithm used, implementation details use wrong control parameters, compare model selection results obtained different R packages, different algorithms checking control parameters.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"nlme","dir":"Articles > Web_only","previous_headings":"Parent degradation > Nonlinear mixed-effects models","what":"nlme","title":"Example evaluations of the dimethenamid data from 2018","text":"nlme package first R extension providing facilities fit nonlinear mixed-effects models. like model selection four combinations degradation models error models based AIC. However, fitting DFOP model constant variance using default control parameters results error, signalling maximum number 50 iterations reached, potentially indicating overparameterisation. Nevertheless, algorithm converges two-component error model used combination DFOP model. can explained fact smaller residues observed later sampling times get weight using two-component error model counteract tendency algorithm try parameter combinations unsuitable fitting data. Note certain degree overparameterisation also indicated warning obtained fitting DFOP two-component error model (‘false convergence’ ‘LME step’ iteration 3). However, warning occur later iterations, specifically last 5 iterations, can ignore warning. model comparison function nlme package can directly applied fits showing much lower AIC DFOP model fitted two-component error model. Also, likelihood ratio test indicates difference significant p-value 0.0001. addition fits, attempts also made include correlations random effects using log Cholesky parameterisation matrix specifying . code used attempts can made visible . SFO variants converge fast, additional parameters introduced lead convergence warnings DFOP model. model comparison clearly show adding correlations random effects improve fits. selected model (DFOP two-component error) fitted data assuming correlations random effects shown .","code":"library(nlme) f_parent_nlme_sfo_const <- nlme(f_parent_mkin_const[\"SFO\", ]) # f_parent_nlme_dfop_const <- nlme(f_parent_mkin_const[\"DFOP\", ]) f_parent_nlme_sfo_tc <- nlme(f_parent_mkin_tc[\"SFO\", ]) f_parent_nlme_dfop_tc <- nlme(f_parent_mkin_tc[\"DFOP\", ]) anova( f_parent_nlme_sfo_const, f_parent_nlme_sfo_tc, f_parent_nlme_dfop_tc ) Model df AIC BIC logLik Test L.Ratio p-value f_parent_nlme_sfo_const 1 5 796.60 811.82 -393.30 f_parent_nlme_sfo_tc 2 6 798.60 816.86 -393.30 1 vs 2 0.00 0.998 f_parent_nlme_dfop_tc 3 10 671.91 702.34 -325.95 2 vs 3 134.69 <.0001 f_parent_nlme_sfo_const_logchol <- nlme(f_parent_mkin_const[\"SFO\", ], random = nlme::pdLogChol(list(DMTA_0 ~ 1, log_k_DMTA ~ 1))) anova(f_parent_nlme_sfo_const, f_parent_nlme_sfo_const_logchol) f_parent_nlme_sfo_tc_logchol <- nlme(f_parent_mkin_tc[\"SFO\", ], random = nlme::pdLogChol(list(DMTA_0 ~ 1, log_k_DMTA ~ 1))) anova(f_parent_nlme_sfo_tc, f_parent_nlme_sfo_tc_logchol) f_parent_nlme_dfop_tc_logchol <- nlme(f_parent_mkin_const[\"DFOP\", ], random = nlme::pdLogChol(list(DMTA_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1))) anova(f_parent_nlme_dfop_tc, f_parent_nlme_dfop_tc_logchol) plot(f_parent_nlme_dfop_tc)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"saemix","dir":"Articles > Web_only","previous_headings":"Parent degradation > Nonlinear mixed-effects models","what":"saemix","title":"Example evaluations of the dimethenamid data from 2018","text":"saemix package provided first Open Source implementation Stochastic Approximation Expectation Maximisation (SAEM) algorithm. SAEM fits degradation models can conveniently performed using interface saemix package available current development versions mkin package. corresponding SAEM fits four combinations degradation error models fitted . convergence criterion implemented saemix package, convergence plots need manually checked every fit. define control settings work well parent data fits shown vignette. convergence plot SFO model using constant variance shown . Obviously selected number iterations sufficient reach convergence. can also said SFO fit using two-component error model. fitting DFOP model constant variance (see ), parameter convergence unambiguous. parameters converge credible values, variance k2 (omega2.k2) converges small value. printout saem.mmkin model shows estimated standard deviation k2 across population soils (SD.k2) ill-defined, indicating overparameterisation model. DFOP model fitted two-component error model, also observe estimated variance k2 becomes small, ill-defined, illustrated excessive confidence interval SD.k2. Doubling number iterations first phase algorithm leads slightly lower likelihood, therefore slightly higher AIC BIC values. even iterations, algorithm stops error message. related variance k2 approximating zero submitted bug saemix package, algorithm converge case. alternative way fit DFOP combination two-component error model use model formulation transformed parameters used per default mkin. using option, convergence slower, eventually algorithm stops well error message. four combinations (SFO/const, SFO/tc, DFOP/const DFOP/tc) version increased iterations can compared using model comparison function saemix package: order check influence likelihood calculation algorithms implemented saemix, likelihood Gaussian quadrature added best fit, AIC values obtained three methods compared. AIC values based importance sampling Gaussian quadrature similar. Using linearisation known less accurate, still gives similar value. order illustrate comparison three method depends degree convergence obtained fit, comparison shown fit using defaults number iterations number MCMC chains. using OpenBlas linear algebra, large difference values obtained Gaussian quadrature, larger number iterations makes lot difference. using LAPACK version coming Debian Bullseye, AIC based Gaussian quadrature almost one obtained methods, also using defaults fit.","code":"library(saemix) saemix_control <- saemixControl(nbiter.saemix = c(800, 300), nb.chains = 15, print = FALSE, save = FALSE, save.graphs = FALSE, displayProgress = FALSE) saemix_control_moreiter <- saemixControl(nbiter.saemix = c(1600, 300), nb.chains = 15, print = FALSE, save = FALSE, save.graphs = FALSE, displayProgress = FALSE) saemix_control_10k <- saemixControl(nbiter.saemix = c(10000, 300), nb.chains = 15, print = FALSE, save = FALSE, save.graphs = FALSE, displayProgress = FALSE) f_parent_saemix_sfo_const <- mkin::saem(f_parent_mkin_const[\"SFO\", ], quiet = TRUE, control = saemix_control, transformations = \"saemix\") plot(f_parent_saemix_sfo_const$so, plot.type = \"convergence\") f_parent_saemix_sfo_tc <- mkin::saem(f_parent_mkin_tc[\"SFO\", ], quiet = TRUE, control = saemix_control, transformations = \"saemix\") plot(f_parent_saemix_sfo_tc$so, plot.type = \"convergence\") f_parent_saemix_dfop_const <- mkin::saem(f_parent_mkin_const[\"DFOP\", ], quiet = TRUE, control = saemix_control, transformations = \"saemix\") plot(f_parent_saemix_dfop_const$so, plot.type = \"convergence\") print(f_parent_saemix_dfop_const) Kinetic nonlinear mixed-effects model fit by SAEM Structural model: d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Likelihood computed by importance sampling AIC BIC logLik 706 704 -344 Fitted parameters: estimate lower upper DMTA_0 97.99583 96.50079 99.4909 k1 0.06377 0.03432 0.0932 k2 0.00848 0.00444 0.0125 g 0.95701 0.91313 1.0009 a.1 1.82141 1.60516 2.0377 SD.DMTA_0 1.64787 0.45729 2.8384 SD.k1 0.57439 0.24731 0.9015 SD.k2 0.03296 -2.50524 2.5712 SD.g 1.10266 0.32354 1.8818 f_parent_saemix_dfop_tc <- mkin::saem(f_parent_mkin_tc[\"DFOP\", ], quiet = TRUE, control = saemix_control, transformations = \"saemix\") f_parent_saemix_dfop_tc_moreiter <- mkin::saem(f_parent_mkin_tc[\"DFOP\", ], quiet = TRUE, control = saemix_control_moreiter, transformations = \"saemix\") plot(f_parent_saemix_dfop_tc$so, plot.type = \"convergence\") print(f_parent_saemix_dfop_tc) Kinetic nonlinear mixed-effects model fit by SAEM Structural model: d_DMTA/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) * DMTA Data: 155 observations of 1 variable(s) grouped in 6 datasets Likelihood computed by importance sampling AIC BIC logLik 666 664 -323 Fitted parameters: estimate lower upper DMTA_0 98.24165 96.29190 100.1914 k1 0.06421 0.03352 0.0949 k2 0.00866 0.00617 0.0111 g 0.95340 0.91218 0.9946 a.1 1.06463 0.87979 1.2495 b.1 0.02964 0.02266 0.0366 SD.DMTA_0 2.03611 0.40361 3.6686 SD.k1 0.59534 0.25692 0.9338 SD.k2 0.00042 -73.00540 73.0062 SD.g 1.04234 0.37189 1.7128 AIC_parent_saemix <- saemix::compare.saemix( f_parent_saemix_sfo_const$so, f_parent_saemix_sfo_tc$so, f_parent_saemix_dfop_const$so, f_parent_saemix_dfop_tc$so, f_parent_saemix_dfop_tc_moreiter$so) Likelihoods calculated by importance sampling rownames(AIC_parent_saemix) <- c( \"SFO const\", \"SFO tc\", \"DFOP const\", \"DFOP tc\", \"DFOP tc more iterations\") print(AIC_parent_saemix) AIC BIC SFO const 796.38 795.34 SFO tc 798.38 797.13 DFOP const 705.75 703.88 DFOP tc 665.67 663.59 DFOP tc more iterations 665.85 663.76 f_parent_saemix_dfop_tc$so <- saemix::llgq.saemix(f_parent_saemix_dfop_tc$so) AIC_parent_saemix_methods <- c( is = AIC(f_parent_saemix_dfop_tc$so, method = \"is\"), gq = AIC(f_parent_saemix_dfop_tc$so, method = \"gq\"), lin = AIC(f_parent_saemix_dfop_tc$so, method = \"lin\") ) print(AIC_parent_saemix_methods) is gq lin 665.67 665.74 665.13 f_parent_saemix_dfop_tc_defaults <- mkin::saem(f_parent_mkin_tc[\"DFOP\", ]) f_parent_saemix_dfop_tc_defaults$so <- saemix::llgq.saemix(f_parent_saemix_dfop_tc_defaults$so) AIC_parent_saemix_methods_defaults <- c( is = AIC(f_parent_saemix_dfop_tc_defaults$so, method = \"is\"), gq = AIC(f_parent_saemix_dfop_tc_defaults$so, method = \"gq\"), lin = AIC(f_parent_saemix_dfop_tc_defaults$so, method = \"lin\") ) print(AIC_parent_saemix_methods_defaults) is gq lin 670.09 669.37 671.29"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"comparison","dir":"Articles > Web_only","previous_headings":"Parent degradation","what":"Comparison","title":"Example evaluations of the dimethenamid data from 2018","text":"following table gives AIC values obtained backend packages using control parameters (800 iterations burn-, 300 iterations second phase, 15 chains).","code":"AIC_all <- data.frame( check.names = FALSE, \"Degradation model\" = c(\"SFO\", \"SFO\", \"DFOP\", \"DFOP\"), \"Error model\" = c(\"const\", \"tc\", \"const\", \"tc\"), nlme = c(AIC(f_parent_nlme_sfo_const), AIC(f_parent_nlme_sfo_tc), NA, AIC(f_parent_nlme_dfop_tc)), saemix_lin = sapply(list(f_parent_saemix_sfo_const$so, f_parent_saemix_sfo_tc$so, f_parent_saemix_dfop_const$so, f_parent_saemix_dfop_tc$so), AIC, method = \"lin\"), saemix_is = sapply(list(f_parent_saemix_sfo_const$so, f_parent_saemix_sfo_tc$so, f_parent_saemix_dfop_const$so, f_parent_saemix_dfop_tc$so), AIC, method = \"is\") ) kable(AIC_all)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"conclusion","dir":"Articles > Web_only","previous_headings":"","what":"Conclusion","title":"Example evaluations of the dimethenamid data from 2018","text":"detailed analysis dimethenamid dataset confirmed DFOP model provides appropriate description decline parent compound data. hand, closer inspection results revealed variability k2 parameter across population soils ill-defined. coincides observation parameter robustly quantified soils. Regarding regulatory use data, claimed improved characterisation mean parameter values across population obtained using nonlinear mixed-effects models presented . However, attempts quantify variability slower rate constant biphasic decline dimethenamid indicate data sufficient characterise variability satisfactory precision.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html","id":"session-info","dir":"Articles > Web_only","previous_headings":"","what":"Session Info","title":"Example evaluations of the dimethenamid data from 2018","text":"","code":"sessionInfo() R version 4.4.2 (2024-10-31) Platform: x86_64-pc-linux-gnu Running under: Debian GNU/Linux 12 (bookworm) Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.11.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.11.0 locale: [1] LC_CTYPE=de_DE.UTF-8 LC_NUMERIC=C [3] LC_TIME=C LC_COLLATE=de_DE.UTF-8 [5] LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=de_DE.UTF-8 [7] LC_PAPER=de_DE.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C time zone: Europe/Berlin tzcode source: system (glibc) attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] saemix_3.3 npde_3.5 nlme_3.1-166 mkin_1.2.10 knitr_1.49 loaded via a namespace (and not attached): [1] gtable_0.3.6 jsonlite_1.8.9 dplyr_1.1.4 compiler_4.4.2 [5] tidyselect_1.2.1 parallel_4.4.2 gridExtra_2.3 jquerylib_0.1.4 [9] systemfonts_1.1.0 scales_1.3.0 textshaping_0.4.1 yaml_2.3.10 [13] fastmap_1.2.0 lattice_0.22-6 ggplot2_3.5.1 R6_2.5.1 [17] generics_0.1.3 lmtest_0.9-40 MASS_7.3-61 htmlwidgets_1.6.4 [21] tibble_3.2.1 desc_1.4.3 munsell_0.5.1 bslib_0.8.0 [25] pillar_1.9.0 rlang_1.1.4 utf8_1.2.4 cachem_1.1.0 [29] xfun_0.49 fs_1.6.5 sass_0.4.9 cli_3.6.3 [33] pkgdown_2.1.1 magrittr_2.0.3 digest_0.6.37 grid_4.4.2 [37] mclust_6.1.1 lifecycle_1.0.4 vctrs_0.6.5 evaluate_1.0.1 [41] glue_1.8.0 codetools_0.2-20 ragg_1.3.3 zoo_1.8-12 [45] fansi_1.0.6 colorspace_2.1-1 rmarkdown_2.29 pkgconfig_2.0.3 [49] tools_4.4.2 htmltools_0.5.8.1"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html","id":"test-data","dir":"Articles > Web_only","previous_headings":"","what":"Test data","title":"Benchmark timings for saem.mmkin","text":"Please refer vignette dimethenamid_2018 explanation following preprocessing.","code":"dmta_ds <- lapply(1:7, function(i) { ds_i <- dimethenamid_2018$ds[[i]]$data ds_i[ds_i$name == \"DMTAP\", \"name\"] <- \"DMTA\" ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i] ds_i }) names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title) dmta_ds[[\"Elliot\"]] <- rbind(dmta_ds[[\"Elliot 1\"]], dmta_ds[[\"Elliot 2\"]]) dmta_ds[[\"Elliot 1\"]] <- NULL dmta_ds[[\"Elliot 2\"]] <- NULL"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html","id":"parent-only","dir":"Articles > Web_only","previous_headings":"Test cases","what":"Parent only","title":"Benchmark timings for saem.mmkin","text":"model comparison suggests use SFORB model two-component error. comparison, keep DFOP model two-component error, competes SFORB biphasic curves. two models, random effects transformed parameters k2 k_DMTA_bound_free quantified.","code":"parent_mods <- c(\"SFO\", \"DFOP\", \"SFORB\", \"HS\") parent_sep_const <- mmkin(parent_mods, dmta_ds, quiet = TRUE, cores = n_cores) parent_sep_tc <- update(parent_sep_const, error_model = \"tc\") t1 <- system.time(sfo_const <- saem(parent_sep_const[\"SFO\", ]))[[\"elapsed\"]] t2 <- system.time(dfop_const <- saem(parent_sep_const[\"DFOP\", ]))[[\"elapsed\"]] t3 <- system.time(sforb_const <- saem(parent_sep_const[\"SFORB\", ]))[[\"elapsed\"]] t4 <- system.time(hs_const <- saem(parent_sep_const[\"HS\", ]))[[\"elapsed\"]] t5 <- system.time(sfo_tc <- saem(parent_sep_tc[\"SFO\", ]))[[\"elapsed\"]] t6 <- system.time(dfop_tc <- saem(parent_sep_tc[\"DFOP\", ]))[[\"elapsed\"]] t7 <- system.time(sforb_tc <- saem(parent_sep_tc[\"SFORB\", ]))[[\"elapsed\"]] t8 <- system.time(hs_tc <- saem(parent_sep_tc[\"HS\", ]))[[\"elapsed\"]] anova( sfo_const, dfop_const, sforb_const, hs_const, sfo_tc, dfop_tc, sforb_tc, hs_tc) |> kable(, digits = 1) illparms(dfop_tc) ## [1] \"sd(log_k2)\" illparms(sforb_tc) ## [1] \"sd(log_k_DMTA_bound_free)\""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html","id":"one-metabolite","dir":"Articles > Web_only","previous_headings":"Test cases","what":"One metabolite","title":"Benchmark timings for saem.mmkin","text":"remove parameters found ill-defined parent fits.","code":"one_met_mods <- list( DFOP_SFO = mkinmod( DMTA = mkinsub(\"DFOP\", \"M23\"), M23 = mkinsub(\"SFO\")), SFORB_SFO = mkinmod( DMTA = mkinsub(\"SFORB\", \"M23\"), M23 = mkinsub(\"SFO\"))) one_met_sep_const <- mmkin(one_met_mods, dmta_ds, error_model = \"const\", cores = n_cores, quiet = TRUE) one_met_sep_tc <- mmkin(one_met_mods, dmta_ds, error_model = \"tc\", cores = n_cores, quiet = TRUE) t9 <- system.time(dfop_sfo_tc <- saem(one_met_sep_tc[\"DFOP_SFO\", ], no_random_effect = \"log_k2\"))[[\"elapsed\"]] t10 <- system.time(sforb_sfo_tc <- saem(one_met_sep_tc[\"SFORB_SFO\", ], no_random_effect = \"log_k_DMTA_bound_free\"))[[\"elapsed\"]]"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html","id":"three-metabolites","dir":"Articles > Web_only","previous_headings":"Test cases","what":"Three metabolites","title":"Benchmark timings for saem.mmkin","text":"case three metabolites, keep SFORB model order limit time compiling vignette, fitting parallel may disturb benchmark. , include random effects ill-defined previous fits subsets degradation model.","code":"illparms(sforb_sfo_tc) three_met_mods <- list( SFORB_SFO3_plus = mkinmod( DMTA = mkinsub(\"SFORB\", c(\"M23\", \"M27\", \"M31\")), M23 = mkinsub(\"SFO\"), M27 = mkinsub(\"SFO\"), M31 = mkinsub(\"SFO\", \"M27\", sink = FALSE))) three_met_sep_tc <- mmkin(three_met_mods, dmta_ds, error_model = \"tc\", cores = n_cores, quiet = TRUE) t11 <- system.time(sforb_sfo3_plus_const <- saem(three_met_sep_tc[\"SFORB_SFO3_plus\", ], no_random_effect = \"log_k_DMTA_bound_free\"))[[\"elapsed\"]]"},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html","id":"results","dir":"Articles > Web_only","previous_headings":"","what":"Results","title":"Benchmark timings for saem.mmkin","text":"Benchmarks available error models shown. intended improving mkin, comparing CPUs operating systems. trademarks belong respective owners.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html","id":"parent-only-1","dir":"Articles > Web_only","previous_headings":"Results","what":"Parent only","title":"Benchmark timings for saem.mmkin","text":"Constant variance SFO, DFOP, SFORB HS. Two-component error fits SFO, DFOP, SFORB HS.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html","id":"one-metabolite-1","dir":"Articles > Web_only","previous_headings":"Results","what":"One metabolite","title":"Benchmark timings for saem.mmkin","text":"Two-component error DFOP-SFO SFORB-SFO.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html","id":"three-metabolites-1","dir":"Articles > Web_only","previous_headings":"Results","what":"Three metabolites","title":"Benchmark timings for saem.mmkin","text":"Two-component error SFORB-SFO3-plus","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Johannes Ranke. Author, maintainer, copyright holder. Katrin Lindenberger. Contributor. contributed mkinresplot() René Lehmann. Contributor. ilr() invilr() Eurofins Regulatory AG. Copyright holder. copyright contributions JR 2012-2014","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Ranke J (2025). mkin: Kinetic Evaluation Chemical Degradation Data. R package version 1.2.10, https://pkgdown.jrwb.de/mkin/.","code":"@Manual{, title = {mkin: Kinetic Evaluation of Chemical Degradation Data}, author = {Johannes Ranke}, year = {2025}, note = {R package version 1.2.10}, url = {https://pkgdown.jrwb.de/mkin/}, }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"mkin","dir":"","previous_headings":"","what":"Kinetic Evaluation of Chemical Degradation Data","title":"Kinetic Evaluation of Chemical Degradation Data","text":"R package mkin provides calculation routines analysis chemical degradation data, including multicompartment kinetics needed modelling formation decline transformation products, several degradation compartments involved. provides stable functionality kinetic evaluations according FOCUS guidance (see details). addition, provides functionality hierarchical kinetics based nonlinear mixed-effects models.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Kinetic Evaluation of Chemical Degradation Data","text":"can install latest released version CRAN within R:","code":"install.packages(\"mkin\")"},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"background","dir":"","previous_headings":"","what":"Background","title":"Kinetic Evaluation of Chemical Degradation Data","text":"regulatory evaluation chemical substances like plant protection products (pesticides), biocides chemicals, degradation data play important role. evaluation pesticide degradation experiments, detailed guidance various helpful tools developed detailed ‘Credits historical remarks’ . package aims provide one stop solution degradation kinetics, addressing modellers willing , even prefer work R.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"basic-usage","dir":"","previous_headings":"","what":"Basic usage","title":"Kinetic Evaluation of Chemical Degradation Data","text":"start, look code examples provided plot.mkinfit plot.mmkin, package vignettes FOCUS L FOCUS D.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"documentation","dir":"","previous_headings":"","what":"Documentation","title":"Kinetic Evaluation of Chemical Degradation Data","text":"HTML documentation latest version released CRAN available jrwb.de github. Documentation development version found ‘dev’ subdirectory. articles section documentation, can also find demonstrations application nonlinear hierarchical models, also known nonlinear mixed-effects models, complex data, including transformation products covariates.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"general","dir":"","previous_headings":"Features","what":"General","title":"Kinetic Evaluation of Chemical Degradation Data","text":"Highly flexible model specification using mkinmod, including equilibrium reactions using single first-order reversible binding (SFORB) model, automatically create two state variables observed variable. Model solution (forward modelling) function mkinpredict performed either using analytical solution case parent degradation simple models involving single transformation product, , eigenvalue based solution simple first-order (SFO) SFORB kinetics used model, using numeric solver deSolve package (default lsoda). usual one-sided t-test significant difference zero shown based estimators untransformed parameters. Summary plotting functions. summary mkinfit object fact full report give enough information able approximately reproduce fit tools. chi-squared error level defined FOCUS kinetics guidance (see ) calculated observed variable. ‘variance variable’ error model often fitted using Iteratively Reweighted Least Squares (IRLS) can specified error_model = \"obs\".","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"unique-in-mkin","dir":"","previous_headings":"Features","what":"Unique in mkin","title":"Kinetic Evaluation of Chemical Degradation Data","text":"Three different error models can selected using argument error_model mkinfit function. two-component error model similar one proposed Rocke Lorenzato can selected using argument error_model = \"tc\". Model comparisons using Akaike Information Criterion (AIC) supported can also used non-constant variance. cases FOCUS chi-squared error level meaningful. default, kinetic rate constants kinetic formation fractions transformed internally using transform_odeparms estimators can reasonably expected follow normal distribution. parameter estimates backtransformed match model definition, confidence intervals calculated standard errors also backtransformed correct scale, include meaningless values like negative rate constants formation fractions adding 1, occur single experiment single defined radiolabel position. metabolite decline phase described well SFO kinetics, SFORB kinetics can used metabolite. Mathematically, SFORB model equivalent DFOP model. However, SFORB model advantage mechanistic interpretation model parameters. Nonlinear mixed-effects models (hierarchical models) can created fits degradation model different datasets compound using nlme.mmkin saem.mmkin methods. Note convergence nlme fits depends quality data. Convergence better simple models data many groups (e.g. soils). saem method uses saemix package backend. Analytical solutions suitable use package implemented parent models important models including one metabolite (SFO-SFO DFOP-SFO). Fitting models saem.mmkin, makes use compiled ODE models mkin provides, longer run times (couple minutes hour).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"performance","dir":"","previous_headings":"Features","what":"Performance","title":"Kinetic Evaluation of Chemical Degradation Data","text":"Parallel fitting several models several datasets supported, see example plot.mmkin. C compiler installed, kinetic models compiled automatically generated C code, see vignette compiled_models. autogeneration C code inspired ccSolve package. Thanks Karline Soetaert work . Even compiler installed, many degradation models still give good performance, current versions mkin also analytical solutions models one metabolite, SFO SFORB used parent compound, Eigenvalue based solutions degradation model available.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"gui","dir":"","previous_headings":"","what":"GUI","title":"Kinetic Evaluation of Chemical Degradation Data","text":"graphical user interface may useful. Please refer documentation page installation instructions manual. supports evaluations using (generalised) nonlinear regression, simultaneous fits using nonlinear mixed-effects models.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"news","dir":"","previous_headings":"","what":"News","title":"Kinetic Evaluation of Chemical Degradation Data","text":"list changes latest CRAN release one github branch, e.g. main branch.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"credits-and-historical-remarks","dir":"","previous_headings":"","what":"Credits and historical remarks","title":"Kinetic Evaluation of Chemical Degradation Data","text":"mkin possible without underlying software stack consisting , among others, R package deSolve. previous version, mkin also using functionality FME package. Please refer package page CRAN full list imported suggested R packages. Also, Debian Linux, vim editor Nvim-R plugin invaluable development. mkin written without introduced regulatory fate modelling pesticides Adrian Gurney time Harlan Laboratories Ltd (formerly RCC Ltd). mkin greatly profits largely follows work done FOCUS Degradation Kinetics Workgroup, detailed guidance document 2006, slightly updated 2011 2014. Also, inspired first version KinGUI developed BayerCropScience, based MatLab runtime environment. companion package kinfit (now deprecated) started 2008 first published CRAN 01 May 2010. first mkin code published 11 May 2010 first CRAN version 18 May 2010. 2011, Bayer Crop Science started distribute R based successor KinGUI named KinGUII whose R code based mkin, added, among refinements, closed source graphical user interface (GUI), iteratively reweighted least squares (IRLS) optimisation variance observed variables, Markov Chain Monte Carlo (MCMC) simulation functionality, similar available e.g. FME package. Somewhat parallel, Syngenta sponsored development mkin KinGUII based GUI application called CAKE, also adds IRLS MCMC, limited model formulation, puts weight usability. CAKE available download CAKE website, can also find zip archive R scripts derived mkin, published GPL license. Finally, KineticEval, contains development scripts used KinGUII. Thanks René Lehmann, formerly working Umweltbundesamt, nice cooperation parameter transformations, especially isometric log-ratio transformation now used formation fractions case two transformation targets. Many inspirations improvements mkin resulted kinetic evaluations degradation data clients working Harlan Laboratories Eurofins Regulatory AG, now independent consultant. Funding received Umweltbundesamt course projects Project Number 27452 (Testing validation modelling software alternative ModelMaker 4.0, 2014-2015) Project Number 56703 (Optimization gmkin routine use Umweltbundesamt, 2015) Project Number 92570 (Update Project Number 27452, 2017-2018) Project Number 112407 (Testing feasibility using error model according Rocke Lorenzato realistic parameter estimates kinetic evaluation degradation data, 2018-2019) Project Number 120667 (Development objective criteria evaluation visual fit kinetic evaluation degradation data, 2019-2020) Project Number 146839 (Checking feasibility using mixed-effects models derivation kinetic modelling parameters degradation studies, 2020-2021) Project Number 173340 (Application nonlinear hierarchical models kinetic evaluation chemical degradation data) Thanks everyone involved collaboration support! Thanks due also Emmanuelle Comets, maintainer saemix package, interest support using SAEM algorithm implementation saemix evaluation chemical degradation data. Regarding application nonlinear mixed-effects models degradation data, von Götz et al (1999) already proposed use technique context environmental risk assessments pesticides. However, work apparently followed , independently arrive idea missed cite previous work topic first publications.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/index.html","id":"development","dir":"","previous_headings":"","what":"Development","title":"Kinetic Evaluation of Chemical Degradation Data","text":"Contributions welcome!","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/AIC.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate the AIC for a column of an mmkin object — AIC.mmkin","title":"Calculate the AIC for a column of an mmkin object — AIC.mmkin","text":"Provides convenient way compare different kinetic models fitted dataset.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/AIC.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate the AIC for a column of an mmkin object — AIC.mmkin","text":"","code":"# S3 method for class 'mmkin' AIC(object, ..., k = 2) # S3 method for class 'mmkin' BIC(object, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/AIC.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate the AIC for a column of an mmkin object — AIC.mmkin","text":"object object class mmkin, containing one column. ... compatibility generic method k generic method","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/AIC.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate the AIC for a column of an mmkin object — AIC.mmkin","text":"generic method (numeric value single fits, dataframe several fits column).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/AIC.mmkin.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculate the AIC for a column of an mmkin object — AIC.mmkin","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/AIC.mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate the AIC for a column of an mmkin object — AIC.mmkin","text":"","code":"# skip, as it takes > 10 s on winbuilder f <- mmkin(c(\"SFO\", \"FOMC\", \"DFOP\"), list(\"FOCUS A\" = FOCUS_2006_A, \"FOCUS C\" = FOCUS_2006_C), cores = 1, quiet = TRUE) #> Warning: Optimisation did not converge: #> false convergence (8) # We get a warning because the FOMC model does not converge for the # FOCUS A dataset, as it is well described by SFO AIC(f[\"SFO\", \"FOCUS A\"]) # We get a single number for a single fit #> [1] 55.28197 AIC(f[[\"SFO\", \"FOCUS A\"]]) # or when extracting an mkinfit object #> [1] 55.28197 # For FOCUS A, the models fit almost equally well, so the higher the number # of parameters, the higher (worse) the AIC AIC(f[, \"FOCUS A\"]) #> df AIC #> SFO 3 55.28197 #> FOMC 4 57.28198 #> DFOP 5 59.28197 AIC(f[, \"FOCUS A\"], k = 0) # If we do not penalize additional parameters, we get nearly the same #> df AIC #> SFO 3 49.28197 #> FOMC 4 49.28198 #> DFOP 5 49.28197 BIC(f[, \"FOCUS A\"]) # Comparing the BIC gives a very similar picture #> df BIC #> SFO 3 55.52030 #> FOMC 4 57.59974 #> DFOP 5 59.67918 # For FOCUS C, the more complex models fit better AIC(f[, \"FOCUS C\"]) #> df AIC #> SFO 3 59.29336 #> FOMC 4 44.68652 #> DFOP 5 29.02372 BIC(f[, \"FOCUS C\"]) #> df BIC #> SFO 3 59.88504 #> FOMC 4 45.47542 #> DFOP 5 30.00984"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/CAKE_export.html","id":null,"dir":"Reference","previous_headings":"","what":"Export a list of datasets format to a CAKE study file — CAKE_export","title":"Export a list of datasets format to a CAKE study file — CAKE_export","text":"addition datasets, pathways degradation model can specified well.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/CAKE_export.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Export a list of datasets format to a CAKE study file — CAKE_export","text":"","code":"CAKE_export( ds, map = c(parent = \"Parent\"), links = NA, filename = \"CAKE_export.csf\", path = \".\", overwrite = FALSE, study = \"Degradinol aerobic soil degradation\", description = \"\", time_unit = \"days\", res_unit = \"% AR\", comment = \"\", date = Sys.Date(), optimiser = \"IRLS\" )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/CAKE_export.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Export a list of datasets format to a CAKE study file — CAKE_export","text":"ds named list datasets long format compatible mkinfit. map character vector CAKE compartment names (Parent, A1, ...), named names used list datasets. links optional character vector target compartments, named names source compartments. order make easier, names used datasets supplied. filename write result. end .csf order compatible CAKE. path optional path output file. overwrite TRUE, existing files overwritten. study name study. description optional description. time_unit time unit residue data. res_unit unit used residues. comment optional comment. date date file creation. optimiser Can OLS IRLS.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/CAKE_export.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Export a list of datasets format to a CAKE study file — CAKE_export","text":"function called side effect.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/CAKE_export.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Export a list of datasets format to a CAKE study file — CAKE_export","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/D24_2014.html","id":null,"dir":"Reference","previous_headings":"","what":"Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 — D24_2014","title":"Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 — D24_2014","text":"five datasets extracted active substance evaluation dossier published EFSA. Kinetic evaluations shown datasets intended illustrate advance kinetic modelling. fact data results shown imply license use context pesticide registrations, use data may constrained data protection regulations.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/D24_2014.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 — D24_2014","text":"","code":"D24_2014"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/D24_2014.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 — D24_2014","text":"mkindsg object grouping five datasets","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/D24_2014.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 — D24_2014","text":"Hellenic Ministry Rural Development Agriculture (2014) Final addendum Renewal Assessment Report - public version - 2,4-D Volume 3 Annex B.8 Fate behaviour environment https://open.efsa.europa.eu/study-inventory/EFSA-Q-2013-00811","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/D24_2014.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 — D24_2014","text":"Data first dataset p. 685. Data four datasets used preprocessed versions given kinetics section (p. 761ff.), exception residues smaller 1 DCP soil Site I2, values given p. 694 used. R code used create data object installed package 'dataset_generation' directory. code, page numbers given specific pieces information comments.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/D24_2014.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 — D24_2014","text":"","code":"print(D24_2014) #> holding 5 mkinds objects #> Title $title: Aerobic soil degradation data on 2,4-D from the EU assessment in 2014 #> Occurrence of observed compounds $observed_n: #> D24 DCP DCA #> 5 4 4 #> Time normalisation factors $f_time_norm: #> [1] 1.6062378 0.7118732 0.7156063 0.7156063 0.8977124 #> Meta information $meta: #> study usda_soil_type study_moisture_ref_type #> Mississippi Cohen 1991 Silt loam #> Fayette Liu and Adelfinskaya 2011 Silt loam pF1 #> RefSol 03-G Liu and Adelfinskaya 2011 Loam pF1 #> Site E1 Liu and Adelfinskaya 2011 Loam pF1 #> Site I2 Liu and Adelfinskaya 2011 Loamy sand pF1 #> rel_moisture temperature #> Mississippi NA 25 #> Fayette 0.5 20 #> RefSol 03-G 0.5 20 #> Site E1 0.5 20 #> Site I2 0.5 20 # \\dontrun{ print(D24_2014$ds[[1]], data = TRUE) #> with $title: Mississippi #> Observed compounds $observed: D24 #> Sampling times $sampling_times: #> 0, 2, 4, 7, 15, 24, 35, 56, 71, 114, 183, 273, 365 #> With a maximum of 1 replicates #> time D24 #> 1 0 96.8 #> 2 2 81.0 #> 3 4 81.7 #> 4 7 88.2 #> 5 15 66.3 #> 6 24 72.9 #> 7 35 62.6 #> 8 56 54.6 #> 9 71 35.2 #> 10 114 18.0 #> 11 183 11.3 #> 12 273 9.9 #> 13 365 6.3 m_D24 = mkinmod(D24 = mkinsub(\"SFO\", to = \"DCP\"), DCP = mkinsub(\"SFO\", to = \"DCA\"), DCA = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded print(m_D24) #> model generated with #> Use of formation fractions $use_of_ff: max #> Specification $spec: #> $D24 #> $type: SFO; $to: DCP; $sink: TRUE #> $DCP #> $type: SFO; $to: DCA; $sink: TRUE #> $DCA #> $type: SFO; $sink: TRUE #> Coefficient matrix $coefmat available #> Compiled model $cf available #> Differential equations: #> d_D24/dt = - k_D24 * D24 #> d_DCP/dt = + f_D24_to_DCP * k_D24 * D24 - k_DCP * DCP #> d_DCA/dt = + f_DCP_to_DCA * k_DCP * DCP - k_DCA * DCA m_D24_2 = mkinmod(D24 = mkinsub(\"DFOP\", to = \"DCP\"), DCP = mkinsub(\"SFO\", to = \"DCA\"), DCA = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded print(m_D24_2) #> model generated with #> Use of formation fractions $use_of_ff: max #> Specification $spec: #> $D24 #> $type: DFOP; $to: DCP; $sink: TRUE #> $DCP #> $type: SFO; $to: DCA; $sink: TRUE #> $DCA #> $type: SFO; $sink: TRUE #> Compiled model $cf available #> Differential equations: #> d_D24/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * #> time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) #> * D24 #> d_DCP/dt = + f_D24_to_DCP * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * #> exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 #> * time))) * D24 - k_DCP * DCP #> d_DCA/dt = + f_DCP_to_DCA * k_DCP * DCP - k_DCA * DCA # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/DFOP.solution.html","id":null,"dir":"Reference","previous_headings":"","what":"Double First-Order in Parallel kinetics — DFOP.solution","title":"Double First-Order in Parallel kinetics — DFOP.solution","text":"Function describing decline defined starting value using sum two exponential decline functions.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/DFOP.solution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Double First-Order in Parallel kinetics — DFOP.solution","text":"","code":"DFOP.solution(t, parent_0, k1, k2, g)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/DFOP.solution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Double First-Order in Parallel kinetics — DFOP.solution","text":"t Time. parent_0 Starting value response variable time zero. k1 First kinetic constant. k2 Second kinetic constant. g Fraction starting value declining according first kinetic constant.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/DFOP.solution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Double First-Order in Parallel kinetics — DFOP.solution","text":"value response variable time t.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/DFOP.solution.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Double First-Order in Parallel kinetics — DFOP.solution","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics FOCUS (2014) “Generic guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, Version 1.1, 18 December 2014 http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/DFOP.solution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Double First-Order in Parallel kinetics — DFOP.solution","text":"","code":"plot(function(x) DFOP.solution(x, 100, 5, 0.5, 0.3), 0, 4, ylim = c(0,100))"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/Extract.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Subsetting method for mmkin objects — [.mmkin","title":"Subsetting method for mmkin objects — [.mmkin","text":"Subsetting method mmkin objects","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/Extract.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Subsetting method for mmkin objects — [.mmkin","text":"","code":"# S3 method for class 'mmkin' x[i, j, ..., drop = FALSE]"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/Extract.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Subsetting method for mmkin objects — [.mmkin","text":"x mmkin object Row index selecting fits specific models j Column index selecting fits specific datasets ... used, satisfy generic method definition drop FALSE, method always returns mmkin object, otherwise either list mkinfit objects single mkinfit object.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/Extract.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Subsetting method for mmkin objects — [.mmkin","text":"object class mmkin.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/Extract.mmkin.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Subsetting method for mmkin objects — [.mmkin","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/Extract.mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Subsetting method for mmkin objects — [.mmkin","text":"","code":"# Only use one core, to pass R CMD check --as-cran fits <- mmkin(c(\"SFO\", \"FOMC\"), list(B = FOCUS_2006_B, C = FOCUS_2006_C), cores = 1, quiet = TRUE) fits[\"FOMC\", ] #> object #> Status of individual fits: #> #> dataset #> model B C #> FOMC OK OK #> #> OK: No warnings fits[, \"B\"] #> object #> Status of individual fits: #> #> dataset #> model B #> SFO OK #> FOMC OK #> #> OK: No warnings fits[\"SFO\", \"B\"] #> object #> Status of individual fits: #> #> dataset #> model B #> SFO OK #> #> OK: No warnings head( # This extracts an mkinfit object with lots of components fits[[\"FOMC\", \"B\"]] ) #> $par #> parent_0 log_alpha log_beta sigma #> 99.666192 2.549850 5.050587 1.890202 #> #> $objective #> [1] 28.58291 #> #> $convergence #> [1] 0 #> #> $iterations #> [1] 21 #> #> $evaluations #> function gradient #> 25 78 #> #> $message #> [1] \"both X-convergence and relative convergence (5)\" #>"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html","id":null,"dir":"Reference","previous_headings":"","what":"Results of fitting the DFOP model to Datasets A to B of FOCUS (2006) — FOCUS_2006_DFOP_ref_A_to_B","title":"Results of fitting the DFOP model to Datasets A to B of FOCUS (2006) — FOCUS_2006_DFOP_ref_A_to_B","text":"table fitted parameters resulting DT50 DT90 values generated different software packages. Taken directly FOCUS (2006). results fitting data Topfit software removed, initial concentration parent compound fixed value 100 fit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Results of fitting the DFOP model to Datasets A to B of FOCUS (2006) — FOCUS_2006_DFOP_ref_A_to_B","text":"","code":"FOCUS_2006_DFOP_ref_A_to_B"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Results of fitting the DFOP model to Datasets A to B of FOCUS (2006) — FOCUS_2006_DFOP_ref_A_to_B","text":"data frame containing following variables. package factor giving name software package M0 fitted initial concentration parent compound f fitted f parameter k1 fitted k1 parameter k2 fitted k2 parameter DT50 resulting half-life parent compound DT90 resulting DT90 parent compound dataset FOCUS dataset used","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Results of fitting the DFOP model to Datasets A to B of FOCUS (2006) — FOCUS_2006_DFOP_ref_A_to_B","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Results of fitting the DFOP model to Datasets A to B of FOCUS (2006) — FOCUS_2006_DFOP_ref_A_to_B","text":"","code":"data(FOCUS_2006_DFOP_ref_A_to_B)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html","id":null,"dir":"Reference","previous_headings":"","what":"Results of fitting the FOMC model to Datasets A to F of FOCUS (2006) — FOCUS_2006_FOMC_ref_A_to_F","title":"Results of fitting the FOMC model to Datasets A to F of FOCUS (2006) — FOCUS_2006_FOMC_ref_A_to_F","text":"table fitted parameters resulting DT50 DT90 values generated different software packages. Taken directly FOCUS (2006). results fitting data Topfit software removed, initial concentration parent compound fixed value 100 fit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Results of fitting the FOMC model to Datasets A to F of FOCUS (2006) — FOCUS_2006_FOMC_ref_A_to_F","text":"","code":"FOCUS_2006_FOMC_ref_A_to_F"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Results of fitting the FOMC model to Datasets A to F of FOCUS (2006) — FOCUS_2006_FOMC_ref_A_to_F","text":"data frame containing following variables. package factor giving name software package M0 fitted initial concentration parent compound alpha fitted alpha parameter beta fitted beta parameter DT50 resulting half-life parent compound DT90 resulting DT90 parent compound dataset FOCUS dataset used","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Results of fitting the FOMC model to Datasets A to F of FOCUS (2006) — FOCUS_2006_FOMC_ref_A_to_F","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Results of fitting the FOMC model to Datasets A to F of FOCUS (2006) — FOCUS_2006_FOMC_ref_A_to_F","text":"","code":"data(FOCUS_2006_FOMC_ref_A_to_F)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_HS_ref_A_to_F.html","id":null,"dir":"Reference","previous_headings":"","what":"Results of fitting the HS model to Datasets A to F of FOCUS (2006) — FOCUS_2006_HS_ref_A_to_F","title":"Results of fitting the HS model to Datasets A to F of FOCUS (2006) — FOCUS_2006_HS_ref_A_to_F","text":"table fitted parameters resulting DT50 DT90 values generated different software packages. Taken directly FOCUS (2006). results fitting data Topfit software removed, initial concentration parent compound fixed value 100 fit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_HS_ref_A_to_F.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Results of fitting the HS model to Datasets A to F of FOCUS (2006) — FOCUS_2006_HS_ref_A_to_F","text":"","code":"FOCUS_2006_HS_ref_A_to_F"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_HS_ref_A_to_F.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Results of fitting the HS model to Datasets A to F of FOCUS (2006) — FOCUS_2006_HS_ref_A_to_F","text":"data frame containing following variables. package factor giving name software package M0 fitted initial concentration parent compound tb fitted tb parameter k1 fitted k1 parameter k2 fitted k2 parameter DT50 resulting half-life parent compound DT90 resulting DT90 parent compound dataset FOCUS dataset used","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_HS_ref_A_to_F.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Results of fitting the HS model to Datasets A to F of FOCUS (2006) — FOCUS_2006_HS_ref_A_to_F","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_HS_ref_A_to_F.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Results of fitting the HS model to Datasets A to F of FOCUS (2006) — FOCUS_2006_HS_ref_A_to_F","text":"","code":"data(FOCUS_2006_HS_ref_A_to_F)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html","id":null,"dir":"Reference","previous_headings":"","what":"Results of fitting the SFO model to Datasets A to F of FOCUS (2006) — FOCUS_2006_SFO_ref_A_to_F","title":"Results of fitting the SFO model to Datasets A to F of FOCUS (2006) — FOCUS_2006_SFO_ref_A_to_F","text":"table fitted parameters resulting DT50 DT90 values generated different software packages. Taken directly FOCUS (2006). results fitting data Topfit software removed, initial concentration parent compound fixed value 100 fit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Results of fitting the SFO model to Datasets A to F of FOCUS (2006) — FOCUS_2006_SFO_ref_A_to_F","text":"","code":"FOCUS_2006_SFO_ref_A_to_F"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Results of fitting the SFO model to Datasets A to F of FOCUS (2006) — FOCUS_2006_SFO_ref_A_to_F","text":"data frame containing following variables. package factor giving name software package M0 fitted initial concentration parent compound k fitted first-order degradation rate constant DT50 resulting half-life parent compound DT90 resulting DT90 parent compound dataset FOCUS dataset used","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Results of fitting the SFO model to Datasets A to F of FOCUS (2006) — FOCUS_2006_SFO_ref_A_to_F","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Results of fitting the SFO model to Datasets A to F of FOCUS (2006) — FOCUS_2006_SFO_ref_A_to_F","text":"","code":"data(FOCUS_2006_SFO_ref_A_to_F)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_datasets.html","id":null,"dir":"Reference","previous_headings":"","what":"Datasets A to F from the FOCUS Kinetics report from 2006 — FOCUS_2006_datasets","title":"Datasets A to F from the FOCUS Kinetics report from 2006 — FOCUS_2006_datasets","text":"Data taken FOCUS (2006), p. 258.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_datasets.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Datasets A to F from the FOCUS Kinetics report from 2006 — FOCUS_2006_datasets","text":"","code":"FOCUS_2006_A FOCUS_2006_B FOCUS_2006_C FOCUS_2006_D FOCUS_2006_E FOCUS_2006_F"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_datasets.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Datasets A to F from the FOCUS Kinetics report from 2006 — FOCUS_2006_datasets","text":"6 datasets observations following variables. name factor containing name observed variable time numeric vector containing time points value numeric vector containing concentrations percent applied radioactivity","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_datasets.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Datasets A to F from the FOCUS Kinetics report from 2006 — FOCUS_2006_datasets","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_datasets.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Datasets A to F from the FOCUS Kinetics report from 2006 — FOCUS_2006_datasets","text":"","code":"FOCUS_2006_C #> name time value #> 1 parent 0 85.1 #> 2 parent 1 57.9 #> 3 parent 3 29.9 #> 4 parent 7 14.6 #> 5 parent 14 9.7 #> 6 parent 28 6.6 #> 7 parent 63 4.0 #> 8 parent 91 3.9 #> 9 parent 119 0.6"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html","id":null,"dir":"Reference","previous_headings":"","what":"First-Order Multi-Compartment kinetics — FOMC.solution","title":"First-Order Multi-Compartment kinetics — FOMC.solution","text":"Function describing exponential decline defined starting value, decreasing rate constant.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"First-Order Multi-Compartment kinetics — FOMC.solution","text":"","code":"FOMC.solution(t, parent_0, alpha, beta)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"First-Order Multi-Compartment kinetics — FOMC.solution","text":"t Time. parent_0 Starting value response variable time zero. alpha Shape parameter determined coefficient variation rate constant values. beta Location parameter.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"First-Order Multi-Compartment kinetics — FOMC.solution","text":"value response variable time t.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"First-Order Multi-Compartment kinetics — FOMC.solution","text":"form given differs slightly original reference Gustafson Holden (1990). parameter beta corresponds 1/beta original equation.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"First-Order Multi-Compartment kinetics — FOMC.solution","text":"solution FOMC kinetic model reduces SFO.solution large values alpha beta \\(k = \\frac{\\beta}{\\alpha}\\).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"First-Order Multi-Compartment kinetics — FOMC.solution","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics FOCUS (2014) “Generic guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, Version 1.1, 18 December 2014 http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics Gustafson DI Holden LR (1990) Nonlinear pesticide dissipation soil: new model based spatial variability. Environmental Science Technology 24, 1032-1038","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"First-Order Multi-Compartment kinetics — FOMC.solution","text":"","code":"plot(function(x) FOMC.solution(x, 100, 10, 2), 0, 2, ylim = c(0, 100))"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/HS.solution.html","id":null,"dir":"Reference","previous_headings":"","what":"Hockey-Stick kinetics — HS.solution","title":"Hockey-Stick kinetics — HS.solution","text":"Function describing two exponential decline functions break point .","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/HS.solution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Hockey-Stick kinetics — HS.solution","text":"","code":"HS.solution(t, parent_0, k1, k2, tb)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/HS.solution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Hockey-Stick kinetics — HS.solution","text":"t Time. parent_0 Starting value response variable time zero. k1 First kinetic constant. k2 Second kinetic constant. tb Break point. time, exponential decline according k1 calculated, time, exponential decline proceeds according k2.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/HS.solution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Hockey-Stick kinetics — HS.solution","text":"value response variable time t.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/HS.solution.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Hockey-Stick kinetics — HS.solution","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics FOCUS (2014) “Generic guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, Version 1.1, 18 December 2014 http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/HS.solution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Hockey-Stick kinetics — HS.solution","text":"","code":"plot(function(x) HS.solution(x, 100, 2, 0.3, 0.5), 0, 2, ylim=c(0,100))"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/IORE.solution.html","id":null,"dir":"Reference","previous_headings":"","what":"Indeterminate order rate equation kinetics — IORE.solution","title":"Indeterminate order rate equation kinetics — IORE.solution","text":"Function describing exponential decline defined starting value, concentration dependent rate constant.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/IORE.solution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Indeterminate order rate equation kinetics — IORE.solution","text":"","code":"IORE.solution(t, parent_0, k__iore, N)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/IORE.solution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Indeterminate order rate equation kinetics — IORE.solution","text":"t Time. parent_0 Starting value response variable time zero. k__iore Rate constant. Note depends concentration units used. N Exponent describing nonlinearity rate equation","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/IORE.solution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Indeterminate order rate equation kinetics — IORE.solution","text":"value response variable time t.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/IORE.solution.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Indeterminate order rate equation kinetics — IORE.solution","text":"solution IORE kinetic model reduces SFO.solution N = 1. parameters IORE model can transformed equivalent parameters FOMC mode - see NAFTA guidance details.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/IORE.solution.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Indeterminate order rate equation kinetics — IORE.solution","text":"NAFTA Technical Working Group Pesticides (dated) Guidance Evaluating Calculating Degradation Kinetics Environmental Media","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/IORE.solution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Indeterminate order rate equation kinetics — IORE.solution","text":"","code":"plot(function(x) IORE.solution(x, 100, 0.2, 1.3), 0, 2, ylim = c(0, 100)) # \\dontrun{ fit.fomc <- mkinfit(\"FOMC\", FOCUS_2006_C, quiet = TRUE) fit.iore <- mkinfit(\"IORE\", FOCUS_2006_C, quiet = TRUE) fit.iore.deS <- mkinfit(\"IORE\", FOCUS_2006_C, solution_type = \"deSolve\", quiet = TRUE) #> Error in is.loaded(initfunc, PACKAGE = dllname, type = \"\") : #> invalid 'PACKAGE' argument print(data.frame(fit.fomc$par, fit.iore$par, fit.iore.deS$par, row.names = paste(\"model par\", 1:4))) #> fit.fomc.par fit.iore.par fit.iore.deS.par #> model par 1 85.87489063 85.874890 85.874890 #> model par 2 0.05192238 -4.826631 -4.826631 #> model par 3 0.65096665 1.949403 1.949403 #> model par 4 1.85744396 1.857444 1.857444 print(rbind(fomc = endpoints(fit.fomc)$distimes, iore = endpoints(fit.iore)$distimes, iore.deS = endpoints(fit.iore)$distimes)) #> DT50 DT90 DT50back #> fomc 1.785233 15.1479 4.559973 #> iore 1.785233 15.1479 4.559973 #> iore.deS 1.785233 15.1479 4.559973 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_2015.html","id":null,"dir":"Reference","previous_headings":"","what":"Example datasets from the NAFTA SOP published 2015 — NAFTA_SOP_2015","title":"Example datasets from the NAFTA SOP published 2015 — NAFTA_SOP_2015","text":"Data taken US EPA (2015), p. 19 23.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_2015.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Example datasets from the NAFTA SOP published 2015 — NAFTA_SOP_2015","text":"","code":"NAFTA_SOP_Appendix_B NAFTA_SOP_Appendix_D"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_2015.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Example datasets from the NAFTA SOP published 2015 — NAFTA_SOP_2015","text":"2 datasets observations following variables. name factor containing name observed variable time numeric vector containing time points value numeric vector containing concentrations","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_2015.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Example datasets from the NAFTA SOP published 2015 — NAFTA_SOP_2015","text":"NAFTA (2011) Guidance evaluating calculating degradation kinetics environmental media. NAFTA Technical Working Group Pesticides https://www.epa.gov/pesticide-science--assessing-pesticide-risks/guidance-evaluating--calculating-degradation accessed 2019-02-22 US EPA (2015) Standard Operating Procedure Using NAFTA Guidance Calculate Representative Half-life Values Characterizing Pesticide Degradation https://www.epa.gov/pesticide-science--assessing-pesticide-risks/standard-operating-procedure-using-nafta-guidance","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_2015.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Example datasets from the NAFTA SOP published 2015 — NAFTA_SOP_2015","text":"","code":"nafta_evaluation <- nafta(NAFTA_SOP_Appendix_D, cores = 1) #> The SFO model is rejected as S_SFO is equal or higher than the critical value S_c #> The representative half-life of the IORE model is longer than the one corresponding #> to the terminal degradation rate found with the DFOP model. #> The representative half-life obtained from the DFOP model may be used print(nafta_evaluation) #> Sums of squares: #> SFO IORE DFOP #> 1378.6832 615.7730 517.8836 #> #> Critical sum of squares for checking the SFO model: #> [1] 717.4598 #> #> Parameters: #> $SFO #> Estimate Pr(>t) Lower Upper #> parent_0 83.7558 1.80e-14 77.18268 90.3288 #> k_parent 0.0017 7.43e-05 0.00112 0.0026 #> sigma 8.7518 1.22e-05 5.64278 11.8608 #> #> $IORE #> Estimate Pr(>t) Lower Upper #> parent_0 9.69e+01 NA 8.88e+01 1.05e+02 #> k__iore_parent 8.40e-14 NA 1.79e-18 3.94e-09 #> N_parent 6.68e+00 NA 4.19e+00 9.17e+00 #> sigma 5.85e+00 NA 3.76e+00 7.94e+00 #> #> $DFOP #> Estimate Pr(>t) Lower Upper #> parent_0 9.76e+01 1.94e-13 9.02e+01 1.05e+02 #> k1 4.24e-02 5.92e-03 2.03e-02 8.88e-02 #> k2 8.24e-04 6.48e-03 3.89e-04 1.75e-03 #> g 2.88e-01 2.47e-05 1.95e-01 4.03e-01 #> sigma 5.36e+00 2.22e-05 3.43e+00 7.30e+00 #> #> #> DTx values: #> DT50 DT90 DT50_rep #> SFO 407 1350 407 #> IORE 541 5190000 1560000 #> DFOP 429 2380 841 #> #> Representative half-life: #> [1] 841.41 plot(nafta_evaluation)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_Attachment.html","id":null,"dir":"Reference","previous_headings":"","what":"Example datasets from Attachment 1 to the NAFTA SOP published 2015 — NAFTA_SOP_Attachment","title":"Example datasets from Attachment 1 to the NAFTA SOP published 2015 — NAFTA_SOP_Attachment","text":"Data taken Attachment 1 SOP.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_Attachment.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Example datasets from Attachment 1 to the NAFTA SOP published 2015 — NAFTA_SOP_Attachment","text":"","code":"NAFTA_SOP_Attachment"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_Attachment.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Example datasets from Attachment 1 to the NAFTA SOP published 2015 — NAFTA_SOP_Attachment","text":"list (NAFTA_SOP_Attachment) containing 16 datasets suitable evaluation nafta","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_Attachment.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Example datasets from Attachment 1 to the NAFTA SOP published 2015 — NAFTA_SOP_Attachment","text":"NAFTA (2011) Guidance evaluating calculating degradation kinetics environmental media. NAFTA Technical Working Group Pesticides https://www.epa.gov/pesticide-science--assessing-pesticide-risks/guidance-evaluating--calculating-degradation accessed 2019-02-22 US EPA (2015) Standard Operating Procedure Using NAFTA Guidance Calculate Representative Half-life Values Characterizing Pesticide Degradation https://www.epa.gov/pesticide-science--assessing-pesticide-risks/standard-operating-procedure-using-nafta-guidance","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_Attachment.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Example datasets from Attachment 1 to the NAFTA SOP published 2015 — NAFTA_SOP_Attachment","text":"","code":"nafta_att_p5a <- nafta(NAFTA_SOP_Attachment[[\"p5a\"]], cores = 1) #> The SFO model is rejected as S_SFO is equal or higher than the critical value S_c #> The half-life obtained from the IORE model may be used print(nafta_att_p5a) #> Sums of squares: #> SFO IORE DFOP #> 465.21753 56.27506 32.06401 #> #> Critical sum of squares for checking the SFO model: #> [1] 64.4304 #> #> Parameters: #> $SFO #> Estimate Pr(>t) Lower Upper #> parent_0 95.8401 4.67e-21 92.245 99.4357 #> k_parent 0.0102 3.92e-12 0.009 0.0117 #> sigma 4.8230 3.81e-06 3.214 6.4318 #> #> $IORE #> Estimate Pr(>t) Lower Upper #> parent_0 1.01e+02 NA 9.91e+01 1.02e+02 #> k__iore_parent 1.54e-05 NA 4.08e-06 5.84e-05 #> N_parent 2.57e+00 NA 2.25e+00 2.89e+00 #> sigma 1.68e+00 NA 1.12e+00 2.24e+00 #> #> $DFOP #> Estimate Pr(>t) Lower Upper #> parent_0 9.99e+01 1.41e-26 98.8116 101.0810 #> k1 2.67e-02 5.05e-06 0.0243 0.0295 #> k2 3.41e-12 5.00e-01 0.0000 Inf #> g 6.47e-01 3.67e-06 0.6248 0.6677 #> sigma 1.27e+00 8.91e-06 0.8395 1.6929 #> #> #> DTx values: #> DT50 DT90 DT50_rep #> SFO 67.7 2.25e+02 6.77e+01 #> IORE 58.2 1.07e+03 3.22e+02 #> DFOP 55.5 3.70e+11 2.03e+11 #> #> Representative half-life: #> [1] 321.51 plot(nafta_att_p5a)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFO.solution.html","id":null,"dir":"Reference","previous_headings":"","what":"Single First-Order kinetics — SFO.solution","title":"Single First-Order kinetics — SFO.solution","text":"Function describing exponential decline defined starting value.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFO.solution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Single First-Order kinetics — SFO.solution","text":"","code":"SFO.solution(t, parent_0, k)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFO.solution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Single First-Order kinetics — SFO.solution","text":"t Time. parent_0 Starting value response variable time zero. k Kinetic rate constant.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFO.solution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Single First-Order kinetics — SFO.solution","text":"value response variable time t.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFO.solution.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Single First-Order kinetics — SFO.solution","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics FOCUS (2014) “Generic guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, Version 1.1, 18 December 2014 http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFO.solution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Single First-Order kinetics — SFO.solution","text":"","code":"plot(function(x) SFO.solution(x, 100, 3), 0, 2)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFORB.solution.html","id":null,"dir":"Reference","previous_headings":"","what":"Single First-Order Reversible Binding kinetics — SFORB.solution","title":"Single First-Order Reversible Binding kinetics — SFORB.solution","text":"Function describing solution differential equations describing kinetic model first-order terms two-way transfer free bound fraction, first-order degradation term free fraction. initial condition defined amount free fraction substance bound fraction.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFORB.solution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Single First-Order Reversible Binding kinetics — SFORB.solution","text":"","code":"SFORB.solution(t, parent_0, k_12, k_21, k_1output)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFORB.solution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Single First-Order Reversible Binding kinetics — SFORB.solution","text":"t Time. parent_0 Starting value response variable time zero. k_12 Kinetic constant describing transfer free bound. k_21 Kinetic constant describing transfer bound free. k_1output Kinetic constant describing degradation free fraction.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFORB.solution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Single First-Order Reversible Binding kinetics — SFORB.solution","text":"value response variable, sum free bound fractions time t.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFORB.solution.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Single First-Order Reversible Binding kinetics — SFORB.solution","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics FOCUS (2014) “Generic guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, Version 1.1, 18 December 2014 http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/SFORB.solution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Single First-Order Reversible Binding kinetics — SFORB.solution","text":"","code":"plot(function(x) SFORB.solution(x, 100, 0.5, 2, 3), 0, 2)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/add_err.html","id":null,"dir":"Reference","previous_headings":"","what":"Add normally distributed errors to simulated kinetic degradation data — add_err","title":"Add normally distributed errors to simulated kinetic degradation data — add_err","text":"Normally distributed errors added data predicted specific degradation model using mkinpredict. variance error may depend predicted value specified standard deviation.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/add_err.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add normally distributed errors to simulated kinetic degradation data — add_err","text":"","code":"add_err( prediction, sdfunc, secondary = c(\"M1\", \"M2\"), n = 10, LOD = 0.1, reps = 2, digits = 1, seed = NA )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/add_err.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add normally distributed errors to simulated kinetic degradation data — add_err","text":"prediction prediction kinetic model produced mkinpredict. sdfunc function taking predicted value argument returning standard deviation used generating random error terms value. secondary names state variables initial value zero n number datasets generated. LOD limit detection (LOD). Values LOD adding random error set NA. reps number replicates generated within datasets. digits number digits values rounded. seed seed used generation random numbers. NA, seed set.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/add_err.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add normally distributed errors to simulated kinetic degradation data — add_err","text":"list datasets compatible mmkin, .e. components list datasets compatible mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/add_err.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Add normally distributed errors to simulated kinetic degradation data — add_err","text":"Ranke J Lehmann R (2015) t-test t-test, question. XV Symposium Pesticide Chemistry 2-4 September 2015, Piacenza, Italy https://jrwb.de/posters/piacenza_2015.pdf","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/add_err.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Add normally distributed errors to simulated kinetic degradation data — add_err","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/add_err.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add normally distributed errors to simulated kinetic degradation data — add_err","text":"","code":"# The kinetic model m_SFO_SFO <- mkinmod(parent = mkinsub(\"SFO\", \"M1\"), M1 = mkinsub(\"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded # Generate a prediction for a specific set of parameters sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) # This is the prediction used for the \"Type 2 datasets\" on the Piacenza poster # from 2015 d_SFO_SFO <- mkinpredict(m_SFO_SFO, c(k_parent = 0.1, f_parent_to_M1 = 0.5, k_M1 = log(2)/1000), c(parent = 100, M1 = 0), sampling_times) # Add an error term with a constant (independent of the value) standard deviation # of 10, and generate three datasets d_SFO_SFO_err <- add_err(d_SFO_SFO, function(x) 10, n = 3, seed = 123456789 ) # Name the datasets for nicer plotting names(d_SFO_SFO_err) <- paste(\"Dataset\", 1:3) # Name the model in the list of models (with only one member in this case) for # nicer plotting later on. Be quiet and use only one core not to offend CRAN # checks # \\dontrun{ f_SFO_SFO <- mmkin(list(\"SFO-SFO\" = m_SFO_SFO), d_SFO_SFO_err, cores = 1, quiet = TRUE) plot(f_SFO_SFO) # We would like to inspect the fit for dataset 3 more closely # Using double brackets makes the returned object an mkinfit object # instead of a list of mkinfit objects, so plot.mkinfit is used plot(f_SFO_SFO[[3]], show_residuals = TRUE) # If we use single brackets, we should give two indices (model and dataset), # and plot.mmkin is used plot(f_SFO_SFO[1, 3]) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/anova.saem.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Anova method for saem.mmkin objects — anova.saem.mmkin","title":"Anova method for saem.mmkin objects — anova.saem.mmkin","text":"Generate anova object. method calculate BIC saemix package. prominent anova methods, models sorted number parameters, tests (requested) always relative model previous line.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/anova.saem.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Anova method for saem.mmkin objects — anova.saem.mmkin","text":"","code":"# S3 method for class 'saem.mmkin' anova( object, ..., method = c(\"is\", \"lin\", \"gq\"), test = FALSE, model.names = NULL )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/anova.saem.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Anova method for saem.mmkin objects — anova.saem.mmkin","text":"object saem.mmkin object ... objects method Method likelihood calculation: \"\" (importance sampling), \"lin\" (linear approximation), \"gq\" (Gaussian quadrature). Passed saemix::logLik.SaemixObject test likelihood ratio test performed? TRUE, alternative models tested first model. done nested models. model.names Optional character vector model names","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/anova.saem.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Anova method for saem.mmkin objects — anova.saem.mmkin","text":"\"anova\" data frame; traditional (S3) result anova()","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/aw.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate Akaike weights for model averaging — aw","title":"Calculate Akaike weights for model averaging — aw","text":"Akaike weights calculated based relative expected Kullback-Leibler information specified Burnham Anderson (2004).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/aw.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate Akaike weights for model averaging — aw","text":"","code":"aw(object, ...) # S3 method for class 'mkinfit' aw(object, ...) # S3 method for class 'mmkin' aw(object, ...) # S3 method for class 'mixed.mmkin' aw(object, ...) # S3 method for class 'multistart' aw(object, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/aw.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate Akaike weights for model averaging — aw","text":"object mmkin column object, containing two mkinfit models fitted data, mkinfit object. latter case, mkinfit objects fitted data specified dots arguments. ... used method mmkin column objects, mkinfit objects method mkinfit objects.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/aw.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Calculate Akaike weights for model averaging — aw","text":"Burnham KP Anderson DR (2004) Multimodel Inference: Understanding AIC BIC Model Selection. Sociological Methods & Research 33(2) 261-304","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/aw.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate Akaike weights for model averaging — aw","text":"","code":"# \\dontrun{ f_sfo <- mkinfit(\"SFO\", FOCUS_2006_D, quiet = TRUE) f_dfop <- mkinfit(\"DFOP\", FOCUS_2006_D, quiet = TRUE) aw_sfo_dfop <- aw(f_sfo, f_dfop) sum(aw_sfo_dfop) #> [1] 1 aw_sfo_dfop # SFO gets more weight as it has less parameters and a similar fit #> [1] 0.5970258 0.4029742 f <- mmkin(c(\"SFO\", \"FOMC\", \"DFOP\"), list(\"FOCUS D\" = FOCUS_2006_D), cores = 1, quiet = TRUE) aw(f) #> [1] 0.4808722 0.1945539 0.3245740 sum(aw(f)) #> [1] 1 aw(f[c(\"SFO\", \"DFOP\")]) #> [1] 0.5970258 0.4029742 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/check_failed.html","id":null,"dir":"Reference","previous_headings":"","what":"Check if fit within an mhmkin object failed — check_failed","title":"Check if fit within an mhmkin object failed — check_failed","text":"Check fit within mhmkin object failed","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/check_failed.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Check if fit within an mhmkin object failed — check_failed","text":"","code":"check_failed(x)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/check_failed.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Check if fit within an mhmkin object failed — check_failed","text":"x object checked","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/confint.mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Confidence intervals for parameters of mkinfit objects — confint.mkinfit","title":"Confidence intervals for parameters of mkinfit objects — confint.mkinfit","text":"default method 'quadratic' based quadratic approximation curvature likelihood function maximum likelihood parameter estimates. alternative method 'profile' based profile likelihood parameter. 'profile' method uses two nested optimisations can take long time, even parallelized specifying 'cores' unixoid platforms. speed method likely improved using method Venzon Moolgavkar (1988).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/confint.mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Confidence intervals for parameters of mkinfit objects — confint.mkinfit","text":"","code":"# S3 method for class 'mkinfit' confint( object, parm, level = 0.95, alpha = 1 - level, cutoff, method = c(\"quadratic\", \"profile\"), transformed = TRUE, backtransform = TRUE, cores = parallel::detectCores(), rel_tol = 0.01, quiet = FALSE, ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/confint.mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Confidence intervals for parameters of mkinfit objects — confint.mkinfit","text":"object mkinfit object parm vector names parameters given confidence intervals. missing, parameters considered. level confidence level required alpha allowed error probability, overrides 'level' specified. cutoff Possibility specify alternative cutoff difference log-likelihoods confidence boundary. Specifying explicit cutoff value overrides arguments 'level' 'alpha' method 'quadratic' method approximates likelihood function optimised parameters using second term Taylor expansion, using second derivative (hessian) contained object. 'profile' method searches parameter space cutoff confidence intervals means likelihood ratio test. transformed quadratic approximation used, applied likelihood based transformed parameters? backtransform approximate likelihood terms transformed parameters, backtransform parameters confidence intervals? cores number cores used multicore processing. Windows machines, cores > 1 currently supported. rel_tol method 'profile', accuracy lower upper bounds, relative estimate obtained quadratic method? quiet suppress message \"Profiling likelihood\" ... used","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/confint.mkinfit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Confidence intervals for parameters of mkinfit objects — confint.mkinfit","text":"matrix columns giving lower upper confidence limits parameter.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/confint.mkinfit.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Confidence intervals for parameters of mkinfit objects — confint.mkinfit","text":"Bates DM Watts GW (1988) Nonlinear regression analysis & applications Pawitan Y (2013) likelihood - Statistical modelling inference using likelihood. Clarendon Press, Oxford. Venzon DJ Moolgavkar SH (1988) Method Computing Profile-Likelihood Based Confidence Intervals, Applied Statistics, 37, 87–94.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/confint.mkinfit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Confidence intervals for parameters of mkinfit objects — confint.mkinfit","text":"","code":"f <- mkinfit(\"SFO\", FOCUS_2006_C, quiet = TRUE) confint(f, method = \"quadratic\") #> 2.5% 97.5% #> parent_0 71.8242430 93.1600766 #> k_parent 0.2109541 0.4440528 #> sigma 1.9778868 7.3681380 # \\dontrun{ confint(f, method = \"profile\") #> Profiling the likelihood #> 2.5% 97.5% #> parent_0 73.0641834 92.1392181 #> k_parent 0.2170293 0.4235348 #> sigma 3.1307772 8.0628314 # Set the number of cores for the profiling method for further examples if (identical(Sys.getenv(\"NOT_CRAN\"), \"true\")) { n_cores <- parallel::detectCores() - 1 } else { n_cores <- 1 } if (Sys.getenv(\"TRAVIS\") != \"\") n_cores = 1 if (Sys.info()[\"sysname\"] == \"Windows\") n_cores = 1 SFO_SFO <- mkinmod(parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\"), use_of_ff = \"min\", quiet = TRUE) SFO_SFO.ff <- mkinmod(parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\"), use_of_ff = \"max\", quiet = TRUE) f_d_1 <- mkinfit(SFO_SFO, subset(FOCUS_2006_D, value != 0), quiet = TRUE) system.time(ci_profile <- confint(f_d_1, method = \"profile\", cores = 1, quiet = TRUE)) #> user system elapsed #> 1.182 0.004 1.186 # Using more cores does not save much time here, as parent_0 takes up most of the time # If we additionally exclude parent_0 (the confidence of which is often of # minor interest), we get a nice performance improvement if we use at least 4 cores system.time(ci_profile_no_parent_0 <- confint(f_d_1, method = \"profile\", c(\"k_parent_sink\", \"k_parent_m1\", \"k_m1_sink\", \"sigma\"), cores = n_cores)) #> Profiling the likelihood #> user system elapsed #> 0.429 0.171 0.324 ci_profile #> 2.5% 97.5% #> parent_0 96.456003640 1.027703e+02 #> k_parent_sink 0.040762501 5.549764e-02 #> k_parent_m1 0.046786482 5.500879e-02 #> k_m1_sink 0.003892605 6.702778e-03 #> sigma 2.535612399 3.985263e+00 ci_quadratic_transformed <- confint(f_d_1, method = \"quadratic\") ci_quadratic_transformed #> 2.5% 97.5% #> parent_0 96.403841640 1.027931e+02 #> k_parent_sink 0.041033378 5.596269e-02 #> k_parent_m1 0.046777902 5.511931e-02 #> k_m1_sink 0.004012217 6.897547e-03 #> sigma 2.396089689 3.854918e+00 ci_quadratic_untransformed <- confint(f_d_1, method = \"quadratic\", transformed = FALSE) ci_quadratic_untransformed #> 2.5% 97.5% #> parent_0 96.403841645 102.79312449 #> k_parent_sink 0.040485331 0.05535491 #> k_parent_m1 0.046611582 0.05494364 #> k_m1_sink 0.003835483 0.00668582 #> sigma 2.396089689 3.85491806 # Against the expectation based on Bates and Watts (1988), the confidence # intervals based on the internal parameter transformation are less # congruent with the likelihood based intervals. Note the superiority of the # interval based on the untransformed fit for k_m1_sink rel_diffs_transformed <- abs((ci_quadratic_transformed - ci_profile)/ci_profile) rel_diffs_untransformed <- abs((ci_quadratic_untransformed - ci_profile)/ci_profile) rel_diffs_transformed < rel_diffs_untransformed #> 2.5% 97.5% #> parent_0 FALSE FALSE #> k_parent_sink TRUE FALSE #> k_parent_m1 TRUE FALSE #> k_m1_sink FALSE FALSE #> sigma FALSE FALSE signif(rel_diffs_transformed, 3) #> 2.5% 97.5% #> parent_0 0.000541 0.000222 #> k_parent_sink 0.006650 0.008380 #> k_parent_m1 0.000183 0.002010 #> k_m1_sink 0.030700 0.029100 #> sigma 0.055000 0.032700 signif(rel_diffs_untransformed, 3) #> 2.5% 97.5% #> parent_0 0.000541 0.000222 #> k_parent_sink 0.006800 0.002570 #> k_parent_m1 0.003740 0.001180 #> k_m1_sink 0.014700 0.002530 #> sigma 0.055000 0.032700 # Investigate a case with formation fractions f_d_2 <- mkinfit(SFO_SFO.ff, subset(FOCUS_2006_D, value != 0), quiet = TRUE) ci_profile_ff <- confint(f_d_2, method = \"profile\", cores = n_cores) #> Profiling the likelihood ci_profile_ff #> 2.5% 97.5% #> parent_0 96.456003640 1.027703e+02 #> k_parent 0.090911032 1.071578e-01 #> k_m1 0.003892606 6.702775e-03 #> f_parent_to_m1 0.471328495 5.611550e-01 #> sigma 2.535612399 3.985263e+00 ci_quadratic_transformed_ff <- confint(f_d_2, method = \"quadratic\") ci_quadratic_transformed_ff #> 2.5% 97.5% #> parent_0 96.403833581 102.79311649 #> k_parent 0.090823771 0.10725430 #> k_m1 0.004012219 0.00689755 #> f_parent_to_m1 0.469118824 0.55959615 #> sigma 2.396089689 3.85491806 ci_quadratic_untransformed_ff <- confint(f_d_2, method = \"quadratic\", transformed = FALSE) ci_quadratic_untransformed_ff #> 2.5% 97.5% #> parent_0 96.403833586 1.027931e+02 #> k_parent 0.090491913 1.069035e-01 #> k_m1 0.003835485 6.685823e-03 #> f_parent_to_m1 0.469113477 5.598387e-01 #> sigma 2.396089689 3.854918e+00 rel_diffs_transformed_ff <- abs((ci_quadratic_transformed_ff - ci_profile_ff)/ci_profile_ff) rel_diffs_untransformed_ff <- abs((ci_quadratic_untransformed_ff - ci_profile_ff)/ci_profile_ff) # While the confidence interval for the parent rate constant is closer to # the profile based interval when using the internal parameter # transformation, the interval for the metabolite rate constant is 'better # without internal parameter transformation. rel_diffs_transformed_ff < rel_diffs_untransformed_ff #> 2.5% 97.5% #> parent_0 FALSE FALSE #> k_parent TRUE TRUE #> k_m1 FALSE FALSE #> f_parent_to_m1 TRUE FALSE #> sigma TRUE FALSE rel_diffs_transformed_ff #> 2.5% 97.5% #> parent_0 0.0005408690 0.0002217233 #> k_parent 0.0009598532 0.0009001864 #> k_m1 0.0307283045 0.0290588367 #> f_parent_to_m1 0.0046881768 0.0027780062 #> sigma 0.0550252516 0.0327066836 rel_diffs_untransformed_ff #> 2.5% 97.5% #> parent_0 0.0005408689 0.0002217233 #> k_parent 0.0046102155 0.0023732280 #> k_m1 0.0146740687 0.0025291815 #> f_parent_to_m1 0.0046995210 0.0023457712 #> sigma 0.0550252516 0.0327066836 # The profiling for the following fit does not finish in a reasonable time, # therefore we use the quadratic approximation m_synth_DFOP_par <- mkinmod(parent = mkinsub(\"DFOP\", c(\"M1\", \"M2\")), M1 = mkinsub(\"SFO\"), M2 = mkinsub(\"SFO\"), use_of_ff = \"max\", quiet = TRUE) DFOP_par_c <- synthetic_data_for_UBA_2014[[12]]$data f_tc_2 <- mkinfit(m_synth_DFOP_par, DFOP_par_c, error_model = \"tc\", error_model_algorithm = \"direct\", quiet = TRUE) confint(f_tc_2, method = \"quadratic\") #> 2.5% 97.5% #> parent_0 94.596181875 106.19936592 #> k_M1 0.037605432 0.04490757 #> k_M2 0.008568745 0.01087675 #> f_parent_to_M1 0.021464676 0.62023880 #> f_parent_to_M2 0.015167158 0.37975350 #> k1 0.273897535 0.33388072 #> k2 0.018614555 0.02250379 #> g 0.671943738 0.73583261 #> sigma_low 0.251283679 0.83992102 #> rsd_high 0.040411022 0.07662008 confint(f_tc_2, \"parent_0\", method = \"quadratic\") #> 2.5% 97.5% #> parent_0 94.59618 106.1994 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/create_deg_func.html","id":null,"dir":"Reference","previous_headings":"","what":"Create degradation functions for known analytical solutions — create_deg_func","title":"Create degradation functions for known analytical solutions — create_deg_func","text":"Create degradation functions known analytical solutions","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/create_deg_func.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create degradation functions for known analytical solutions — create_deg_func","text":"","code":"create_deg_func(spec, use_of_ff = c(\"min\", \"max\"))"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/create_deg_func.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create degradation functions for known analytical solutions — create_deg_func","text":"spec List model specifications contained mkinmod objects use_of_ff Minimum maximum use formation fractions","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/create_deg_func.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create degradation functions for known analytical solutions — create_deg_func","text":"Degradation function attached mkinmod objects","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/create_deg_func.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create degradation functions for known analytical solutions — create_deg_func","text":"","code":"SFO_SFO <- mkinmod( parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded FOCUS_D <- subset(FOCUS_2006_D, value != 0) # to avoid warnings fit_1 <- mkinfit(SFO_SFO, FOCUS_D, solution_type = \"analytical\", quiet = TRUE) # \\dontrun{ fit_2 <- mkinfit(SFO_SFO, FOCUS_D, solution_type = \"deSolve\", quiet = TRUE) if (require(rbenchmark)) benchmark( analytical = mkinfit(SFO_SFO, FOCUS_D, solution_type = \"analytical\", quiet = TRUE), deSolve = mkinfit(SFO_SFO, FOCUS_D, solution_type = \"deSolve\", quiet = TRUE), replications = 2) #> Loading required package: rbenchmark #> test replications elapsed relative user.self sys.self user.child #> 1 analytical 2 0.249 1.000 0.249 0 0 #> 2 deSolve 2 0.307 1.233 0.306 0 0 #> sys.child #> 1 0 #> 2 0 DFOP_SFO <- mkinmod( parent = mkinsub(\"DFOP\", \"m1\"), m1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded benchmark( analytical = mkinfit(DFOP_SFO, FOCUS_D, solution_type = \"analytical\", quiet = TRUE), deSolve = mkinfit(DFOP_SFO, FOCUS_D, solution_type = \"deSolve\", quiet = TRUE), replications = 2) #> test replications elapsed relative user.self sys.self user.child #> 1 analytical 2 0.391 1.000 0.391 0 0 #> 2 deSolve 2 0.543 1.389 0.542 0 0 #> sys.child #> 1 0 #> 2 0 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/dimethenamid_2018.html","id":null,"dir":"Reference","previous_headings":"","what":"Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018 — dimethenamid_2018","title":"Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018 — dimethenamid_2018","text":"datasets extracted active substance evaluation dossier published EFSA. Kinetic evaluations shown datasets intended illustrate advance kinetic modelling. fact data results shown imply license use context pesticide registrations, use data may constrained data protection regulations.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/dimethenamid_2018.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018 — dimethenamid_2018","text":"","code":"dimethenamid_2018"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/dimethenamid_2018.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018 — dimethenamid_2018","text":"mkindsg object grouping seven datasets meta information","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/dimethenamid_2018.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018 — dimethenamid_2018","text":"Rapporteur Member State Germany, Co-Rapporteur Member State Bulgaria (2018) Renewal Assessment Report Dimethenamid-P Volume 3 - B.8 Environmental fate behaviour Rev. 2 - November 2017 https://open.efsa.europa.eu/study-inventory/EFSA-Q-2014-00716","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/dimethenamid_2018.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018 — dimethenamid_2018","text":"R code used create data object installed package 'dataset_generation' directory. code, page numbers given specific pieces information comments.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/dimethenamid_2018.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Aerobic soil degradation data on dimethenamid and dimethenamid-P from the EU assessment in 2018 — dimethenamid_2018","text":"","code":"print(dimethenamid_2018) #> holding 7 mkinds objects #> Title $title: Aerobic soil degradation data on dimethenamid-P from the EU assessment in 2018 #> Occurrence of observed compounds $observed_n: #> DMTAP M23 M27 M31 DMTA #> 3 7 7 7 4 #> Time normalisation factors $f_time_norm: #> [1] 1.0000000 0.9706477 1.2284784 1.2284784 0.6233856 0.7678922 0.6733938 #> Meta information $meta: #> study usda_soil_type study_moisture_ref_type rel_moisture #> Calke Unsworth 2014 Sandy loam pF2 1.00 #> Borstel Staudenmaier 2009 Sand pF1 0.50 #> Elliot 1 Wendt 1997 Clay loam pF2.5 0.75 #> Elliot 2 Wendt 1997 Clay loam pF2.5 0.75 #> Flaach König 1996 Sandy clay loam pF1 0.40 #> BBA 2.2 König 1995 Loamy sand pF1 0.40 #> BBA 2.3 König 1995 Sandy loam pF1 0.40 #> study_ref_moisture temperature #> Calke NA 20 #> Borstel 23.00 20 #> Elliot 1 33.37 23 #> Elliot 2 33.37 23 #> Flaach NA 20 #> BBA 2.2 NA 20 #> BBA 2.3 NA 20 dmta_ds <- lapply(1:7, function(i) { ds_i <- dimethenamid_2018$ds[[i]]$data ds_i[ds_i$name == \"DMTAP\", \"name\"] <- \"DMTA\" ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i] ds_i }) names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title) dmta_ds[[\"Elliot\"]] <- rbind(dmta_ds[[\"Elliot 1\"]], dmta_ds[[\"Elliot 2\"]]) dmta_ds[[\"Elliot 1\"]] <- NULL dmta_ds[[\"Elliot 2\"]] <- NULL # \\dontrun{ # We don't use DFOP for the parent compound, as this gives numerical # instabilities in the fits sfo_sfo3p <- mkinmod( DMTA = mkinsub(\"SFO\", c(\"M23\", \"M27\", \"M31\")), M23 = mkinsub(\"SFO\"), M27 = mkinsub(\"SFO\"), M31 = mkinsub(\"SFO\", \"M27\", sink = FALSE), quiet = TRUE ) dmta_sfo_sfo3p_tc <- mmkin(list(\"SFO-SFO3+\" = sfo_sfo3p), dmta_ds, error_model = \"tc\", quiet = TRUE) print(dmta_sfo_sfo3p_tc) #> object #> Status of individual fits: #> #> dataset #> model Calke Borstel Flaach BBA 2.2 BBA 2.3 Elliot #> SFO-SFO3+ OK OK OK OK OK OK #> #> OK: No warnings # The default (test_log_parms = FALSE) gives an undue # influence of ill-defined rate constants that have # extremely small values: plot(mixed(dmta_sfo_sfo3p_tc), test_log_parms = FALSE) # If we disregards ill-defined rate constants, the results # look more plausible, but the truth is likely to be in # between these variants plot(mixed(dmta_sfo_sfo3p_tc), test_log_parms = TRUE) # We can also specify a default value for the failing # log parameters, to mimic FOCUS guidance plot(mixed(dmta_sfo_sfo3p_tc), test_log_parms = TRUE, default_log_parms = log(2)/1000) # As these attempts are not satisfying, we use nonlinear mixed-effects models # f_dmta_nlme_tc <- nlme(dmta_sfo_sfo3p_tc) # nlme reaches maxIter = 50 without convergence f_dmta_saem_tc <- saem(dmta_sfo_sfo3p_tc) # I am commenting out the convergence plot as rendering them # with pkgdown fails (at least without further tweaks to the # graphics device used) #saemix::plot(f_dmta_saem_tc$so, plot.type = \"convergence\") summary(f_dmta_saem_tc) #> saemix version used for fitting: 3.3 #> mkin version used for pre-fitting: 1.2.10 #> R version used for fitting: 4.4.2 #> Date of fit: Fri Feb 14 07:29:22 2025 #> Date of summary: Fri Feb 14 07:29:22 2025 #> #> Equations: #> d_DMTA/dt = - k_DMTA * DMTA #> d_M23/dt = + f_DMTA_to_M23 * k_DMTA * DMTA - k_M23 * M23 #> d_M27/dt = + f_DMTA_to_M27 * k_DMTA * DMTA - k_M27 * M27 + k_M31 * M31 #> d_M31/dt = + f_DMTA_to_M31 * k_DMTA * DMTA - k_M31 * M31 #> #> Data: #> 563 observations of 4 variable(s) grouped in 6 datasets #> #> Model predictions using solution type deSolve #> #> Fitted in 295.57 s #> Using 300, 100 iterations and 9 chains #> #> Variance model: Two-component variance function #> #> Starting values for degradation parameters: #> DMTA_0 log_k_DMTA log_k_M23 log_k_M27 log_k_M31 f_DMTA_ilr_1 #> 95.5662 -2.9048 -3.8130 -4.1600 -4.1486 0.1341 #> f_DMTA_ilr_2 f_DMTA_ilr_3 #> 0.1385 -1.6700 #> #> Fixed degradation parameter values: #> None #> #> Starting values for random effects (square root of initial entries in omega): #> DMTA_0 log_k_DMTA log_k_M23 log_k_M27 log_k_M31 f_DMTA_ilr_1 #> DMTA_0 4.802 0.0000 0.0000 0.000 0.0000 0.0000 #> log_k_DMTA 0.000 0.9834 0.0000 0.000 0.0000 0.0000 #> log_k_M23 0.000 0.0000 0.6983 0.000 0.0000 0.0000 #> log_k_M27 0.000 0.0000 0.0000 1.028 0.0000 0.0000 #> log_k_M31 0.000 0.0000 0.0000 0.000 0.9841 0.0000 #> f_DMTA_ilr_1 0.000 0.0000 0.0000 0.000 0.0000 0.7185 #> f_DMTA_ilr_2 0.000 0.0000 0.0000 0.000 0.0000 0.0000 #> f_DMTA_ilr_3 0.000 0.0000 0.0000 0.000 0.0000 0.0000 #> f_DMTA_ilr_2 f_DMTA_ilr_3 #> DMTA_0 0.0000 0.0000 #> log_k_DMTA 0.0000 0.0000 #> log_k_M23 0.0000 0.0000 #> log_k_M27 0.0000 0.0000 #> log_k_M31 0.0000 0.0000 #> f_DMTA_ilr_1 0.0000 0.0000 #> f_DMTA_ilr_2 0.7378 0.0000 #> f_DMTA_ilr_3 0.0000 0.4451 #> #> Starting values for error model parameters: #> a.1 b.1 #> 1 1 #> #> Results: #> #> Likelihood computed by importance sampling #> AIC BIC logLik #> 2276 2273 -1120 #> #> Optimised parameters: #> est. lower upper #> DMTA_0 88.4862 84.1127 92.8598 #> log_k_DMTA -3.0512 -3.5674 -2.5351 #> log_k_M23 -4.0576 -4.9013 -3.2139 #> log_k_M27 -3.8584 -4.2572 -3.4595 #> log_k_M31 -3.9779 -4.4844 -3.4714 #> f_DMTA_ilr_1 0.1264 -0.2186 0.4714 #> f_DMTA_ilr_2 0.1509 -0.2547 0.5565 #> f_DMTA_ilr_3 -1.3891 -1.6962 -1.0819 #> a.1 0.9196 0.8307 1.0085 #> b.1 0.1377 0.1205 0.1549 #> SD.DMTA_0 3.5956 -0.8167 8.0078 #> SD.log_k_DMTA 0.6437 0.2784 1.0091 #> SD.log_k_M23 0.9929 0.3719 1.6139 #> SD.log_k_M27 0.4530 0.1522 0.7537 #> SD.log_k_M31 0.5773 0.1952 0.9595 #> SD.f_DMTA_ilr_1 0.4063 0.1505 0.6621 #> SD.f_DMTA_ilr_2 0.4800 0.1817 0.7783 #> SD.f_DMTA_ilr_3 0.3582 0.1350 0.5814 #> #> Correlation: #> DMTA_0 l__DMTA lg__M23 lg__M27 lg__M31 f_DMTA__1 f_DMTA__2 #> log_k_DMTA 0.0306 #> log_k_M23 -0.0234 -0.0032 #> log_k_M27 -0.0380 -0.0049 0.0041 #> log_k_M31 -0.0247 -0.0031 0.0022 0.0817 #> f_DMTA_ilr_1 -0.0046 -0.0006 0.0425 -0.0438 0.0319 #> f_DMTA_ilr_2 -0.0008 -0.0002 0.0216 -0.0267 -0.0890 -0.0349 #> f_DMTA_ilr_3 -0.1805 -0.0136 0.0434 0.0791 0.0390 -0.0061 0.0053 #> #> Random effects: #> est. lower upper #> SD.DMTA_0 3.5956 -0.8167 8.0078 #> SD.log_k_DMTA 0.6437 0.2784 1.0091 #> SD.log_k_M23 0.9929 0.3719 1.6139 #> SD.log_k_M27 0.4530 0.1522 0.7537 #> SD.log_k_M31 0.5773 0.1952 0.9595 #> SD.f_DMTA_ilr_1 0.4063 0.1505 0.6621 #> SD.f_DMTA_ilr_2 0.4800 0.1817 0.7783 #> SD.f_DMTA_ilr_3 0.3582 0.1350 0.5814 #> #> Variance model: #> est. lower upper #> a.1 0.9196 0.8307 1.0085 #> b.1 0.1377 0.1205 0.1549 #> #> Backtransformed parameters: #> est. lower upper #> DMTA_0 88.48621 84.112654 92.85977 #> k_DMTA 0.04730 0.028230 0.07926 #> k_M23 0.01729 0.007437 0.04020 #> k_M27 0.02110 0.014162 0.03144 #> k_M31 0.01872 0.011283 0.03107 #> f_DMTA_to_M23 0.14551 NA NA #> f_DMTA_to_M27 0.12169 NA NA #> f_DMTA_to_M31 0.11062 NA NA #> #> Resulting formation fractions: #> ff #> DMTA_M23 0.1455 #> DMTA_M27 0.1217 #> DMTA_M31 0.1106 #> DMTA_sink 0.6222 #> #> Estimated disappearance times: #> DT50 DT90 #> DMTA 14.65 48.68 #> M23 40.09 133.17 #> M27 32.85 109.11 #> M31 37.02 122.97 # As the confidence interval for the random effects of DMTA_0 # includes zero, we could try an alternative model without # such random effects # f_dmta_saem_tc_2 <- saem(dmta_sfo_sfo3p_tc, # covariance.model = diag(c(0, rep(1, 7)))) # saemix::plot(f_dmta_saem_tc_2$so, plot.type = \"convergence\") # This does not perform better judged by AIC and BIC # saemix::compare.saemix(f_dmta_saem_tc$so, f_dmta_saem_tc_2$so) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ds_mixed.html","id":null,"dir":"Reference","previous_headings":"","what":"Synthetic data for hierarchical kinetic degradation models — ds_mixed","title":"Synthetic data for hierarchical kinetic degradation models — ds_mixed","text":"R code used create data object installed package 'dataset_generation' directory.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ds_mixed.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Synthetic data for hierarchical kinetic degradation models — ds_mixed","text":"","code":"# \\dontrun{ sfo_mmkin <- mmkin(\"SFO\", ds_sfo, quiet = TRUE, error_model = \"tc\", cores = 15) sfo_saem <- saem(sfo_mmkin, no_random_effect = \"parent_0\") plot(sfo_saem) # } # This is the code used to generate the datasets cat(readLines(system.file(\"dataset_generation/ds_mixed.R\", package = \"mkin\")), sep = \"\\n\") #> # Synthetic data for hierarchical kinetic models #> # Refactored version of the code previously in tests/testthat/setup_script.R #> # The number of datasets was 3 for FOMC, and 10 for HS in that script, now it #> # is always 15 for consistency #> #> library(mkin) # We use mkinmod and mkinpredict #> sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) #> n <- 15 #> log_sd <- 0.3 #> err_1 = list(const = 1, prop = 0.05) #> tc <- function(value) sigma_twocomp(value, err_1$const, err_1$prop) #> const <- function(value) 2 #> #> set.seed(123456) #> SFO <- mkinmod(parent = mkinsub(\"SFO\")) #> sfo_pop <- list(parent_0 = 100, k_parent = 0.03) #> sfo_parms <- as.matrix(data.frame( #> k_parent = rlnorm(n, log(sfo_pop$k_parent), log_sd))) #> set.seed(123456) #> ds_sfo <- lapply(1:n, function(i) { #> ds_mean <- mkinpredict(SFO, sfo_parms[i, ], #> c(parent = sfo_pop$parent_0), sampling_times) #> add_err(ds_mean, tc, n = 1)[[1]] #> }) #> attr(ds_sfo, \"pop\") <- sfo_pop #> attr(ds_sfo, \"parms\") <- sfo_parms #> #> set.seed(123456) #> FOMC <- mkinmod(parent = mkinsub(\"FOMC\")) #> fomc_pop <- list(parent_0 = 100, alpha = 2, beta = 8) #> fomc_parms <- as.matrix(data.frame( #> alpha = rlnorm(n, log(fomc_pop$alpha), 0.4), #> beta = rlnorm(n, log(fomc_pop$beta), 0.2))) #> set.seed(123456) #> ds_fomc <- lapply(1:n, function(i) { #> ds_mean <- mkinpredict(FOMC, fomc_parms[i, ], #> c(parent = fomc_pop$parent_0), sampling_times) #> add_err(ds_mean, tc, n = 1)[[1]] #> }) #> attr(ds_fomc, \"pop\") <- fomc_pop #> attr(ds_fomc, \"parms\") <- fomc_parms #> #> set.seed(123456) #> DFOP <- mkinmod(parent = mkinsub(\"DFOP\")) #> dfop_pop <- list(parent_0 = 100, k1 = 0.06, k2 = 0.015, g = 0.4) #> dfop_parms <- as.matrix(data.frame( #> k1 = rlnorm(n, log(dfop_pop$k1), log_sd), #> k2 = rlnorm(n, log(dfop_pop$k2), log_sd), #> g = plogis(rnorm(n, qlogis(dfop_pop$g), log_sd)))) #> set.seed(123456) #> ds_dfop <- lapply(1:n, function(i) { #> ds_mean <- mkinpredict(DFOP, dfop_parms[i, ], #> c(parent = dfop_pop$parent_0), sampling_times) #> add_err(ds_mean, tc, n = 1)[[1]] #> }) #> attr(ds_dfop, \"pop\") <- dfop_pop #> attr(ds_dfop, \"parms\") <- dfop_parms #> #> set.seed(123456) #> HS <- mkinmod(parent = mkinsub(\"HS\")) #> hs_pop <- list(parent_0 = 100, k1 = 0.08, k2 = 0.01, tb = 15) #> hs_parms <- as.matrix(data.frame( #> k1 = rlnorm(n, log(hs_pop$k1), log_sd), #> k2 = rlnorm(n, log(hs_pop$k2), log_sd), #> tb = rlnorm(n, log(hs_pop$tb), 0.1))) #> set.seed(123456) #> ds_hs <- lapply(1:n, function(i) { #> ds_mean <- mkinpredict(HS, hs_parms[i, ], #> c(parent = hs_pop$parent_0), sampling_times) #> add_err(ds_mean, const, n = 1)[[1]] #> }) #> attr(ds_hs, \"pop\") <- hs_pop #> attr(ds_hs, \"parms\") <- hs_parms #> #> set.seed(123456) #> DFOP_SFO <- mkinmod( #> parent = mkinsub(\"DFOP\", \"m1\"), #> m1 = mkinsub(\"SFO\"), #> quiet = TRUE) #> dfop_sfo_pop <- list(parent_0 = 100, #> k_m1 = 0.007, f_parent_to_m1 = 0.5, #> k1 = 0.1, k2 = 0.02, g = 0.5) #> dfop_sfo_parms <- as.matrix(data.frame( #> k1 = rlnorm(n, log(dfop_sfo_pop$k1), log_sd), #> k2 = rlnorm(n, log(dfop_sfo_pop$k2), log_sd), #> g = plogis(rnorm(n, qlogis(dfop_sfo_pop$g), log_sd)), #> f_parent_to_m1 = plogis(rnorm(n, #> qlogis(dfop_sfo_pop$f_parent_to_m1), log_sd)), #> k_m1 = rlnorm(n, log(dfop_sfo_pop$k_m1), log_sd))) #> ds_dfop_sfo_mean <- lapply(1:n, #> function(i) { #> mkinpredict(DFOP_SFO, dfop_sfo_parms[i, ], #> c(parent = dfop_sfo_pop$parent_0, m1 = 0), sampling_times) #> } #> ) #> set.seed(123456) #> ds_dfop_sfo <- lapply(ds_dfop_sfo_mean, function(ds) { #> add_err(ds, #> sdfunc = function(value) sqrt(err_1$const^2 + value^2 * err_1$prop^2), #> n = 1, secondary = \"m1\")[[1]] #> }) #> attr(ds_dfop_sfo, \"pop\") <- dfop_sfo_pop #> attr(ds_dfop_sfo, \"parms\") <- dfop_sfo_parms #> #> #save(ds_sfo, ds_fomc, ds_dfop, ds_hs, ds_dfop_sfo, file = \"data/ds_mixed.rda\", version = 2)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html","id":null,"dir":"Reference","previous_headings":"","what":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","title":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","text":"function calculates DT50 DT90 values well formation fractions kinetic models fitted mkinfit. SFORB model specified one parents metabolites, Eigenvalues returned. equivalent rate constants DFOP model, advantage SFORB model can also used metabolites.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","text":"","code":"endpoints(fit, covariates = NULL, covariate_quantile = 0.5)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","text":"fit object class mkinfit, nlme.mmkin saem.mmkin, another object list components mkinmod containing mkinmod degradation model, two numeric vectors, bparms.optim bparms.fixed, contain parameter values model. covariates Numeric vector covariate values variables covariate models object. given, overrides 'covariate_quantile'. covariate_quantile argument effect fitted object covariate models. , default show endpoints median covariate values (50th percentile).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","text":"list matrix dissipation times named distimes, , applicable, vector formation fractions named ff , SFORB model use, vector eigenvalues SFORB models, equivalent DFOP rate constants","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","text":"Additional DT50 values calculated FOMC DT90 k1 k2 HS DFOP, well Eigenvalues b1 b2 SFORB models","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","text":"function used internally summary.mkinfit, summary.nlme.mmkin summary.saem.mmkin.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Function to calculate endpoints for further use from kinetic models fitted with mkinfit — endpoints","text":"","code":"fit <- mkinfit(\"FOMC\", FOCUS_2006_C, quiet = TRUE) endpoints(fit) #> $distimes #> DT50 DT90 DT50back #> parent 1.785233 15.1479 4.559973 #> # \\dontrun{ fit_2 <- mkinfit(\"DFOP\", FOCUS_2006_C, quiet = TRUE) endpoints(fit_2) #> $distimes #> DT50 DT90 DT50back DT50_k1 DT50_k2 #> parent 1.886925 21.25106 6.397207 1.508293 38.83438 #> fit_3 <- mkinfit(\"SFORB\", FOCUS_2006_C, quiet = TRUE) endpoints(fit_3) #> $ff #> parent_free #> 1 #> #> $SFORB #> parent_b1 parent_b2 parent_g #> 0.4595574 0.0178488 0.8539454 #> #> $distimes #> DT50 DT90 DT50back DT50_parent_b1 DT50_parent_b2 #> parent 1.886925 21.25106 6.397208 1.508293 38.83438 #> # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/experimental_data_for_UBA.html","id":null,"dir":"Reference","previous_headings":"","what":"Experimental datasets used for development and testing of error models — experimental_data_for_UBA_2019","title":"Experimental datasets used for development and testing of error models — experimental_data_for_UBA_2019","text":"12 datasets extracted active substance evaluation dossiers published EFSA. Kinetic evaluations shown datasets intended illustrate advance error model specifications. fact data results shown imply license use context pesticide registrations, use data may constrained data protection regulations. Preprocessing data performed based recommendations FOCUS kinetics workgroup (FOCUS, 2014) described . Datasets 1 2 Renewal Assessment Report (RAR) imazamox (France, 2015, p. 15). setting values reported zero, LOQ 0.1 assumed. Metabolite residues reported day zero added parent compound residues. Datasets 3 4 Renewal Assessment Report (RAR) isofetamid (Belgium, 2014, p. 8) show data two different radiolabels. dataset 4, value given metabolite day zero sampling replicate B added parent compound, following respective FOCUS recommendation. Dataset 5 Renewal Assessment Report (RAR) ethofumesate (Austria, 2015, p. 16). Datasets 6 10 Renewal Assessment Report (RAR) glyphosate (Germany, 2013, pages 8, 28, 50, 51). initial sampling, residues given metabolite added parent value, following recommendation FOCUS kinetics workgroup. Dataset 11 Renewal Assessment Report (RAR) 2,4-D (Hellas, 2013, p. 644). Values reported zero set NA, exception day three sampling metabolite A2, set one half LOD reported 1% AR. Dataset 12 Renewal Assessment Report (RAR) thifensulfuron-methyl (United Kingdom, 2014, p. 81).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/experimental_data_for_UBA.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Experimental datasets used for development and testing of error models — experimental_data_for_UBA_2019","text":"","code":"experimental_data_for_UBA_2019"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/experimental_data_for_UBA.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Experimental datasets used for development and testing of error models — experimental_data_for_UBA_2019","text":"list containing twelve datasets R6 class defined mkinds, containing, among others, following components title name dataset, e.g. Soil 1 data data frame data form expected mkinfit","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/experimental_data_for_UBA.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Experimental datasets used for development and testing of error models — experimental_data_for_UBA_2019","text":"Austria (2015). Ethofumesate Renewal Assessment Report Volume 3 Annex B.8 () Belgium (2014). Isofetamid (IKF-5411) Draft Assessment Report Volume 3 Annex B.8 () France (2015). Imazamox Draft Renewal Assessment Report Volume 3 Annex B.8 () FOCUS (2014) “Generic guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, Version 1.1, 18 December 2014 http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics Germany (2013). Renewal Assessment Report Glyphosate Volume 3 Annex B.8: Environmental Fate Behaviour Hellas (2013). Renewal Assessment Report 2,4-D Volume 3 Annex B.8: Fate behaviour environment Ranke (2019) Documentation results obtained error model expertise written German Umweltbundesamt. United Kingdom (2014). Thifensulfuron-methyl - Annex B.8 (Volume 3) Report Proposed Decision United Kingdom made European Commission Regulation (EC) . 1141/2010 renewal active substance","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/experimental_data_for_UBA.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Experimental datasets used for development and testing of error models — experimental_data_for_UBA_2019","text":"","code":"# \\dontrun{ # Model definitions sfo_sfo <- mkinmod( parent = mkinsub(\"SFO\", to = \"A1\"), A1 = mkinsub(\"SFO\"), use_of_ff = \"max\" ) #> Temporary DLL for differentials generated and loaded dfop_sfo <- mkinmod( parent = mkinsub(\"DFOP\", to = \"A1\"), A1 = mkinsub(\"SFO\"), use_of_ff = \"max\" ) #> Temporary DLL for differentials generated and loaded sfo_sfo_sfo <- mkinmod( parent = mkinsub(\"SFO\", to = \"A1\"), A1 = mkinsub(\"SFO\", to = \"A2\"), A2 = mkinsub(\"SFO\"), use_of_ff = \"max\" ) #> Temporary DLL for differentials generated and loaded dfop_sfo_sfo <- mkinmod( parent = mkinsub(\"DFOP\", to = \"A1\"), A1 = mkinsub(\"SFO\", to = \"A2\"), A2 = mkinsub(\"SFO\"), use_of_ff = \"max\" ) #> Temporary DLL for differentials generated and loaded d_1_2 <- lapply(experimental_data_for_UBA_2019[1:2], function(x) x$data) names(d_1_2) <- paste(\"Soil\", 1:2) f_1_2_tc <- mmkin(list(\"DFOP-SFO-SFO\" = dfop_sfo_sfo), d_1_2, error_model = \"tc\") plot(f_1_2_tc, resplot = \"errmod\") # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/f_time_norm_focus.html","id":null,"dir":"Reference","previous_headings":"","what":"Normalisation factors for aerobic soil degradation according to FOCUS guidance — f_time_norm_focus","title":"Normalisation factors for aerobic soil degradation according to FOCUS guidance — f_time_norm_focus","text":"Time step normalisation factors aerobic soil degradation described Appendix 8 FOCUS kinetics guidance (FOCUS 2014, p. 369).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/f_time_norm_focus.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Normalisation factors for aerobic soil degradation according to FOCUS guidance — f_time_norm_focus","text":"","code":"f_time_norm_focus(object, ...) # S3 method for class 'numeric' f_time_norm_focus( object, moisture = NA, field_moisture = NA, temperature = object, Q10 = 2.58, walker = 0.7, f_na = NA, ... ) # S3 method for class 'mkindsg' f_time_norm_focus( object, study_moisture_ref_source = c(\"auto\", \"meta\", \"focus\"), Q10 = 2.58, walker = 0.7, f_na = NA, ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/f_time_norm_focus.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Normalisation factors for aerobic soil degradation according to FOCUS guidance — f_time_norm_focus","text":"object object containing information used calculations ... Currently used moisture Numeric vector moisture contents \\% w/w field_moisture Numeric vector moisture contents field capacity (pF2) \\% w/w temperature Numeric vector temperatures °C Q10 Q10 value used temperature normalisation walker Walker exponent used moisture normalisation f_na factor use NA values. set NA, factors complete cases returned. study_moisture_ref_source Source reference value used calculate study moisture. 'auto', preference given reference moisture given meta information, otherwise focus soil moisture soil class used","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/f_time_norm_focus.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Normalisation factors for aerobic soil degradation according to FOCUS guidance — f_time_norm_focus","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics FOCUS (2014) “Generic guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, Version 1.1, 18 December 2014 http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/f_time_norm_focus.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Normalisation factors for aerobic soil degradation according to FOCUS guidance — f_time_norm_focus","text":"","code":"f_time_norm_focus(25, 20, 25) # 1.37, compare FOCUS 2014 p. 184 #> [1] 1.373956 D24_2014$meta #> study usda_soil_type study_moisture_ref_type #> Mississippi Cohen 1991 Silt loam #> Fayette Liu and Adelfinskaya 2011 Silt loam pF1 #> RefSol 03-G Liu and Adelfinskaya 2011 Loam pF1 #> Site E1 Liu and Adelfinskaya 2011 Loam pF1 #> Site I2 Liu and Adelfinskaya 2011 Loamy sand pF1 #> rel_moisture temperature #> Mississippi NA 25 #> Fayette 0.5 20 #> RefSol 03-G 0.5 20 #> Site E1 0.5 20 #> Site I2 0.5 20 # No moisture normalisation in the first dataset, so we use f_na = 1 to get # temperature only normalisation as in the EU evaluation f_time_norm_focus(D24_2014, study_moisture_ref_source = \"focus\", f_na = 1) #> $f_time_norm was (re)set to normalised values"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/focus_soil_moisture.html","id":null,"dir":"Reference","previous_headings":"","what":"FOCUS default values for soil moisture contents at field capacity, MWHC and 1/3 bar — focus_soil_moisture","title":"FOCUS default values for soil moisture contents at field capacity, MWHC and 1/3 bar — focus_soil_moisture","text":"value transcribed p. 36. table assumes field capacity corresponds pF2, MWHC pF 1 1/3 bar pF 2.5.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/focus_soil_moisture.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"FOCUS default values for soil moisture contents at field capacity, MWHC and 1/3 bar — focus_soil_moisture","text":"","code":"focus_soil_moisture"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/focus_soil_moisture.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"FOCUS default values for soil moisture contents at field capacity, MWHC and 1/3 bar — focus_soil_moisture","text":"matrix upper case USDA soil classes row names, water tension ('pF1', 'pF2', 'pF 2.5') column names","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/focus_soil_moisture.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"FOCUS default values for soil moisture contents at field capacity, MWHC and 1/3 bar — focus_soil_moisture","text":"Anonymous (2014) Generic Guidance Tier 1 FOCUS Ground Water Assessment Version 2.2, May 2014 https://esdac.jrc.ec.europa.eu/projects/ground-water","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/focus_soil_moisture.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"FOCUS default values for soil moisture contents at field capacity, MWHC and 1/3 bar — focus_soil_moisture","text":"","code":"focus_soil_moisture #> pF1 pF2 pF2.5 #> Sand 24 12 7 #> Loamy sand 24 14 9 #> Sandy loam 27 19 15 #> Sandy clay loam 28 22 18 #> Clay loam 32 28 25 #> Loam 31 25 21 #> Silt loam 32 26 21 #> Silty clay loam 34 30 27 #> Silt 31 27 21 #> Sandy clay 41 35 31 #> Silty clay 44 40 36 #> Clay 53 48 43"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/get_deg_func.html","id":null,"dir":"Reference","previous_headings":"","what":"Retrieve a degradation function from the mmkin namespace — get_deg_func","title":"Retrieve a degradation function from the mmkin namespace — get_deg_func","text":"Retrieve degradation function mmkin namespace","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/get_deg_func.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Retrieve a degradation function from the mmkin namespace — get_deg_func","text":"","code":"get_deg_func()"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/get_deg_func.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Retrieve a degradation function from the mmkin namespace — get_deg_func","text":"function likely previously assigned within nlme.mmkin","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/hierarchical_kinetics.html","id":null,"dir":"Reference","previous_headings":"","what":"Hierarchical kinetics template — hierarchical_kinetics","title":"Hierarchical kinetics template — hierarchical_kinetics","text":"R markdown format setting hierarchical kinetics based template provided mkin package. format based rmarkdown::pdf_document. Chunk options adapted. Echoing R code code chunks caching turned per default. character prepending output code chunks set empty string, code tidying , figure alignment defaults centering, positioning figures set \"H\", means figures move around document, stay user includes .","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/hierarchical_kinetics.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Hierarchical kinetics template — hierarchical_kinetics","text":"","code":"hierarchical_kinetics(..., keep_tex = FALSE)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/hierarchical_kinetics.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Hierarchical kinetics template — hierarchical_kinetics","text":"... Arguments rmarkdown::pdf_document keep_tex Keep intermediate tex file used conversion PDF. Note argument control whether keep auxiliary files (e.g., .aux) generated LaTeX compiling .tex .pdf. keep files, may set options(tinytex.clean = FALSE).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/hierarchical_kinetics.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Hierarchical kinetics template — hierarchical_kinetics","text":"R Markdown output format pass render","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/hierarchical_kinetics.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Hierarchical kinetics template — hierarchical_kinetics","text":"latter feature (positioning figures \"H\") depends LaTeX package 'float'. addition, LaTeX package 'listing' used template showing model fit summaries Appendix. means LaTeX packages 'float' 'listing' need installed TeX distribution used. Windows, easiest way achieve (TeX distribution present ) install 'tinytex' R package, run 'tinytex::install_tinytex()' get basic tiny Tex distribution, run 'tinytex::tlmgr_install(c(\"float\", \"listing\"))'.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/hierarchical_kinetics.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Hierarchical kinetics template — hierarchical_kinetics","text":"","code":"# \\dontrun{ library(rmarkdown) # The following is now commented out after the relase of v1.2.3 for the generation # of online docs, as the command creates a directory and opens an editor #draft(\"example_analysis.rmd\", template = \"hierarchical_kinetics\", package = \"mkin\") # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/illparms.html","id":null,"dir":"Reference","previous_headings":"","what":"Method to get the names of ill-defined parameters — illparms","title":"Method to get the names of ill-defined parameters — illparms","text":"method generalised nonlinear regression fits obtained mkinfit mmkin checks degradation parameters pass Wald test (degradation kinetics often simply called t-test) significant difference zero. test, parameterisation without parameter transformations used.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/illparms.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Method to get the names of ill-defined parameters — illparms","text":"","code":"illparms(object, ...) # S3 method for class 'mkinfit' illparms(object, conf.level = 0.95, ...) # S3 method for class 'illparms.mkinfit' print(x, ...) # S3 method for class 'mmkin' illparms(object, conf.level = 0.95, ...) # S3 method for class 'illparms.mmkin' print(x, ...) # S3 method for class 'saem.mmkin' illparms( object, conf.level = 0.95, random = TRUE, errmod = TRUE, slopes = TRUE, ... ) # S3 method for class 'illparms.saem.mmkin' print(x, ...) # S3 method for class 'mhmkin' illparms(object, conf.level = 0.95, random = TRUE, errmod = TRUE, ...) # S3 method for class 'illparms.mhmkin' print(x, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/illparms.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Method to get the names of ill-defined parameters — illparms","text":"object object investigate ... potential future extensions conf.level confidence level checking p values x object printed random hierarchical fits, random effects tested? errmod hierarchical fits, error model parameters tested? slopes hierarchical saem fits using saemix backend, slope parameters covariate model(starting 'beta_') tested?","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/illparms.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Method to get the names of ill-defined parameters — illparms","text":"mkinfit saem objects, character vector parameter names. mmkin mhmkin objects, matrix like object class 'illparms.mmkin' 'illparms.mhmkin'.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/illparms.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Method to get the names of ill-defined parameters — illparms","text":"method hierarchical model fits, also known nonlinear mixed-effects model fits obtained saem mhmkin checks confidence intervals random effects expressed standard deviations include zero, confidence intervals error model parameters include zero.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/illparms.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Method to get the names of ill-defined parameters — illparms","text":"return objects printing methods. single fits, printing output anything case ill-defined parameters found.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/illparms.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Method to get the names of ill-defined parameters — illparms","text":"","code":"fit <- mkinfit(\"FOMC\", FOCUS_2006_A, quiet = TRUE) #> Warning: Optimisation did not converge: #> false convergence (8) illparms(fit) #> [1] \"parent_0\" \"alpha\" \"beta\" \"sigma\" # \\dontrun{ fits <- mmkin( c(\"SFO\", \"FOMC\"), list(\"FOCUS A\" = FOCUS_2006_A, \"FOCUS C\" = FOCUS_2006_C), quiet = TRUE) illparms(fits) #> dataset #> model FOCUS A FOCUS C #> SFO #> FOMC parent_0, alpha, beta, sigma # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ilr.html","id":null,"dir":"Reference","previous_headings":"","what":"Function to perform isometric log-ratio transformation — ilr","title":"Function to perform isometric log-ratio transformation — ilr","text":"implementation special case class isometric log-ratio transformations.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ilr.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Function to perform isometric log-ratio transformation — ilr","text":"","code":"ilr(x) invilr(x)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ilr.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Function to perform isometric log-ratio transformation — ilr","text":"x numeric vector. Naturally, forward transformation sensible vectors elements greater zero.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ilr.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Function to perform isometric log-ratio transformation — ilr","text":"result forward backward transformation. returned components always sum 1 case inverse log-ratio transformation.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ilr.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Function to perform isometric log-ratio transformation — ilr","text":"Peter Filzmoser, Karel Hron (2008) Outlier Detection Compositional Data Using Robust Methods. Math Geosci 40 233-248","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ilr.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Function to perform isometric log-ratio transformation — ilr","text":"René Lehmann Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/ilr.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Function to perform isometric log-ratio transformation — ilr","text":"","code":"# Order matters ilr(c(0.1, 1, 10)) #> [1] -1.628174 -2.820079 ilr(c(10, 1, 0.1)) #> [1] 1.628174 2.820079 # Equal entries give ilr transformations with zeros as elements ilr(c(3, 3, 3)) #> [1] 0 0 # Almost equal entries give small numbers ilr(c(0.3, 0.4, 0.3)) #> [1] -0.2034219 0.1174457 # Only the ratio between the numbers counts, not their sum invilr(ilr(c(0.7, 0.29, 0.01))) #> [1] 0.70 0.29 0.01 invilr(ilr(2.1 * c(0.7, 0.29, 0.01))) #> [1] 0.70 0.29 0.01 # Inverse transformation of larger numbers gives unequal elements invilr(-10) #> [1] 7.213536e-07 9.999993e-01 invilr(c(-10, 0)) #> [1] 7.207415e-07 9.991507e-01 8.486044e-04 # The sum of the elements of the inverse ilr is 1 sum(invilr(c(-10, 0))) #> [1] 1 # This is why we do not need all elements of the inverse transformation to go back: a <- c(0.1, 0.3, 0.5) b <- invilr(a) length(b) # Four elements #> [1] 4 ilr(c(b[1:3], 1 - sum(b[1:3]))) # Gives c(0.1, 0.3, 0.5) #> [1] 0.1 0.3 0.5"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/intervals.saem.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Confidence intervals for parameters in saem.mmkin objects — intervals.saem.mmkin","title":"Confidence intervals for parameters in saem.mmkin objects — intervals.saem.mmkin","text":"Confidence intervals parameters saem.mmkin objects","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/intervals.saem.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Confidence intervals for parameters in saem.mmkin objects — intervals.saem.mmkin","text":"","code":"# S3 method for class 'saem.mmkin' intervals(object, level = 0.95, backtransform = TRUE, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/intervals.saem.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Confidence intervals for parameters in saem.mmkin objects — intervals.saem.mmkin","text":"object fitted saem.mmkin object level confidence level. Must default 0.95 available saemix object backtransform case model fitted mkin transformations, backtransform parameters one one correlation transformed backtransformed parameters exists? ... compatibility generic method","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/intervals.saem.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Confidence intervals for parameters in saem.mmkin objects — intervals.saem.mmkin","text":"object 'intervals.saem.mmkin' 'intervals.lme' class attribute","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/llhist.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot the distribution of log likelihoods from multistart objects — llhist","title":"Plot the distribution of log likelihoods from multistart objects — llhist","text":"Produces histogram log-likelihoods. addition, likelihood original fit shown red vertical line.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/llhist.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot the distribution of log likelihoods from multistart objects — llhist","text":"","code":"llhist(object, breaks = \"Sturges\", lpos = \"topleft\", main = \"\", ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/llhist.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot the distribution of log likelihoods from multistart objects — llhist","text":"object multistart object breaks Passed hist lpos Positioning legend. main Title plot ... Passed hist","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/loftest.html","id":null,"dir":"Reference","previous_headings":"","what":"Lack-of-fit test for models fitted to data with replicates — loftest","title":"Lack-of-fit test for models fitted to data with replicates — loftest","text":"generic function method currently defined mkinfit objects. fits anova model data contained object compares likelihoods using likelihood ratio test lrtest.default lmtest package.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/loftest.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Lack-of-fit test for models fitted to data with replicates — loftest","text":"","code":"loftest(object, ...) # S3 method for class 'mkinfit' loftest(object, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/loftest.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Lack-of-fit test for models fitted to data with replicates — loftest","text":"object model object defined loftest method ... used","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/loftest.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Lack-of-fit test for models fitted to data with replicates — loftest","text":"anova model interpreted simplest form mkinfit model, assuming constant variance means, enforcing structure means, one model parameter every mean replicate samples.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/loftest.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Lack-of-fit test for models fitted to data with replicates — loftest","text":"","code":"# \\dontrun{ test_data <- subset(synthetic_data_for_UBA_2014[[12]]$data, name == \"parent\") sfo_fit <- mkinfit(\"SFO\", test_data, quiet = TRUE) plot_res(sfo_fit) # We see a clear pattern in the residuals loftest(sfo_fit) # We have a clear lack of fit #> Likelihood ratio test #> #> Model 1: ANOVA with error model const #> Model 2: SFO with error model const #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 10 -40.710 #> 2 3 -63.954 -7 46.487 7.027e-08 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 # # We try a different model (the one that was used to generate the data) dfop_fit <- mkinfit(\"DFOP\", test_data, quiet = TRUE) plot_res(dfop_fit) # We don't see systematic deviations, but heteroscedastic residuals # therefore we should consider adapting the error model, although we have loftest(dfop_fit) # no lack of fit #> Likelihood ratio test #> #> Model 1: ANOVA with error model const #> Model 2: DFOP with error model const #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 10 -40.710 #> 2 5 -42.453 -5 3.485 0.6257 # # This is the anova model used internally for the comparison test_data_anova <- test_data test_data_anova$time <- as.factor(test_data_anova$time) anova_fit <- lm(value ~ time, data = test_data_anova) summary(anova_fit) #> #> Call: #> lm(formula = value ~ time, data = test_data_anova) #> #> Residuals: #> Min 1Q Median 3Q Max #> -6.1000 -0.5625 0.0000 0.5625 6.1000 #> #> Coefficients: #> Estimate Std. Error t value Pr(>|t|) #> (Intercept) 103.150 2.323 44.409 7.44e-12 *** #> time1 -19.950 3.285 -6.073 0.000185 *** #> time3 -50.800 3.285 -15.465 8.65e-08 *** #> time7 -68.500 3.285 -20.854 6.28e-09 *** #> time14 -79.750 3.285 -24.278 1.63e-09 *** #> time28 -86.000 3.285 -26.181 8.35e-10 *** #> time60 -94.900 3.285 -28.891 3.48e-10 *** #> time90 -98.500 3.285 -29.986 2.49e-10 *** #> time120 -100.450 3.285 -30.580 2.09e-10 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 #> #> Residual standard error: 3.285 on 9 degrees of freedom #> Multiple R-squared: 0.9953,\tAdjusted R-squared: 0.9912 #> F-statistic: 240.5 on 8 and 9 DF, p-value: 1.417e-09 #> logLik(anova_fit) # We get the same likelihood and degrees of freedom #> 'log Lik.' -40.71015 (df=10) # test_data_2 <- synthetic_data_for_UBA_2014[[12]]$data m_synth_SFO_lin <- mkinmod(parent = list(type = \"SFO\", to = \"M1\"), M1 = list(type = \"SFO\", to = \"M2\"), M2 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded sfo_lin_fit <- mkinfit(m_synth_SFO_lin, test_data_2, quiet = TRUE) plot_res(sfo_lin_fit) # not a good model, we try parallel formation loftest(sfo_lin_fit) #> Likelihood ratio test #> #> Model 1: ANOVA with error model const #> Model 2: m_synth_SFO_lin with error model const and fixed parameter(s) M1_0, M2_0 #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 28 -93.606 #> 2 7 -171.927 -21 156.64 < 2.2e-16 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 # m_synth_SFO_par <- mkinmod(parent = list(type = \"SFO\", to = c(\"M1\", \"M2\")), M1 = list(type = \"SFO\"), M2 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded sfo_par_fit <- mkinfit(m_synth_SFO_par, test_data_2, quiet = TRUE) plot_res(sfo_par_fit) # much better for metabolites loftest(sfo_par_fit) #> Likelihood ratio test #> #> Model 1: ANOVA with error model const #> Model 2: m_synth_SFO_par with error model const and fixed parameter(s) M1_0, M2_0 #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 28 -93.606 #> 2 7 -156.331 -21 125.45 < 2.2e-16 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 # m_synth_DFOP_par <- mkinmod(parent = list(type = \"DFOP\", to = c(\"M1\", \"M2\")), M1 = list(type = \"SFO\"), M2 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded dfop_par_fit <- mkinfit(m_synth_DFOP_par, test_data_2, quiet = TRUE) plot_res(dfop_par_fit) # No visual lack of fit loftest(dfop_par_fit) # no lack of fit found by the test #> Likelihood ratio test #> #> Model 1: ANOVA with error model const #> Model 2: m_synth_DFOP_par with error model const and fixed parameter(s) M1_0, M2_0 #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 28 -93.606 #> 2 9 -102.763 -19 18.313 0.5016 # # The anova model used for comparison in the case of transformation products test_data_anova_2 <- dfop_par_fit$data test_data_anova_2$variable <- as.factor(test_data_anova_2$variable) test_data_anova_2$time <- as.factor(test_data_anova_2$time) anova_fit_2 <- lm(observed ~ time:variable - 1, data = test_data_anova_2) summary(anova_fit_2) #> #> Call: #> lm(formula = observed ~ time:variable - 1, data = test_data_anova_2) #> #> Residuals: #> Min 1Q Median 3Q Max #> -6.1000 -0.5875 0.0000 0.5875 6.1000 #> #> Coefficients: (2 not defined because of singularities) #> Estimate Std. Error t value Pr(>|t|) #> time0:variableparent 103.150 1.573 65.562 < 2e-16 *** #> time1:variableparent 83.200 1.573 52.882 < 2e-16 *** #> time3:variableparent 52.350 1.573 33.274 < 2e-16 *** #> time7:variableparent 34.650 1.573 22.024 < 2e-16 *** #> time14:variableparent 23.400 1.573 14.873 6.35e-14 *** #> time28:variableparent 17.150 1.573 10.901 5.47e-11 *** #> time60:variableparent 8.250 1.573 5.244 1.99e-05 *** #> time90:variableparent 4.650 1.573 2.956 0.006717 ** #> time120:variableparent 2.700 1.573 1.716 0.098507 . #> time0:variableM1 NA NA NA NA #> time1:variableM1 11.850 1.573 7.532 6.93e-08 *** #> time3:variableM1 22.700 1.573 14.428 1.26e-13 *** #> time7:variableM1 33.050 1.573 21.007 < 2e-16 *** #> time14:variableM1 31.250 1.573 19.863 < 2e-16 *** #> time28:variableM1 18.900 1.573 12.013 7.02e-12 *** #> time60:variableM1 7.550 1.573 4.799 6.28e-05 *** #> time90:variableM1 3.850 1.573 2.447 0.021772 * #> time120:variableM1 2.050 1.573 1.303 0.204454 #> time0:variableM2 NA NA NA NA #> time1:variableM2 6.700 1.573 4.259 0.000254 *** #> time3:variableM2 16.750 1.573 10.646 8.93e-11 *** #> time7:variableM2 25.800 1.573 16.399 6.89e-15 *** #> time14:variableM2 28.600 1.573 18.178 6.35e-16 *** #> time28:variableM2 25.400 1.573 16.144 9.85e-15 *** #> time60:variableM2 21.600 1.573 13.729 3.81e-13 *** #> time90:variableM2 17.800 1.573 11.314 2.51e-11 *** #> time120:variableM2 14.100 1.573 8.962 2.79e-09 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 #> #> Residual standard error: 2.225 on 25 degrees of freedom #> Multiple R-squared: 0.9979,\tAdjusted R-squared: 0.9957 #> F-statistic: 469.2 on 25 and 25 DF, p-value: < 2.2e-16 #> # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit","title":"Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit","text":"function returns product likelihood densities observed value, calculated part fitting procedure using dnorm, .e. assuming normal distribution, means predicted degradation model, standard deviations predicted error model.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit","text":"","code":"# S3 method for class 'mkinfit' logLik(object, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit","text":"object object class mkinfit. ... compatibility generic method","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.mkinfit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit","text":"object class logLik number estimated parameters (degradation model parameters plus variance model parameters) attribute.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.mkinfit.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit","text":"total number estimated parameters returned value likelihood calculated sum fitted degradation model parameters fitted error model parameters.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.mkinfit.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.mkinfit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculated the log-likelihood of a fitted mkinfit object — logLik.mkinfit","text":"","code":"# \\dontrun{ sfo_sfo <- mkinmod( parent = mkinsub(\"SFO\", to = \"m1\"), m1 = mkinsub(\"SFO\") ) #> Temporary DLL for differentials generated and loaded d_t <- subset(FOCUS_2006_D, value != 0) f_nw <- mkinfit(sfo_sfo, d_t, quiet = TRUE) # no weighting (weights are unity) f_obs <- update(f_nw, error_model = \"obs\") f_tc <- update(f_nw, error_model = \"tc\") AIC(f_nw, f_obs, f_tc) #> df AIC #> f_nw 5 204.4486 #> f_obs 6 205.8727 #> f_tc 6 141.9656 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.saem.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"logLik method for saem.mmkin objects — logLik.saem.mmkin","title":"logLik method for saem.mmkin objects — logLik.saem.mmkin","text":"logLik method saem.mmkin objects","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.saem.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"logLik method for saem.mmkin objects — logLik.saem.mmkin","text":"","code":"# S3 method for class 'saem.mmkin' logLik(object, ..., method = c(\"is\", \"lin\", \"gq\"))"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logLik.saem.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"logLik method for saem.mmkin objects — logLik.saem.mmkin","text":"object fitted saem.mmkin object ... Passed saemix::logLik.SaemixObject method Passed saemix::logLik.SaemixObject","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logistic.solution.html","id":null,"dir":"Reference","previous_headings":"","what":"Logistic kinetics — logistic.solution","title":"Logistic kinetics — logistic.solution","text":"Function describing exponential decline defined starting value, increasing rate constant, supposedly caused microbial growth","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logistic.solution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Logistic kinetics — logistic.solution","text":"","code":"logistic.solution(t, parent_0, kmax, k0, r)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logistic.solution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Logistic kinetics — logistic.solution","text":"t Time. parent_0 Starting value response variable time zero. kmax Maximum rate constant. k0 Minimum rate constant effective time zero. r Growth rate increase rate constant.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logistic.solution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Logistic kinetics — logistic.solution","text":"value response variable time t.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logistic.solution.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Logistic kinetics — logistic.solution","text":"solution logistic model reduces SFO.solution k0 equal kmax.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logistic.solution.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Logistic kinetics — logistic.solution","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics FOCUS (2014) “Generic guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, Version 1.1, 18 December 2014 http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/logistic.solution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Logistic kinetics — logistic.solution","text":"","code":"# Reproduce the plot on page 57 of FOCUS (2014) plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.2), from = 0, to = 100, ylim = c(0, 100), xlab = \"Time\", ylab = \"Residue\") plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.4), from = 0, to = 100, add = TRUE, lty = 2, col = 2) plot(function(x) logistic.solution(x, 100, 0.08, 0.0001, 0.8), from = 0, to = 100, add = TRUE, lty = 3, col = 3) plot(function(x) logistic.solution(x, 100, 0.08, 0.001, 0.2), from = 0, to = 100, add = TRUE, lty = 4, col = 4) plot(function(x) logistic.solution(x, 100, 0.08, 0.08, 0.2), from = 0, to = 100, add = TRUE, lty = 5, col = 5) legend(\"topright\", inset = 0.05, legend = paste0(\"k0 = \", c(0.0001, 0.0001, 0.0001, 0.001, 0.08), \", r = \", c(0.2, 0.4, 0.8, 0.2, 0.2)), lty = 1:5, col = 1:5) # Fit with synthetic data logistic <- mkinmod(parent = mkinsub(\"logistic\")) sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) parms_logistic <- c(kmax = 0.08, k0 = 0.0001, r = 0.2) d_logistic <- mkinpredict(logistic, parms_logistic, c(parent = 100), sampling_times) d_2_1 <- add_err(d_logistic, sdfunc = function(x) sigma_twocomp(x, 0.5, 0.07), n = 1, reps = 2, digits = 5, LOD = 0.1, seed = 123456)[[1]] m <- mkinfit(\"logistic\", d_2_1, quiet = TRUE) plot_sep(m) summary(m)$bpar #> Estimate se_notrans t value Pr(>t) Lower #> parent_0 1.057896e+02 1.9023449604 55.610120 3.768360e-16 1.016451e+02 #> kmax 6.398190e-02 0.0143201030 4.467978 3.841828e-04 3.929235e-02 #> k0 1.612775e-04 0.0005866813 0.274898 3.940351e-01 5.846688e-08 #> r 2.263946e-01 0.1718110664 1.317695 1.061043e-01 4.335843e-02 #> sigma 5.332935e+00 0.9145907310 5.830952 4.036926e-05 3.340213e+00 #> Upper #> parent_0 109.9341588 #> kmax 0.1041853 #> k0 0.4448749 #> r 1.1821120 #> sigma 7.3256566 endpoints(m)$distimes #> DT50 DT90 DT50_k0 DT50_kmax #> parent 36.86533 62.41511 4297.853 10.83349"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/lrtest.mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Likelihood ratio test for mkinfit models — lrtest.mkinfit","title":"Likelihood ratio test for mkinfit models — lrtest.mkinfit","text":"Compare two mkinfit models based likelihood. two fitted mkinfit objects given arguments, checked fitted data. responsibility user make sure models nested, .e. one less degrees freedom can expressed fixing parameters .","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/lrtest.mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Likelihood ratio test for mkinfit models — lrtest.mkinfit","text":"","code":"# S3 method for class 'mkinfit' lrtest(object, object_2 = NULL, ...) # S3 method for class 'mmkin' lrtest(object, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/lrtest.mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Likelihood ratio test for mkinfit models — lrtest.mkinfit","text":"object mkinfit object, mmkin column object containing two fits data. object_2 Optionally, another mkinfit object fitted data. ... Argument mkinfit, passed update.mkinfit creating alternative fitted object.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/lrtest.mkinfit.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Likelihood ratio test for mkinfit models — lrtest.mkinfit","text":"Alternatively, argument mkinfit can given passed update.mkinfit obtain alternative model. comparison made lrtest.default method lmtest package. model higher number fitted parameters (alternative hypothesis) listed first, model lower number fitted parameters (null hypothesis).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/lrtest.mkinfit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Likelihood ratio test for mkinfit models — lrtest.mkinfit","text":"","code":"# \\dontrun{ test_data <- subset(synthetic_data_for_UBA_2014[[12]]$data, name == \"parent\") sfo_fit <- mkinfit(\"SFO\", test_data, quiet = TRUE) dfop_fit <- mkinfit(\"DFOP\", test_data, quiet = TRUE) lrtest(dfop_fit, sfo_fit) #> Likelihood ratio test #> #> Model 1: DFOP with error model const #> Model 2: SFO with error model const #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 5 -42.453 #> 2 3 -63.954 -2 43.002 4.594e-10 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 lrtest(sfo_fit, dfop_fit) #> Likelihood ratio test #> #> Model 1: DFOP with error model const #> Model 2: SFO with error model const #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 5 -42.453 #> 2 3 -63.954 -2 43.002 4.594e-10 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 # The following two examples are commented out as they fail during # generation of the static help pages by pkgdown #lrtest(dfop_fit, error_model = \"tc\") #lrtest(dfop_fit, fixed_parms = c(k2 = 0)) # However, this equivalent syntax also works for static help pages lrtest(dfop_fit, update(dfop_fit, error_model = \"tc\")) #> Likelihood ratio test #> #> Model 1: DFOP with error model tc #> Model 2: DFOP with error model const #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 6 -34.587 #> 2 5 -42.453 -1 15.731 7.302e-05 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 lrtest(dfop_fit, update(dfop_fit, fixed_parms = c(k2 = 0))) #> Likelihood ratio test #> #> Model 1: DFOP with error model const #> Model 2: DFOP with error model const and fixed parameter(s) k2 #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 5 -42.453 #> 2 4 -57.340 -1 29.776 4.851e-08 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/max_twa_parent.html","id":null,"dir":"Reference","previous_headings":"","what":"Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent","title":"Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent","text":"function calculates maximum moving window time weighted average concentrations (TWAs) kinetic models fitted mkinfit. Currently, calculations parent implemented SFO, FOMC, DFOP HS models, using analytical formulas given PEC soil section FOCUS guidance.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/max_twa_parent.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent","text":"","code":"max_twa_parent(fit, windows) max_twa_sfo(M0 = 1, k, t) max_twa_fomc(M0 = 1, alpha, beta, t) max_twa_dfop(M0 = 1, k1, k2, g, t) max_twa_hs(M0 = 1, k1, k2, tb, t)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/max_twa_parent.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent","text":"fit object class mkinfit. windows width time windows TWAs calculated. M0 initial concentration maximum time weighted average decline curve calculated. default use value 1, means relative maximum time weighted average factor (f_twa) calculated. k rate constant case SFO kinetics. t width time window. alpha Parameter FOMC model. beta Parameter FOMC model. k1 first rate constant DFOP HS kinetics. k2 second rate constant DFOP HS kinetics. g Parameter DFOP model. tb Parameter HS model.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/max_twa_parent.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent","text":"max_twa_parent, numeric vector, named using windows argument. functions, numeric vector length one (also known 'number').","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/max_twa_parent.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/max_twa_parent.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/max_twa_parent.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Function to calculate maximum time weighted average concentrations from kinetic models fitted with mkinfit — max_twa_parent","text":"","code":"fit <- mkinfit(\"FOMC\", FOCUS_2006_C, quiet = TRUE) max_twa_parent(fit, c(7, 21)) #> 7 21 #> 34.71343 18.22124"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mccall81_245T.html","id":null,"dir":"Reference","previous_headings":"","what":"Datasets on aerobic soil metabolism of 2,4,5-T in six soils — mccall81_245T","title":"Datasets on aerobic soil metabolism of 2,4,5-T in six soils — mccall81_245T","text":"Time course 2,4,5-trichlorophenoxyacetic acid, corresponding 2,4,5-trichlorophenol 2,4,5-trichloroanisole recovered diethylether extracts.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mccall81_245T.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Datasets on aerobic soil metabolism of 2,4,5-T in six soils — mccall81_245T","text":"","code":"mccall81_245T"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mccall81_245T.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Datasets on aerobic soil metabolism of 2,4,5-T in six soils — mccall81_245T","text":"dataframe containing following variables. name name compound observed. Note T245 used acronym 2,4,5-T. T245 legitimate object name R, necessary specifying models using mkinmod. time numeric vector containing sampling times days treatment value numeric vector containing concentrations percent applied radioactivity soil factor containing name soil","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mccall81_245T.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Datasets on aerobic soil metabolism of 2,4,5-T in six soils — mccall81_245T","text":"McCall P, Vrona SA, Kelley SS (1981) Fate uniformly carbon-14 ring labelled 2,4,5-Trichlorophenoxyacetic acid 2,4-dichlorophenoxyacetic acid. J Agric Chem 29, 100-107 doi:10.1021/jf00103a026","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mccall81_245T.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Datasets on aerobic soil metabolism of 2,4,5-T in six soils — mccall81_245T","text":"","code":"SFO_SFO_SFO <- mkinmod(T245 = list(type = \"SFO\", to = \"phenol\"), phenol = list(type = \"SFO\", to = \"anisole\"), anisole = list(type = \"SFO\")) #> Temporary DLL for differentials generated and loaded # \\dontrun{ fit.1 <- mkinfit(SFO_SFO_SFO, subset(mccall81_245T, soil == \"Commerce\"), quiet = TRUE) #> Warning: Observations with value of zero were removed from the data summary(fit.1)$bpar #> Estimate se_notrans t value Pr(>t) #> T245_0 1.038550e+02 2.1847074943 47.537272 4.472189e-18 #> k_T245 4.337042e-02 0.0018983965 22.845818 2.276911e-13 #> k_phenol 4.050581e-01 0.2986993738 1.356073 9.756990e-02 #> k_anisole 6.678742e-03 0.0008021439 8.326114 2.623177e-07 #> f_T245_to_phenol 6.227599e-01 0.3985340721 1.562626 6.949414e-02 #> f_phenol_to_anisole 1.000000e+00 0.6718440131 1.488441 7.867790e-02 #> sigma 2.514628e+00 0.4907558973 5.123989 6.233159e-05 #> Lower Upper #> T245_0 99.246061490 1.084640e+02 #> k_T245 0.039631621 4.746194e-02 #> k_phenol 0.218013879 7.525762e-01 #> k_anisole 0.005370739 8.305299e-03 #> f_T245_to_phenol 0.547559080 6.924813e-01 #> f_phenol_to_anisole 0.000000000 1.000000e+00 #> sigma 1.706607296 3.322649e+00 endpoints(fit.1) #> $ff #> T245_phenol T245_sink phenol_anisole phenol_sink #> 6.227599e-01 3.772401e-01 1.000000e+00 3.072478e-10 #> #> $distimes #> DT50 DT90 #> T245 15.982025 53.09114 #> phenol 1.711229 5.68458 #> anisole 103.784093 344.76329 #> # formation fraction from phenol to anisol is practically 1. As we cannot # fix formation fractions when using the ilr transformation, we can turn of # the sink in the model generation SFO_SFO_SFO_2 <- mkinmod(T245 = list(type = \"SFO\", to = \"phenol\"), phenol = list(type = \"SFO\", to = \"anisole\", sink = FALSE), anisole = list(type = \"SFO\")) #> Temporary DLL for differentials generated and loaded fit.2 <- mkinfit(SFO_SFO_SFO_2, subset(mccall81_245T, soil == \"Commerce\"), quiet = TRUE) #> Warning: Observations with value of zero were removed from the data summary(fit.2)$bpar #> Estimate se_notrans t value Pr(>t) Lower #> T245_0 1.038550e+02 2.1623653059 48.028439 4.993108e-19 99.271020328 #> k_T245 4.337042e-02 0.0018343666 23.643268 3.573556e-14 0.039650976 #> k_phenol 4.050582e-01 0.1177237651 3.440752 1.679255e-03 0.218746589 #> k_anisole 6.678742e-03 0.0006829745 9.778903 1.872894e-08 0.005377083 #> f_T245_to_phenol 6.227599e-01 0.0342197873 18.198824 2.039411e-12 0.547975634 #> sigma 2.514628e+00 0.3790944250 6.633250 2.875782e-06 1.710983655 #> Upper #> T245_0 108.43904079 #> k_T245 0.04743877 #> k_phenol 0.75005593 #> k_anisole 0.00829550 #> f_T245_to_phenol 0.69212307 #> sigma 3.31827222 endpoints(fit.1) #> $ff #> T245_phenol T245_sink phenol_anisole phenol_sink #> 6.227599e-01 3.772401e-01 1.000000e+00 3.072478e-10 #> #> $distimes #> DT50 DT90 #> T245 15.982025 53.09114 #> phenol 1.711229 5.68458 #> anisole 103.784093 344.76329 #> plot_sep(fit.2) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mean_degparms.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate mean degradation parameters for an mmkin row object — mean_degparms","title":"Calculate mean degradation parameters for an mmkin row object — mean_degparms","text":"Calculate mean degradation parameters mmkin row object","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mean_degparms.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate mean degradation parameters for an mmkin row object — mean_degparms","text":"","code":"mean_degparms( object, random = FALSE, test_log_parms = FALSE, conf.level = 0.6, default_log_parms = NA )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mean_degparms.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate mean degradation parameters for an mmkin row object — mean_degparms","text":"object mmkin row object containing several fits model different datasets random list fixed random effects returned? test_log_parms TRUE, log parameters considered mean calculations untransformed counterparts (likely rate constants) pass t-test significant difference zero. conf.level Possibility adjust required confidence level parameter tested requested 'test_log_parms'. default_log_parms set numeric value, used default value tested log parameters failed t-test.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mean_degparms.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate mean degradation parameters for an mmkin row object — mean_degparms","text":"random FALSE (default), named vector containing mean values fitted degradation model parameters. random TRUE, list fixed random effects, format required start argument nlme case single grouping variable ds.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mhmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models — mhmkin","title":"Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models — mhmkin","text":"name methods expresses (multiple) hierarchichal (also known multilevel) multicompartment kinetic models fitted. kinetic models nonlinear, can use various nonlinear mixed-effects model fitting functions.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mhmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models — mhmkin","text":"","code":"mhmkin(objects, ...) # S3 method for class 'mmkin' mhmkin(objects, ...) # S3 method for class 'list' mhmkin( objects, backend = \"saemix\", algorithm = \"saem\", no_random_effect = NULL, ..., cores = if (Sys.info()[\"sysname\"] == \"Windows\") 1 else parallel::detectCores(), cluster = NULL ) # S3 method for class 'mhmkin' x[i, j, ..., drop = FALSE] # S3 method for class 'mhmkin' print(x, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mhmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models — mhmkin","text":"objects list mmkin objects containing fits degradation models data, using different error models. Alternatively, single mmkin object containing fits several degradation models data ... arguments passed nonlinear mixed-effects model fitting function. backend backend used fitting. Currently, saemix supported algorithm algorithm used fitting (currently used) no_random_effect Default NULL passed saem. character vector supplied, passed calls saem, exclude random effects matching parameters. Alternatively, list character vectors object class illparms.mhmkin can specified. dimensions return object current call , .e. number rows must match number degradation models mmkin object(s), number columns must match number error models used mmkin object(s). cores number cores used multicore processing. used cluster argument NULL. Windows machines, cores > 1 supported, need use cluster argument use multiple logical processors. Per default, cores detected parallel::detectCores() used, except Windows default 1. cluster cluster returned makeCluster used parallel execution. x mhmkin object. Row index selecting fits specific models j Column index selecting fits specific datasets drop FALSE, method always returns mhmkin object, otherwise either list fit objects single fit object.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mhmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models — mhmkin","text":"two-dimensional array fit objects /try-errors can indexed using degradation model names first index (row index) error model names second index (column index), class attribute 'mhmkin'. object inheriting mhmkin.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mhmkin.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models — mhmkin","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mhmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit nonlinear mixed-effects models built from one or more kinetic degradation models and one or more error models — mhmkin","text":"","code":"# \\dontrun{ # We start with separate evaluations of all the first six datasets with two # degradation models and two error models f_sep_const <- mmkin(c(\"SFO\", \"FOMC\"), ds_fomc[1:6], cores = 2, quiet = TRUE) f_sep_tc <- update(f_sep_const, error_model = \"tc\") # The mhmkin function sets up hierarchical degradation models aka # nonlinear mixed-effects models for all four combinations, specifying # uncorrelated random effects for all degradation parameters f_saem_1 <- mhmkin(list(f_sep_const, f_sep_tc), cores = 2) status(f_saem_1) #> error #> degradation const tc #> SFO OK OK #> FOMC OK OK #> #> OK: Fit terminated successfully # The 'illparms' function shows that in all hierarchical fits, at least # one random effect is ill-defined (the confidence interval for the # random effect expressed as standard deviation includes zero) illparms(f_saem_1) #> error #> degradation const tc #> SFO sd(parent_0) sd(parent_0) #> FOMC sd(log_beta) sd(parent_0), sd(log_beta) # Therefore we repeat the fits, excluding the ill-defined random effects f_saem_2 <- update(f_saem_1, no_random_effect = illparms(f_saem_1)) status(f_saem_2) #> error #> degradation const tc #> SFO OK OK #> FOMC OK OK #> #> OK: Fit terminated successfully illparms(f_saem_2) #> error #> degradation const tc #> SFO #> FOMC # Model comparisons show that FOMC with two-component error is preferable, # and confirms our reduction of the default parameter model anova(f_saem_1) #> Data: 95 observations of 1 variable(s) grouped in 6 datasets #> #> npar AIC BIC Lik #> SFO const 5 574.40 573.35 -282.20 #> SFO tc 6 543.72 542.47 -265.86 #> FOMC const 7 489.67 488.22 -237.84 #> FOMC tc 8 406.11 404.44 -195.05 anova(f_saem_2) #> Data: 95 observations of 1 variable(s) grouped in 6 datasets #> #> npar AIC BIC Lik #> SFO const 4 572.22 571.39 -282.11 #> SFO tc 5 541.63 540.59 -265.81 #> FOMC const 6 487.38 486.13 -237.69 #> FOMC tc 6 402.12 400.88 -195.06 # The convergence plot for the selected model looks fine saemix::plot(f_saem_2[[\"FOMC\", \"tc\"]]$so, plot.type = \"convergence\") # The plot of predictions versus data shows that we have a pretty data-rich # situation with homogeneous distribution of residuals, because we used the # same degradation model, error model and parameter distribution model that # was used in the data generation. plot(f_saem_2[[\"FOMC\", \"tc\"]]) # We can specify the same parameter model reductions manually no_ranef <- list(\"parent_0\", \"log_beta\", \"parent_0\", c(\"parent_0\", \"log_beta\")) dim(no_ranef) <- c(2, 2) f_saem_2m <- update(f_saem_1, no_random_effect = no_ranef) anova(f_saem_2m) #> Data: 95 observations of 1 variable(s) grouped in 6 datasets #> #> npar AIC BIC Lik #> SFO const 4 572.22 571.39 -282.11 #> SFO tc 5 541.63 540.59 -265.81 #> FOMC const 6 487.38 486.13 -237.69 #> FOMC tc 6 402.12 400.88 -195.06 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mixed.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a mixed effects model from an mmkin row object — mixed","title":"Create a mixed effects model from an mmkin row object — mixed","text":"Create mixed effects model mmkin row object","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mixed.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a mixed effects model from an mmkin row object — mixed","text":"","code":"mixed(object, ...) # S3 method for class 'mmkin' mixed(object, method = c(\"none\"), ...) # S3 method for class 'mixed.mmkin' print(x, digits = max(3, getOption(\"digits\") - 3), ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mixed.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a mixed effects model from an mmkin row object — mixed","text":"object mmkin row object ... Currently used method method used x mixed.mmkin object print digits Number digits use printing.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mixed.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create a mixed effects model from an mmkin row object — mixed","text":"object class 'mixed.mmkin' observed data single dataframe convenient plotting","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mixed.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create a mixed effects model from an mmkin row object — mixed","text":"","code":"sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) n_biphasic <- 8 err_1 = list(const = 1, prop = 0.07) DFOP_SFO <- mkinmod( parent = mkinsub(\"DFOP\", \"m1\"), m1 = mkinsub(\"SFO\"), quiet = TRUE) set.seed(123456) log_sd <- 0.3 syn_biphasic_parms <- as.matrix(data.frame( k1 = rlnorm(n_biphasic, log(0.05), log_sd), k2 = rlnorm(n_biphasic, log(0.01), log_sd), g = plogis(rnorm(n_biphasic, 0, log_sd)), f_parent_to_m1 = plogis(rnorm(n_biphasic, 0, log_sd)), k_m1 = rlnorm(n_biphasic, log(0.002), log_sd))) ds_biphasic_mean <- lapply(1:n_biphasic, function(i) { mkinpredict(DFOP_SFO, syn_biphasic_parms[i, ], c(parent = 100, m1 = 0), sampling_times) } ) set.seed(123456L) ds_biphasic <- lapply(ds_biphasic_mean, function(ds) { add_err(ds, sdfunc = function(value) sqrt(err_1$const^2 + value^2 * err_1$prop^2), n = 1, secondary = \"m1\")[[1]] }) # \\dontrun{ f_mmkin <- mmkin(list(\"DFOP-SFO\" = DFOP_SFO), ds_biphasic, error_model = \"tc\", quiet = TRUE) f_mixed <- mixed(f_mmkin) print(f_mixed) #> Kinetic model fitted by nonlinear regression to each dataset #> Structural model: #> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * #> time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) #> * parent #> d_m1/dt = + f_parent_to_m1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) #> * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * #> exp(-k2 * time))) * parent - k_m1 * m1 #> #> Data: #> 271 observations of 2 variable(s) grouped in 8 datasets #> #> object #> Status of individual fits: #> #> dataset #> model 1 2 3 4 5 6 7 8 #> DFOP-SFO OK OK OK OK OK C OK OK #> #> C: Optimisation did not converge: #> iteration limit reached without convergence (10) #> OK: No warnings #> #> Mean fitted parameters: #> parent_0 log_k_m1 f_parent_qlogis log_k1 log_k2 #> 100.605312 -8.758664 -0.001917 -3.350887 -3.990017 #> g_qlogis #> -0.091167 plot(f_mixed) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_long_to_wide.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert a dataframe from long to wide format — mkin_long_to_wide","title":"Convert a dataframe from long to wide format — mkin_long_to_wide","text":"function takes dataframe long form, .e. row observed value, converts dataframe one independent variable several dependent variables columns.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_long_to_wide.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert a dataframe from long to wide format — mkin_long_to_wide","text":"","code":"mkin_long_to_wide(long_data, time = \"time\", outtime = \"time\")"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_long_to_wide.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert a dataframe from long to wide format — mkin_long_to_wide","text":"long_data dataframe must contain one variable called \"time\" time values specified time argument, one column called \"name\" grouping observed values, finally one column observed values called \"value\". time name time variable long input data. outtime name time variable wide output data.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_long_to_wide.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert a dataframe from long to wide format — mkin_long_to_wide","text":"Dataframe wide format.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_long_to_wide.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Convert a dataframe from long to wide format — mkin_long_to_wide","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_long_to_wide.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert a dataframe from long to wide format — mkin_long_to_wide","text":"","code":"mkin_long_to_wide(FOCUS_2006_D) #> time parent m1 #> 1 0 99.46 0.00 #> 2 0 102.04 0.00 #> 3 1 93.50 4.84 #> 4 1 92.50 5.64 #> 5 3 63.23 12.91 #> 6 3 68.99 12.96 #> 7 7 52.32 22.97 #> 8 7 55.13 24.47 #> 9 14 27.27 41.69 #> 10 14 26.64 33.21 #> 11 21 11.50 44.37 #> 12 21 11.64 46.44 #> 13 35 2.85 41.22 #> 14 35 2.91 37.95 #> 15 50 0.69 41.19 #> 16 50 0.63 40.01 #> 17 75 0.05 40.09 #> 18 75 0.06 33.85 #> 19 100 NA 31.04 #> 20 100 NA 33.13 #> 21 120 NA 25.15 #> 22 120 NA 33.31"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_wide_to_long.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert a dataframe with observations over time into long format — mkin_wide_to_long","title":"Convert a dataframe with observations over time into long format — mkin_wide_to_long","text":"function simply takes dataframe one independent variable several dependent variable converts long form required mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_wide_to_long.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert a dataframe with observations over time into long format — mkin_wide_to_long","text":"","code":"mkin_wide_to_long(wide_data, time = \"t\")"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_wide_to_long.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert a dataframe with observations over time into long format — mkin_wide_to_long","text":"wide_data dataframe must contain one variable time values specified time argument usually one column observed values. time name time variable.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_wide_to_long.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert a dataframe with observations over time into long format — mkin_wide_to_long","text":"Dataframe long format needed mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_wide_to_long.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Convert a dataframe with observations over time into long format — mkin_wide_to_long","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkin_wide_to_long.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert a dataframe with observations over time into long format — mkin_wide_to_long","text":"","code":"wide <- data.frame(t = c(1,2,3), x = c(1,4,7), y = c(3,4,5)) mkin_wide_to_long(wide) #> name time value #> 1 x 1 1 #> 2 x 2 4 #> 3 x 3 7 #> 4 y 1 3 #> 5 y 2 4 #> 6 y 3 5"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":null,"dir":"Reference","previous_headings":"","what":"A dataset class for mkin — mkinds","title":"A dataset class for mkin — mkinds","text":"moment dataset class hardly used mkin. example, mkinfit take mkinds datasets argument, works dataframes contained data field mkinds objects. datasets provided package come mkinds objects nevertheless.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A dataset class for mkin — mkinds","text":"","code":"# S3 method for class 'mkinds' print(x, data = FALSE, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"A dataset class for mkin — mkinds","text":"x mkinds object. data data printed? ... used.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"public-fields","dir":"Reference","previous_headings":"","what":"Public fields","title":"A dataset class for mkin — mkinds","text":"title full title dataset sampling_times sampling times time_unit time unit observed Names observed variables unit unit observations replicates maximum number replicates per sampling time data data frame least columns name, time value order compatible mkinfit","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"A dataset class for mkin — mkinds","text":"mkinds$new() mkinds$clone()","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"A dataset class for mkin — mkinds","text":"Create new mkinds object","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A dataset class for mkin — mkinds","text":"","code":"mkinds$new(title = \"\", data, time_unit = NA, unit = NA)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"A dataset class for mkin — mkinds","text":"title dataset title data data time_unit time unit unit unit observations","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"A dataset class for mkin — mkinds","text":"objects class cloneable method.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"A dataset class for mkin — mkinds","text":"","code":"mkinds$clone(deep = FALSE)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"A dataset class for mkin — mkinds","text":"deep Whether make deep clone.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A dataset class for mkin — mkinds","text":"","code":"mds <- mkinds$new(\"FOCUS A\", FOCUS_2006_A) print(mds) #> with $title: FOCUS A #> Observed compounds $observed: parent #> Sampling times $sampling_times: #> 0, 3, 7, 14, 30, 62, 90, 118 #> With a maximum of 1 replicates"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":null,"dir":"Reference","previous_headings":"","what":"A class for dataset groups for mkin — mkindsg","title":"A class for dataset groups for mkin — mkindsg","text":"container working datasets share least one compound, combined evaluations desirable. Time normalisation factors initialised value 1 dataset data supplied.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A class for dataset groups for mkin — mkindsg","text":"","code":"# S3 method for class 'mkindsg' print(x, data = FALSE, verbose = data, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"A class for dataset groups for mkin — mkindsg","text":"x mkindsg object. data mkinds objects printed data? verbose mkinds objects printed? ... used.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"public-fields","dir":"Reference","previous_headings":"","what":"Public fields","title":"A class for dataset groups for mkin — mkindsg","text":"title title dataset group ds list mkinds objects observed_n Occurrence counts compounds datasets f_time_norm Time normalisation factors meta data frame row dataset, containing additional information form categorical data (factors) numerical data (e.g. temperature, moisture, covariates like soil pH).","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"A class for dataset groups for mkin — mkindsg","text":"mkindsg$new() mkindsg$clone()","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"method-new-","dir":"Reference","previous_headings":"","what":"Method new()","title":"A class for dataset groups for mkin — mkindsg","text":"Create new mkindsg object","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A class for dataset groups for mkin — mkindsg","text":"","code":"mkindsg$new(title = \"\", ds, f_time_norm = rep(1, length(ds)), meta)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"A class for dataset groups for mkin — mkindsg","text":"title title ds list mkinds objects f_time_norm Time normalisation factors meta meta data","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"A class for dataset groups for mkin — mkindsg","text":"objects class cloneable method.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"A class for dataset groups for mkin — mkindsg","text":"","code":"mkindsg$clone(deep = FALSE)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"A class for dataset groups for mkin — mkindsg","text":"deep Whether make deep clone.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A class for dataset groups for mkin — mkindsg","text":"","code":"mdsg <- mkindsg$new(\"Experimental X\", experimental_data_for_UBA_2019[6:10]) print(mdsg) #> holding 5 mkinds objects #> Title $title: Experimental X #> Occurrence of observed compounds $observed_n: #> parent A1 #> 5 5 print(mdsg, verbose = TRUE) #> holding 5 mkinds objects #> Title $title: Experimental X #> Occurrence of observed compounds $observed_n: #> parent A1 #> 5 5 #> #> Datasets $ds: #> with $title: Soil 6 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 3, 6, 10, 20, 34, 55, 90, 112, 132 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> #> with $title: Soil 7 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 3, 7, 14, 30, 60, 90, 120, 180 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> #> with $title: Soil 8 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 1, 3, 8, 14, 27, 48, 70 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> #> with $title: Soil 9 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 1, 3, 8, 14, 27, 48, 70, 91, 120 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> #> with $title: Soil 10 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 8, 14, 21, 41, 63, 91, 120 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR print(mdsg, verbose = TRUE, data = TRUE) #> holding 5 mkinds objects #> Title $title: Experimental X #> Occurrence of observed compounds $observed_n: #> parent A1 #> 5 5 #> #> Datasets $ds: #> with $title: Soil 6 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 3, 6, 10, 20, 34, 55, 90, 112, 132 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> time parent A1 #> 1 0 97.2 NA #> 2 0 96.4 NA #> 3 3 71.1 4.3 #> 4 3 69.2 4.6 #> 5 6 58.1 7.0 #> 6 6 56.6 7.2 #> 7 10 44.4 8.2 #> 8 10 43.4 8.0 #> 9 20 33.3 11.0 #> 10 20 29.2 13.7 #> 11 34 17.6 11.5 #> 12 34 18.0 12.7 #> 13 55 10.5 14.9 #> 14 55 9.3 14.5 #> 15 90 4.5 12.1 #> 16 90 4.7 12.3 #> 17 112 3.0 9.9 #> 18 112 3.4 10.2 #> 19 132 2.3 8.8 #> 20 132 2.7 7.8 #> #> with $title: Soil 7 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 3, 7, 14, 30, 60, 90, 120, 180 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> time parent A1 #> 1 0 93.6 NA #> 2 0 92.3 NA #> 3 3 87.0 3.9 #> 4 3 82.2 3.1 #> 5 7 74.0 6.9 #> 6 7 73.9 6.6 #> 7 14 64.2 10.4 #> 8 14 69.5 8.3 #> 9 30 54.0 14.4 #> 10 30 54.6 13.7 #> 11 60 41.1 22.1 #> 12 60 38.4 22.3 #> 13 90 32.5 27.5 #> 14 90 35.5 25.4 #> 15 120 28.1 28.0 #> 16 120 29.0 26.6 #> 17 180 26.5 25.8 #> 18 180 27.6 25.3 #> #> with $title: Soil 8 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 1, 3, 8, 14, 27, 48, 70 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> time parent A1 #> 1 0 91.9 NA #> 2 0 90.8 NA #> 3 1 64.9 9.6 #> 4 1 66.2 7.7 #> 5 3 43.5 15.0 #> 6 3 44.1 15.1 #> 7 8 18.3 21.2 #> 8 8 18.1 21.1 #> 9 14 10.2 19.7 #> 10 14 10.8 18.9 #> 11 27 4.9 17.5 #> 12 27 3.3 15.9 #> 13 48 1.6 9.5 #> 14 48 1.5 9.8 #> 15 70 1.1 6.2 #> 16 70 0.9 6.1 #> #> with $title: Soil 9 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 1, 3, 8, 14, 27, 48, 70, 91, 120 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> time parent A1 #> 1 0 99.8 NA #> 2 0 98.3 NA #> 3 1 77.1 4.2 #> 4 1 77.2 3.9 #> 5 3 59.0 7.4 #> 6 3 58.1 7.9 #> 7 8 27.4 14.5 #> 8 8 29.2 13.7 #> 9 14 19.1 14.2 #> 10 14 29.6 12.2 #> 11 27 10.1 13.7 #> 12 27 18.2 13.2 #> 13 48 4.5 13.6 #> 14 48 9.1 15.4 #> 15 70 2.3 10.4 #> 16 70 2.9 11.6 #> 17 91 2.0 10.0 #> 18 91 1.8 9.5 #> 19 120 2.0 9.1 #> 20 120 2.2 9.0 #> #> with $title: Soil 10 #> Observed compounds $observed: parent, A1 #> Sampling times $sampling_times: #> 0, 8, 14, 21, 41, 63, 91, 120 #> With a maximum of 2 replicates #> Time unit: days #> Observation unit: \\%AR #> time parent A1 #> 1 0 96.1 NA #> 2 0 94.3 NA #> 3 8 73.9 3.3 #> 4 8 73.9 3.4 #> 5 14 69.4 3.9 #> 6 14 73.1 2.9 #> 7 21 65.6 6.4 #> 8 21 65.3 7.2 #> 9 41 55.9 9.1 #> 10 41 54.4 8.5 #> 11 63 47.0 11.7 #> 12 63 49.3 12.0 #> 13 91 44.7 13.3 #> 14 91 46.7 13.2 #> 15 120 42.1 14.3 #> 16 120 41.3 12.1"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrmin.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate the minimum error to assume in order to pass the variance test — mkinerrmin","title":"Calculate the minimum error to assume in order to pass the variance test — mkinerrmin","text":"function finds smallest relative error still resulting passing chi-squared test defined FOCUS kinetics report 2006.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrmin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate the minimum error to assume in order to pass the variance test — mkinerrmin","text":"","code":"mkinerrmin(fit, alpha = 0.05)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrmin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate the minimum error to assume in order to pass the variance test — mkinerrmin","text":"fit object class mkinfit. alpha confidence level chosen chi-squared test.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrmin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate the minimum error to assume in order to pass the variance test — mkinerrmin","text":"dataframe following components: err.min relative error, expressed fraction. n.optim number optimised parameters attributed data series. df number remaining degrees freedom chi2 error level calculations. Note mean values used chi2 statistic therefore every time point observed values series counts one time. dataframe one row total dataset one row observed state variable model.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrmin.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate the minimum error to assume in order to pass the variance test — mkinerrmin","text":"function used internally summary.mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrmin.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Calculate the minimum error to assume in order to pass the variance test — mkinerrmin","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrmin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate the minimum error to assume in order to pass the variance test — mkinerrmin","text":"","code":"SFO_SFO = mkinmod(parent = mkinsub(\"SFO\", to = \"m1\"), m1 = mkinsub(\"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded fit_FOCUS_D = mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE) #> Warning: Observations with value of zero were removed from the data round(mkinerrmin(fit_FOCUS_D), 4) #> err.min n.optim df #> All data 0.0640 4 15 #> parent 0.0646 2 7 #> m1 0.0469 2 8 # \\dontrun{ fit_FOCUS_E = mkinfit(SFO_SFO, FOCUS_2006_E, quiet = TRUE) round(mkinerrmin(fit_FOCUS_E), 4) #> err.min n.optim df #> All data 0.1544 4 13 #> parent 0.1659 2 7 #> m1 0.1095 2 6 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Function to plot squared residuals and the error model for an mkin object — mkinerrplot","title":"Function to plot squared residuals and the error model for an mkin object — mkinerrplot","text":"function plots squared residuals specified subset observed variables mkinfit object. addition, one dashed line(s) show fitted error model. combined plot fitted model error model plot can obtained plot.mkinfit using argument show_errplot = TRUE.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Function to plot squared residuals and the error model for an mkin object — mkinerrplot","text":"","code":"mkinerrplot( object, obs_vars = names(object$mkinmod$map), xlim = c(0, 1.1 * max(object$data$predicted)), xlab = \"Predicted\", ylab = \"Squared residual\", maxy = \"auto\", legend = TRUE, lpos = \"topright\", col_obs = \"auto\", pch_obs = \"auto\", frame = TRUE, ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Function to plot squared residuals and the error model for an mkin object — mkinerrplot","text":"object fit represented mkinfit object. obs_vars character vector names observed variables residuals plotted. Defaults observed variables model xlim plot range x direction. xlab Label x axis. ylab Label y axis. maxy Maximum value residuals. used scaling y axis defaults \"auto\". legend legend plotted? lpos legend placed? Default \"topright\". passed legend. col_obs Colors observed variables. pch_obs Symbols used observed variables. frame frame drawn around plots? ... arguments passed plot.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrplot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Function to plot squared residuals and the error model for an mkin object — mkinerrplot","text":"Nothing returned function, called side effect, namely produce plot.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrplot.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Function to plot squared residuals and the error model for an mkin object — mkinerrplot","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrplot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Function to plot squared residuals and the error model for an mkin object — mkinerrplot","text":"","code":"# \\dontrun{ model <- mkinmod(parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded fit <- mkinfit(model, FOCUS_2006_D, error_model = \"tc\", quiet = TRUE) #> Warning: Observations with value of zero were removed from the data mkinerrplot(fit) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a kinetic model to data with one or more state variables — mkinfit","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"function maximises likelihood observed data using Port algorithm stats::nlminb(), specified initial fixed parameters starting values. step optimisation, kinetic model solved using function mkinpredict(), except analytical solution implemented, case model solved using degradation function mkinmod object. parameters selected error model fitted simultaneously degradation model parameters, arguments likelihood function.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"","code":"mkinfit( mkinmod, observed, parms.ini = \"auto\", state.ini = \"auto\", err.ini = \"auto\", fixed_parms = NULL, fixed_initials = names(mkinmod$diffs)[-1], from_max_mean = FALSE, solution_type = c(\"auto\", \"analytical\", \"eigen\", \"deSolve\"), method.ode = \"lsoda\", use_compiled = \"auto\", control = list(eval.max = 300, iter.max = 200), transform_rates = TRUE, transform_fractions = TRUE, quiet = FALSE, atol = 1e-08, rtol = 1e-10, error_model = c(\"const\", \"obs\", \"tc\"), error_model_algorithm = c(\"auto\", \"d_3\", \"direct\", \"twostep\", \"threestep\", \"fourstep\", \"IRLS\", \"OLS\"), reweight.tol = 1e-08, reweight.max.iter = 10, trace_parms = FALSE, test_residuals = FALSE, ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"mkinmod list class mkinmod, containing kinetic model fitted data, one shorthand names (\"SFO\", \"FOMC\", \"DFOP\", \"HS\", \"SFORB\", \"IORE\"). shorthand name given, parent degradation model generated variable highest value observed. observed dataframe object coercible dataframe (e.g. tibble) observed data. first column called \"name\" must contain name observed variable data point. second column must contain times observation, named \"time\". third column must named \"value\" contain observed values. Zero values \"value\" column removed, warning, order avoid problems fitting two-component error model. expected problem, general, values zero observed degradation data, lower limit detection. parms.ini named vector initial values parameters, including parameters optimised potentially also fixed parameters indicated fixed_parms. set \"auto\", initial values rate constants set default values. Using parameter names model gives error. possible specify subset parameters model needs. can use parameter lists \"bparms.ode\" previously fitted model, contains differential equation parameters model. works nicely models nested. example given . state.ini named vector initial values state variables model. case observed variables represented one model variable, names differ names observed variables (see map component mkinmod). default set initial value first model variable mean time zero values variable maximum observed value, others 0. variable time zero observations, initial value set 100. err.ini named vector initial values error model parameters optimised. set \"auto\", initial values set default values. Otherwise, inital values error model parameters must given. fixed_parms names parameters optimised rather kept values specified parms.ini. Alternatively, named numeric vector parameters fixed, regardless values parms.ini. fixed_initials names model variables initial state time 0 excluded optimisation. Defaults state variables except first one. from_max_mean set TRUE, model one observed variable, data time maximum observed value (averaging sampling time) discarded, time subtracted remaining time values, time maximum observed mean value new time zero. solution_type set \"eigen\", solution system differential equations based spectral decomposition coefficient matrix cases possible. set \"deSolve\", numerical ode solver package deSolve used. set \"analytical\", analytical solution model used. implemented relatively simple degradation models. default \"auto\", uses \"analytical\" possible, otherwise \"deSolve\" compiler present, \"eigen\" compiler present model can expressed using eigenvalues eigenvectors. method.ode solution method passed via mkinpredict() deSolve::ode() case solution type \"deSolve\". default \"lsoda\" performant, sometimes fails converge. use_compiled set FALSE, compiled version mkinmod model used calls mkinpredict() even compiled version present. control list control arguments passed stats::nlminb(). transform_rates Boolean specifying kinetic rate constants transformed model specification used fitting better compliance assumption normal distribution estimator. TRUE, also alpha beta parameters FOMC model log-transformed, well k1 k2 rate constants DFOP HS models break point tb HS model. FALSE, zero used lower bound rates optimisation. transform_fractions Boolean specifying formation fractions transformed model specification used fitting better compliance assumption normal distribution estimator. default (TRUE) transformations. TRUE, g parameter DFOP model also transformed. Transformations described transform_odeparms. quiet Suppress printing current value negative log-likelihood improvement? atol Absolute error tolerance, passed deSolve::ode(). Default 1e-8, lower default deSolve::lsoda() function used per default. rtol Absolute error tolerance, passed deSolve::ode(). Default 1e-10, much lower deSolve::lsoda(). error_model error model \"const\", constant standard deviation assumed. error model \"obs\", observed variable assumed variance. error model \"tc\" (two-component error model), two component error model similar one described Rocke Lorenzato (1995) used setting likelihood function. Note model deviates model Rocke Lorenzato, model implies errors follow lognormal distribution large values, normal distribution assumed method. error_model_algorithm \"auto\", selected algorithm depends error model. error model \"const\", unweighted nonlinear least squares fitting (\"OLS\") selected. error model \"obs\", \"tc\", \"d_3\" algorithm selected. algorithm \"d_3\" directly minimize negative log-likelihood independently also use three step algorithm described . fit higher likelihood returned. algorithm \"direct\" directly minimize negative log-likelihood. algorithm \"twostep\" minimize negative log-likelihood initial unweighted least squares optimisation step. algorithm \"threestep\" starts unweighted least squares, optimizes error model using degradation model parameters found, minimizes negative log-likelihood free degradation error model parameters. algorithm \"fourstep\" starts unweighted least squares, optimizes error model using degradation model parameters found, optimizes degradation model fixed error model parameters, finally minimizes negative log-likelihood free degradation error model parameters. algorithm \"IRLS\" (Iteratively Reweighted Least Squares) starts unweighted least squares, iterates optimization error model parameters subsequent optimization degradation model using error model parameters, error model parameters converge. reweight.tol Tolerance convergence criterion calculated error model parameters IRLS fits. reweight.max.iter Maximum number iterations IRLS fits. trace_parms trace parameter values listed? test_residuals residuals tested normal distribution? ... arguments passed deSolve::ode().","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"list \"mkinfit\" class attribute.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"Per default, parameters kinetic models internally transformed order better satisfy assumption normal distribution estimators.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"using \"IORE\" submodel metabolites, fitting \"transform_rates = TRUE\" (default) often leads failures numerical ODE solver. situation may help switch internal rate transformation.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"Rocke DM Lorenzato S (1995) two-component model measurement error analytical chemistry. Technometrics 37(2), 176-184. Ranke J Meinecke S (2019) Error Models Kinetic Evaluation Chemical Degradation Data. Environments 6(12) 124 doi:10.3390/environments6120124 .","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a kinetic model to data with one or more state variables — mkinfit","text":"","code":"# Use shorthand notation for parent only degradation fit <- mkinfit(\"FOMC\", FOCUS_2006_C, quiet = TRUE) summary(fit) #> mkin version used for fitting: 1.2.10 #> R version used for fitting: 4.4.2 #> Date of fit: Fri Feb 14 07:30:02 2025 #> Date of summary: Fri Feb 14 07:30:02 2025 #> #> Equations: #> d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent #> #> Model predictions using solution type analytical #> #> Fitted using 222 model solutions performed in 0.014 s #> #> Error model: Constant variance #> #> Error model algorithm: OLS #> #> Starting values for parameters to be optimised: #> value type #> parent_0 85.1 state #> alpha 1.0 deparm #> beta 10.0 deparm #> #> Starting values for the transformed parameters actually optimised: #> value lower upper #> parent_0 85.100000 -Inf Inf #> log_alpha 0.000000 -Inf Inf #> log_beta 2.302585 -Inf Inf #> #> Fixed parameter values: #> None #> #> Results: #> #> AIC BIC logLik #> 44.68652 45.47542 -18.34326 #> #> Optimised, transformed parameters with symmetric confidence intervals: #> Estimate Std. Error Lower Upper #> parent_0 85.87000 1.8070 81.23000 90.5200 #> log_alpha 0.05192 0.1353 -0.29580 0.3996 #> log_beta 0.65100 0.2287 0.06315 1.2390 #> sigma 1.85700 0.4378 0.73200 2.9830 #> #> Parameter correlation: #> parent_0 log_alpha log_beta sigma #> parent_0 1.000e+00 -1.565e-01 -3.142e-01 4.681e-08 #> log_alpha -1.565e-01 1.000e+00 9.564e-01 1.013e-07 #> log_beta -3.142e-01 9.564e-01 1.000e+00 8.637e-08 #> sigma 4.681e-08 1.013e-07 8.637e-08 1.000e+00 #> #> Backtransformed parameters: #> Confidence intervals for internally transformed parameters are asymmetric. #> t-test (unrealistically) based on the assumption of normal distribution #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper #> parent_0 85.870 47.530 3.893e-08 81.2300 90.520 #> alpha 1.053 7.393 3.562e-04 0.7439 1.491 #> beta 1.917 4.373 3.601e-03 1.0650 3.451 #> sigma 1.857 4.243 4.074e-03 0.7320 2.983 #> #> FOCUS Chi2 error levels in percent: #> err.min n.optim df #> All data 6.657 3 6 #> parent 6.657 3 6 #> #> Estimated disappearance times: #> DT50 DT90 DT50back #> parent 1.785 15.15 4.56 #> #> Data: #> time variable observed predicted residual #> 0 parent 85.1 85.875 -0.7749 #> 1 parent 57.9 55.191 2.7091 #> 3 parent 29.9 31.845 -1.9452 #> 7 parent 14.6 17.012 -2.4124 #> 14 parent 9.7 9.241 0.4590 #> 28 parent 6.6 4.754 1.8460 #> 63 parent 4.0 2.102 1.8977 #> 91 parent 3.9 1.441 2.4590 #> 119 parent 0.6 1.092 -0.4919 # One parent compound, one metabolite, both single first order. # We remove zero values from FOCUS dataset D in order to avoid warnings FOCUS_D <- subset(FOCUS_2006_D, value != 0) # Use mkinsub for convenience in model formulation. Pathway to sink included per default. SFO_SFO <- mkinmod( parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded # Fit the model quietly to the FOCUS example dataset D using defaults fit <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE) plot_sep(fit) # As lower parent values appear to have lower variance, we try an alternative error model fit.tc <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = \"tc\") # This avoids the warning, and the likelihood ratio test confirms it is preferable lrtest(fit.tc, fit) #> Likelihood ratio test #> #> Model 1: SFO_SFO with error model tc and fixed parameter(s) m1_0 #> Model 2: SFO_SFO with error model const and fixed parameter(s) m1_0 #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 6 -64.983 #> 2 5 -97.224 -1 64.483 9.737e-16 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 # We can also allow for different variances of parent and metabolite as error model fit.obs <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = \"obs\") # The two-component error model has significantly higher likelihood lrtest(fit.obs, fit.tc) #> Likelihood ratio test #> #> Model 1: SFO_SFO with error model tc and fixed parameter(s) m1_0 #> Model 2: SFO_SFO with error model obs and fixed parameter(s) m1_0 #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 6 -64.983 #> 2 6 -96.936 0 63.907 < 2.2e-16 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 parms(fit.tc) #> parent_0 k_parent k_m1 f_parent_to_m1 sigma_low #> 1.007343e+02 1.005562e-01 5.166712e-03 5.083933e-01 3.049883e-03 #> rsd_high #> 7.928118e-02 endpoints(fit.tc) #> $ff #> parent_m1 parent_sink #> 0.5083933 0.4916067 #> #> $distimes #> DT50 DT90 #> parent 6.89313 22.89848 #> m1 134.15634 445.65771 #> # We can show a quick (only one replication) benchmark for this case, as we # have several alternative solution methods for the model. We skip # uncompiled deSolve, as it is so slow. More benchmarks are found in the # benchmark vignette # \\dontrun{ if(require(rbenchmark)) { benchmark(replications = 1, order = \"relative\", columns = c(\"test\", \"relative\", \"elapsed\"), deSolve_compiled = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = \"tc\", solution_type = \"deSolve\", use_compiled = TRUE), eigen = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = \"tc\", solution_type = \"eigen\"), analytical = mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE, error_model = \"tc\", solution_type = \"analytical\")) } #> test relative elapsed #> 3 analytical 1.000 0.242 #> 2 eigen 1.913 0.463 #> 1 deSolve_compiled 1.917 0.464 # } # Use stepwise fitting, using optimised parameters from parent only fit, FOMC-SFO # \\dontrun{ FOMC_SFO <- mkinmod( parent = mkinsub(\"FOMC\", \"m1\"), m1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded fit.FOMC_SFO <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE) # Again, we get a warning and try a more sophisticated error model fit.FOMC_SFO.tc <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE, error_model = \"tc\") # This model has a higher likelihood, but not significantly so lrtest(fit.tc, fit.FOMC_SFO.tc) #> Likelihood ratio test #> #> Model 1: FOMC_SFO with error model tc and fixed parameter(s) m1_0 #> Model 2: SFO_SFO with error model tc and fixed parameter(s) m1_0 #> #Df LogLik Df Chisq Pr(>Chisq) #> 1 7 -64.829 #> 2 6 -64.983 -1 0.3075 0.5792 # Also, the missing standard error for log_beta and the t-tests for alpha # and beta indicate overparameterisation summary(fit.FOMC_SFO.tc, data = FALSE) #> Warning: NaNs produced #> Warning: diag(V) had non-positive or NA entries; the non-finite result may be dubious #> mkin version used for fitting: 1.2.10 #> R version used for fitting: 4.4.2 #> Date of fit: Fri Feb 14 07:30:07 2025 #> Date of summary: Fri Feb 14 07:30:07 2025 #> #> Equations: #> d_parent/dt = - (alpha/beta) * 1/((time/beta) + 1) * parent #> d_m1/dt = + f_parent_to_m1 * (alpha/beta) * 1/((time/beta) + 1) * #> parent - k_m1 * m1 #> #> Model predictions using solution type deSolve #> #> Fitted using 4062 model solutions performed in 0.77 s #> #> Error model: Two-component variance function #> #> Error model algorithm: d_3 #> Direct fitting and three-step fitting yield approximately the same likelihood #> #> Starting values for parameters to be optimised: #> value type #> parent_0 100.75 state #> alpha 1.00 deparm #> beta 10.00 deparm #> k_m1 0.10 deparm #> f_parent_to_m1 0.50 deparm #> sigma_low 0.10 error #> rsd_high 0.10 error #> #> Starting values for the transformed parameters actually optimised: #> value lower upper #> parent_0 100.750000 -Inf Inf #> log_k_m1 -2.302585 -Inf Inf #> f_parent_qlogis 0.000000 -Inf Inf #> log_alpha 0.000000 -Inf Inf #> log_beta 2.302585 -Inf Inf #> sigma_low 0.100000 0 Inf #> rsd_high 0.100000 0 Inf #> #> Fixed parameter values: #> value type #> m1_0 0 state #> #> Results: #> #> AIC BIC logLik #> 143.658 155.1211 -64.82902 #> #> Optimised, transformed parameters with symmetric confidence intervals: #> Estimate Std. Error Lower Upper #> parent_0 101.600000 2.6400000 96.240000 107.000000 #> log_k_m1 -5.284000 0.0929100 -5.474000 -5.095000 #> f_parent_qlogis 0.001426 0.0766900 -0.155000 0.157800 #> log_alpha 5.522000 0.0077320 5.506000 5.538000 #> log_beta 7.806000 NaN NaN NaN #> sigma_low 0.002488 0.0002431 0.001992 0.002984 #> rsd_high 0.079210 0.0093280 0.060180 0.098230 #> #> Parameter correlation: #> parent_0 log_k_m1 f_parent_qlogis log_alpha log_beta #> parent_0 1.000000 -0.095161 -0.76675 0.70542 NaN #> log_k_m1 -0.095161 1.000000 0.51429 -0.14382 NaN #> f_parent_qlogis -0.766750 0.514286 1.00000 -0.61393 NaN #> log_alpha 0.705417 -0.143821 -0.61393 1.00000 NaN #> log_beta NaN NaN NaN NaN 1 #> sigma_low 0.016086 0.001583 0.01547 5.87036 NaN #> rsd_high 0.006618 -0.011695 -0.05356 0.04848 NaN #> sigma_low rsd_high #> parent_0 0.016086 0.006618 #> log_k_m1 0.001583 -0.011695 #> f_parent_qlogis 0.015466 -0.053560 #> log_alpha 5.870361 0.048483 #> log_beta NaN NaN #> sigma_low 1.000000 -0.652545 #> rsd_high -0.652545 1.000000 #> #> Backtransformed parameters: #> Confidence intervals for internally transformed parameters are asymmetric. #> t-test (unrealistically) based on the assumption of normal distribution #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper #> parent_0 1.016e+02 32.7800 6.310e-26 9.624e+01 1.070e+02 #> k_m1 5.072e-03 10.1200 1.216e-11 4.196e-03 6.130e-03 #> f_parent_to_m1 5.004e-01 20.8300 4.316e-20 4.613e-01 5.394e-01 #> alpha 2.502e+02 0.5624 2.889e-01 2.463e+02 2.542e+02 #> beta 2.455e+03 0.5549 2.915e-01 NA NA #> sigma_low 2.488e-03 0.4843 3.158e-01 1.992e-03 2.984e-03 #> rsd_high 7.921e-02 8.4300 8.001e-10 6.018e-02 9.823e-02 #> #> FOCUS Chi2 error levels in percent: #> err.min n.optim df #> All data 6.781 5 14 #> parent 7.141 3 6 #> m1 4.640 2 8 #> #> Resulting formation fractions: #> ff #> parent_m1 0.5004 #> parent_sink 0.4996 #> #> Estimated disappearance times: #> DT50 DT90 DT50back #> parent 6.812 22.7 6.834 #> m1 136.661 454.0 NA # We can easily use starting parameters from the parent only fit (only for illustration) fit.FOMC = mkinfit(\"FOMC\", FOCUS_2006_D, quiet = TRUE, error_model = \"tc\") fit.FOMC_SFO <- mkinfit(FOMC_SFO, FOCUS_D, quiet = TRUE, parms.ini = fit.FOMC$bparms.ode, error_model = \"tc\") # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":null,"dir":"Reference","previous_headings":"","what":"Function to set up a kinetic model with one or more state variables — mkinmod","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"function usually called using call mkinsub() observed variable, specifying corresponding submodel well outgoing pathways (see examples). Print mkinmod objects way user finds way get components.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"","code":"mkinmod( ..., use_of_ff = \"max\", name = NULL, speclist = NULL, quiet = FALSE, verbose = FALSE, dll_dir = NULL, unload = FALSE, overwrite = FALSE ) # S3 method for class 'mkinmod' print(x, ...) mkinsub(submodel, to = NULL, sink = TRUE, full_name = NA)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"... observed variable, list obtained mkinsub() specified argument (see examples). Currently, single first order kinetics \"SFO\", indeterminate order rate equation kinetics \"IORE\", single first order reversible binding \"SFORB\" implemented variables, \"FOMC\", \"DFOP\", \"HS\" \"logistic\" can additionally chosen first variable assumed source compartment. Additionally, mkinsub() argument , specifying names variables transfer assumed model. argument use_of_ff set \"min\" model compartment \"SFO\" \"SFORB\", additional mkinsub() argument can sink = FALSE, effectively fixing flux sink zero. print.mkinmod, argument currently used. use_of_ff Specification use formation fractions model equations , applicable, coefficient matrix. \"max\", formation fractions always used (default). \"min\", minimum use formation fractions made, .e. first-order pathway metabolite rate constant. name name model. valid R object name. speclist specification observed variables submodel types pathways can given single list using argument. Default NULL. quiet messages suppressed? verbose TRUE, passed inline::cfunction() applicable give detailed information C function built. dll_dir Directory DLL object, generated internally inline::cfunction(), saved. DLL stored permanent location use future sessions, 'dll_dir' 'name' specified. helpful fit objects cached e.g. knitr, cache remains functional across sessions DLL stored user defined location. unload DLL target location 'dll_dir' already loaded, unloaded first? overwrite file exists target DLL location 'dll_dir', overwritten? x mkinmod object. submodel Character vector length one specify submodel type. See mkinmod list allowed submodel names. Vector names state variable transformation shall included model. sink pathway sink included model addition pathways state variables? full_name optional name used e.g. plotting fits performed model. can use non-ASCII characters , R code portable, .e. may produce unintended plot results operating systems system configurations.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"list class mkinmod use mkinfit(), containing, among others, diffs vector string representations differential equations, one modelling variable. map list containing named character vectors observed variable, specifying modelling variables represented. use_of_ff content use_of_ff passed list component. deg_func generated, function containing solution degradation model. coefmat coefficient matrix, system differential equations can represented one. cf generated, compiled function calculating derivatives returned cfunction. list use mkinmod.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"definition model types parameters, equations given FOCUS NAFTA guidance documents used. kinetic models one observed variable, symbolic solution system differential equations included resulting mkinmod object cases, speeding solution. C compiler found pkgbuild::has_compiler() one observed variable specification, C code generated evaluating differential equations, compiled using inline::cfunction() added resulting mkinmod object.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"IORE submodel well tested metabolites. using model metabolites, may want read note help page mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics NAFTA Technical Working Group Pesticides (dated) Guidance Evaluating Calculating Degradation Kinetics Environmental Media","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Function to set up a kinetic model with one or more state variables — mkinmod","text":"","code":"# Specify the SFO model (this is not needed any more, as we can now mkinfit(\"SFO\", ...) SFO <- mkinmod(parent = mkinsub(\"SFO\")) # One parent compound, one metabolite, both single first order SFO_SFO <- mkinmod( parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded print(SFO_SFO) #> model generated with #> Use of formation fractions $use_of_ff: max #> Specification $spec: #> $parent #> $type: SFO; $to: m1; $sink: TRUE #> $m1 #> $type: SFO; $sink: TRUE #> Coefficient matrix $coefmat available #> Compiled model $cf available #> Differential equations: #> d_parent/dt = - k_parent * parent #> d_m1/dt = + f_parent_to_m1 * k_parent * parent - k_m1 * m1 # \\dontrun{ fit_sfo_sfo <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE, solution_type = \"deSolve\") #> Warning: Observations with value of zero were removed from the data # Now supplying compound names used for plotting, and write to user defined location # We need to choose a path outside the session tempdir because this gets removed DLL_dir <- \"~/.local/share/mkin\" if (!dir.exists(DLL_dir)) dir.create(DLL_dir) SFO_SFO.2 <- mkinmod( parent = mkinsub(\"SFO\", \"m1\", full_name = \"Test compound\"), m1 = mkinsub(\"SFO\", full_name = \"Metabolite M1\"), name = \"SFO_SFO\", dll_dir = DLL_dir, unload = TRUE, overwrite = TRUE) #> Temporary DLL for differentials generated and loaded #> Copied DLL from /tmp/RtmpSeNGYy/file226312370605e2.so to /home/jranke/.local/share/mkin/SFO_SFO.so # Now we can save the model and restore it in a new session saveRDS(SFO_SFO.2, file = \"~/SFO_SFO.rds\") # Terminate the R session here if you would like to check, and then do library(mkin) SFO_SFO.3 <- readRDS(\"~/SFO_SFO.rds\") fit_sfo_sfo <- mkinfit(SFO_SFO.3, FOCUS_2006_D, quiet = TRUE, solution_type = \"deSolve\") #> Warning: Observations with value of zero were removed from the data # Show details of creating the C function SFO_SFO <- mkinmod( parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\"), verbose = TRUE) #> Program source: #> 1: #include #> 2: #> 3: #> 4: static double parms [3]; #> 5: #define k_parent parms[0] #> 6: #define f_parent_to_m1 parms[1] #> 7: #define k_m1 parms[2] #> 8: #> 9: void initpar(void (* odeparms)(int *, double *)) { #> 10: int N = 3; #> 11: odeparms(&N, parms); #> 12: } #> 13: #> 14: #> 15: void diffs ( int * n, double * t, double * y, double * f, double * rpar, int * ipar ) { #> 16: #> 17: f[0] = - k_parent * y[0]; #> 18: f[1] = + f_parent_to_m1 * k_parent * y[0] - k_m1 * y[1]; #> 19: } #> Temporary DLL for differentials generated and loaded # The symbolic solution which is available in this case is not # made for human reading but for speed of computation SFO_SFO$deg_func #> function (observed, odeini, odeparms) #> { #> predicted <- numeric(0) #> with(as.list(odeparms), { #> t <- observed[observed$name == \"parent\", \"time\"] #> predicted <<- c(predicted, SFO.solution(t, odeini[\"parent\"], #> k_parent)) #> t <- observed[observed$name == \"m1\", \"time\"] #> predicted <<- c(predicted, (((k_m1 - k_parent) * odeini[\"m1\"] - #> f_parent_to_m1 * k_parent * odeini[\"parent\"]) * exp(-k_m1 * #> t) + f_parent_to_m1 * k_parent * odeini[\"parent\"] * #> exp(-k_parent * t))/(k_m1 - k_parent)) #> }) #> return(predicted) #> } #> # If we have several parallel metabolites # (compare tests/testthat/test_synthetic_data_for_UBA_2014.R) m_synth_DFOP_par <- mkinmod( parent = mkinsub(\"DFOP\", c(\"M1\", \"M2\")), M1 = mkinsub(\"SFO\"), M2 = mkinsub(\"SFO\"), quiet = TRUE) fit_DFOP_par_c <- mkinfit(m_synth_DFOP_par, synthetic_data_for_UBA_2014[[12]]$data, quiet = TRUE) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinparplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Function to plot the confidence intervals obtained using mkinfit — mkinparplot","title":"Function to plot the confidence intervals obtained using mkinfit — mkinparplot","text":"function plots confidence intervals parameters fitted using mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinparplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Function to plot the confidence intervals obtained using mkinfit — mkinparplot","text":"","code":"mkinparplot(object)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinparplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Function to plot the confidence intervals obtained using mkinfit — mkinparplot","text":"object fit represented mkinfit object.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinparplot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Function to plot the confidence intervals obtained using mkinfit — mkinparplot","text":"Nothing returned function, called side effect, namely produce plot.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinparplot.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Function to plot the confidence intervals obtained using mkinfit — mkinparplot","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinparplot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Function to plot the confidence intervals obtained using mkinfit — mkinparplot","text":"","code":"# \\dontrun{ model <- mkinmod( T245 = mkinsub(\"SFO\", to = c(\"phenol\"), sink = FALSE), phenol = mkinsub(\"SFO\", to = c(\"anisole\")), anisole = mkinsub(\"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded fit <- mkinfit(model, subset(mccall81_245T, soil == \"Commerce\"), quiet = TRUE) #> Warning: Observations with value of zero were removed from the data mkinparplot(fit) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot the observed data and the fitted model of an mkinfit object — mkinplot","title":"Plot the observed data and the fitted model of an mkinfit object — mkinplot","text":"Deprecated function. now calls plot method plot.mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot the observed data and the fitted model of an mkinfit object — mkinplot","text":"","code":"mkinplot(fit, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot the observed data and the fitted model of an mkinfit object — mkinplot","text":"fit object class mkinfit. ... arguments passed plot.mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinplot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot the observed data and the fitted model of an mkinfit object — mkinplot","text":"function called side effect.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinplot.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Plot the observed data and the fitted model of an mkinfit object — mkinplot","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinpredict.html","id":null,"dir":"Reference","previous_headings":"","what":"Produce predictions from a kinetic model using specific parameters — mkinpredict","title":"Produce predictions from a kinetic model using specific parameters — mkinpredict","text":"function produces time series observed variables kinetic model specified mkinmod, using specific set kinetic parameters initial values state variables.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinpredict.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Produce predictions from a kinetic model using specific parameters — mkinpredict","text":"","code":"mkinpredict(x, odeparms, odeini, outtimes, ...) # S3 method for class 'mkinmod' mkinpredict( x, odeparms = c(k_parent_sink = 0.1), odeini = c(parent = 100), outtimes = seq(0, 120, by = 0.1), solution_type = \"deSolve\", use_compiled = \"auto\", use_symbols = FALSE, method.ode = \"lsoda\", atol = 1e-08, rtol = 1e-10, maxsteps = 20000L, map_output = TRUE, na_stop = TRUE, ... ) # S3 method for class 'mkinfit' mkinpredict( x, odeparms = x$bparms.ode, odeini = x$bparms.state, outtimes = seq(0, 120, by = 0.1), solution_type = \"deSolve\", use_compiled = \"auto\", method.ode = \"lsoda\", atol = 1e-08, rtol = 1e-10, map_output = TRUE, ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinpredict.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Produce predictions from a kinetic model using specific parameters — mkinpredict","text":"x kinetic model produced mkinmod, kinetic fit fitted mkinfit. latter case, fitted parameters used prediction. odeparms numeric vector specifying parameters used kinetic model, generally defined set ordinary differential equations. odeini numeric vector containing initial values state variables model. Note state variables can differ observed variables, example case SFORB model. outtimes numeric vector specifying time points model predictions generated. ... arguments passed ode solver case solver used. solution_type method used producing predictions. generally \"analytical\" one observed variable, usually \"deSolve\" case several observed variables. third possibility \"eigen\" fast comparison uncompiled ODE models, applicable models, e.g. using FOMC parent compound. use_compiled set FALSE, compiled version mkinmod model used, even present. use_symbols set TRUE (default), symbol info present mkinmod object used available accessing compiled code method.ode solution method passed via mkinpredict deSolve::ode() case solution type \"deSolve\" using compiled code. using compiled code, lsoda supported. atol Absolute error tolerance, passed ode solver. rtol Absolute error tolerance, passed ode solver. maxsteps Maximum number steps, passed ode solver. map_output Boolean specify output list values observed variables (default) state variables (set FALSE). Setting FALSE effect analytical solutions, always return mapped output. na_stop error deSolve::ode() returns NaN values","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinpredict.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Produce predictions from a kinetic model using specific parameters — mkinpredict","text":"matrix numeric solution wide format","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinpredict.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Produce predictions from a kinetic model using specific parameters — mkinpredict","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinpredict.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Produce predictions from a kinetic model using specific parameters — mkinpredict","text":"","code":"SFO <- mkinmod(degradinol = mkinsub(\"SFO\")) # Compare solution types mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = \"analytical\") #> time degradinol #> 0 0 100.0000000 #> 1 1 74.0818221 #> 2 2 54.8811636 #> 3 3 40.6569660 #> 4 4 30.1194212 #> 5 5 22.3130160 #> 6 6 16.5298888 #> 7 7 12.2456428 #> 8 8 9.0717953 #> 9 9 6.7205513 #> 10 10 4.9787068 #> 11 11 3.6883167 #> 12 12 2.7323722 #> 13 13 2.0241911 #> 14 14 1.4995577 #> 15 15 1.1108997 #> 16 16 0.8229747 #> 17 17 0.6096747 #> 18 18 0.4516581 #> 19 19 0.3345965 #> 20 20 0.2478752 mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = \"deSolve\") #> time degradinol #> 0 0 100.0000000 #> 1 1 74.0818221 #> 2 2 54.8811636 #> 3 3 40.6569660 #> 4 4 30.1194212 #> 5 5 22.3130160 #> 6 6 16.5298888 #> 7 7 12.2456428 #> 8 8 9.0717953 #> 9 9 6.7205513 #> 10 10 4.9787068 #> 11 11 3.6883167 #> 12 12 2.7323722 #> 13 13 2.0241911 #> 14 14 1.4995577 #> 15 15 1.1108996 #> 16 16 0.8229747 #> 17 17 0.6096747 #> 18 18 0.4516581 #> 19 19 0.3345965 #> 20 20 0.2478752 mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = \"deSolve\", use_compiled = FALSE) #> time degradinol #> 0 0 100.0000000 #> 1 1 74.0818221 #> 2 2 54.8811636 #> 3 3 40.6569660 #> 4 4 30.1194212 #> 5 5 22.3130160 #> 6 6 16.5298888 #> 7 7 12.2456428 #> 8 8 9.0717953 #> 9 9 6.7205513 #> 10 10 4.9787068 #> 11 11 3.6883167 #> 12 12 2.7323722 #> 13 13 2.0241911 #> 14 14 1.4995577 #> 15 15 1.1108996 #> 16 16 0.8229747 #> 17 17 0.6096747 #> 18 18 0.4516581 #> 19 19 0.3345965 #> 20 20 0.2478752 mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = \"eigen\") #> time degradinol #> 0 0 100.0000000 #> 1 1 74.0818221 #> 2 2 54.8811636 #> 3 3 40.6569660 #> 4 4 30.1194212 #> 5 5 22.3130160 #> 6 6 16.5298888 #> 7 7 12.2456428 #> 8 8 9.0717953 #> 9 9 6.7205513 #> 10 10 4.9787068 #> 11 11 3.6883167 #> 12 12 2.7323722 #> 13 13 2.0241911 #> 14 14 1.4995577 #> 15 15 1.1108997 #> 16 16 0.8229747 #> 17 17 0.6096747 #> 18 18 0.4516581 #> 19 19 0.3345965 #> 20 20 0.2478752 # Compare integration methods to analytical solution mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = \"analytical\")[21,] #> time degradinol #> 20.0000000 0.2478752 mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, method = \"lsoda\", use_compiled = FALSE)[21,] #> time degradinol #> 20.0000000 0.2478752 mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, method = \"ode45\", use_compiled = FALSE)[21,] #> time degradinol #> 20.0000000 0.2478752 mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, method = \"rk4\", use_compiled = FALSE)[21,] #> time degradinol #> 20.0000000 0.2480043 # rk4 is not as precise here # The number of output times used to make a lot of difference until the # default for atol was adjusted mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), seq(0, 20, by = 0.1))[201,] #> time degradinol #> 20.0000000 0.2478752 mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), seq(0, 20, by = 0.01))[2001,] #> time degradinol #> 20.0000000 0.2478752 # Comparison of the performance of solution types SFO_SFO = mkinmod(parent = list(type = \"SFO\", to = \"m1\"), m1 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded if(require(rbenchmark)) { benchmark(replications = 10, order = \"relative\", columns = c(\"test\", \"relative\", \"elapsed\"), eigen = mkinpredict(SFO_SFO, c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01), c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), solution_type = \"eigen\")[201,], deSolve_compiled = mkinpredict(SFO_SFO, c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01), c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), solution_type = \"deSolve\")[201,], deSolve = mkinpredict(SFO_SFO, c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01), c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), solution_type = \"deSolve\", use_compiled = FALSE)[201,], analytical = mkinpredict(SFO_SFO, c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01), c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), solution_type = \"analytical\", use_compiled = FALSE)[201,]) } #> test relative elapsed #> 2 deSolve_compiled 1.0 0.002 #> 4 analytical 1.0 0.002 #> 1 eigen 4.0 0.008 #> 3 deSolve 30.5 0.061 # \\dontrun{ # Predict from a fitted model f <- mkinfit(SFO_SFO, FOCUS_2006_C, quiet = TRUE) f <- mkinfit(SFO_SFO, FOCUS_2006_C, quiet = TRUE, solution_type = \"deSolve\") head(mkinpredict(f)) #> Error in !is.null(x$symbols) & use_symbols: operations are possible only for numeric, logical or complex types # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinresplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Function to plot residuals stored in an mkin object — mkinresplot","title":"Function to plot residuals stored in an mkin object — mkinresplot","text":"function plots residuals specified subset observed variables mkinfit object. combined plot fitted model residuals can obtained using plot.mkinfit using argument show_residuals = TRUE.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinresplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Function to plot residuals stored in an mkin object — mkinresplot","text":"","code":"mkinresplot( object, obs_vars = names(object$mkinmod$map), xlim = c(0, 1.1 * max(object$data$time)), standardized = FALSE, xlab = \"Time\", ylab = ifelse(standardized, \"Standardized residual\", \"Residual\"), maxabs = \"auto\", legend = TRUE, lpos = \"topright\", col_obs = \"auto\", pch_obs = \"auto\", frame = TRUE, ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinresplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Function to plot residuals stored in an mkin object — mkinresplot","text":"object fit represented mkinfit object. obs_vars character vector names observed variables residuals plotted. Defaults observed variables model xlim plot range x direction. standardized residuals standardized dividing standard deviation given error model fit? xlab Label x axis. ylab Label y axis. maxabs Maximum absolute value residuals. used scaling y axis defaults \"auto\". legend legend plotted? lpos legend placed? Default \"topright\". passed legend. col_obs Colors observed variables. pch_obs Symbols used observed variables. frame frame drawn around plots? ... arguments passed plot.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinresplot.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Function to plot residuals stored in an mkin object — mkinresplot","text":"Nothing returned function, called side effect, namely produce plot.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinresplot.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Function to plot residuals stored in an mkin object — mkinresplot","text":"Johannes Ranke Katrin Lindenberger","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mkinresplot.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Function to plot residuals stored in an mkin object — mkinresplot","text":"","code":"model <- mkinmod(parent = mkinsub(\"SFO\", \"m1\"), m1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded fit <- mkinfit(model, FOCUS_2006_D, quiet = TRUE) #> Warning: Observations with value of zero were removed from the data mkinresplot(fit, \"m1\")"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin","title":"Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin","text":"function calls mkinfit combinations models datasets specified first two arguments.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin","text":"","code":"mmkin( models = c(\"SFO\", \"FOMC\", \"DFOP\"), datasets, cores = if (Sys.info()[\"sysname\"] == \"Windows\") 1 else parallel::detectCores(), cluster = NULL, ... ) # S3 method for class 'mmkin' print(x, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin","text":"models Either character vector shorthand names like c(\"SFO\", \"FOMC\", \"DFOP\", \"HS\", \"SFORB\"), optionally named list mkinmod objects. datasets optionally named list datasets suitable observed data mkinfit. cores number cores used multicore processing. used cluster argument NULL. Windows machines, cores > 1 supported, need use cluster argument use multiple logical processors. Per default, cores detected parallel::detectCores() used, except Windows default 1. cluster cluster returned makeCluster used parallel execution. ... used. x mmkin object.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin","text":"two-dimensional array mkinfit objects /try-errors can indexed using model names first index (row index) dataset names second index (column index).","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mmkin.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit one or more kinetic models with one or more state variables to one or more datasets — mmkin","text":"","code":"# \\dontrun{ m_synth_SFO_lin <- mkinmod(parent = mkinsub(\"SFO\", \"M1\"), M1 = mkinsub(\"SFO\", \"M2\"), M2 = mkinsub(\"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded m_synth_FOMC_lin <- mkinmod(parent = mkinsub(\"FOMC\", \"M1\"), M1 = mkinsub(\"SFO\", \"M2\"), M2 = mkinsub(\"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded models <- list(SFO_lin = m_synth_SFO_lin, FOMC_lin = m_synth_FOMC_lin) datasets <- lapply(synthetic_data_for_UBA_2014[1:3], function(x) x$data) names(datasets) <- paste(\"Dataset\", 1:3) time_default <- system.time(fits.0 <- mmkin(models, datasets, quiet = TRUE)) time_1 <- system.time(fits.4 <- mmkin(models, datasets, cores = 1, quiet = TRUE)) time_default #> user system elapsed #> 1.522 0.957 0.720 time_1 #> user system elapsed #> 1.991 0.024 2.015 endpoints(fits.0[[\"SFO_lin\", 2]]) #> $ff #> parent_M1 parent_sink M1_M2 M1_sink #> 0.7340481 0.2659519 0.7505690 0.2494310 #> #> $distimes #> DT50 DT90 #> parent 0.8777689 2.915885 #> M1 2.3257403 7.725942 #> M2 33.7201060 112.015767 #> # plot.mkinfit handles rows or columns of mmkin result objects plot(fits.0[1, ]) plot(fits.0[1, ], obs_var = c(\"M1\", \"M2\")) plot(fits.0[, 1]) # Use double brackets to extract a single mkinfit object, which will be plotted # by plot.mkinfit and can be plotted using plot_sep plot(fits.0[[1, 1]], sep_obs = TRUE, show_residuals = TRUE, show_errmin = TRUE) plot_sep(fits.0[[1, 1]]) # Plotting with mmkin (single brackets, extracting an mmkin object) does not # allow to plot the observed variables separately plot(fits.0[1, 1]) # On Windows, we can use multiple cores by making a cluster first cl <- parallel::makePSOCKcluster(12) f <- mmkin(c(\"SFO\", \"FOMC\", \"DFOP\"), list(A = FOCUS_2006_A, B = FOCUS_2006_B, C = FOCUS_2006_C, D = FOCUS_2006_D), cluster = cl, quiet = TRUE) print(f) #> object #> Status of individual fits: #> #> dataset #> model A B C D #> SFO OK OK OK OK #> FOMC C OK OK OK #> DFOP OK OK OK OK #> #> C: Optimisation did not converge: #> false convergence (8) #> OK: No warnings # We get false convergence for the FOMC fit to FOCUS_2006_A because this # dataset is really SFO, and the FOMC fit is overparameterised parallel::stopCluster(cl) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/multistart.html","id":null,"dir":"Reference","previous_headings":"","what":"Perform a hierarchical model fit with multiple starting values — multistart","title":"Perform a hierarchical model fit with multiple starting values — multistart","text":"purpose method check certain algorithm fitting nonlinear hierarchical models (also known nonlinear mixed-effects models) reliably yield results sufficiently similar , started certain range reasonable starting parameters. inspired article practical identifiabiliy frame nonlinear mixed-effects models Duchesne et al (2021).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/multistart.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Perform a hierarchical model fit with multiple starting values — multistart","text":"","code":"multistart( object, n = 50, cores = if (Sys.info()[\"sysname\"] == \"Windows\") 1 else parallel::detectCores(), cluster = NULL, ... ) # S3 method for class 'saem.mmkin' multistart(object, n = 50, cores = 1, cluster = NULL, ...) # S3 method for class 'multistart' print(x, ...) best(object, ...) # Default S3 method best(object, ...) which.best(object, ...) # Default S3 method which.best(object, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/multistart.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Perform a hierarchical model fit with multiple starting values — multistart","text":"object fit object work n many different combinations starting parameters used? cores many fits run parallel (posix platforms)? cluster cluster returned parallel::makeCluster used parallel execution. ... Passed update function. x multistart object print","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/multistart.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Perform a hierarchical model fit with multiple starting values — multistart","text":"list saem.mmkin objects, class attributes 'multistart.saem.mmkin' 'multistart'. object highest likelihood index object highest likelihood","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/multistart.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Perform a hierarchical model fit with multiple starting values — multistart","text":"Duchesne R, Guillemin , Gandrillon O, Crauste F. Practical identifiability frame nonlinear mixed effects models: example vitro erythropoiesis. BMC Bioinformatics. 2021 Oct 4;22(1):478. doi: 10.1186/s12859-021-04373-4.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/multistart.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Perform a hierarchical model fit with multiple starting values — multistart","text":"","code":"# \\dontrun{ library(mkin) dmta_ds <- lapply(1:7, function(i) { ds_i <- dimethenamid_2018$ds[[i]]$data ds_i[ds_i$name == \"DMTAP\", \"name\"] <- \"DMTA\" ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i] ds_i }) names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title) dmta_ds[[\"Elliot\"]] <- rbind(dmta_ds[[\"Elliot 1\"]], dmta_ds[[\"Elliot 2\"]]) dmta_ds[[\"Elliot 1\"]] <- dmta_ds[[\"Elliot 2\"]] <- NULL f_mmkin <- mmkin(\"DFOP\", dmta_ds, error_model = \"tc\", cores = 7, quiet = TRUE) f_saem_full <- saem(f_mmkin) f_saem_full_multi <- multistart(f_saem_full, n = 16, cores = 16) parplot(f_saem_full_multi, lpos = \"topleft\", las = 2) illparms(f_saem_full) #> [1] \"sd(log_k2)\" f_saem_reduced <- update(f_saem_full, no_random_effect = \"log_k2\") illparms(f_saem_reduced) # On Windows, we need to create a PSOCK cluster first and refer to it # in the call to multistart() library(parallel) cl <- makePSOCKcluster(12) f_saem_reduced_multi <- multistart(f_saem_reduced, n = 16, cluster = cl) parplot(f_saem_reduced_multi, lpos = \"topright\", ylim = c(0.5, 2), las = 2) stopCluster(cl) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nafta.html","id":null,"dir":"Reference","previous_headings":"","what":"Evaluate parent kinetics using the NAFTA guidance — nafta","title":"Evaluate parent kinetics using the NAFTA guidance — nafta","text":"function fits SFO, IORE DFOP models using mmkin returns object class nafta methods printing plotting. Print nafta objects. results three models printed order increasing model complexity, .e. SFO, IORE, finally DFOP.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nafta.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluate parent kinetics using the NAFTA guidance — nafta","text":"","code":"nafta(ds, title = NA, quiet = FALSE, ...) # S3 method for class 'nafta' print(x, quiet = TRUE, digits = 3, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nafta.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Evaluate parent kinetics using the NAFTA guidance — nafta","text":"NAFTA (2011) Guidance evaluating calculating degradation kinetics environmental media. NAFTA Technical Working Group Pesticides https://www.epa.gov/pesticide-science--assessing-pesticide-risks/guidance-evaluating--calculating-degradation accessed 2019-02-22 US EPA (2015) Standard Operating Procedure Using NAFTA Guidance Calculate Representative Half-life Values Characterizing Pesticide Degradation https://www.epa.gov/pesticide-science--assessing-pesticide-risks/standard-operating-procedure-using-nafta-guidance","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nafta.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluate parent kinetics using the NAFTA guidance — nafta","text":"ds dataframe must contain one variable called \"time\" time values specified time argument, one column called \"name\" grouping observed values, finally one column observed values called \"value\". title Optional title dataset quiet evaluation text shown? ... arguments passed mmkin (printing method). x nafta object. digits Number digits used printing parameters dissipation times.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nafta.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Evaluate parent kinetics using the NAFTA guidance — nafta","text":"list class nafta. list element named \"mmkin\" mmkin object containing fits three models. list element named \"title\" contains title dataset used. list element \"data\" contains dataset used fits.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nafta.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Evaluate parent kinetics using the NAFTA guidance — nafta","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nafta.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Evaluate parent kinetics using the NAFTA guidance — nafta","text":"","code":"nafta_evaluation <- nafta(NAFTA_SOP_Appendix_D, cores = 1) #> The SFO model is rejected as S_SFO is equal or higher than the critical value S_c #> The representative half-life of the IORE model is longer than the one corresponding #> to the terminal degradation rate found with the DFOP model. #> The representative half-life obtained from the DFOP model may be used print(nafta_evaluation) #> Sums of squares: #> SFO IORE DFOP #> 1378.6832 615.7730 517.8836 #> #> Critical sum of squares for checking the SFO model: #> [1] 717.4598 #> #> Parameters: #> $SFO #> Estimate Pr(>t) Lower Upper #> parent_0 83.7558 1.80e-14 77.18268 90.3288 #> k_parent 0.0017 7.43e-05 0.00112 0.0026 #> sigma 8.7518 1.22e-05 5.64278 11.8608 #> #> $IORE #> Estimate Pr(>t) Lower Upper #> parent_0 9.69e+01 NA 8.88e+01 1.05e+02 #> k__iore_parent 8.40e-14 NA 1.79e-18 3.94e-09 #> N_parent 6.68e+00 NA 4.19e+00 9.17e+00 #> sigma 5.85e+00 NA 3.76e+00 7.94e+00 #> #> $DFOP #> Estimate Pr(>t) Lower Upper #> parent_0 9.76e+01 1.94e-13 9.02e+01 1.05e+02 #> k1 4.24e-02 5.92e-03 2.03e-02 8.88e-02 #> k2 8.24e-04 6.48e-03 3.89e-04 1.75e-03 #> g 2.88e-01 2.47e-05 1.95e-01 4.03e-01 #> sigma 5.36e+00 2.22e-05 3.43e+00 7.30e+00 #> #> #> DTx values: #> DT50 DT90 DT50_rep #> SFO 407 1350 407 #> IORE 541 5190000 1560000 #> DFOP 429 2380 841 #> #> Representative half-life: #> [1] 841.41 plot(nafta_evaluation)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.html","id":null,"dir":"Reference","previous_headings":"","what":"Helper functions to create nlme models from mmkin row objects — nlme_function","title":"Helper functions to create nlme models from mmkin row objects — nlme_function","text":"functions facilitate setting nonlinear mixed effects model mmkin row object. mmkin row object essentially list mkinfit objects obtained fitting model list datasets. used internally nlme.mmkin() method.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Helper functions to create nlme models from mmkin row objects — nlme_function","text":"","code":"nlme_function(object) nlme_data(object)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Helper functions to create nlme models from mmkin row objects — nlme_function","text":"object mmkin row object containing several fits model different datasets","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Helper functions to create nlme models from mmkin row objects — nlme_function","text":"function can used nlme nlme::groupedData object","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Helper functions to create nlme models from mmkin row objects — nlme_function","text":"","code":"sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) m_SFO <- mkinmod(parent = mkinsub(\"SFO\")) d_SFO_1 <- mkinpredict(m_SFO, c(k_parent = 0.1), c(parent = 98), sampling_times) d_SFO_1_long <- mkin_wide_to_long(d_SFO_1, time = \"time\") d_SFO_2 <- mkinpredict(m_SFO, c(k_parent = 0.05), c(parent = 102), sampling_times) d_SFO_2_long <- mkin_wide_to_long(d_SFO_2, time = \"time\") d_SFO_3 <- mkinpredict(m_SFO, c(k_parent = 0.02), c(parent = 103), sampling_times) d_SFO_3_long <- mkin_wide_to_long(d_SFO_3, time = \"time\") d1 <- add_err(d_SFO_1, function(value) 3, n = 1) d2 <- add_err(d_SFO_2, function(value) 2, n = 1) d3 <- add_err(d_SFO_3, function(value) 4, n = 1) ds <- c(d1 = d1, d2 = d2, d3 = d3) f <- mmkin(\"SFO\", ds, cores = 1, quiet = TRUE) mean_dp <- mean_degparms(f) grouped_data <- nlme_data(f) nlme_f <- nlme_function(f) # These assignments are necessary for these objects to be # visible to nlme and augPred when evaluation is done by # pkgdown to generate the html docs. assign(\"nlme_f\", nlme_f, globalenv()) assign(\"grouped_data\", grouped_data, globalenv()) library(nlme) m_nlme <- nlme(value ~ nlme_f(name, time, parent_0, log_k_parent_sink), data = grouped_data, fixed = parent_0 + log_k_parent_sink ~ 1, random = pdDiag(parent_0 + log_k_parent_sink ~ 1), start = mean_dp) summary(m_nlme) #> Nonlinear mixed-effects model fit by maximum likelihood #> Model: value ~ nlme_f(name, time, parent_0, log_k_parent_sink) #> Data: grouped_data #> AIC BIC logLik #> 266.6428 275.8935 -128.3214 #> #> Random effects: #> Formula: list(parent_0 ~ 1, log_k_parent_sink ~ 1) #> Level: ds #> Structure: Diagonal #> parent_0 log_k_parent_sink Residual #> StdDev: 0.0003775775 0.7058039 3.065183 #> #> Fixed effects: parent_0 + log_k_parent_sink ~ 1 #> Value Std.Error DF t-value p-value #> parent_0 101.18323 0.7900461 43 128.07257 0 #> log_k_parent_sink -3.08708 0.4171755 43 -7.39995 0 #> Correlation: #> prnt_0 #> log_k_parent_sink 0.031 #> #> Standardized Within-Group Residuals: #> Min Q1 Med Q3 Max #> -2.38427070 -0.52059848 0.03593021 0.39987268 2.73188969 #> #> Number of Observations: 47 #> Number of Groups: 3 plot(augPred(m_nlme, level = 0:1), layout = c(3, 1)) # augPred does not work on fits with more than one state # variable # # The procedure is greatly simplified by the nlme.mmkin function f_nlme <- nlme(f) plot(f_nlme)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Create an nlme model for an mmkin row object — nlme.mmkin","title":"Create an nlme model for an mmkin row object — nlme.mmkin","text":"functions sets nonlinear mixed effects model mmkin row object. mmkin row object essentially list mkinfit objects obtained fitting model list datasets.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create an nlme model for an mmkin row object — nlme.mmkin","text":"","code":"# S3 method for class 'mmkin' nlme( model, data = \"auto\", fixed = lapply(as.list(names(mean_degparms(model))), function(el) eval(parse(text = paste(el, 1, sep = \"~\")))), random = pdDiag(fixed), groups, start = mean_degparms(model, random = TRUE, test_log_parms = TRUE), correlation = NULL, weights = NULL, subset, method = c(\"ML\", \"REML\"), na.action = na.fail, naPattern, control = list(), verbose = FALSE ) # S3 method for class 'nlme.mmkin' print(x, digits = max(3, getOption(\"digits\") - 3), ...) # S3 method for class 'nlme.mmkin' update(object, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create an nlme model for an mmkin row object — nlme.mmkin","text":"model mmkin row object. data Ignored, data taken mmkin model fixed Ignored, degradation parameters fitted mmkin model used fixed parameters random specified, correlations random effects set optimised degradation model parameters. achieved using nlme::pdDiag method. groups See documentation nlme start specified, mean values fitted degradation parameters taken mmkin object used correlation See documentation nlme weights passed nlme subset passed nlme method passed nlme na.action passed nlme naPattern passed nlme control passed nlme verbose passed nlme x nlme.mmkin object print digits Number digits use printing ... Update specifications passed update.nlme object nlme.mmkin object update","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create an nlme model for an mmkin row object — nlme.mmkin","text":"Upon success, fitted 'nlme.mmkin' object, nlme object additional elements. also inherits 'mixed.mmkin'.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.mmkin.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create an nlme model for an mmkin row object — nlme.mmkin","text":"Note convergence nlme algorithms depends quality data. degradation kinetics, often datasets (e.g. data soils) complicated degradation models, may make impossible obtain convergence nlme.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.mmkin.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Create an nlme model for an mmkin row object — nlme.mmkin","text":"object inherits nlme::nlme, wealth methods automatically work 'nlme.mmkin' objects, nlme::intervals(), nlme::anova.lme() nlme::coef.lme().","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nlme.mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create an nlme model for an mmkin row object — nlme.mmkin","text":"","code":"ds <- lapply(experimental_data_for_UBA_2019[6:10], function(x) subset(x$data[c(\"name\", \"time\", \"value\")], name == \"parent\")) # \\dontrun{ f <- mmkin(c(\"SFO\", \"DFOP\"), ds, quiet = TRUE, cores = 1) library(nlme) f_nlme_sfo <- nlme(f[\"SFO\", ]) f_nlme_dfop <- nlme(f[\"DFOP\", ]) anova(f_nlme_sfo, f_nlme_dfop) #> Model df AIC BIC logLik Test L.Ratio p-value #> f_nlme_sfo 1 5 625.0539 637.5529 -307.5269 #> f_nlme_dfop 2 9 495.1270 517.6253 -238.5635 1 vs 2 137.9269 <.0001 print(f_nlme_dfop) #> Kinetic nonlinear mixed-effects model fit by maximum likelihood #> #> Structural model: #> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * #> time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) #> * parent #> #> Data: #> 90 observations of 1 variable(s) grouped in 5 datasets #> #> Log-likelihood: -238.6 #> #> Fixed effects: #> list(parent_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1) #> parent_0 log_k1 log_k2 g_qlogis #> 94.1702 -1.8002 -4.1474 0.0324 #> #> Random effects: #> Formula: list(parent_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1) #> Level: ds #> Structure: Diagonal #> parent_0 log_k1 log_k2 g_qlogis Residual #> StdDev: 2.488 0.8447 1.33 0.4652 2.321 #> plot(f_nlme_dfop) endpoints(f_nlme_dfop) #> $distimes #> DT50 DT90 DT50back DT50_k1 DT50_k2 #> parent 10.79857 100.7937 30.34192 4.193937 43.85442 #> ds_2 <- lapply(experimental_data_for_UBA_2019[6:10], function(x) x$data[c(\"name\", \"time\", \"value\")]) m_sfo_sfo <- mkinmod(parent = mkinsub(\"SFO\", \"A1\"), A1 = mkinsub(\"SFO\"), use_of_ff = \"min\", quiet = TRUE) m_sfo_sfo_ff <- mkinmod(parent = mkinsub(\"SFO\", \"A1\"), A1 = mkinsub(\"SFO\"), use_of_ff = \"max\", quiet = TRUE) m_dfop_sfo <- mkinmod(parent = mkinsub(\"DFOP\", \"A1\"), A1 = mkinsub(\"SFO\"), quiet = TRUE) f_2 <- mmkin(list(\"SFO-SFO\" = m_sfo_sfo, \"SFO-SFO-ff\" = m_sfo_sfo_ff, \"DFOP-SFO\" = m_dfop_sfo), ds_2, quiet = TRUE) f_nlme_sfo_sfo <- nlme(f_2[\"SFO-SFO\", ]) plot(f_nlme_sfo_sfo) # With formation fractions this does not coverge with defaults # f_nlme_sfo_sfo_ff <- nlme(f_2[\"SFO-SFO-ff\", ]) #plot(f_nlme_sfo_sfo_ff) # For the following, we need to increase pnlsMaxIter and the tolerance # to get convergence f_nlme_dfop_sfo <- nlme(f_2[\"DFOP-SFO\", ], control = list(pnlsMaxIter = 120, tolerance = 5e-4)) plot(f_nlme_dfop_sfo) anova(f_nlme_dfop_sfo, f_nlme_sfo_sfo) #> Model df AIC BIC logLik Test L.Ratio p-value #> f_nlme_dfop_sfo 1 13 843.8547 884.620 -408.9273 #> f_nlme_sfo_sfo 2 9 1085.1821 1113.404 -533.5910 1 vs 2 249.3274 <.0001 endpoints(f_nlme_sfo_sfo) #> $ff #> parent_sink parent_A1 A1_sink #> 0.5912432 0.4087568 1.0000000 #> #> $distimes #> DT50 DT90 #> parent 19.13518 63.5657 #> A1 66.02155 219.3189 #> endpoints(f_nlme_dfop_sfo) #> $ff #> parent_A1 parent_sink #> 0.2768574 0.7231426 #> #> $distimes #> DT50 DT90 DT50back DT50_k1 DT50_k2 #> parent 11.07091 104.6320 31.49737 4.462383 46.20825 #> A1 162.30550 539.1672 NA NA NA #> if (length(findFunction(\"varConstProp\")) > 0) { # tc error model for nlme available # Attempts to fit metabolite kinetics with the tc error model are possible, # but need tweeking of control values and sometimes do not converge f_tc <- mmkin(c(\"SFO\", \"DFOP\"), ds, quiet = TRUE, error_model = \"tc\") f_nlme_sfo_tc <- nlme(f_tc[\"SFO\", ]) f_nlme_dfop_tc <- nlme(f_tc[\"DFOP\", ]) AIC(f_nlme_sfo, f_nlme_sfo_tc, f_nlme_dfop, f_nlme_dfop_tc) print(f_nlme_dfop_tc) } #> Kinetic nonlinear mixed-effects model fit by maximum likelihood #> #> Structural model: #> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * #> time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) #> * parent #> #> Data: #> 90 observations of 1 variable(s) grouped in 5 datasets #> #> Log-likelihood: -238.4 #> #> Fixed effects: #> list(parent_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1) #> parent_0 log_k1 log_k2 g_qlogis #> 94.04774 -1.82340 -4.16716 0.05685 #> #> Random effects: #> Formula: list(parent_0 ~ 1, log_k1 ~ 1, log_k2 ~ 1, g_qlogis ~ 1) #> Level: ds #> Structure: Diagonal #> parent_0 log_k1 log_k2 g_qlogis Residual #> StdDev: 2.474 0.85 1.337 0.4659 1 #> #> Variance function: #> Structure: Constant plus proportion of variance covariate #> Formula: ~fitted(.) #> Parameter estimates: #> const prop #> 2.23222933 0.01262399 f_2_obs <- update(f_2, error_model = \"obs\") f_nlme_sfo_sfo_obs <- nlme(f_2_obs[\"SFO-SFO\", ]) print(f_nlme_sfo_sfo_obs) #> Kinetic nonlinear mixed-effects model fit by maximum likelihood #> #> Structural model: #> d_parent/dt = - k_parent_sink * parent - k_parent_A1 * parent #> d_A1/dt = + k_parent_A1 * parent - k_A1_sink * A1 #> #> Data: #> 170 observations of 2 variable(s) grouped in 5 datasets #> #> Log-likelihood: -473 #> #> Fixed effects: #> list(parent_0 ~ 1, log_k_parent_sink ~ 1, log_k_parent_A1 ~ 1, log_k_A1_sink ~ 1) #> parent_0 log_k_parent_sink log_k_parent_A1 log_k_A1_sink #> 87.976 -3.670 -4.164 -4.645 #> #> Random effects: #> Formula: list(parent_0 ~ 1, log_k_parent_sink ~ 1, log_k_parent_A1 ~ 1, log_k_A1_sink ~ 1) #> Level: ds #> Structure: Diagonal #> parent_0 log_k_parent_sink log_k_parent_A1 log_k_A1_sink Residual #> StdDev: 3.992 1.777 1.055 0.4821 6.483 #> #> Variance function: #> Structure: Different standard deviations per stratum #> Formula: ~1 | name #> Parameter estimates: #> parent A1 #> 1.0000000 0.2050005 f_nlme_dfop_sfo_obs <- nlme(f_2_obs[\"DFOP-SFO\", ], control = list(pnlsMaxIter = 120, tolerance = 5e-4)) f_2_tc <- update(f_2, error_model = \"tc\") # f_nlme_sfo_sfo_tc <- nlme(f_2_tc[\"SFO-SFO\", ]) # No convergence with 50 iterations # f_nlme_dfop_sfo_tc <- nlme(f_2_tc[\"DFOP-SFO\", ], # control = list(pnlsMaxIter = 120, tolerance = 5e-4)) # Error in X[, fmap[[nm]]] <- gradnm anova(f_nlme_dfop_sfo, f_nlme_dfop_sfo_obs) #> Model df AIC BIC logLik Test L.Ratio p-value #> f_nlme_dfop_sfo 1 13 843.8547 884.620 -408.9273 #> f_nlme_dfop_sfo_obs 2 14 817.5338 861.435 -394.7669 1 vs 2 28.32084 <.0001 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nobs.mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Number of observations on which an mkinfit object was fitted — nobs.mkinfit","title":"Number of observations on which an mkinfit object was fitted — nobs.mkinfit","text":"Number observations mkinfit object fitted","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nobs.mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Number of observations on which an mkinfit object was fitted — nobs.mkinfit","text":"","code":"# S3 method for class 'mkinfit' nobs(object, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nobs.mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Number of observations on which an mkinfit object was fitted — nobs.mkinfit","text":"object mkinfit object ... compatibility generic method","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/nobs.mkinfit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Number of observations on which an mkinfit object was fitted — nobs.mkinfit","text":"number rows data included mkinfit object","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parms.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract model parameters — parms","title":"Extract model parameters — parms","text":"function returns degradation model parameters well error model parameters per default, order avoid working fitted model without considering error structure assumed fit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parms.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract model parameters — parms","text":"","code":"parms(object, ...) # S3 method for class 'mkinfit' parms(object, transformed = FALSE, errparms = TRUE, ...) # S3 method for class 'mmkin' parms(object, transformed = FALSE, errparms = TRUE, ...) # S3 method for class 'multistart' parms(object, exclude_failed = TRUE, ...) # S3 method for class 'saem.mmkin' parms(object, ci = FALSE, covariates = NULL, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parms.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract model parameters — parms","text":"object fitted model object. ... used transformed parameters returned used internally optimisation? errparms error model parameters returned addition degradation parameters? exclude_failed multistart objects, rows failed fits removed returned parameter matrix? ci matrix estimates confidence interval boundaries returned? FALSE (default), vector estimates returned covariates given, otherwise matrix estimates returned, column corresponding row data frame holding covariates covariates data frame holding covariate values return parameter values. effect 'ci' FALSE.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parms.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract model parameters — parms","text":"Depending object, numeric vector fitted model parameters, matrix (e.g. mmkin row objects), list matrices (e.g. mmkin objects one row).","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parms.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract model parameters — parms","text":"","code":"# mkinfit objects fit <- mkinfit(\"SFO\", FOCUS_2006_C, quiet = TRUE) parms(fit) #> parent_0 k_parent sigma #> 82.4921598 0.3060633 4.6730124 parms(fit, transformed = TRUE) #> parent_0 log_k_parent sigma #> 82.492160 -1.183963 4.673012 # mmkin objects ds <- lapply(experimental_data_for_UBA_2019[6:10], function(x) subset(x$data[c(\"name\", \"time\", \"value\")])) names(ds) <- paste(\"Dataset\", 6:10) # \\dontrun{ fits <- mmkin(c(\"SFO\", \"FOMC\", \"DFOP\"), ds, quiet = TRUE, cores = 1) parms(fits[\"SFO\", ]) #> Dataset 6 Dataset 7 Dataset 8 Dataset 9 Dataset 10 #> parent_0 88.52275400 82.666781678 86.8547308 91.7779306 82.14809450 #> k_parent 0.05794659 0.009647805 0.2102974 0.1232258 0.00720421 #> sigma 5.15274487 7.040168584 3.6769645 6.4669234 6.50457673 parms(fits[, 2]) #> $SFO #> Dataset 7 #> parent_0 82.666781678 #> k_parent 0.009647805 #> sigma 7.040168584 #> #> $FOMC #> Dataset 7 #> parent_0 92.6837649 #> alpha 0.4967832 #> beta 14.1451255 #> sigma 1.9167519 #> #> $DFOP #> Dataset 7 #> parent_0 91.058971584 #> k1 0.044946770 #> k2 0.002868336 #> g 0.526942414 #> sigma 2.221302196 #> parms(fits) #> $SFO #> Dataset 6 Dataset 7 Dataset 8 Dataset 9 Dataset 10 #> parent_0 88.52275400 82.666781678 86.8547308 91.7779306 82.14809450 #> k_parent 0.05794659 0.009647805 0.2102974 0.1232258 0.00720421 #> sigma 5.15274487 7.040168584 3.6769645 6.4669234 6.50457673 #> #> $FOMC #> Dataset 6 Dataset 7 Dataset 8 Dataset 9 Dataset 10 #> parent_0 95.558575 92.6837649 90.719787 98.383939 94.8481458 #> alpha 1.338667 0.4967832 1.639099 1.074460 0.2805272 #> beta 13.033315 14.1451255 5.007077 4.397126 6.9052224 #> sigma 1.847671 1.9167519 1.066063 3.146056 1.6222778 #> #> $DFOP #> Dataset 6 Dataset 7 Dataset 8 Dataset 9 Dataset 10 #> parent_0 96.55213663 91.058971584 90.34509493 98.14858820 94.311323735 #> k1 0.21954588 0.044946770 0.41232288 0.31697588 0.080663857 #> k2 0.02957934 0.002868336 0.07581766 0.03260384 0.003425417 #> g 0.44845068 0.526942414 0.66091967 0.65322767 0.342652880 #> sigma 1.35690468 2.221302196 1.34169076 2.87159846 1.942067831 #> parms(fits, transformed = TRUE) #> $SFO #> Dataset 6 Dataset 7 Dataset 8 Dataset 9 Dataset 10 #> parent_0 88.522754 82.666782 86.854731 91.777931 82.148095 #> log_k_parent -2.848234 -4.641025 -1.559232 -2.093737 -4.933090 #> sigma 5.152745 7.040169 3.676964 6.466923 6.504577 #> #> $FOMC #> Dataset 6 Dataset 7 Dataset 8 Dataset 9 Dataset 10 #> parent_0 95.5585751 92.6837649 90.7197870 98.38393898 94.848146 #> log_alpha 0.2916741 -0.6996015 0.4941466 0.07181816 -1.271085 #> log_beta 2.5675088 2.6493701 1.6108523 1.48095106 1.932278 #> sigma 1.8476712 1.9167519 1.0660627 3.14605557 1.622278 #> #> $DFOP #> Dataset 6 Dataset 7 Dataset 8 Dataset 9 Dataset 10 #> parent_0 96.5521366 91.0589716 90.3450949 98.1485882 94.3113237 #> log_k1 -1.5161940 -3.1022764 -0.8859486 -1.1489296 -2.5174647 #> log_k2 -3.5206791 -5.8540232 -2.5794240 -3.4233253 -5.6765322 #> g_qlogis -0.2069326 0.1078741 0.6673953 0.6332573 -0.6514943 #> sigma 1.3569047 2.2213022 1.3416908 2.8715985 1.9420678 #> # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot parameter variability of multistart objects — parplot","title":"Plot parameter variability of multistart objects — parplot","text":"Produces boxplot parameters multiple runs, scaled either parameters run highest likelihood, medians proposed paper Duchesne et al. (2021).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot parameter variability of multistart objects — parplot","text":"","code":"parplot(object, ...) # S3 method for class 'multistart.saem.mmkin' parplot( object, llmin = -Inf, llquant = NA, scale = c(\"best\", \"median\"), lpos = \"bottomleft\", main = \"\", ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot parameter variability of multistart objects — parplot","text":"object multistart object ... Passed boxplot llmin minimum likelihood objects shown llquant Fractional value selecting fits higher likelihoods. Overrides 'llmin'. scale default, scale parameters using best available fit. 'median', parameters scaled using median parameters fits. lpos Positioning legend. main Title plot","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parplot.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Plot parameter variability of multistart objects — parplot","text":"Starting values degradation model parameters error model parameters shown green circles. results obtained original run shown red circles.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/parplot.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Plot parameter variability of multistart objects — parplot","text":"Duchesne R, Guillemin , Gandrillon O, Crauste F. Practical identifiability frame nonlinear mixed effects models: example vitro erythropoiesis. BMC Bioinformatics. 2021 Oct 4;22(1):478. doi: 10.1186/s12859-021-04373-4.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mixed.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin","title":"Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin","text":"Plot predictions fitted nonlinear mixed model obtained via mmkin row object","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mixed.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin","text":"","code":"# S3 method for class 'mixed.mmkin' plot( x, i = 1:ncol(x$mmkin), obs_vars = names(x$mkinmod$map), standardized = TRUE, covariates = NULL, covariate_quantiles = c(0.5, 0.05, 0.95), xlab = \"Time\", xlim = range(x$data$time), resplot = c(\"predicted\", \"time\"), pop_curves = \"auto\", pred_over = NULL, test_log_parms = FALSE, conf.level = 0.6, default_log_parms = NA, ymax = \"auto\", maxabs = \"auto\", ncol.legend = ifelse(length(i) <= 3, length(i) + 1, ifelse(length(i) <= 8, 3, 4)), nrow.legend = ceiling((length(i) + 1)/ncol.legend), rel.height.legend = 0.02 + 0.07 * nrow.legend, rel.height.bottom = 1.1, pch_ds = c(1:25, 33, 35:38, 40:41, 47:57, 60:90)[1:length(i)], col_ds = pch_ds + 1, lty_ds = col_ds, frame = TRUE, ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mixed.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin","text":"x object class mixed.mmkin, saem.mmkin nlme.mmkin numeric index select datasets plot individual predictions, case plots get large obs_vars character vector names observed variables data model plotted. Defauls observed variables model. standardized residuals standardized? takes effect resplot = \"time\". covariates Data frame covariate values variables covariate models object. given, overrides 'covariate_quantiles'. line data frame result line drawn population. Rownames used legend label lines. covariate_quantiles argument effect fitted object covariate models. , default show three population curves, 5th percentile, 50th percentile 95th percentile covariate values used fitting model. xlab Label x axis. xlim Plot range x direction. resplot residuals plotted time predicted values? pop_curves Per default, one population curve drawn case population parameters fitted model, e.g. saem objects. case covariate model, behaviour depends value 'covariates' pred_over Named list alternative predictions obtained mkinpredict compatible mkinmod. test_log_parms Passed mean_degparms case mixed.mmkin object conf.level Passed mean_degparms case mixed.mmkin object default_log_parms Passed mean_degparms case mixed.mmkin object ymax Vector maximum y axis values maxabs Maximum absolute value residuals. used scaling y axis defaults \"auto\". ncol.legend Number columns use legend nrow.legend Number rows use legend rel.height.legend relative height legend shown top rel.height.bottom relative height bottom plot row pch_ds Symbols used plotting data. col_ds Colors used plotting observed data corresponding model prediction lines different datasets. lty_ds Line types used model predictions. frame frame drawn around plots? ... arguments passed plot.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mixed.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin","text":"function called side effect.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mixed.mmkin.html","id":"note","dir":"Reference","previous_headings":"","what":"Note","title":"Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin","text":"Covariate models currently supported saem.mmkin objects.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mixed.mmkin.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mixed.mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Plot predictions from a fitted nonlinear mixed model obtained via an mmkin row object — plot.mixed.mmkin","text":"","code":"ds <- lapply(experimental_data_for_UBA_2019[6:10], function(x) x$data[c(\"name\", \"time\", \"value\")]) names(ds) <- paste0(\"ds \", 6:10) dfop_sfo <- mkinmod(parent = mkinsub(\"DFOP\", \"A1\"), A1 = mkinsub(\"SFO\"), quiet = TRUE) # \\dontrun{ f <- mmkin(list(\"DFOP-SFO\" = dfop_sfo), ds, quiet = TRUE) plot(f[, 3:4], standardized = TRUE) # For this fit we need to increase pnlsMaxiter, and we increase the # tolerance in order to speed up the fit for this example evaluation # It still takes 20 seconds to run f_nlme <- nlme(f, control = list(pnlsMaxIter = 120, tolerance = 1e-3)) plot(f_nlme) f_saem <- saem(f, transformations = \"saemix\") plot(f_saem) f_obs <- mmkin(list(\"DFOP-SFO\" = dfop_sfo), ds, quiet = TRUE, error_model = \"obs\") f_nlmix <- nlmix(f_obs) #> Error in nlmix(f_obs): could not find function \"nlmix\" plot(f_nlmix) #> Error: object 'f_nlmix' not found # We can overlay the two variants if we generate predictions pred_nlme <- mkinpredict(dfop_sfo, f_nlme$bparms.optim[-1], c(parent = f_nlme$bparms.optim[[1]], A1 = 0), seq(0, 180, by = 0.2)) plot(f_saem, pred_over = list(nlme = pred_nlme)) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit","title":"Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit","text":"Solves differential equations optimised fixed parameters previous successful call mkinfit plots observed data together solution fitted model.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit","text":"","code":"# S3 method for class 'mkinfit' plot( x, fit = x, obs_vars = names(fit$mkinmod$map), xlab = \"Time\", ylab = \"Residue\", xlim = range(fit$data$time), ylim = \"default\", col_obs = 1:length(obs_vars), pch_obs = col_obs, lty_obs = rep(1, length(obs_vars)), add = FALSE, legend = !add, show_residuals = FALSE, show_errplot = FALSE, maxabs = \"auto\", sep_obs = FALSE, rel.height.middle = 0.9, row_layout = FALSE, lpos = \"topright\", inset = c(0.05, 0.05), show_errmin = FALSE, errmin_digits = 3, frame = TRUE, ... ) plot_sep( fit, show_errmin = TRUE, show_residuals = ifelse(identical(fit$err_mod, \"const\"), TRUE, \"standardized\"), ... ) plot_res( fit, sep_obs = FALSE, show_errmin = sep_obs, standardized = ifelse(identical(fit$err_mod, \"const\"), FALSE, TRUE), ... ) plot_err(fit, sep_obs = FALSE, show_errmin = sep_obs, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit","text":"x Alias fit introduced compatibility generic S3 method. fit object class mkinfit. obs_vars character vector names observed variables data model plotted. Defauls observed variables model. xlab Label x axis. ylab Label y axis. xlim Plot range x direction. ylim Plot range y direction. given list, plot ranges different plot rows can given row layout. col_obs Colors used plotting observed data corresponding model prediction lines. pch_obs Symbols used plotting data. lty_obs Line types used model predictions. add plot added existing plot? legend legend added plot? show_residuals residuals shown? one plot fits shown, residual plot lower third plot. Otherwise, .e. \"sep_obs\" given, residual plots located right plots fitted curves. set 'standardized', plot residuals divided standard deviation given fitted error model shown. show_errplot squared residuals error model shown? one plot fits shown, plot lower third plot. Otherwise, .e. \"sep_obs\" given, residual plots located right plots fitted curves. maxabs Maximum absolute value residuals. used scaling y axis defaults \"auto\". sep_obs observed variables shown separate subplots? yes, residual plots requested \"show_residuals\" shown next , plot fits. rel.height.middle relative height middle plot, two rows plots shown. row_layout use row layout residual plot error model plot shown right? lpos Position(s) legend(s). Passed legend first argument. length one, length obs_var argument. inset Passed legend applicable. show_errmin FOCUS chi2 error value shown upper margin plot? errmin_digits number significant digits rounding FOCUS chi2 error percentage. frame frame drawn around plots? ... arguments passed plot. standardized calling 'plot_res', residuals standardized residual plot?","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mkinfit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit","text":"function called side effect.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mkinfit.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit","text":"current plot device tikz device, latex used formatting chi2 error level, show_errmin = TRUE.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mkinfit.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mkinfit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Plot the observed data and the fitted model of an mkinfit object — plot.mkinfit","text":"","code":"# One parent compound, one metabolite, both single first order, path from # parent to sink included # \\dontrun{ SFO_SFO <- mkinmod(parent = mkinsub(\"SFO\", \"m1\", full = \"Parent\"), m1 = mkinsub(\"SFO\", full = \"Metabolite M1\" )) #> Temporary DLL for differentials generated and loaded fit <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE) #> Warning: Observations with value of zero were removed from the data fit <- mkinfit(SFO_SFO, FOCUS_2006_D, quiet = TRUE, error_model = \"tc\") #> Warning: Observations with value of zero were removed from the data plot(fit) plot_res(fit) plot_res(fit, standardized = FALSE) plot_err(fit) # Show the observed variables separately, with residuals plot(fit, sep_obs = TRUE, show_residuals = TRUE, lpos = c(\"topright\", \"bottomright\"), show_errmin = TRUE) # The same can be obtained with less typing, using the convenience function plot_sep plot_sep(fit, lpos = c(\"topright\", \"bottomright\")) # Show the observed variables separately, with the error model plot(fit, sep_obs = TRUE, show_errplot = TRUE, lpos = c(\"topright\", \"bottomright\"), show_errmin = TRUE) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin","title":"Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin","text":"x row selected mmkin object ([.mmkin), model fitted least one dataset shown. column, fit least one model dataset shown.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin","text":"","code":"# S3 method for class 'mmkin' plot( x, main = \"auto\", legends = 1, resplot = c(\"time\", \"errmod\"), ylab = \"Residue\", standardized = FALSE, show_errmin = TRUE, errmin_var = \"All data\", errmin_digits = 3, cex = 0.7, rel.height.middle = 0.9, ymax = \"auto\", ... )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin","text":"x object class mmkin, either one row one column. main main title placed outer margin plot. legends index fits legends shown. resplot residuals plotted time, using mkinresplot, squared residuals predicted values, error model, using mkinerrplot. ylab Label y axis. standardized residuals standardized? option passed mkinresplot, takes effect resplot = \"time\". show_errmin chi2 error level shown top plots left? errmin_var variable FOCUS chi2 error value shown. errmin_digits number significant digits rounding FOCUS chi2 error percentage. cex Passed plot functions mtext. rel.height.middle relative height middle plot, two rows plots shown. ymax Maximum y axis value plot.mkinfit. ... arguments passed plot.mkinfit mkinresplot.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin","text":"function called side effect.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mmkin.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin","text":"current plot device tikz device, latex used formatting chi2 error level.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mmkin.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Plot model fits (observed and fitted) and the residuals for a row or column of an mmkin object — plot.mmkin","text":"","code":"# \\dontrun{ # Only use one core not to offend CRAN checks fits <- mmkin(c(\"FOMC\", \"HS\"), list(\"FOCUS B\" = FOCUS_2006_B, \"FOCUS C\" = FOCUS_2006_C), # named list for titles cores = 1, quiet = TRUE, error_model = \"tc\") #> Warning: Optimisation did not converge: #> iteration limit reached without convergence (10) plot(fits[, \"FOCUS C\"]) plot(fits[\"FOMC\", ]) plot(fits[\"FOMC\", ], show_errmin = FALSE) # We can also plot a single fit, if we like the way plot.mmkin works, but then the plot # height should be smaller than the plot width (this is not possible for the html pages # generated by pkgdown, as far as I know). plot(fits[\"FOMC\", \"FOCUS C\"]) # same as plot(fits[1, 2]) # Show the error models plot(fits[\"FOMC\", ], resplot = \"errmod\") # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.nafta.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot the results of the three models used in the NAFTA scheme. — plot.nafta","title":"Plot the results of the three models used in the NAFTA scheme. — plot.nafta","text":"plots ordered increasing complexity model function (SFO, IORE, DFOP).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.nafta.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot the results of the three models used in the NAFTA scheme. — plot.nafta","text":"","code":"# S3 method for class 'nafta' plot(x, legend = FALSE, main = \"auto\", ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.nafta.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot the results of the three models used in the NAFTA scheme. — plot.nafta","text":"x object class nafta. legend legend added? main Possibility override main title plot. ... arguments passed plot.mmkin.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.nafta.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot the results of the three models used in the NAFTA scheme. — plot.nafta","text":"function called side effect.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.nafta.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Plot the results of the three models used in the NAFTA scheme. — plot.nafta","text":"Calls plot.mmkin.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/plot.nafta.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Plot the results of the three models used in the NAFTA scheme. — plot.nafta","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/read_spreadsheet.html","id":null,"dir":"Reference","previous_headings":"","what":"Read datasets and relevant meta information from a spreadsheet file — read_spreadsheet","title":"Read datasets and relevant meta information from a spreadsheet file — read_spreadsheet","text":"function imports one dataset sheet spreadsheet file. sheets selected based contents sheet 'Datasets', column called 'Dataset Number', containing numbers identifying dataset sheets read . second column must grouping variable, often named 'Soil'. Optionally, time normalization factors can given columns named 'Temperature' 'Moisture'.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/read_spreadsheet.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read datasets and relevant meta information from a spreadsheet file — read_spreadsheet","text":"","code":"read_spreadsheet( path, valid_datasets = \"all\", parent_only = FALSE, normalize = TRUE )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/read_spreadsheet.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read datasets and relevant meta information from a spreadsheet file — read_spreadsheet","text":"path Absolute relative path spreadsheet file valid_datasets Optional numeric index valid datasets, default use datasets parent_only parent data used? normalize time scale normalized using temperature moisture normalisation factors sheet 'Datasets'?","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/read_spreadsheet.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Read datasets and relevant meta information from a spreadsheet file — read_spreadsheet","text":"must sheet 'Compounds', columns 'Name' 'Acronym'. first row read header read sheet assumed contain name acronym parent compound. dataset sheets named using dataset numbers read 'Datasets' sheet, .e. '1', '2', ... . dataset sheet, name observed variable (e.g. acronym parent compound one transformation products) first column, time values second colum, observed value third column. case relevant covariate data available, given sheet 'Covariates', containing one line value grouping variable specified 'Datasets'. values first column column must name second column 'Datasets'. Covariates read columns four higher. names preferably contain special characters like spaces, can easily used specifying covariate models. similar data structure defined R6 class mkindsg, probably complicated use.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/reexports.html","id":null,"dir":"Reference","previous_headings":"","what":"Objects exported from other packages — reexports","title":"Objects exported from other packages — reexports","text":"objects imported packages. Follow links see documentation. lmtest lrtest nlme intervals, nlme","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/residuals.mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract residuals from an mkinfit model — residuals.mkinfit","title":"Extract residuals from an mkinfit model — residuals.mkinfit","text":"Extract residuals mkinfit model","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/residuals.mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract residuals from an mkinfit model — residuals.mkinfit","text":"","code":"# S3 method for class 'mkinfit' residuals(object, standardized = FALSE, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/residuals.mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract residuals from an mkinfit model — residuals.mkinfit","text":"object mkinfit object standardized residuals standardized dividing standard deviation obtained fitted error model? ... used","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/residuals.mkinfit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract residuals from an mkinfit model — residuals.mkinfit","text":"","code":"f <- mkinfit(\"DFOP\", FOCUS_2006_C, quiet = TRUE) residuals(f) #> [1] 0.09726374 -0.13912142 -0.15351210 0.73388322 -0.08657004 -0.93204702 #> [7] -0.03269080 1.45347823 -0.88423697 residuals(f, standardized = TRUE) #> [1] 0.13969917 -0.19981904 -0.22048826 1.05407091 -0.12433989 -1.33869208 #> [7] -0.04695355 2.08761977 -1.27002287"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/saem.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit nonlinear mixed models with SAEM — saem","title":"Fit nonlinear mixed models with SAEM — saem","text":"function uses saemix::saemix() backend fitting nonlinear mixed effects models created mmkin row objects using Stochastic Approximation Expectation Maximisation algorithm (SAEM).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/saem.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit nonlinear mixed models with SAEM — saem","text":"","code":"saem(object, ...) # S3 method for class 'mmkin' saem( object, transformations = c(\"mkin\", \"saemix\"), error_model = \"auto\", degparms_start = numeric(), test_log_parms = TRUE, conf.level = 0.6, solution_type = \"auto\", covariance.model = \"auto\", omega.init = \"auto\", covariates = NULL, covariate_models = NULL, no_random_effect = NULL, error.init = c(1, 1), nbiter.saemix = c(300, 100), control = list(displayProgress = FALSE, print = FALSE, nbiter.saemix = nbiter.saemix, save = FALSE, save.graphs = FALSE), verbose = FALSE, quiet = FALSE, ... ) # S3 method for class 'saem.mmkin' print(x, digits = max(3, getOption(\"digits\") - 3), ...) saemix_model( object, solution_type = \"auto\", transformations = c(\"mkin\", \"saemix\"), error_model = \"auto\", degparms_start = numeric(), covariance.model = \"auto\", no_random_effect = NULL, omega.init = \"auto\", covariates = NULL, covariate_models = NULL, error.init = numeric(), test_log_parms = FALSE, conf.level = 0.6, verbose = FALSE, ... ) saemix_data(object, covariates = NULL, verbose = FALSE, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/saem.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit nonlinear mixed models with SAEM — saem","text":"object mmkin row object containing several fits mkinmod model different datasets ... parameters passed saemix::saemixModel. transformations Per default, parameter transformations done mkin. argument set 'saemix', parameter transformations done 'saemix' supported cases, .e. (version 1.1.2) SFO, FOMC, DFOP HS without fixing parent_0, SFO DFOP one SFO metabolite. error_model Possibility override error model used mmkin object degparms_start Parameter values given named numeric vector used override starting values obtained 'mmkin' object. test_log_parms TRUE, attempt made use robust starting values population parameters fitted log parameters mkin (like rate constants) considering rate constants pass t-test calculating mean degradation parameters using mean_degparms. conf.level Possibility adjust required confidence level parameter tested requested 'test_log_parms'. solution_type Possibility specify solution type case automatic choice desired covariance.model passed saemix::saemixModel(). Per default, uncorrelated random effects specified degradation parameters. omega.init passed saemix::saemixModel(). using mkin transformations default covariance model optionally excluded random effects, variances degradation parameters estimated using mean_degparms, testing untransformed log parameters significant difference zero. using mkin transformations custom covariance model, default initialisation saemix::saemixModel used omega.init. covariates data frame covariate data use 'covariate_models', dataset names row names. covariate_models list containing linear model formulas one explanatory variable, .e. type 'parameter ~ covariate'. Covariates must available 'covariates' data frame. no_random_effect Character vector degradation parameters variability groups. used covariance model explicitly specified. error.init passed saemix::saemixModel(). nbiter.saemix Convenience option increase number iterations control Passed saemix::saemix. verbose print information created objects type saemix::SaemixModel saemix::SaemixData? quiet suppress messages saemix prints beginning end optimisation process? x saem.mmkin object print digits Number digits use printing","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/saem.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit nonlinear mixed models with SAEM — saem","text":"S3 object class 'saem.mmkin', containing fitted saemix::SaemixObject list component named ''. object also inherits 'mixed.mmkin'. saemix::SaemixModel object. saemix::SaemixData object.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/saem.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit nonlinear mixed models with SAEM — saem","text":"mmkin row object essentially list mkinfit objects obtained fitting model list datasets using mkinfit. Starting values fixed effects (population mean parameters, argument psi0 saemix::saemixModel() mean values parameters found using mmkin.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/saem.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit nonlinear mixed models with SAEM — saem","text":"","code":"# \\dontrun{ ds <- lapply(experimental_data_for_UBA_2019[6:10], function(x) subset(x$data[c(\"name\", \"time\", \"value\")])) names(ds) <- paste(\"Dataset\", 6:10) f_mmkin_parent_p0_fixed <- mmkin(\"FOMC\", ds, state.ini = c(parent = 100), fixed_initials = \"parent\", quiet = TRUE) f_saem_p0_fixed <- saem(f_mmkin_parent_p0_fixed) f_mmkin_parent <- mmkin(c(\"SFO\", \"FOMC\", \"DFOP\"), ds, quiet = TRUE) f_saem_sfo <- saem(f_mmkin_parent[\"SFO\", ]) f_saem_fomc <- saem(f_mmkin_parent[\"FOMC\", ]) f_saem_dfop <- saem(f_mmkin_parent[\"DFOP\", ]) anova(f_saem_sfo, f_saem_fomc, f_saem_dfop) #> Data: 90 observations of 1 variable(s) grouped in 5 datasets #> #> npar AIC BIC Lik #> f_saem_sfo 5 624.33 622.38 -307.17 #> f_saem_fomc 7 467.85 465.11 -226.92 #> f_saem_dfop 9 493.76 490.24 -237.88 anova(f_saem_sfo, f_saem_dfop, test = TRUE) #> Data: 90 observations of 1 variable(s) grouped in 5 datasets #> #> npar AIC BIC Lik Chisq Df Pr(>Chisq) #> f_saem_sfo 5 624.33 622.38 -307.17 #> f_saem_dfop 9 493.76 490.24 -237.88 138.57 4 < 2.2e-16 *** #> --- #> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 illparms(f_saem_dfop) #> [1] \"sd(g_qlogis)\" f_saem_dfop_red <- update(f_saem_dfop, no_random_effect = \"g_qlogis\") anova(f_saem_dfop, f_saem_dfop_red, test = TRUE) #> Data: 90 observations of 1 variable(s) grouped in 5 datasets #> #> npar AIC BIC Lik Chisq Df Pr(>Chisq) #> f_saem_dfop_red 8 488.68 485.55 -236.34 #> f_saem_dfop 9 493.76 490.24 -237.88 0 1 1 anova(f_saem_sfo, f_saem_fomc, f_saem_dfop) #> Data: 90 observations of 1 variable(s) grouped in 5 datasets #> #> npar AIC BIC Lik #> f_saem_sfo 5 624.33 622.38 -307.17 #> f_saem_fomc 7 467.85 465.11 -226.92 #> f_saem_dfop 9 493.76 490.24 -237.88 # The returned saem.mmkin object contains an SaemixObject, therefore we can use # functions from saemix library(saemix) #> Loading required package: npde #> Package saemix, version 3.3, March 2024 #> please direct bugs, questions and feedback to emmanuelle.comets@inserm.fr #> #> Attaching package: ‘saemix’ #> The following objects are masked from ‘package:npde’: #> #> kurtosis, skewness compare.saemix(f_saem_sfo$so, f_saem_fomc$so, f_saem_dfop$so) #> Likelihoods calculated by importance sampling #> AIC BIC #> 1 624.3316 622.3788 #> 2 467.8472 465.1132 #> 3 493.7592 490.2441 plot(f_saem_fomc$so, plot.type = \"convergence\") plot(f_saem_fomc$so, plot.type = \"individual.fit\") #> Simulating data using nsim = 1000 simulated datasets #> Computing WRES and npde . plot(f_saem_fomc$so, plot.type = \"npde\") #> Simulating data using nsim = 1000 simulated datasets #> Computing WRES and npde . #> Please use npdeSaemix to obtain VPC and npde plot(f_saem_fomc$so, plot.type = \"vpc\") f_mmkin_parent_tc <- update(f_mmkin_parent, error_model = \"tc\") f_saem_fomc_tc <- saem(f_mmkin_parent_tc[\"FOMC\", ]) anova(f_saem_fomc, f_saem_fomc_tc, test = TRUE) #> Data: 90 observations of 1 variable(s) grouped in 5 datasets #> #> npar AIC BIC Lik Chisq Df Pr(>Chisq) #> f_saem_fomc 7 467.85 465.11 -226.92 #> f_saem_fomc_tc 8 469.90 466.77 -226.95 0 1 1 sfo_sfo <- mkinmod(parent = mkinsub(\"SFO\", \"A1\"), A1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded fomc_sfo <- mkinmod(parent = mkinsub(\"FOMC\", \"A1\"), A1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded dfop_sfo <- mkinmod(parent = mkinsub(\"DFOP\", \"A1\"), A1 = mkinsub(\"SFO\")) #> Temporary DLL for differentials generated and loaded # The following fit uses analytical solutions for SFO-SFO and DFOP-SFO, # and compiled ODEs for FOMC that are much slower f_mmkin <- mmkin(list( \"SFO-SFO\" = sfo_sfo, \"FOMC-SFO\" = fomc_sfo, \"DFOP-SFO\" = dfop_sfo), ds, quiet = TRUE) # saem fits of SFO-SFO and DFOP-SFO to these data take about five seconds # each on this system, as we use analytical solutions written for saemix. # When using the analytical solutions written for mkin this took around # four minutes f_saem_sfo_sfo <- saem(f_mmkin[\"SFO-SFO\", ]) f_saem_dfop_sfo <- saem(f_mmkin[\"DFOP-SFO\", ]) # We can use print, plot and summary methods to check the results print(f_saem_dfop_sfo) #> Kinetic nonlinear mixed-effects model fit by SAEM #> Structural model: #> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * #> time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) #> * parent #> d_A1/dt = + f_parent_to_A1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) #> * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * #> exp(-k2 * time))) * parent - k_A1 * A1 #> #> Data: #> 170 observations of 2 variable(s) grouped in 5 datasets #> #> Likelihood computed by importance sampling #> AIC BIC logLik #> 839.2 834.1 -406.6 #> #> Fitted parameters: #> estimate lower upper #> parent_0 93.70402 91.04104 96.3670 #> log_k_A1 -5.83760 -7.66452 -4.0107 #> f_parent_qlogis -0.95718 -1.35955 -0.5548 #> log_k1 -2.35514 -3.39402 -1.3163 #> log_k2 -3.79634 -5.64009 -1.9526 #> g_qlogis -0.02108 -0.66463 0.6225 #> a.1 1.88191 1.66491 2.0989 #> SD.parent_0 2.81628 0.78922 4.8433 #> SD.log_k_A1 1.78751 0.42105 3.1540 #> SD.f_parent_qlogis 0.45016 0.16116 0.7391 #> SD.log_k1 1.06923 0.31676 1.8217 #> SD.log_k2 2.03768 0.70938 3.3660 #> SD.g_qlogis 0.44024 -0.09262 0.9731 plot(f_saem_dfop_sfo) summary(f_saem_dfop_sfo, data = TRUE) #> saemix version used for fitting: 3.3 #> mkin version used for pre-fitting: 1.2.10 #> R version used for fitting: 4.4.2 #> Date of fit: Fri Feb 14 07:32:13 2025 #> Date of summary: Fri Feb 14 07:32:13 2025 #> #> Equations: #> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * #> time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) #> * parent #> d_A1/dt = + f_parent_to_A1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) #> * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * #> exp(-k2 * time))) * parent - k_A1 * A1 #> #> Data: #> 170 observations of 2 variable(s) grouped in 5 datasets #> #> Model predictions using solution type analytical #> #> Fitted in 3.605 s #> Using 300, 100 iterations and 10 chains #> #> Variance model: Constant variance #> #> Starting values for degradation parameters: #> parent_0 log_k_A1 f_parent_qlogis log_k1 log_k2 #> 93.8102 -5.3734 -0.9711 -1.8799 -4.2708 #> g_qlogis #> 0.1356 #> #> Fixed degradation parameter values: #> None #> #> Starting values for random effects (square root of initial entries in omega): #> parent_0 log_k_A1 f_parent_qlogis log_k1 log_k2 g_qlogis #> parent_0 4.941 0.000 0.0000 0.000 0.000 0.0000 #> log_k_A1 0.000 2.551 0.0000 0.000 0.000 0.0000 #> f_parent_qlogis 0.000 0.000 0.7251 0.000 0.000 0.0000 #> log_k1 0.000 0.000 0.0000 1.449 0.000 0.0000 #> log_k2 0.000 0.000 0.0000 0.000 2.228 0.0000 #> g_qlogis 0.000 0.000 0.0000 0.000 0.000 0.7814 #> #> Starting values for error model parameters: #> a.1 #> 1 #> #> Results: #> #> Likelihood computed by importance sampling #> AIC BIC logLik #> 839.2 834.1 -406.6 #> #> Optimised parameters: #> est. lower upper #> parent_0 93.70402 91.04104 96.3670 #> log_k_A1 -5.83760 -7.66452 -4.0107 #> f_parent_qlogis -0.95718 -1.35955 -0.5548 #> log_k1 -2.35514 -3.39402 -1.3163 #> log_k2 -3.79634 -5.64009 -1.9526 #> g_qlogis -0.02108 -0.66463 0.6225 #> a.1 1.88191 1.66491 2.0989 #> SD.parent_0 2.81628 0.78922 4.8433 #> SD.log_k_A1 1.78751 0.42105 3.1540 #> SD.f_parent_qlogis 0.45016 0.16116 0.7391 #> SD.log_k1 1.06923 0.31676 1.8217 #> SD.log_k2 2.03768 0.70938 3.3660 #> SD.g_qlogis 0.44024 -0.09262 0.9731 #> #> Correlation: #> parnt_0 lg_k_A1 f_prnt_ log_k1 log_k2 #> log_k_A1 -0.0147 #> f_parent_qlogis -0.0269 0.0573 #> log_k1 0.0263 -0.0011 -0.0040 #> log_k2 0.0020 0.0065 -0.0002 -0.0776 #> g_qlogis -0.0248 -0.0180 -0.0004 -0.0903 -0.0603 #> #> Random effects: #> est. lower upper #> SD.parent_0 2.8163 0.78922 4.8433 #> SD.log_k_A1 1.7875 0.42105 3.1540 #> SD.f_parent_qlogis 0.4502 0.16116 0.7391 #> SD.log_k1 1.0692 0.31676 1.8217 #> SD.log_k2 2.0377 0.70938 3.3660 #> SD.g_qlogis 0.4402 -0.09262 0.9731 #> #> Variance model: #> est. lower upper #> a.1 1.882 1.665 2.099 #> #> Backtransformed parameters: #> est. lower upper #> parent_0 93.704015 9.104e+01 96.36699 #> k_A1 0.002916 4.692e-04 0.01812 #> f_parent_to_A1 0.277443 2.043e-01 0.36475 #> k1 0.094880 3.357e-02 0.26813 #> k2 0.022453 3.553e-03 0.14191 #> g 0.494731 3.397e-01 0.65078 #> #> Resulting formation fractions: #> ff #> parent_A1 0.2774 #> parent_sink 0.7226 #> #> Estimated disappearance times: #> DT50 DT90 DT50back DT50_k1 DT50_k2 #> parent 14.0 72.38 21.79 7.306 30.87 #> A1 237.7 789.68 NA NA NA #> #> Data: #> ds name time observed predicted residual std standardized #> Dataset 6 parent 0 97.2 95.70025 1.49975 1.882 0.79693 #> Dataset 6 parent 0 96.4 95.70025 0.69975 1.882 0.37183 #> Dataset 6 parent 3 71.1 71.44670 -0.34670 1.882 -0.18423 #> Dataset 6 parent 3 69.2 71.44670 -2.24670 1.882 -1.19384 #> Dataset 6 parent 6 58.1 56.59283 1.50717 1.882 0.80087 #> Dataset 6 parent 6 56.6 56.59283 0.00717 1.882 0.00381 #> Dataset 6 parent 10 44.4 44.56648 -0.16648 1.882 -0.08847 #> Dataset 6 parent 10 43.4 44.56648 -1.16648 1.882 -0.61984 #> Dataset 6 parent 20 33.3 29.76020 3.53980 1.882 1.88096 #> Dataset 6 parent 20 29.2 29.76020 -0.56020 1.882 -0.29767 #> Dataset 6 parent 34 17.6 19.39208 -1.79208 1.882 -0.95226 #> Dataset 6 parent 34 18.0 19.39208 -1.39208 1.882 -0.73971 #> Dataset 6 parent 55 10.5 10.55761 -0.05761 1.882 -0.03061 #> Dataset 6 parent 55 9.3 10.55761 -1.25761 1.882 -0.66826 #> Dataset 6 parent 90 4.5 3.84742 0.65258 1.882 0.34676 #> Dataset 6 parent 90 4.7 3.84742 0.85258 1.882 0.45304 #> Dataset 6 parent 112 3.0 2.03997 0.96003 1.882 0.51013 #> Dataset 6 parent 112 3.4 2.03997 1.36003 1.882 0.72268 #> Dataset 6 parent 132 2.3 1.14585 1.15415 1.882 0.61328 #> Dataset 6 parent 132 2.7 1.14585 1.55415 1.882 0.82583 #> Dataset 6 A1 3 4.3 4.86054 -0.56054 1.882 -0.29786 #> Dataset 6 A1 3 4.6 4.86054 -0.26054 1.882 -0.13844 #> Dataset 6 A1 6 7.0 7.74179 -0.74179 1.882 -0.39417 #> Dataset 6 A1 6 7.2 7.74179 -0.54179 1.882 -0.28789 #> Dataset 6 A1 10 8.2 9.94048 -1.74048 1.882 -0.92485 #> Dataset 6 A1 10 8.0 9.94048 -1.94048 1.882 -1.03112 #> Dataset 6 A1 20 11.0 12.19109 -1.19109 1.882 -0.63291 #> Dataset 6 A1 20 13.7 12.19109 1.50891 1.882 0.80180 #> Dataset 6 A1 34 11.5 13.10706 -1.60706 1.882 -0.85395 #> Dataset 6 A1 34 12.7 13.10706 -0.40706 1.882 -0.21630 #> Dataset 6 A1 55 14.9 13.06131 1.83869 1.882 0.97703 #> Dataset 6 A1 55 14.5 13.06131 1.43869 1.882 0.76448 #> Dataset 6 A1 90 12.1 11.54495 0.55505 1.882 0.29494 #> Dataset 6 A1 90 12.3 11.54495 0.75505 1.882 0.40122 #> Dataset 6 A1 112 9.9 10.31533 -0.41533 1.882 -0.22070 #> Dataset 6 A1 112 10.2 10.31533 -0.11533 1.882 -0.06128 #> Dataset 6 A1 132 8.8 9.20222 -0.40222 1.882 -0.21373 #> Dataset 6 A1 132 7.8 9.20222 -1.40222 1.882 -0.74510 #> Dataset 7 parent 0 93.6 90.82357 2.77643 1.882 1.47532 #> Dataset 7 parent 0 92.3 90.82357 1.47643 1.882 0.78453 #> Dataset 7 parent 3 87.0 84.73448 2.26552 1.882 1.20384 #> Dataset 7 parent 3 82.2 84.73448 -2.53448 1.882 -1.34675 #> Dataset 7 parent 7 74.0 77.65013 -3.65013 1.882 -1.93958 #> Dataset 7 parent 7 73.9 77.65013 -3.75013 1.882 -1.99272 #> Dataset 7 parent 14 64.2 67.60639 -3.40639 1.882 -1.81007 #> Dataset 7 parent 14 69.5 67.60639 1.89361 1.882 1.00621 #> Dataset 7 parent 30 54.0 52.53663 1.46337 1.882 0.77760 #> Dataset 7 parent 30 54.6 52.53663 2.06337 1.882 1.09642 #> Dataset 7 parent 60 41.1 39.42728 1.67272 1.882 0.88884 #> Dataset 7 parent 60 38.4 39.42728 -1.02728 1.882 -0.54587 #> Dataset 7 parent 90 32.5 33.76360 -1.26360 1.882 -0.67144 #> Dataset 7 parent 90 35.5 33.76360 1.73640 1.882 0.92268 #> Dataset 7 parent 120 28.1 30.39975 -2.29975 1.882 -1.22203 #> Dataset 7 parent 120 29.0 30.39975 -1.39975 1.882 -0.74379 #> Dataset 7 parent 180 26.5 25.62379 0.87621 1.882 0.46559 #> Dataset 7 parent 180 27.6 25.62379 1.97621 1.882 1.05010 #> Dataset 7 A1 3 3.9 2.70005 1.19995 1.882 0.63762 #> Dataset 7 A1 3 3.1 2.70005 0.39995 1.882 0.21252 #> Dataset 7 A1 7 6.9 5.83475 1.06525 1.882 0.56605 #> Dataset 7 A1 7 6.6 5.83475 0.76525 1.882 0.40663 #> Dataset 7 A1 14 10.4 10.26142 0.13858 1.882 0.07364 #> Dataset 7 A1 14 8.3 10.26142 -1.96142 1.882 -1.04225 #> Dataset 7 A1 30 14.4 16.82999 -2.42999 1.882 -1.29123 #> Dataset 7 A1 30 13.7 16.82999 -3.12999 1.882 -1.66319 #> Dataset 7 A1 60 22.1 22.32486 -0.22486 1.882 -0.11949 #> Dataset 7 A1 60 22.3 22.32486 -0.02486 1.882 -0.01321 #> Dataset 7 A1 90 27.5 24.45927 3.04073 1.882 1.61576 #> Dataset 7 A1 90 25.4 24.45927 0.94073 1.882 0.49988 #> Dataset 7 A1 120 28.0 25.54862 2.45138 1.882 1.30260 #> Dataset 7 A1 120 26.6 25.54862 1.05138 1.882 0.55868 #> Dataset 7 A1 180 25.8 26.82277 -1.02277 1.882 -0.54347 #> Dataset 7 A1 180 25.3 26.82277 -1.52277 1.882 -0.80916 #> Dataset 8 parent 0 91.9 91.16791 0.73209 1.882 0.38901 #> Dataset 8 parent 0 90.8 91.16791 -0.36791 1.882 -0.19550 #> Dataset 8 parent 1 64.9 67.58358 -2.68358 1.882 -1.42598 #> Dataset 8 parent 1 66.2 67.58358 -1.38358 1.882 -0.73520 #> Dataset 8 parent 3 43.5 41.62086 1.87914 1.882 0.99853 #> Dataset 8 parent 3 44.1 41.62086 2.47914 1.882 1.31735 #> Dataset 8 parent 8 18.3 19.60116 -1.30116 1.882 -0.69140 #> Dataset 8 parent 8 18.1 19.60116 -1.50116 1.882 -0.79768 #> Dataset 8 parent 14 10.2 10.63101 -0.43101 1.882 -0.22903 #> Dataset 8 parent 14 10.8 10.63101 0.16899 1.882 0.08980 #> Dataset 8 parent 27 4.9 3.12435 1.77565 1.882 0.94354 #> Dataset 8 parent 27 3.3 3.12435 0.17565 1.882 0.09334 #> Dataset 8 parent 48 1.6 0.43578 1.16422 1.882 0.61864 #> Dataset 8 parent 48 1.5 0.43578 1.06422 1.882 0.56550 #> Dataset 8 parent 70 1.1 0.05534 1.04466 1.882 0.55510 #> Dataset 8 parent 70 0.9 0.05534 0.84466 1.882 0.44883 #> Dataset 8 A1 1 9.6 7.63450 1.96550 1.882 1.04442 #> Dataset 8 A1 1 7.7 7.63450 0.06550 1.882 0.03481 #> Dataset 8 A1 3 15.0 15.52593 -0.52593 1.882 -0.27947 #> Dataset 8 A1 3 15.1 15.52593 -0.42593 1.882 -0.22633 #> Dataset 8 A1 8 21.2 20.32192 0.87808 1.882 0.46659 #> Dataset 8 A1 8 21.1 20.32192 0.77808 1.882 0.41345 #> Dataset 8 A1 14 19.7 20.09721 -0.39721 1.882 -0.21107 #> Dataset 8 A1 14 18.9 20.09721 -1.19721 1.882 -0.63617 #> Dataset 8 A1 27 17.5 16.37477 1.12523 1.882 0.59792 #> Dataset 8 A1 27 15.9 16.37477 -0.47477 1.882 -0.25228 #> Dataset 8 A1 48 9.5 10.13141 -0.63141 1.882 -0.33551 #> Dataset 8 A1 48 9.8 10.13141 -0.33141 1.882 -0.17610 #> Dataset 8 A1 70 6.2 5.81827 0.38173 1.882 0.20284 #> Dataset 8 A1 70 6.1 5.81827 0.28173 1.882 0.14970 #> Dataset 9 parent 0 99.8 97.48728 2.31272 1.882 1.22892 #> Dataset 9 parent 0 98.3 97.48728 0.81272 1.882 0.43186 #> Dataset 9 parent 1 77.1 79.29476 -2.19476 1.882 -1.16624 #> Dataset 9 parent 1 77.2 79.29476 -2.09476 1.882 -1.11310 #> Dataset 9 parent 3 59.0 55.67060 3.32940 1.882 1.76915 #> Dataset 9 parent 3 58.1 55.67060 2.42940 1.882 1.29092 #> Dataset 9 parent 8 27.4 31.57871 -4.17871 1.882 -2.22046 #> Dataset 9 parent 8 29.2 31.57871 -2.37871 1.882 -1.26398 #> Dataset 9 parent 14 19.1 22.51546 -3.41546 1.882 -1.81489 #> Dataset 9 parent 14 29.6 22.51546 7.08454 1.882 3.76454 #> Dataset 9 parent 27 10.1 14.09074 -3.99074 1.882 -2.12057 #> Dataset 9 parent 27 18.2 14.09074 4.10926 1.882 2.18355 #> Dataset 9 parent 48 4.5 6.95747 -2.45747 1.882 -1.30584 #> Dataset 9 parent 48 9.1 6.95747 2.14253 1.882 1.13848 #> Dataset 9 parent 70 2.3 3.32472 -1.02472 1.882 -0.54451 #> Dataset 9 parent 70 2.9 3.32472 -0.42472 1.882 -0.22569 #> Dataset 9 parent 91 2.0 1.64300 0.35700 1.882 0.18970 #> Dataset 9 parent 91 1.8 1.64300 0.15700 1.882 0.08343 #> Dataset 9 parent 120 2.0 0.62073 1.37927 1.882 0.73291 #> Dataset 9 parent 120 2.2 0.62073 1.57927 1.882 0.83918 #> Dataset 9 A1 1 4.2 3.64568 0.55432 1.882 0.29455 #> Dataset 9 A1 1 3.9 3.64568 0.25432 1.882 0.13514 #> Dataset 9 A1 3 7.4 8.30173 -0.90173 1.882 -0.47916 #> Dataset 9 A1 3 7.9 8.30173 -0.40173 1.882 -0.21347 #> Dataset 9 A1 8 14.5 12.71589 1.78411 1.882 0.94803 #> Dataset 9 A1 8 13.7 12.71589 0.98411 1.882 0.52293 #> Dataset 9 A1 14 14.2 13.90452 0.29548 1.882 0.15701 #> Dataset 9 A1 14 12.2 13.90452 -1.70452 1.882 -0.90574 #> Dataset 9 A1 27 13.7 14.15523 -0.45523 1.882 -0.24190 #> Dataset 9 A1 27 13.2 14.15523 -0.95523 1.882 -0.50759 #> Dataset 9 A1 48 13.6 13.31038 0.28962 1.882 0.15389 #> Dataset 9 A1 48 15.4 13.31038 2.08962 1.882 1.11037 #> Dataset 9 A1 70 10.4 11.85965 -1.45965 1.882 -0.77562 #> Dataset 9 A1 70 11.6 11.85965 -0.25965 1.882 -0.13797 #> Dataset 9 A1 91 10.0 10.36294 -0.36294 1.882 -0.19286 #> Dataset 9 A1 91 9.5 10.36294 -0.86294 1.882 -0.45855 #> Dataset 9 A1 120 9.1 8.43003 0.66997 1.882 0.35601 #> Dataset 9 A1 120 9.0 8.43003 0.56997 1.882 0.30287 #> Dataset 10 parent 0 96.1 93.95603 2.14397 1.882 1.13925 #> Dataset 10 parent 0 94.3 93.95603 0.34397 1.882 0.18278 #> Dataset 10 parent 8 73.9 77.70592 -3.80592 1.882 -2.02237 #> Dataset 10 parent 8 73.9 77.70592 -3.80592 1.882 -2.02237 #> Dataset 10 parent 14 69.4 70.04570 -0.64570 1.882 -0.34311 #> Dataset 10 parent 14 73.1 70.04570 3.05430 1.882 1.62298 #> Dataset 10 parent 21 65.6 64.01710 1.58290 1.882 0.84111 #> Dataset 10 parent 21 65.3 64.01710 1.28290 1.882 0.68170 #> Dataset 10 parent 41 55.9 54.98434 0.91566 1.882 0.48656 #> Dataset 10 parent 41 54.4 54.98434 -0.58434 1.882 -0.31050 #> Dataset 10 parent 63 47.0 49.87137 -2.87137 1.882 -1.52577 #> Dataset 10 parent 63 49.3 49.87137 -0.57137 1.882 -0.30361 #> Dataset 10 parent 91 44.7 45.06727 -0.36727 1.882 -0.19516 #> Dataset 10 parent 91 46.7 45.06727 1.63273 1.882 0.86759 #> Dataset 10 parent 120 42.1 40.76402 1.33598 1.882 0.70991 #> Dataset 10 parent 120 41.3 40.76402 0.53598 1.882 0.28481 #> Dataset 10 A1 8 3.3 4.14599 -0.84599 1.882 -0.44954 #> Dataset 10 A1 8 3.4 4.14599 -0.74599 1.882 -0.39640 #> Dataset 10 A1 14 3.9 6.08478 -2.18478 1.882 -1.16093 #> Dataset 10 A1 14 2.9 6.08478 -3.18478 1.882 -1.69231 #> Dataset 10 A1 21 6.4 7.59411 -1.19411 1.882 -0.63452 #> Dataset 10 A1 21 7.2 7.59411 -0.39411 1.882 -0.20942 #> Dataset 10 A1 41 9.1 9.78292 -0.68292 1.882 -0.36289 #> Dataset 10 A1 41 8.5 9.78292 -1.28292 1.882 -0.68171 #> Dataset 10 A1 63 11.7 10.93274 0.76726 1.882 0.40770 #> Dataset 10 A1 63 12.0 10.93274 1.06726 1.882 0.56711 #> Dataset 10 A1 91 13.3 11.93986 1.36014 1.882 0.72274 #> Dataset 10 A1 91 13.2 11.93986 1.26014 1.882 0.66961 #> Dataset 10 A1 120 14.3 12.79238 1.50762 1.882 0.80111 #> Dataset 10 A1 120 12.1 12.79238 -0.69238 1.882 -0.36791 # The following takes about 6 minutes f_saem_dfop_sfo_deSolve <- saem(f_mmkin[\"DFOP-SFO\", ], solution_type = \"deSolve\", nbiter.saemix = c(200, 80)) #> DINTDY- T (=R1) illegal #> In above message, R1 = 70 #> #> T not in interval TCUR - HU (= R1) to TCUR (=R2) #> In above message, R1 = 53.1042, R2 = 56.6326 #> #> DINTDY- T (=R1) illegal #> In above message, R1 = 91 #> #> T not in interval TCUR - HU (= R1) to TCUR (=R2) #> In above message, R1 = 53.1042, R2 = 56.6326 #> #> DLSODA- Trouble in DINTDY. ITASK = I1, TOUT = R1 #> In above message, I1 = 1 #> #> In above message, R1 = 91 #> #> Error in deSolve::lsoda(y = odeini, times = outtimes, func = lsoda_func, : #> illegal input detected before taking any integration steps - see written message #anova( # f_saem_dfop_sfo, # f_saem_dfop_sfo_deSolve)) # If the model supports it, we can also use eigenvalue based solutions, which # take a similar amount of time #f_saem_sfo_sfo_eigen <- saem(f_mmkin[\"SFO-SFO\", ], solution_type = \"eigen\", # control = list(nbiter.saemix = c(200, 80), nbdisplay = 10)) # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/schaefer07_complex_case.html","id":null,"dir":"Reference","previous_headings":"","what":"Metabolism data set used for checking the software quality of KinGUI — schaefer07_complex_case","title":"Metabolism data set used for checking the software quality of KinGUI — schaefer07_complex_case","text":"dataset used comparison KinGUI ModelMaker check software quality KinGUI original publication (Schäfer et al., 2007). results fitting also included.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/schaefer07_complex_case.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Metabolism data set used for checking the software quality of KinGUI — schaefer07_complex_case","text":"","code":"schaefer07_complex_case"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/schaefer07_complex_case.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Metabolism data set used for checking the software quality of KinGUI — schaefer07_complex_case","text":"data set data frame 8 observations following 6 variables. time numeric vector parent numeric vector A1 numeric vector B1 numeric vector C1 numeric vector A2 numeric vector results data frame 14 results different parameter values","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/schaefer07_complex_case.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Metabolism data set used for checking the software quality of KinGUI — schaefer07_complex_case","text":"Schäfer D, Mikolasch B, Rainbird P Harvey B (2007). KinGUI: new kinetic software tool evaluations according FOCUS degradation kinetics. : Del Re AAM, Capri E, Fragoulis G Trevisan M (Eds.). Proceedings XIII Symposium Pesticide Chemistry, Piacenza, 2007, p. 916-923.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/schaefer07_complex_case.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Metabolism data set used for checking the software quality of KinGUI — schaefer07_complex_case","text":"","code":"data <- mkin_wide_to_long(schaefer07_complex_case, time = \"time\") model <- mkinmod( parent = list(type = \"SFO\", to = c(\"A1\", \"B1\", \"C1\"), sink = FALSE), A1 = list(type = \"SFO\", to = \"A2\"), B1 = list(type = \"SFO\"), C1 = list(type = \"SFO\"), A2 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded # \\dontrun{ fit <- mkinfit(model, data, quiet = TRUE) plot(fit) endpoints(fit) #> $ff #> parent_A1 parent_B1 parent_C1 parent_sink A1_A2 A1_sink #> 0.3809618 0.1954668 0.4235714 0.0000000 0.4479540 0.5520460 #> #> $distimes #> DT50 DT90 #> parent 13.95078 46.34349 #> A1 49.75347 165.27745 #> B1 37.26905 123.80511 #> C1 11.23129 37.30955 #> A2 28.50690 94.69789 #> # } # Compare with the results obtained in the original publication print(schaefer07_complex_results) #> compound parameter KinGUI ModelMaker deviation #> 1 parent degradation rate 0.0496 0.0506 2.0 #> 2 parent DT50 13.9900 13.6900 2.2 #> 3 metabolite A1 formation fraction 0.3803 0.3696 2.9 #> 4 metabolite A1 degradation rate 0.0139 0.0136 2.2 #> 5 metabolite A1 DT50 49.9600 50.8900 1.8 #> 6 metabolite B1 formation fraction 0.1866 0.1818 2.6 #> 7 metabolite B1 degradation rate 0.0175 0.0172 1.7 #> 8 metabolite B1 DT50 39.6100 40.2400 1.6 #> 9 metabolite C1 formation fraction 0.4331 0.4486 3.5 #> 10 metabolite C1 degradation rate 0.0638 0.0700 8.9 #> 11 metabolite C1 DT50 10.8700 9.9000 9.8 #> 12 metabolite A2 formation fraction 0.4529 0.4559 0.7 #> 13 metabolite A2 degradation rate 0.0245 0.0244 0.4 #> 14 metabolite A2 DT50 28.2400 28.4500 0.7"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/set_nd_nq.html","id":null,"dir":"Reference","previous_headings":"","what":"Set non-detects and unquantified values in residue series without replicates — set_nd_nq","title":"Set non-detects and unquantified values in residue series without replicates — set_nd_nq","text":"function automates replacing unquantified values residue time depth series. time series, function performs part residue processing proposed FOCUS kinetics guidance parent compounds metabolites. two-dimensional residue series time depth, automates proposal Boesten et al (2015).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/set_nd_nq.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Set non-detects and unquantified values in residue series without replicates — set_nd_nq","text":"","code":"set_nd_nq(res_raw, lod, loq = NA, time_zero_presence = FALSE) set_nd_nq_focus( res_raw, lod, loq = NA, set_first_sample_nd = TRUE, first_sample_nd_value = 0, ignore_below_loq_after_first_nd = TRUE )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/set_nd_nq.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Set non-detects and unquantified values in residue series without replicates — set_nd_nq","text":"res_raw Character vector residue time series, matrix residue values rows representing depth profiles specific sampling time, columns representing time series residues depth. Values limit detection (lod) coded \"nd\", values limit detection limit quantification, , coded \"nq\". Samples analysed coded \"na\". values \"na\", \"nd\" \"nq\" coercible numeric lod Limit detection (numeric) loq Limit quantification(numeric). Must specified FOCUS rule stop first non-detection applied time_zero_presence assume residues occur time zero? affects samples first sampling time reported \"nd\" (detected). set_first_sample_nd first sample set \"first_sample_nd_value\" case non-detection? first_sample_nd_value Value used first sample non-detection ignore_below_loq_after_first_nd ignore values LOQ first non-detection occurs quantified values?","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/set_nd_nq.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Set non-detects and unquantified values in residue series without replicates — set_nd_nq","text":"numeric vector, vector supplied, numeric matrix otherwise","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/set_nd_nq.html","id":"functions","dir":"Reference","previous_headings":"","what":"Functions","title":"Set non-detects and unquantified values in residue series without replicates — set_nd_nq","text":"set_nd_nq_focus(): Set non-detects residue time series according FOCUS rules","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/set_nd_nq.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Set non-detects and unquantified values in residue series without replicates — set_nd_nq","text":"Boesten, J. J. T. ., van der Linden, . M. ., Beltman, W. H. J. Pol, J. W. (2015). Leaching plant protection products transformation products; Proposals improving assessment leaching groundwater Netherlands — Version 2. Alterra report 2630, Alterra Wageningen UR (University & Research centre) FOCUS (2014) Generic Guidance Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration, Version 1.1, 18 December 2014, p. 251","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/set_nd_nq.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Set non-detects and unquantified values in residue series without replicates — set_nd_nq","text":"","code":"# FOCUS (2014) p. 75/76 and 131/132 parent_1 <- c(.12, .09, .05, .03, \"nd\", \"nd\", \"nd\", \"nd\", \"nd\", \"nd\") set_nd_nq(parent_1, 0.02) #> [1] 0.12 0.09 0.05 0.03 0.01 NA NA NA NA NA parent_2 <- c(.12, .09, .05, .03, \"nd\", \"nd\", .03, \"nd\", \"nd\", \"nd\") set_nd_nq(parent_2, 0.02) #> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.03 0.01 NA NA set_nd_nq_focus(parent_2, 0.02, loq = 0.05) #> [1] 0.12 0.09 0.05 0.03 0.01 NA NA NA NA NA parent_3 <- c(.12, .09, .05, .03, \"nd\", \"nd\", .06, \"nd\", \"nd\", \"nd\") set_nd_nq(parent_3, 0.02) #> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.06 0.01 NA NA set_nd_nq_focus(parent_3, 0.02, loq = 0.05) #> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.06 0.01 NA NA metabolite <- c(\"nd\", \"nd\", \"nd\", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, \"nd\", \"nd\") set_nd_nq(metabolite, 0.02) #> [1] NA NA 0.01 0.03 0.06 0.10 0.11 0.10 0.09 0.05 0.03 0.01 NA set_nd_nq_focus(metabolite, 0.02, 0.05) #> [1] 0.00 NA 0.01 0.03 0.06 0.10 0.11 0.10 0.09 0.05 0.03 0.01 NA # # Boesten et al. (2015), p. 57/58 table_8 <- matrix( c(10, 10, rep(\"nd\", 4), 10, 10, rep(\"nq\", 2), rep(\"nd\", 2), 10, 10, 10, \"nq\", \"nd\", \"nd\", \"nq\", 10, \"nq\", rep(\"nd\", 3), \"nd\", \"nq\", \"nq\", rep(\"nd\", 3), rep(\"nd\", 6), rep(\"nd\", 6)), ncol = 6, byrow = TRUE) set_nd_nq(table_8, 0.5, 1.5, time_zero_presence = TRUE) #> [,1] [,2] [,3] [,4] [,5] [,6] #> [1,] 10.00 10.00 0.25 0.25 NA NA #> [2,] 10.00 10.00 1.00 1.00 0.25 NA #> [3,] 10.00 10.00 10.00 1.00 0.25 NA #> [4,] 1.00 10.00 1.00 0.25 NA NA #> [5,] 0.25 1.00 1.00 0.25 NA NA #> [6,] NA 0.25 0.25 NA NA NA #> [7,] NA NA NA NA NA NA table_10 <- matrix( c(10, 10, rep(\"nd\", 4), 10, 10, rep(\"nd\", 4), 10, 10, 10, rep(\"nd\", 3), \"nd\", 10, rep(\"nd\", 4), rep(\"nd\", 18)), ncol = 6, byrow = TRUE) set_nd_nq(table_10, 0.5, time_zero_presence = TRUE) #> [,1] [,2] [,3] [,4] [,5] [,6] #> [1,] 10.00 10.00 0.25 NA NA NA #> [2,] 10.00 10.00 0.25 NA NA NA #> [3,] 10.00 10.00 10.00 0.25 NA NA #> [4,] 0.25 10.00 0.25 NA NA NA #> [5,] NA 0.25 NA NA NA NA #> [6,] NA NA NA NA NA NA #> [7,] NA NA NA NA NA NA"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/sigma_twocomp.html","id":null,"dir":"Reference","previous_headings":"","what":"Two-component error model — sigma_twocomp","title":"Two-component error model — sigma_twocomp","text":"Function describing standard deviation measurement error dependence measured value \\(y\\):","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/sigma_twocomp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Two-component error model — sigma_twocomp","text":"","code":"sigma_twocomp(y, sigma_low, rsd_high)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/sigma_twocomp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Two-component error model — sigma_twocomp","text":"y magnitude observed value sigma_low asymptotic minimum standard deviation low observed values rsd_high coefficient describing increase standard deviation magnitude observed value","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/sigma_twocomp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Two-component error model — sigma_twocomp","text":"standard deviation response variable.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/sigma_twocomp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Two-component error model — sigma_twocomp","text":"$$\\sigma = \\sqrt{ \\sigma_{low}^2 + y^2 * {rsd}_{high}^2}$$ sigma = sqrt(sigma_low^2 + y^2 * rsd_high^2) error model used example Werner et al. (1978). model proposed Rocke Lorenzato (1995) can written form well, assumes approximate lognormal distribution errors high values y.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/sigma_twocomp.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Two-component error model — sigma_twocomp","text":"Werner, Mario, Brooks, Samuel H., Knott, Lancaster B. (1978) Additive, Multiplicative, Mixed Analytical Errors. Clinical Chemistry 24(11), 1895-1898. Rocke, David M. Lorenzato, Stefan (1995) two-component model measurement error analytical chemistry. Technometrics 37(2), 176-184. Ranke J Meinecke S (2019) Error Models Kinetic Evaluation Chemical Degradation Data. Environments 6(12) 124 doi:10.3390/environments6120124 .","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/sigma_twocomp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Two-component error model — sigma_twocomp","text":"","code":"times <- c(0, 1, 3, 7, 14, 28, 60, 90, 120) d_pred <- data.frame(time = times, parent = 100 * exp(- 0.03 * times)) set.seed(123456) d_syn <- add_err(d_pred, function(y) sigma_twocomp(y, 1, 0.07), reps = 2, n = 1)[[1]] f_nls <- nls(value ~ SSasymp(time, 0, parent_0, lrc), data = d_syn, start = list(parent_0 = 100, lrc = -3)) library(nlme) f_gnls <- gnls(value ~ SSasymp(time, 0, parent_0, lrc), data = d_syn, na.action = na.omit, start = list(parent_0 = 100, lrc = -3)) if (length(findFunction(\"varConstProp\")) > 0) { f_gnls_tc <- update(f_gnls, weights = varConstProp()) f_gnls_tc_sf <- update(f_gnls_tc, control = list(sigma = 1)) } f_mkin <- mkinfit(\"SFO\", d_syn, error_model = \"const\", quiet = TRUE) f_mkin_tc <- mkinfit(\"SFO\", d_syn, error_model = \"tc\", quiet = TRUE) plot_res(f_mkin_tc, standardized = TRUE) AIC(f_nls, f_gnls, f_gnls_tc, f_gnls_tc_sf, f_mkin, f_mkin_tc) #> df AIC #> f_nls 3 114.4817 #> f_gnls 3 114.4817 #> f_gnls_tc 5 103.6447 #> f_gnls_tc_sf 4 101.6447 #> f_mkin 3 114.4817 #> f_mkin_tc 4 101.6446"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/status.html","id":null,"dir":"Reference","previous_headings":"","what":"Method to get status information for fit array objects — status","title":"Method to get status information for fit array objects — status","text":"Method get status information fit array objects","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/status.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Method to get status information for fit array objects — status","text":"","code":"status(object, ...) # S3 method for class 'mmkin' status(object, ...) # S3 method for class 'status.mmkin' print(x, ...) # S3 method for class 'mhmkin' status(object, ...) # S3 method for class 'status.mhmkin' print(x, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/status.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Method to get status information for fit array objects — status","text":"object object investigate ... potential future extensions x object printed","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/status.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Method to get status information for fit array objects — status","text":"object dimensions fit array suitable printing method.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/status.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Method to get status information for fit array objects — status","text":"","code":"# \\dontrun{ fits <- mmkin( c(\"SFO\", \"FOMC\"), list(\"FOCUS A\" = FOCUS_2006_A, \"FOCUS B\" = FOCUS_2006_C), quiet = TRUE) status(fits) #> dataset #> model FOCUS A FOCUS B #> SFO OK OK #> FOMC C OK #> #> C: Optimisation did not converge: #> false convergence (8) #> OK: No warnings # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Summary method for class ","title":"Summary method for class ","text":"Lists model equations, initial parameter values, optimised parameters uncertainty statistics, chi2 error levels calculated according FOCUS guidance (2006) defined therein, formation fractions, DT50 values optionally data, consisting observed, predicted residual values.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summary method for class ","text":"","code":"# S3 method for class 'mkinfit' summary(object, data = TRUE, distimes = TRUE, alpha = 0.05, ...) # S3 method for class 'summary.mkinfit' print(x, digits = max(3, getOption(\"digits\") - 3), ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summary method for class ","text":"object object class mkinfit. data logical, indicating whether data included summary. distimes logical, indicating whether DT50 DT90 values included. alpha error level confidence interval estimation t distribution ... optional arguments passed methods like print. x object class summary.mkinfit. digits Number digits use printing","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mkinfit.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Summary method for class ","text":"summary function returns list components, among others version, Rversion mkin R versions used date.fit, date.summary dates fit summary produced diffs differential equations used model use_of_ff maximum minimum use made formation fractions bpar Optimised backtransformed parameters data data (see Description ). start starting values bounds, applicable, optimised parameters. fixed values fixed parameters. errmin chi2 error levels observed variable. bparms.ode backtransformed ODE parameters, use starting parameters related models. errparms Error model parameters. ff estimated formation fractions derived fitted model. distimes DT50 DT90 values observed variable. SFORB applicable, eigenvalues fractional eigenvector component g SFORB systems model. print method called side effect, .e. printing summary.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mkinfit.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Summary method for class ","text":"FOCUS (2006) “Guidance Document Estimating Persistence Degradation Kinetics Environmental Fate Studies Pesticides EU Registration” Report FOCUS Work Group Degradation Kinetics, EC Document Reference Sanco/10058/2005 version 2.0, 434 pp, http://esdac.jrc.ec.europa.eu/projects/degradation-kinetics","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mkinfit.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Summary method for class ","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mkinfit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summary method for class ","text":"","code":"summary(mkinfit(\"SFO\", FOCUS_2006_A, quiet = TRUE)) #> mkin version used for fitting: 1.2.10 #> R version used for fitting: 4.4.2 #> Date of fit: Fri Feb 14 07:34:16 2025 #> Date of summary: Fri Feb 14 07:34:16 2025 #> #> Equations: #> d_parent/dt = - k_parent * parent #> #> Model predictions using solution type analytical #> #> Fitted using 131 model solutions performed in 0.009 s #> #> Error model: Constant variance #> #> Error model algorithm: OLS #> #> Starting values for parameters to be optimised: #> value type #> parent_0 101.24 state #> k_parent 0.10 deparm #> #> Starting values for the transformed parameters actually optimised: #> value lower upper #> parent_0 101.240000 -Inf Inf #> log_k_parent -2.302585 -Inf Inf #> #> Fixed parameter values: #> None #> #> Results: #> #> AIC BIC logLik #> 55.28197 55.5203 -24.64099 #> #> Optimised, transformed parameters with symmetric confidence intervals: #> Estimate Std. Error Lower Upper #> parent_0 109.200 3.70400 99.630 118.700 #> log_k_parent -3.291 0.09176 -3.527 -3.055 #> sigma 5.266 1.31600 1.882 8.649 #> #> Parameter correlation: #> parent_0 log_k_parent sigma #> parent_0 1.000e+00 5.428e-01 1.642e-07 #> log_k_parent 5.428e-01 1.000e+00 2.507e-07 #> sigma 1.642e-07 2.507e-07 1.000e+00 #> #> Backtransformed parameters: #> Confidence intervals for internally transformed parameters are asymmetric. #> t-test (unrealistically) based on the assumption of normal distribution #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper #> parent_0 109.20000 29.47 4.218e-07 99.6300 118.70000 #> k_parent 0.03722 10.90 5.650e-05 0.0294 0.04712 #> sigma 5.26600 4.00 5.162e-03 1.8820 8.64900 #> #> FOCUS Chi2 error levels in percent: #> err.min n.optim df #> All data 8.385 2 6 #> parent 8.385 2 6 #> #> Estimated disappearance times: #> DT50 DT90 #> parent 18.62 61.87 #> #> Data: #> time variable observed predicted residual #> 0 parent 101.24 109.153 -7.9132 #> 3 parent 99.27 97.622 1.6484 #> 7 parent 90.11 84.119 5.9913 #> 14 parent 72.19 64.826 7.3641 #> 30 parent 29.71 35.738 -6.0283 #> 62 parent 5.98 10.862 -4.8818 #> 90 parent 1.54 3.831 -2.2911 #> 118 parent 0.39 1.351 -0.9613"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Summary method for class ","title":"Summary method for class ","text":"Shows status information mkinfit objects contained object gives overview ill-defined parameters calculated illparms.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summary method for class ","text":"","code":"# S3 method for class 'mmkin' summary(object, conf.level = 0.95, ...) # S3 method for class 'summary.mmkin' print(x, digits = max(3, getOption(\"digits\") - 3), ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summary method for class ","text":"object object class mmkin conf.level confidence level testing parameters ... optional arguments passed methods like print. x object class summary.mmkin. digits number digits use printing","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summary method for class ","text":"","code":"fits <- mmkin( c(\"SFO\", \"FOMC\"), list(\"FOCUS A\" = FOCUS_2006_A, \"FOCUS C\" = FOCUS_2006_C), quiet = TRUE, cores = 1) #> Warning: Optimisation did not converge: #> false convergence (8) summary(fits) #> Error model: Constant variance #> Fitted in 0.512 s #> #> Status: #> dataset #> model FOCUS A FOCUS C #> SFO OK OK #> FOMC C OK #> #> C: Optimisation did not converge: #> false convergence (8) #> OK: No warnings #> #> Ill-defined parameters: #> dataset #> model FOCUS A FOCUS C #> SFO #> FOMC parent_0, alpha, beta, sigma"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.nlme.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Summary method for class ","title":"Summary method for class ","text":"Lists model equations, initial parameter values, optimised parameters fixed effects (population), random effects (deviations population mean) residual error model, well resulting endpoints formation fractions DT50 values. Optionally (default FALSE), data listed full.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.nlme.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summary method for class ","text":"","code":"# S3 method for class 'nlme.mmkin' summary( object, data = FALSE, verbose = FALSE, distimes = TRUE, alpha = 0.05, ... ) # S3 method for class 'summary.nlme.mmkin' print(x, digits = max(3, getOption(\"digits\") - 3), verbose = x$verbose, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.nlme.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summary method for class ","text":"object object class nlme.mmkin data logical, indicating whether full data included summary. verbose summary verbose? distimes logical, indicating whether DT50 DT90 values included. alpha error level confidence interval estimation t distribution ... optional arguments passed methods like print. x object class summary.nlme.mmkin digits Number digits use printing","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.nlme.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Summary method for class ","text":"summary function returns list based nlme object obtained fit, least following additional components nlmeversion, mkinversion, Rversion nlme, mkin R versions used date.fit, date.summary dates fit summary produced diffs differential equations used degradation model use_of_ff maximum minimum use made formation fractions data data confint_trans Transformed parameters used optimisation, confidence intervals confint_back Backtransformed parameters, confidence intervals available ff estimated formation fractions derived fitted model. distimes DT50 DT90 values observed variable. SFORB applicable, eigenvalues SFORB components model. print method called side effect, .e. printing summary.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.nlme.mmkin.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Summary method for class ","text":"Johannes Ranke mkin specific parts José Pinheiro Douglas Bates components inherited nlme","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.nlme.mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summary method for class ","text":"","code":"# Generate five datasets following SFO kinetics sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) dt50_sfo_in_pop <- 50 k_in_pop <- log(2) / dt50_sfo_in_pop set.seed(1234) k_in <- rlnorm(5, log(k_in_pop), 0.5) SFO <- mkinmod(parent = mkinsub(\"SFO\")) pred_sfo <- function(k) { mkinpredict(SFO, c(k_parent = k), c(parent = 100), sampling_times) } ds_sfo_mean <- lapply(k_in, pred_sfo) names(ds_sfo_mean) <- paste(\"ds\", 1:5) set.seed(12345) ds_sfo_syn <- lapply(ds_sfo_mean, function(ds) { add_err(ds, sdfunc = function(value) sqrt(1^2 + value^2 * 0.07^2), n = 1)[[1]] }) # \\dontrun{ # Evaluate using mmkin and nlme library(nlme) f_mmkin <- mmkin(\"SFO\", ds_sfo_syn, quiet = TRUE, error_model = \"tc\", cores = 1) #> Warning: Optimisation did not converge: #> iteration limit reached without convergence (10) f_nlme <- nlme(f_mmkin) summary(f_nlme, data = TRUE) #> nlme version used for fitting: 3.1.166 #> mkin version used for pre-fitting: 1.2.10 #> R version used for fitting: 4.4.2 #> Date of fit: Fri Feb 14 07:34:18 2025 #> Date of summary: Fri Feb 14 07:34:18 2025 #> #> Equations: #> d_parent/dt = - k_parent * parent #> #> Data: #> 90 observations of 1 variable(s) grouped in 5 datasets #> #> Model predictions using solution type analytical #> #> Fitted in 0.187 s using 4 iterations #> #> Variance model: Two-component variance function #> #> Mean of starting values for individual parameters: #> parent_0 log_k_parent #> 101.569 -4.454 #> #> Fixed degradation parameter values: #> None #> #> Results: #> #> AIC BIC logLik #> 584.5 599.5 -286.2 #> #> Optimised, transformed parameters with symmetric confidence intervals: #> lower est. upper #> parent_0 99.371 101.592 103.814 #> log_k_parent -4.973 -4.449 -3.926 #> #> Correlation: #> parnt_0 #> log_k_parent 0.0507 #> #> Random effects: #> Formula: list(parent_0 ~ 1, log_k_parent ~ 1) #> Level: ds #> Structure: Diagonal #> parent_0 log_k_parent Residual #> StdDev: 6.921e-05 0.5863 1 #> #> Variance function: #> Structure: Constant plus proportion of variance covariate #> Formula: ~fitted(.) #> Parameter estimates: #> const prop #> 0.0001208313 0.0789967985 #> #> Backtransformed parameters with asymmetric confidence intervals: #> lower est. upper #> parent_0 99.370882 101.59243 103.81398 #> k_parent 0.006923 0.01168 0.01972 #> #> Estimated disappearance times: #> DT50 DT90 #> parent 59.32 197.1 #> #> Data: #> ds name time observed predicted residual std standardized #> ds 1 parent 0 104.1 101.592 2.50757 8.0255 0.312451 #> ds 1 parent 0 105.0 101.592 3.40757 8.0255 0.424594 #> ds 1 parent 1 98.5 100.796 -2.29571 7.9625 -0.288313 #> ds 1 parent 1 96.1 100.796 -4.69571 7.9625 -0.589725 #> ds 1 parent 3 101.9 99.221 2.67904 7.8381 0.341796 #> ds 1 parent 3 85.2 99.221 -14.02096 7.8381 -1.788812 #> ds 1 parent 7 99.1 96.145 2.95512 7.5951 0.389081 #> ds 1 parent 7 93.0 96.145 -3.14488 7.5951 -0.414065 #> ds 1 parent 14 88.1 90.989 -2.88944 7.1879 -0.401987 #> ds 1 parent 14 84.1 90.989 -6.88944 7.1879 -0.958480 #> ds 1 parent 28 80.2 81.493 -1.29305 6.4377 -0.200857 #> ds 1 parent 28 91.3 81.493 9.80695 6.4377 1.523364 #> ds 1 parent 60 65.1 63.344 1.75642 5.0039 0.351008 #> ds 1 parent 60 65.8 63.344 2.45642 5.0039 0.490898 #> ds 1 parent 90 47.8 50.018 -2.21764 3.9512 -0.561252 #> ds 1 parent 90 53.5 50.018 3.48236 3.9512 0.881335 #> ds 1 parent 120 37.6 39.495 -1.89515 3.1200 -0.607423 #> ds 1 parent 120 39.3 39.495 -0.19515 3.1200 -0.062549 #> ds 2 parent 0 107.9 101.592 6.30757 8.0255 0.785943 #> ds 2 parent 0 102.1 101.592 0.50757 8.0255 0.063245 #> ds 2 parent 1 103.8 100.058 3.74159 7.9043 0.473361 #> ds 2 parent 1 108.6 100.058 8.54159 7.9043 1.080626 #> ds 2 parent 3 91.0 97.060 -6.05952 7.6674 -0.790297 #> ds 2 parent 3 84.9 97.060 -12.15952 7.6674 -1.585874 #> ds 2 parent 7 79.3 91.329 -12.02867 7.2147 -1.667251 #> ds 2 parent 7 100.9 91.329 9.57133 7.2147 1.326647 #> ds 2 parent 14 77.3 82.102 -4.80185 6.4858 -0.740366 #> ds 2 parent 14 83.5 82.102 1.39815 6.4858 0.215571 #> ds 2 parent 28 66.8 66.351 0.44945 5.2415 0.085748 #> ds 2 parent 28 63.3 66.351 -3.05055 5.2415 -0.582002 #> ds 2 parent 60 40.8 40.775 0.02474 3.2211 0.007679 #> ds 2 parent 60 44.8 40.775 4.02474 3.2211 1.249485 #> ds 2 parent 90 27.8 25.832 1.96762 2.0407 0.964198 #> ds 2 parent 90 27.0 25.832 1.16762 2.0407 0.572171 #> ds 2 parent 120 15.2 16.366 -1.16561 1.2928 -0.901595 #> ds 2 parent 120 15.5 16.366 -0.86561 1.2928 -0.669547 #> ds 3 parent 0 97.7 101.592 -3.89243 8.0255 -0.485009 #> ds 3 parent 0 88.2 101.592 -13.39243 8.0255 -1.668740 #> ds 3 parent 1 109.9 99.218 10.68196 7.8379 1.362858 #> ds 3 parent 1 97.8 99.218 -1.41804 7.8379 -0.180921 #> ds 3 parent 3 100.5 94.634 5.86555 7.4758 0.784603 #> ds 3 parent 3 77.4 94.634 -17.23445 7.4758 -2.305360 #> ds 3 parent 7 78.3 86.093 -7.79273 6.8011 -1.145813 #> ds 3 parent 7 90.3 86.093 4.20727 6.8011 0.618620 #> ds 3 parent 14 76.0 72.958 3.04222 5.7634 0.527848 #> ds 3 parent 14 79.1 72.958 6.14222 5.7634 1.065722 #> ds 3 parent 28 46.0 52.394 -6.39404 4.1390 -1.544842 #> ds 3 parent 28 53.4 52.394 1.00596 4.1390 0.243046 #> ds 3 parent 60 25.1 24.582 0.51786 1.9419 0.266676 #> ds 3 parent 60 21.4 24.582 -3.18214 1.9419 -1.638664 #> ds 3 parent 90 11.0 12.092 -1.09202 0.9552 -1.143199 #> ds 3 parent 90 14.2 12.092 2.10798 0.9552 2.206777 #> ds 3 parent 120 5.8 5.948 -0.14810 0.4699 -0.315178 #> ds 3 parent 120 6.1 5.948 0.15190 0.4699 0.323282 #> ds 4 parent 0 95.3 101.592 -6.29243 8.0255 -0.784057 #> ds 4 parent 0 102.0 101.592 0.40757 8.0255 0.050784 #> ds 4 parent 1 104.4 101.125 3.27549 7.9885 0.410025 #> ds 4 parent 1 105.4 101.125 4.27549 7.9885 0.535205 #> ds 4 parent 3 113.7 100.195 13.50487 7.9151 1.706218 #> ds 4 parent 3 82.3 100.195 -17.89513 7.9151 -2.260886 #> ds 4 parent 7 98.1 98.362 -0.26190 7.7703 -0.033706 #> ds 4 parent 7 87.8 98.362 -10.56190 7.7703 -1.359270 #> ds 4 parent 14 97.9 95.234 2.66590 7.5232 0.354357 #> ds 4 parent 14 104.8 95.234 9.56590 7.5232 1.271521 #> ds 4 parent 28 85.0 89.274 -4.27372 7.0523 -0.606001 #> ds 4 parent 28 77.2 89.274 -12.07372 7.0523 -1.712017 #> ds 4 parent 60 82.2 77.013 5.18661 6.0838 0.852526 #> ds 4 parent 60 86.1 77.013 9.08661 6.0838 1.493571 #> ds 4 parent 90 70.5 67.053 3.44692 5.2970 0.650733 #> ds 4 parent 90 61.7 67.053 -5.35308 5.2970 -1.010591 #> ds 4 parent 120 60.0 58.381 1.61905 4.6119 0.351058 #> ds 4 parent 120 56.4 58.381 -1.98095 4.6119 -0.429530 #> ds 5 parent 0 92.6 101.592 -8.99243 8.0255 -1.120485 #> ds 5 parent 0 116.5 101.592 14.90757 8.0255 1.857531 #> ds 5 parent 1 108.0 99.914 8.08560 7.8929 1.024413 #> ds 5 parent 1 104.9 99.914 4.98560 7.8929 0.631655 #> ds 5 parent 3 100.5 96.641 3.85898 7.6343 0.505477 #> ds 5 parent 3 89.5 96.641 -7.14102 7.6343 -0.935383 #> ds 5 parent 7 91.7 90.412 1.28752 7.1423 0.180267 #> ds 5 parent 7 95.1 90.412 4.68752 7.1423 0.656304 #> ds 5 parent 14 82.2 80.463 1.73715 6.3563 0.273295 #> ds 5 parent 14 84.5 80.463 4.03715 6.3563 0.635141 #> ds 5 parent 28 60.5 63.728 -3.22788 5.0343 -0.641178 #> ds 5 parent 28 72.8 63.728 9.07212 5.0343 1.802062 #> ds 5 parent 60 38.3 37.399 0.90061 2.9544 0.304835 #> ds 5 parent 60 40.7 37.399 3.30061 2.9544 1.117174 #> ds 5 parent 90 22.5 22.692 -0.19165 1.7926 -0.106913 #> ds 5 parent 90 20.8 22.692 -1.89165 1.7926 -1.055273 #> ds 5 parent 120 13.4 13.768 -0.36790 1.0876 -0.338259 #> ds 5 parent 120 13.8 13.768 0.03210 1.0876 0.029517 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.saem.mmkin.html","id":null,"dir":"Reference","previous_headings":"","what":"Summary method for class ","title":"Summary method for class ","text":"Lists model equations, initial parameter values, optimised parameters fixed effects (population), random effects (deviations population mean) residual error model, well resulting endpoints formation fractions DT50 values. Optionally (default FALSE), data listed full.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.saem.mmkin.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Summary method for class ","text":"","code":"# S3 method for class 'saem.mmkin' summary( object, data = FALSE, verbose = FALSE, covariates = NULL, covariate_quantile = 0.5, distimes = TRUE, ... ) # S3 method for class 'summary.saem.mmkin' print(x, digits = max(3, getOption(\"digits\") - 3), verbose = x$verbose, ...)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.saem.mmkin.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Summary method for class ","text":"object object class saem.mmkin data logical, indicating whether full data included summary. verbose summary verbose? covariates Numeric vector covariate values variables covariate models object. given, overrides 'covariate_quantile'. covariate_quantile argument effect fitted object covariate models. , default show endpoints median covariate values (50th percentile). distimes logical, indicating whether DT50 DT90 values included. ... optional arguments passed methods like print. x object class summary.saem.mmkin digits Number digits use printing","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.saem.mmkin.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Summary method for class ","text":"summary function returns list based saemix::SaemixObject obtained fit, least following additional components saemixversion, mkinversion, Rversion saemix, mkin R versions used date.fit, date.summary dates fit summary produced diffs differential equations used degradation model use_of_ff maximum minimum use made formation fractions data data confint_trans Transformed parameters used optimisation, confidence intervals confint_back Backtransformed parameters, confidence intervals available confint_errmod Error model parameters confidence intervals ff estimated formation fractions derived fitted model. distimes DT50 DT90 values observed variable. SFORB applicable, eigenvalues SFORB components model. print method called side effect, .e. printing summary.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.saem.mmkin.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Summary method for class ","text":"Johannes Ranke mkin specific parts saemix authors parts inherited saemix.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary.saem.mmkin.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Summary method for class ","text":"","code":"# Generate five datasets following DFOP-SFO kinetics sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) dfop_sfo <- mkinmod(parent = mkinsub(\"DFOP\", \"m1\"), m1 = mkinsub(\"SFO\"), quiet = TRUE) set.seed(1234) k1_in <- rlnorm(5, log(0.1), 0.3) k2_in <- rlnorm(5, log(0.02), 0.3) g_in <- plogis(rnorm(5, qlogis(0.5), 0.3)) f_parent_to_m1_in <- plogis(rnorm(5, qlogis(0.3), 0.3)) k_m1_in <- rlnorm(5, log(0.02), 0.3) pred_dfop_sfo <- function(k1, k2, g, f_parent_to_m1, k_m1) { mkinpredict(dfop_sfo, c(k1 = k1, k2 = k2, g = g, f_parent_to_m1 = f_parent_to_m1, k_m1 = k_m1), c(parent = 100, m1 = 0), sampling_times) } ds_mean_dfop_sfo <- lapply(1:5, function(i) { mkinpredict(dfop_sfo, c(k1 = k1_in[i], k2 = k2_in[i], g = g_in[i], f_parent_to_m1 = f_parent_to_m1_in[i], k_m1 = k_m1_in[i]), c(parent = 100, m1 = 0), sampling_times) }) names(ds_mean_dfop_sfo) <- paste(\"ds\", 1:5) ds_syn_dfop_sfo <- lapply(ds_mean_dfop_sfo, function(ds) { add_err(ds, sdfunc = function(value) sqrt(1^2 + value^2 * 0.07^2), n = 1)[[1]] }) # \\dontrun{ # Evaluate using mmkin and saem f_mmkin_dfop_sfo <- mmkin(list(dfop_sfo), ds_syn_dfop_sfo, quiet = TRUE, error_model = \"tc\", cores = 5) f_saem_dfop_sfo <- saem(f_mmkin_dfop_sfo) print(f_saem_dfop_sfo) #> Kinetic nonlinear mixed-effects model fit by SAEM #> Structural model: #> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * #> time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) #> * parent #> d_m1/dt = + f_parent_to_m1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) #> * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * #> exp(-k2 * time))) * parent - k_m1 * m1 #> #> Data: #> 171 observations of 2 variable(s) grouped in 5 datasets #> #> Likelihood computed by importance sampling #> AIC BIC logLik #> 810.8 805.4 -391.4 #> #> Fitted parameters: #> estimate lower upper #> parent_0 100.966822 97.90584 104.02780 #> log_k_m1 -4.076164 -4.17485 -3.97748 #> f_parent_qlogis -0.940902 -1.35358 -0.52823 #> log_k1 -2.363988 -2.71690 -2.01107 #> log_k2 -4.060016 -4.21743 -3.90260 #> g_qlogis -0.029999 -0.44766 0.38766 #> a.1 0.876272 0.67790 1.07464 #> b.1 0.079594 0.06521 0.09398 #> SD.parent_0 0.076322 -76.45825 76.61089 #> SD.log_k_m1 0.005052 -1.08943 1.09953 #> SD.f_parent_qlogis 0.446968 0.16577 0.72816 #> SD.log_k1 0.348786 0.09502 0.60255 #> SD.log_k2 0.147456 0.03111 0.26380 #> SD.g_qlogis 0.348244 0.02794 0.66854 illparms(f_saem_dfop_sfo) #> [1] \"sd(parent_0)\" \"sd(log_k_m1)\" f_saem_dfop_sfo_2 <- update(f_saem_dfop_sfo, no_random_effect = c(\"parent_0\", \"log_k_m1\")) illparms(f_saem_dfop_sfo_2) intervals(f_saem_dfop_sfo_2) #> Approximate 95% confidence intervals #> #> Fixed effects: #> lower est. upper #> parent_0 98.04247057 101.09950884 104.15654711 #> k_m1 0.01528983 0.01687734 0.01862969 #> f_parent_to_m1 0.20447650 0.27932896 0.36887691 #> k1 0.06779844 0.09638524 0.13702550 #> k2 0.01495629 0.01741775 0.02028431 #> g 0.37669311 0.48368409 0.59219202 #> #> Random effects: #> lower est. upper #> sd(f_parent_qlogis) 0.16515113 0.4448330 0.7245148 #> sd(log_k1) 0.08982399 0.3447403 0.5996565 #> sd(log_k2) 0.02806780 0.1419560 0.2558443 #> sd(g_qlogis) 0.04908644 0.3801993 0.7113121 #> #> #> lower est. upper #> a.1 0.67993373 0.87630147 1.07266921 #> b.1 0.06522297 0.07920531 0.09318766 summary(f_saem_dfop_sfo_2, data = TRUE) #> saemix version used for fitting: 3.3 #> mkin version used for pre-fitting: 1.2.10 #> R version used for fitting: 4.4.2 #> Date of fit: Fri Feb 14 07:34:33 2025 #> Date of summary: Fri Feb 14 07:34:33 2025 #> #> Equations: #> d_parent/dt = - ((k1 * g * exp(-k1 * time) + k2 * (1 - g) * exp(-k2 * #> time)) / (g * exp(-k1 * time) + (1 - g) * exp(-k2 * time))) #> * parent #> d_m1/dt = + f_parent_to_m1 * ((k1 * g * exp(-k1 * time) + k2 * (1 - g) #> * exp(-k2 * time)) / (g * exp(-k1 * time) + (1 - g) * #> exp(-k2 * time))) * parent - k_m1 * m1 #> #> Data: #> 171 observations of 2 variable(s) grouped in 5 datasets #> #> Model predictions using solution type analytical #> #> Fitted in 8.903 s #> Using 300, 100 iterations and 10 chains #> #> Variance model: Two-component variance function #> #> Starting values for degradation parameters: #> parent_0 log_k_m1 f_parent_qlogis log_k1 log_k2 #> 101.65645 -4.05368 -0.94311 -2.35943 -4.07006 #> g_qlogis #> -0.01133 #> #> Fixed degradation parameter values: #> None #> #> Starting values for random effects (square root of initial entries in omega): #> parent_0 log_k_m1 f_parent_qlogis log_k1 log_k2 g_qlogis #> parent_0 6.742 0.0000 0.0000 0.0000 0.0000 0.000 #> log_k_m1 0.000 0.2236 0.0000 0.0000 0.0000 0.000 #> f_parent_qlogis 0.000 0.0000 0.5572 0.0000 0.0000 0.000 #> log_k1 0.000 0.0000 0.0000 0.8031 0.0000 0.000 #> log_k2 0.000 0.0000 0.0000 0.0000 0.2931 0.000 #> g_qlogis 0.000 0.0000 0.0000 0.0000 0.0000 0.807 #> #> Starting values for error model parameters: #> a.1 b.1 #> 1 1 #> #> Results: #> #> Likelihood computed by importance sampling #> AIC BIC logLik #> 806.9 802.2 -391.5 #> #> Optimised parameters: #> est. lower upper #> parent_0 101.09951 98.04247 104.15655 #> log_k_m1 -4.08178 -4.18057 -3.98300 #> f_parent_qlogis -0.94779 -1.35855 -0.53704 #> log_k1 -2.33940 -2.69122 -1.98759 #> log_k2 -4.05027 -4.20262 -3.89791 #> g_qlogis -0.06529 -0.50361 0.37303 #> a.1 0.87630 0.67993 1.07267 #> b.1 0.07921 0.06522 0.09319 #> SD.f_parent_qlogis 0.44483 0.16515 0.72451 #> SD.log_k1 0.34474 0.08982 0.59966 #> SD.log_k2 0.14196 0.02807 0.25584 #> SD.g_qlogis 0.38020 0.04909 0.71131 #> #> Correlation: #> parnt_0 lg_k_m1 f_prnt_ log_k1 log_k2 #> log_k_m1 -0.4716 #> f_parent_qlogis -0.2394 0.2617 #> log_k1 0.1677 -0.1566 -0.0659 #> log_k2 0.0165 0.0638 0.0045 0.2013 #> g_qlogis 0.1118 -0.1118 -0.0340 -0.2324 -0.3419 #> #> Random effects: #> est. lower upper #> SD.f_parent_qlogis 0.4448 0.16515 0.7245 #> SD.log_k1 0.3447 0.08982 0.5997 #> SD.log_k2 0.1420 0.02807 0.2558 #> SD.g_qlogis 0.3802 0.04909 0.7113 #> #> Variance model: #> est. lower upper #> a.1 0.87630 0.67993 1.07267 #> b.1 0.07921 0.06522 0.09319 #> #> Backtransformed parameters: #> est. lower upper #> parent_0 101.09951 98.04247 104.15655 #> k_m1 0.01688 0.01529 0.01863 #> f_parent_to_m1 0.27933 0.20448 0.36888 #> k1 0.09639 0.06780 0.13703 #> k2 0.01742 0.01496 0.02028 #> g 0.48368 0.37669 0.59219 #> #> Resulting formation fractions: #> ff #> parent_m1 0.2793 #> parent_sink 0.7207 #> #> Estimated disappearance times: #> DT50 DT90 DT50back DT50_k1 DT50_k2 #> parent 15.66 94.28 28.38 7.191 39.8 #> m1 41.07 136.43 NA NA NA #> #> Data: #> ds name time observed predicted residual std standardized #> ds 1 parent 0 89.8 1.011e+02 -11.29951 8.0554 -1.402721 #> ds 1 parent 0 104.1 1.011e+02 3.00049 8.0554 0.372481 #> ds 1 parent 1 88.7 9.624e+01 -7.53600 7.6726 -0.982195 #> ds 1 parent 1 95.5 9.624e+01 -0.73600 7.6726 -0.095925 #> ds 1 parent 3 81.8 8.736e+01 -5.55672 6.9744 -0.796732 #> ds 1 parent 3 94.5 8.736e+01 7.14328 6.9744 1.024217 #> ds 1 parent 7 71.5 7.251e+01 -1.00511 5.8093 -0.173019 #> ds 1 parent 7 70.3 7.251e+01 -2.20511 5.8093 -0.379585 #> ds 1 parent 14 54.2 5.356e+01 0.63921 4.3319 0.147560 #> ds 1 parent 14 49.6 5.356e+01 -3.96079 4.3319 -0.914340 #> ds 1 parent 28 31.5 3.175e+01 -0.25429 2.6634 -0.095475 #> ds 1 parent 28 28.8 3.175e+01 -2.95429 2.6634 -1.109218 #> ds 1 parent 60 12.1 1.281e+01 -0.71388 1.3409 -0.532390 #> ds 1 parent 60 13.6 1.281e+01 0.78612 1.3409 0.586271 #> ds 1 parent 90 6.2 6.405e+00 -0.20462 1.0125 -0.202083 #> ds 1 parent 90 8.3 6.405e+00 1.89538 1.0125 1.871910 #> ds 1 parent 120 2.2 3.329e+00 -1.12941 0.9151 -1.234165 #> ds 1 parent 120 2.4 3.329e+00 -0.92941 0.9151 -1.015615 #> ds 1 m1 1 0.3 1.177e+00 -0.87699 0.8812 -0.995168 #> ds 1 m1 1 0.2 1.177e+00 -0.97699 0.8812 -1.108644 #> ds 1 m1 3 2.2 3.268e+00 -1.06821 0.9137 -1.169063 #> ds 1 m1 3 3.0 3.268e+00 -0.26821 0.9137 -0.293536 #> ds 1 m1 7 6.5 6.555e+00 -0.05539 1.0186 -0.054377 #> ds 1 m1 7 5.0 6.555e+00 -1.55539 1.0186 -1.527022 #> ds 1 m1 14 10.2 1.017e+01 0.03108 1.1902 0.026117 #> ds 1 m1 14 9.5 1.017e+01 -0.66892 1.1902 -0.562010 #> ds 1 m1 28 12.2 1.270e+01 -0.50262 1.3342 -0.376708 #> ds 1 m1 28 13.4 1.270e+01 0.69738 1.3342 0.522686 #> ds 1 m1 60 11.8 1.078e+01 1.01734 1.2236 0.831403 #> ds 1 m1 60 13.2 1.078e+01 2.41734 1.2236 1.975530 #> ds 1 m1 90 6.6 7.686e+00 -1.08586 1.0670 -1.017675 #> ds 1 m1 90 9.3 7.686e+00 1.61414 1.0670 1.512779 #> ds 1 m1 120 3.5 5.205e+00 -1.70467 0.9684 -1.760250 #> ds 1 m1 120 5.4 5.205e+00 0.19533 0.9684 0.201701 #> ds 2 parent 0 118.0 1.011e+02 16.90049 8.0554 2.098026 #> ds 2 parent 0 99.8 1.011e+02 -1.29951 8.0554 -0.161321 #> ds 2 parent 1 90.2 9.574e+01 -5.53784 7.6334 -0.725473 #> ds 2 parent 1 94.6 9.574e+01 -1.13784 7.6334 -0.149060 #> ds 2 parent 3 96.1 8.638e+01 9.72233 6.8975 1.409551 #> ds 2 parent 3 78.4 8.638e+01 -7.97767 6.8975 -1.156610 #> ds 2 parent 7 77.9 7.194e+01 5.95854 5.7651 1.033547 #> ds 2 parent 7 77.7 7.194e+01 5.75854 5.7651 0.998856 #> ds 2 parent 14 56.0 5.558e+01 0.42141 4.4885 0.093888 #> ds 2 parent 14 54.7 5.558e+01 -0.87859 4.4885 -0.195742 #> ds 2 parent 28 36.6 3.852e+01 -1.92382 3.1746 -0.605999 #> ds 2 parent 28 36.8 3.852e+01 -1.72382 3.1746 -0.543000 #> ds 2 parent 60 22.1 2.108e+01 1.02043 1.8856 0.541168 #> ds 2 parent 60 24.7 2.108e+01 3.62043 1.8856 1.920034 #> ds 2 parent 90 12.4 1.250e+01 -0.09675 1.3220 -0.073184 #> ds 2 parent 90 10.8 1.250e+01 -1.69675 1.3220 -1.283492 #> ds 2 parent 120 6.8 7.426e+00 -0.62587 1.0554 -0.593027 #> ds 2 parent 120 7.9 7.426e+00 0.47413 1.0554 0.449242 #> ds 2 m1 1 1.3 1.417e+00 -0.11735 0.8835 -0.132825 #> ds 2 m1 3 3.7 3.823e+00 -0.12301 0.9271 -0.132673 #> ds 2 m1 3 4.7 3.823e+00 0.87699 0.9271 0.945909 #> ds 2 m1 7 8.1 7.288e+00 0.81180 1.0494 0.773619 #> ds 2 m1 7 7.9 7.288e+00 0.61180 1.0494 0.583025 #> ds 2 m1 14 10.1 1.057e+01 -0.46957 1.2119 -0.387459 #> ds 2 m1 14 10.3 1.057e+01 -0.26957 1.2119 -0.222432 #> ds 2 m1 28 10.7 1.234e+01 -1.63555 1.3124 -1.246185 #> ds 2 m1 28 12.2 1.234e+01 -0.13555 1.3124 -0.103281 #> ds 2 m1 60 10.7 1.065e+01 0.04641 1.2165 0.038151 #> ds 2 m1 60 12.5 1.065e+01 1.84641 1.2165 1.517773 #> ds 2 m1 90 9.1 8.177e+00 0.92337 1.0896 0.847403 #> ds 2 m1 90 7.4 8.177e+00 -0.77663 1.0896 -0.712734 #> ds 2 m1 120 6.1 5.966e+00 0.13404 0.9956 0.134631 #> ds 2 m1 120 4.5 5.966e+00 -1.46596 0.9956 -1.472460 #> ds 3 parent 0 106.2 1.011e+02 5.10049 8.0554 0.633175 #> ds 3 parent 0 106.9 1.011e+02 5.80049 8.0554 0.720073 #> ds 3 parent 1 107.4 9.365e+01 13.74627 7.4695 1.840332 #> ds 3 parent 1 96.1 9.365e+01 2.44627 7.4695 0.327504 #> ds 3 parent 3 79.4 8.139e+01 -1.99118 6.5059 -0.306058 #> ds 3 parent 3 82.6 8.139e+01 1.20882 6.5059 0.185803 #> ds 3 parent 7 63.9 6.445e+01 -0.54666 5.1792 -0.105549 #> ds 3 parent 7 62.4 6.445e+01 -2.04666 5.1792 -0.395170 #> ds 3 parent 14 51.0 4.830e+01 2.69944 3.9247 0.687800 #> ds 3 parent 14 47.1 4.830e+01 -1.20056 3.9247 -0.305896 #> ds 3 parent 28 36.1 3.426e+01 1.83885 2.8516 0.644839 #> ds 3 parent 28 36.6 3.426e+01 2.33885 2.8516 0.820177 #> ds 3 parent 60 20.1 1.968e+01 0.42208 1.7881 0.236053 #> ds 3 parent 60 19.8 1.968e+01 0.12208 1.7881 0.068273 #> ds 3 parent 90 11.3 1.194e+01 -0.64013 1.2893 -0.496496 #> ds 3 parent 90 10.7 1.194e+01 -1.24013 1.2893 -0.961865 #> ds 3 parent 120 8.2 7.247e+00 0.95264 1.0476 0.909381 #> ds 3 parent 120 7.3 7.247e+00 0.05264 1.0476 0.050254 #> ds 3 m1 0 0.8 -2.956e-12 0.80000 0.8763 0.912928 #> ds 3 m1 1 1.8 1.757e+00 0.04318 0.8873 0.048666 #> ds 3 m1 1 2.3 1.757e+00 0.54318 0.8873 0.612186 #> ds 3 m1 3 4.2 4.566e+00 -0.36607 0.9480 -0.386149 #> ds 3 m1 3 4.1 4.566e+00 -0.46607 0.9480 -0.491634 #> ds 3 m1 7 6.8 8.157e+00 -1.35680 1.0887 -1.246241 #> ds 3 m1 7 10.1 8.157e+00 1.94320 1.0887 1.784855 #> ds 3 m1 14 11.4 1.085e+01 0.55367 1.2272 0.451182 #> ds 3 m1 14 12.8 1.085e+01 1.95367 1.2272 1.592023 #> ds 3 m1 28 11.5 1.149e+01 0.01098 1.2633 0.008689 #> ds 3 m1 28 10.6 1.149e+01 -0.88902 1.2633 -0.703717 #> ds 3 m1 60 7.5 9.295e+00 -1.79500 1.1445 -1.568351 #> ds 3 m1 60 8.6 9.295e+00 -0.69500 1.1445 -0.607245 #> ds 3 m1 90 7.3 7.017e+00 0.28305 1.0377 0.272775 #> ds 3 m1 90 8.1 7.017e+00 1.08305 1.0377 1.043720 #> ds 3 m1 120 5.3 5.087e+00 0.21272 0.9645 0.220547 #> ds 3 m1 120 3.8 5.087e+00 -1.28728 0.9645 -1.334660 #> ds 4 parent 0 104.7 1.011e+02 3.60049 8.0554 0.446965 #> ds 4 parent 0 88.3 1.011e+02 -12.79951 8.0554 -1.588930 #> ds 4 parent 1 94.2 9.755e+01 -3.35176 7.7762 -0.431030 #> ds 4 parent 1 94.6 9.755e+01 -2.95176 7.7762 -0.379591 #> ds 4 parent 3 78.1 9.095e+01 -12.85198 7.2570 -1.770981 #> ds 4 parent 3 96.5 9.095e+01 5.54802 7.2570 0.764508 #> ds 4 parent 7 76.2 7.949e+01 -3.29267 6.3569 -0.517966 #> ds 4 parent 7 77.8 7.949e+01 -1.69267 6.3569 -0.266272 #> ds 4 parent 14 70.8 6.384e+01 6.95621 5.1321 1.355423 #> ds 4 parent 14 67.3 6.384e+01 3.45621 5.1321 0.673445 #> ds 4 parent 28 43.1 4.345e+01 -0.35291 3.5515 -0.099370 #> ds 4 parent 28 45.1 4.345e+01 1.64709 3.5515 0.463771 #> ds 4 parent 60 21.3 2.137e+01 -0.07478 1.9063 -0.039229 #> ds 4 parent 60 23.5 2.137e+01 2.12522 1.9063 1.114813 #> ds 4 parent 90 11.8 1.205e+01 -0.24925 1.2957 -0.192375 #> ds 4 parent 90 12.1 1.205e+01 0.05075 1.2957 0.039168 #> ds 4 parent 120 7.0 6.967e+00 0.03315 1.0356 0.032013 #> ds 4 parent 120 6.2 6.967e+00 -0.76685 1.0356 -0.740510 #> ds 4 m1 0 1.6 1.421e-13 1.60000 0.8763 1.825856 #> ds 4 m1 1 0.9 7.250e-01 0.17503 0.8782 0.199310 #> ds 4 m1 3 3.7 2.038e+00 1.66201 0.8910 1.865236 #> ds 4 m1 3 2.0 2.038e+00 -0.03799 0.8910 -0.042637 #> ds 4 m1 7 3.6 4.186e+00 -0.58623 0.9369 -0.625692 #> ds 4 m1 7 3.8 4.186e+00 -0.38623 0.9369 -0.412230 #> ds 4 m1 14 7.1 6.752e+00 0.34768 1.0266 0.338666 #> ds 4 m1 14 6.6 6.752e+00 -0.15232 1.0266 -0.148372 #> ds 4 m1 28 9.5 9.034e+00 0.46628 1.1313 0.412159 #> ds 4 m1 28 9.3 9.034e+00 0.26628 1.1313 0.235373 #> ds 4 m1 60 8.3 8.634e+00 -0.33359 1.1115 -0.300112 #> ds 4 m1 60 9.0 8.634e+00 0.36641 1.1115 0.329645 #> ds 4 m1 90 6.6 6.671e+00 -0.07091 1.0233 -0.069295 #> ds 4 m1 90 7.7 6.671e+00 1.02909 1.0233 1.005691 #> ds 4 m1 120 3.7 4.823e+00 -1.12301 0.9559 -1.174763 #> ds 4 m1 120 3.5 4.823e+00 -1.32301 0.9559 -1.383979 #> ds 5 parent 0 110.4 1.011e+02 9.30049 8.0554 1.154563 #> ds 5 parent 0 112.1 1.011e+02 11.00049 8.0554 1.365601 #> ds 5 parent 1 93.5 9.440e+01 -0.90098 7.5282 -0.119681 #> ds 5 parent 1 91.0 9.440e+01 -3.40098 7.5282 -0.451764 #> ds 5 parent 3 71.0 8.287e+01 -11.86698 6.6217 -1.792122 #> ds 5 parent 3 89.7 8.287e+01 6.83302 6.6217 1.031907 #> ds 5 parent 7 60.4 6.562e+01 -5.22329 5.2711 -0.990936 #> ds 5 parent 7 59.1 6.562e+01 -6.52329 5.2711 -1.237566 #> ds 5 parent 14 56.5 4.739e+01 9.10588 3.8548 2.362225 #> ds 5 parent 14 47.0 4.739e+01 -0.39412 3.8548 -0.102240 #> ds 5 parent 28 30.2 3.118e+01 -0.98128 2.6206 -0.374451 #> ds 5 parent 28 23.9 3.118e+01 -7.28128 2.6206 -2.778500 #> ds 5 parent 60 17.0 1.804e+01 -1.03959 1.6761 -0.620224 #> ds 5 parent 60 18.7 1.804e+01 0.66041 1.6761 0.394008 #> ds 5 parent 90 11.3 1.165e+01 -0.35248 1.2727 -0.276958 #> ds 5 parent 90 11.9 1.165e+01 0.24752 1.2727 0.194488 #> ds 5 parent 120 9.0 7.556e+00 1.44368 1.0612 1.360449 #> ds 5 parent 120 8.1 7.556e+00 0.54368 1.0612 0.512338 #> ds 5 m1 0 0.7 -1.421e-14 0.70000 0.8763 0.798812 #> ds 5 m1 1 3.0 3.160e+00 -0.15979 0.9113 -0.175340 #> ds 5 m1 1 2.6 3.160e+00 -0.55979 0.9113 -0.614254 #> ds 5 m1 3 5.1 8.448e+00 -3.34789 1.1026 -3.036487 #> ds 5 m1 3 7.5 8.448e+00 -0.94789 1.1026 -0.859720 #> ds 5 m1 7 16.5 1.581e+01 0.68760 1.5286 0.449839 #> ds 5 m1 7 19.0 1.581e+01 3.18760 1.5286 2.085373 #> ds 5 m1 14 22.9 2.218e+01 0.71983 1.9632 0.366658 #> ds 5 m1 14 23.2 2.218e+01 1.01983 1.9632 0.519469 #> ds 5 m1 28 22.2 2.425e+01 -2.05105 2.1113 -0.971479 #> ds 5 m1 28 24.4 2.425e+01 0.14895 2.1113 0.070552 #> ds 5 m1 60 15.5 1.876e+01 -3.25968 1.7250 -1.889646 #> ds 5 m1 60 19.8 1.876e+01 1.04032 1.7250 0.603074 #> ds 5 m1 90 14.9 1.365e+01 1.25477 1.3914 0.901806 #> ds 5 m1 90 14.2 1.365e+01 0.55477 1.3914 0.398714 #> ds 5 m1 120 10.9 9.726e+00 1.17443 1.1667 1.006587 #> ds 5 m1 120 10.4 9.726e+00 0.67443 1.1667 0.578044 # Add a correlation between random effects of g and k2 cov_model_3 <- f_saem_dfop_sfo_2$so@model@covariance.model cov_model_3[\"log_k2\", \"g_qlogis\"] <- 1 cov_model_3[\"g_qlogis\", \"log_k2\"] <- 1 f_saem_dfop_sfo_3 <- update(f_saem_dfop_sfo, covariance.model = cov_model_3) intervals(f_saem_dfop_sfo_3) #> Approximate 95% confidence intervals #> #> Fixed effects: #> lower est. upper #> parent_0 98.42519529 101.51623115 104.60726702 #> k_m1 0.01505059 0.01662123 0.01835577 #> f_parent_to_m1 0.20100222 0.27477835 0.36332008 #> k1 0.07347479 0.10139028 0.13991179 #> k2 0.01469861 0.01771120 0.02134125 #> g 0.35506898 0.46263682 0.57379888 #> #> Random effects: #> lower est. upper #> sd(f_parent_qlogis) 0.16472883 0.4435866 0.7224443 #> sd(log_k1) 0.05323856 0.2981783 0.5431180 #> sd(log_k2) 0.05013379 0.1912531 0.3323723 #> sd(g_qlogis) 0.04710647 0.3997298 0.7523531 #> corr(log_k2,g_qlogis) -1.31087397 -0.5845703 0.1417334 #> #> #> lower est. upper #> a.1 0.67769608 0.87421677 1.07073746 #> b.1 0.06525119 0.07925135 0.09325151 # The correlation does not improve the fit judged by AIC and BIC, although # the likelihood is higher with the additional parameter anova(f_saem_dfop_sfo, f_saem_dfop_sfo_2, f_saem_dfop_sfo_3) #> Data: 171 observations of 2 variable(s) grouped in 5 datasets #> #> npar AIC BIC Lik #> f_saem_dfop_sfo_2 12 806.91 802.23 -391.46 #> f_saem_dfop_sfo_3 13 807.96 802.88 -390.98 #> f_saem_dfop_sfo 14 810.83 805.36 -391.41 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary_listing.html","id":null,"dir":"Reference","previous_headings":"","what":"Display the output of a summary function according to the output format — summary_listing","title":"Display the output of a summary function according to the output format — summary_listing","text":"function intended use R markdown code chunk chunk option results = \"asis\".","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary_listing.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Display the output of a summary function according to the output format — summary_listing","text":"","code":"summary_listing(object, caption = NULL, label = NULL, clearpage = TRUE) tex_listing(object, caption = NULL, label = NULL, clearpage = TRUE) html_listing(object, caption = NULL)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/summary_listing.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Display the output of a summary function according to the output format — summary_listing","text":"object object summary listed caption optional caption label optional label, ignored html output clearpage new page started listing? Ignored html output","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/synthetic_data_for_UBA_2014.html","id":null,"dir":"Reference","previous_headings":"","what":"Synthetic datasets for one parent compound with two metabolites — synthetic_data_for_UBA_2014","title":"Synthetic datasets for one parent compound with two metabolites — synthetic_data_for_UBA_2014","text":"12 datasets generated using four different models three different variance components. four models either SFO DFOP model either two sequential two parallel metabolites. Variance component '' based normal distribution standard deviation 3, Variance component 'b' also based normal distribution, standard deviation 7. Variance component 'c' based error model Rocke Lorenzato (1995), minimum standard deviation (small y values) 0.5, proportionality constant 0.07 increase standard deviation y. Note simplified version error model proposed Rocke Lorenzato (1995), model error measured values approximates lognormal distribution high values, whereas using normally distributed error components along. Initial concentrations metabolites values adding variance component resulted value assumed limit detection 0.1 set NA. example, first dataset title SFO_lin_a based SFO model two sequential metabolites (linear pathway), added variance component ''. Compare also code example section see degradation models.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/synthetic_data_for_UBA_2014.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Synthetic datasets for one parent compound with two metabolites — synthetic_data_for_UBA_2014","text":"","code":"synthetic_data_for_UBA_2014"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/synthetic_data_for_UBA_2014.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Synthetic datasets for one parent compound with two metabolites — synthetic_data_for_UBA_2014","text":"list containing twelve datasets R6 class defined mkinds, containing, among others, following components title name dataset, e.g. SFO_lin_a data data frame data form expected mkinfit","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/synthetic_data_for_UBA_2014.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Synthetic datasets for one parent compound with two metabolites — synthetic_data_for_UBA_2014","text":"Ranke (2014) Prüfung und Validierung von Modellierungssoftware als Alternative zu ModelMaker 4.0, Umweltbundesamt Projektnummer 27452 Rocke, David M. und Lorenzato, Stefan (1995) two-component model measurement error analytical chemistry. Technometrics 37(2), 176-184.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/synthetic_data_for_UBA_2014.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Synthetic datasets for one parent compound with two metabolites — synthetic_data_for_UBA_2014","text":"","code":"# \\dontrun{ # The data have been generated using the following kinetic models m_synth_SFO_lin <- mkinmod(parent = list(type = \"SFO\", to = \"M1\"), M1 = list(type = \"SFO\", to = \"M2\"), M2 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded m_synth_SFO_par <- mkinmod(parent = list(type = \"SFO\", to = c(\"M1\", \"M2\"), sink = FALSE), M1 = list(type = \"SFO\"), M2 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded m_synth_DFOP_lin <- mkinmod(parent = list(type = \"DFOP\", to = \"M1\"), M1 = list(type = \"SFO\", to = \"M2\"), M2 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded m_synth_DFOP_par <- mkinmod(parent = list(type = \"DFOP\", to = c(\"M1\", \"M2\"), sink = FALSE), M1 = list(type = \"SFO\"), M2 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded # The model predictions without intentional error were generated as follows sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120) d_synth_SFO_lin <- mkinpredict(m_synth_SFO_lin, c(k_parent = 0.7, f_parent_to_M1 = 0.8, k_M1 = 0.3, f_M1_to_M2 = 0.7, k_M2 = 0.02), c(parent = 100, M1 = 0, M2 = 0), sampling_times) d_synth_DFOP_lin <- mkinpredict(m_synth_DFOP_lin, c(k1 = 0.2, k2 = 0.02, g = 0.5, f_parent_to_M1 = 0.5, k_M1 = 0.3, f_M1_to_M2 = 0.7, k_M2 = 0.02), c(parent = 100, M1 = 0, M2 = 0), sampling_times) d_synth_SFO_par <- mkinpredict(m_synth_SFO_par, c(k_parent = 0.2, f_parent_to_M1 = 0.8, k_M1 = 0.01, f_parent_to_M2 = 0.2, k_M2 = 0.02), c(parent = 100, M1 = 0, M2 = 0), sampling_times) d_synth_DFOP_par <- mkinpredict(m_synth_DFOP_par, c(k1 = 0.3, k2 = 0.02, g = 0.7, f_parent_to_M1 = 0.6, k_M1 = 0.04, f_parent_to_M2 = 0.4, k_M2 = 0.01), c(parent = 100, M1 = 0, M2 = 0), sampling_times) # Construct names for datasets with errors d_synth_names = paste0(\"d_synth_\", c(\"SFO_lin\", \"SFO_par\", \"DFOP_lin\", \"DFOP_par\")) # Original function used or adding errors. The add_err function now published # with this package is a slightly generalised version where the names of # secondary compartments that should have an initial value of zero (M1 and M2 # in this case) are not hardcoded any more. # add_err = function(d, sdfunc, LOD = 0.1, reps = 2, seed = 123456789) # { # set.seed(seed) # d_long = mkin_wide_to_long(d, time = \"time\") # d_rep = data.frame(lapply(d_long, rep, each = 2)) # d_rep$value = rnorm(length(d_rep$value), d_rep$value, sdfunc(d_rep$value)) # # d_rep[d_rep$time == 0 & d_rep$name %in% c(\"M1\", \"M2\"), \"value\"] <- 0 # d_NA <- transform(d_rep, value = ifelse(value < LOD, NA, value)) # d_NA$value <- round(d_NA$value, 1) # return(d_NA) # } # The following is the simplified version of the two-component model of Rocke # and Lorenzato (1995) sdfunc_twocomp = function(value, sd_low, rsd_high) { sqrt(sd_low^2 + value^2 * rsd_high^2) } # Add the errors. for (d_synth_name in d_synth_names) { d_synth = get(d_synth_name) assign(paste0(d_synth_name, \"_a\"), add_err(d_synth, function(value) 3)) assign(paste0(d_synth_name, \"_b\"), add_err(d_synth, function(value) 7)) assign(paste0(d_synth_name, \"_c\"), add_err(d_synth, function(value) sdfunc_twocomp(value, 0.5, 0.07))) } d_synth_err_names = c( paste(rep(d_synth_names, each = 3), letters[1:3], sep = \"_\") ) # This is just one example of an evaluation using the kinetic model used for # the generation of the data fit <- mkinfit(m_synth_SFO_lin, synthetic_data_for_UBA_2014[[1]]$data, quiet = TRUE) plot_sep(fit) summary(fit) #> mkin version used for fitting: 1.2.10 #> R version used for fitting: 4.4.2 #> Date of fit: Fri Feb 14 07:34:43 2025 #> Date of summary: Fri Feb 14 07:34:43 2025 #> #> Equations: #> d_parent/dt = - k_parent * parent #> d_M1/dt = + f_parent_to_M1 * k_parent * parent - k_M1 * M1 #> d_M2/dt = + f_M1_to_M2 * k_M1 * M1 - k_M2 * M2 #> #> Model predictions using solution type deSolve #> #> Fitted using 848 model solutions performed in 0.17 s #> #> Error model: Constant variance #> #> Error model algorithm: OLS #> #> Starting values for parameters to be optimised: #> value type #> parent_0 101.3500 state #> k_parent 0.1000 deparm #> k_M1 0.1001 deparm #> k_M2 0.1002 deparm #> f_parent_to_M1 0.5000 deparm #> f_M1_to_M2 0.5000 deparm #> #> Starting values for the transformed parameters actually optimised: #> value lower upper #> parent_0 101.350000 -Inf Inf #> log_k_parent -2.302585 -Inf Inf #> log_k_M1 -2.301586 -Inf Inf #> log_k_M2 -2.300587 -Inf Inf #> f_parent_qlogis 0.000000 -Inf Inf #> f_M1_qlogis 0.000000 -Inf Inf #> #> Fixed parameter values: #> value type #> M1_0 0 state #> M2_0 0 state #> #> Results: #> #> AIC BIC logLik #> 188.7274 200.3723 -87.36368 #> #> Optimised, transformed parameters with symmetric confidence intervals: #> Estimate Std. Error Lower Upper #> parent_0 102.1000 1.57000 98.8600 105.3000 #> log_k_parent -0.3020 0.03885 -0.3812 -0.2229 #> log_k_M1 -1.2070 0.07123 -1.3520 -1.0620 #> log_k_M2 -3.9010 0.06571 -4.0350 -3.7670 #> f_parent_qlogis 1.2010 0.23530 0.7216 1.6800 #> f_M1_qlogis 0.9589 0.24890 0.4520 1.4660 #> sigma 2.2730 0.25740 1.7490 2.7970 #> #> Parameter correlation: #> parent_0 log_k_parent log_k_M1 log_k_M2 f_parent_qlogis #> parent_0 1.000e+00 3.933e-01 -1.605e-01 2.819e-02 -4.624e-01 #> log_k_parent 3.933e-01 1.000e+00 -4.082e-01 7.166e-02 -5.682e-01 #> log_k_M1 -1.605e-01 -4.082e-01 1.000e+00 -3.929e-01 7.478e-01 #> log_k_M2 2.819e-02 7.166e-02 -3.929e-01 1.000e+00 -2.658e-01 #> f_parent_qlogis -4.624e-01 -5.682e-01 7.478e-01 -2.658e-01 1.000e+00 #> f_M1_qlogis 1.614e-01 4.102e-01 -8.109e-01 5.419e-01 -8.605e-01 #> sigma -1.377e-08 7.536e-10 1.089e-08 -4.422e-08 7.124e-09 #> f_M1_qlogis sigma #> parent_0 1.614e-01 -1.377e-08 #> log_k_parent 4.102e-01 7.536e-10 #> log_k_M1 -8.109e-01 1.089e-08 #> log_k_M2 5.419e-01 -4.422e-08 #> f_parent_qlogis -8.605e-01 7.124e-09 #> f_M1_qlogis 1.000e+00 -2.685e-08 #> sigma -2.685e-08 1.000e+00 #> #> Backtransformed parameters: #> Confidence intervals for internally transformed parameters are asymmetric. #> t-test (unrealistically) based on the assumption of normal distribution #> for estimators of untransformed parameters. #> Estimate t value Pr(>t) Lower Upper #> parent_0 102.10000 65.000 7.281e-36 98.86000 105.30000 #> k_parent 0.73930 25.740 2.948e-23 0.68310 0.80020 #> k_M1 0.29920 14.040 1.577e-15 0.25880 0.34590 #> k_M2 0.02023 15.220 1.653e-16 0.01769 0.02312 #> f_parent_to_M1 0.76870 18.370 7.295e-19 0.67300 0.84290 #> f_M1_to_M2 0.72290 14.500 6.418e-16 0.61110 0.81240 #> sigma 2.27300 8.832 2.161e-10 1.74900 2.79700 #> #> FOCUS Chi2 error levels in percent: #> err.min n.optim df #> All data 8.454 6 17 #> parent 8.660 2 6 #> M1 10.583 2 5 #> M2 3.586 2 6 #> #> Resulting formation fractions: #> ff #> parent_M1 0.7687 #> parent_sink 0.2313 #> M1_M2 0.7229 #> M1_sink 0.2771 #> #> Estimated disappearance times: #> DT50 DT90 #> parent 0.9376 3.114 #> M1 2.3170 7.697 #> M2 34.2689 113.839 #> #> Data: #> time variable observed predicted residual #> 0 parent 101.5 1.021e+02 -0.56248 #> 0 parent 101.2 1.021e+02 -0.86248 #> 1 parent 53.9 4.873e+01 5.17118 #> 1 parent 47.5 4.873e+01 -1.22882 #> 3 parent 10.4 1.111e+01 -0.70773 #> 3 parent 7.6 1.111e+01 -3.50773 #> 7 parent 1.1 5.772e-01 0.52283 #> 7 parent 0.3 5.772e-01 -0.27717 #> 14 parent 3.5 3.264e-03 3.49674 #> 28 parent 3.2 1.045e-07 3.20000 #> 90 parent 0.6 9.532e-10 0.60000 #> 120 parent 3.5 -5.940e-10 3.50000 #> 1 M1 36.4 3.479e+01 1.61088 #> 1 M1 37.4 3.479e+01 2.61088 #> 3 M1 34.3 3.937e+01 -5.07027 #> 3 M1 39.8 3.937e+01 0.42973 #> 7 M1 15.1 1.549e+01 -0.38715 #> 7 M1 17.8 1.549e+01 2.31285 #> 14 M1 5.8 1.995e+00 3.80469 #> 14 M1 1.2 1.995e+00 -0.79531 #> 60 M1 0.5 2.111e-06 0.50000 #> 90 M1 3.2 -9.672e-10 3.20000 #> 120 M1 1.5 7.670e-10 1.50000 #> 120 M1 0.6 7.670e-10 0.60000 #> 1 M2 4.8 4.455e+00 0.34517 #> 3 M2 20.9 2.153e+01 -0.62527 #> 3 M2 19.3 2.153e+01 -2.22527 #> 7 M2 42.0 4.192e+01 0.07941 #> 7 M2 43.1 4.192e+01 1.17941 #> 14 M2 49.4 4.557e+01 3.83353 #> 14 M2 44.3 4.557e+01 -1.26647 #> 28 M2 34.6 3.547e+01 -0.87275 #> 28 M2 33.0 3.547e+01 -2.47275 #> 60 M2 18.8 1.858e+01 0.21837 #> 60 M2 17.6 1.858e+01 -0.98163 #> 90 M2 10.6 1.013e+01 0.47130 #> 90 M2 10.8 1.013e+01 0.67130 #> 120 M2 9.8 5.521e+00 4.27893 #> 120 M2 3.3 5.521e+00 -2.22107 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/test_data_from_UBA_2014.html","id":null,"dir":"Reference","previous_headings":"","what":"Three experimental datasets from two water sediment systems and one soil — test_data_from_UBA_2014","title":"Three experimental datasets from two water sediment systems and one soil — test_data_from_UBA_2014","text":"datasets used comparative validation several kinetic evaluation software packages (Ranke, 2014).","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/test_data_from_UBA_2014.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Three experimental datasets from two water sediment systems and one soil — test_data_from_UBA_2014","text":"","code":"test_data_from_UBA_2014"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/test_data_from_UBA_2014.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Three experimental datasets from two water sediment systems and one soil — test_data_from_UBA_2014","text":"list containing three datasets R6 class defined mkinds. dataset , among others, following components title name dataset, e.g. UBA_2014_WS_river data data frame data form expected mkinfit","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/test_data_from_UBA_2014.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Three experimental datasets from two water sediment systems and one soil — test_data_from_UBA_2014","text":"Ranke (2014) Prüfung und Validierung von Modellierungssoftware als Alternative zu ModelMaker 4.0, Umweltbundesamt Projektnummer 27452","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/test_data_from_UBA_2014.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Three experimental datasets from two water sediment systems and one soil — test_data_from_UBA_2014","text":"","code":"# \\dontrun{ # This is a level P-II evaluation of the dataset according to the FOCUS kinetics # guidance. Due to the strong correlation of the parameter estimates, the # covariance matrix is not returned. Note that level P-II evaluations are # generally considered deprecated due to the frequent occurrence of such # large parameter correlations, among other reasons (e.g. the adequacy of the # model). m_ws <- mkinmod(parent_w = mkinsub(\"SFO\", \"parent_s\"), parent_s = mkinsub(\"SFO\", \"parent_w\")) #> Temporary DLL for differentials generated and loaded f_river <- mkinfit(m_ws, test_data_from_UBA_2014[[1]]$data, quiet = TRUE) #> Warning: Observations with value of zero were removed from the data plot_sep(f_river) summary(f_river)$bpar #> Estimate se_notrans t value Pr(>t) #> parent_w_0 95.98567441 2.16285684 44.3791159 1.245593e-17 #> k_parent_w 0.42068803 0.05573864 7.5475120 8.752928e-07 #> k_parent_s 0.07419672 0.10108562 0.7339987 2.371337e-01 #> f_parent_w_to_parent_s 0.14336920 0.05809346 2.4679062 1.305295e-02 #> f_parent_s_to_parent_w 1.00000000 3.13868615 0.3186046 3.772097e-01 #> sigma 2.98287858 0.68923267 4.3278253 2.987160e-04 #> Lower Upper #> parent_w_0 91.48420501 100.4871438 #> k_parent_w 0.36593946 0.4836276 #> k_parent_s 0.02289956 0.2404043 #> f_parent_w_to_parent_s 0.08180934 0.2391848 #> f_parent_s_to_parent_w 0.00000000 1.0000000 #> sigma 2.00184022 3.9639169 mkinerrmin(f_river) #> err.min n.optim df #> All data 0.09246946 5 6 #> parent_w 0.06377096 3 3 #> parent_s 0.20882325 2 3 # This is the evaluation used for the validation of software packages # in the expertise from 2014 m_soil <- mkinmod(parent = mkinsub(\"SFO\", c(\"M1\", \"M2\")), M1 = mkinsub(\"SFO\", \"M3\"), M2 = mkinsub(\"SFO\", \"M3\"), M3 = mkinsub(\"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded f_soil <- mkinfit(m_soil, test_data_from_UBA_2014[[3]]$data, quiet = TRUE) #> Warning: Observations with value of zero were removed from the data plot_sep(f_soil, lpos = c(\"topright\", \"topright\", \"topright\", \"bottomright\")) summary(f_soil)$bpar #> Estimate se_notrans t value Pr(>t) Lower #> parent_0 76.55425650 0.859186398 89.1008711 1.113861e-26 74.755959420 #> k_parent 0.12081956 0.004601918 26.2541722 1.077359e-16 0.111561575 #> k_M1 0.84258615 0.806159719 1.0451851 1.545266e-01 0.113779564 #> k_M2 0.04210880 0.017083034 2.4649483 1.170188e-02 0.018013857 #> k_M3 0.01122918 0.007245855 1.5497385 6.885051e-02 0.002909431 #> f_parent_to_M1 0.32240200 0.240783878 1.3389684 9.819070e-02 NA #> f_parent_to_M2 0.16099855 0.033691952 4.7785463 6.531136e-05 NA #> f_M1_to_M3 0.27921507 0.269423709 1.0363419 1.565266e-01 0.022978202 #> f_M2_to_M3 0.55641252 0.595119937 0.9349586 1.807707e-01 0.008002509 #> sigma 1.14005399 0.149696423 7.6157731 1.727024e-07 0.826735778 #> Upper #> parent_0 78.35255358 #> k_parent 0.13084582 #> k_M1 6.23970946 #> k_M2 0.09843260 #> k_M3 0.04333992 #> f_parent_to_M1 NA #> f_parent_to_M2 NA #> f_M1_to_M3 0.86450778 #> f_M2_to_M3 0.99489895 #> sigma 1.45337221 mkinerrmin(f_soil) #> err.min n.optim df #> All data 0.09649963 9 20 #> parent 0.04721283 2 6 #> M1 0.26551208 2 5 #> M2 0.20327575 2 5 #> M3 0.05196550 3 4 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/transform_odeparms.html","id":null,"dir":"Reference","previous_headings":"","what":"Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms","title":"Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms","text":"transformations intended map parameters take restricted values full scale real numbers. kinetic rate constants parameters can take positive values, simple log transformation used. compositional parameters, formations fractions always sum 1 can negative, ilr transformation used.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/transform_odeparms.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms","text":"","code":"transform_odeparms( parms, mkinmod, transform_rates = TRUE, transform_fractions = TRUE ) backtransform_odeparms( transparms, mkinmod, transform_rates = TRUE, transform_fractions = TRUE )"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/transform_odeparms.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms","text":"parms Parameters kinetic models used differential equations. mkinmod kinetic model class mkinmod, containing names model variables needed grouping formation fractions ilr transformation, parameter names information pathway sink included model. transform_rates Boolean specifying kinetic rate constants transformed model specification used fitting better compliance assumption normal distribution estimator. TRUE, also alpha beta parameters FOMC model log-transformed, well k1 k2 rate constants DFOP HS models break point tb HS model. transform_fractions Boolean specifying formation fractions constants transformed model specification used fitting better compliance assumption normal distribution estimator. default (TRUE) transformations. g parameter DFOP model also seen fraction. single fraction transformed (g parameter DFOP single target variable e.g. single metabolite plus pathway sink), logistic transformation used stats::qlogis(). cases, .e. two formation fractions need transformed whose sum exceed one, ilr transformation used. transparms Transformed parameters kinetic models used fitting procedure.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/transform_odeparms.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms","text":"vector transformed backtransformed parameters","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/transform_odeparms.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms","text":"transformation sets formation fractions fragile, supposes ordering components forward backward transformation. problem internal use mkinfit.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/transform_odeparms.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms","text":"Johannes Ranke","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/transform_odeparms.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Functions to transform and backtransform kinetic parameters for fitting — transform_odeparms","text":"","code":"SFO_SFO <- mkinmod( parent = list(type = \"SFO\", to = \"m1\", sink = TRUE), m1 = list(type = \"SFO\"), use_of_ff = \"min\") #> Temporary DLL for differentials generated and loaded # Fit the model to the FOCUS example dataset D using defaults FOCUS_D <- subset(FOCUS_2006_D, value != 0) # remove zero values to avoid warning fit <- mkinfit(SFO_SFO, FOCUS_D, quiet = TRUE) fit.s <- summary(fit) # Transformed and backtransformed parameters print(fit.s$par, 3) #> Estimate Std. Error Lower Upper #> parent_0 99.60 1.5702 96.40 102.79 #> log_k_parent_sink -3.04 0.0763 -3.19 -2.88 #> log_k_parent_m1 -2.98 0.0403 -3.06 -2.90 #> log_k_m1_sink -5.25 0.1332 -5.52 -4.98 #> sigma 3.13 0.3585 2.40 3.85 print(fit.s$bpar, 3) #> Estimate se_notrans t value Pr(>t) Lower Upper #> parent_0 99.59848 1.57022 63.43 2.30e-36 96.40384 102.7931 #> k_parent_sink 0.04792 0.00365 13.11 6.13e-15 0.04103 0.0560 #> k_parent_m1 0.05078 0.00205 24.80 3.27e-23 0.04678 0.0551 #> k_m1_sink 0.00526 0.00070 7.51 6.16e-09 0.00401 0.0069 #> sigma 3.12550 0.35852 8.72 2.24e-10 2.39609 3.8549 # \\dontrun{ # Compare to the version without transforming rate parameters (does not work # with analytical solution, we get NA values for m1 in predictions) fit.2 <- mkinfit(SFO_SFO, FOCUS_D, transform_rates = FALSE, solution_type = \"deSolve\", quiet = TRUE) fit.2.s <- summary(fit.2) print(fit.2.s$par, 3) #> Estimate Std. Error Lower Upper #> parent_0 99.59848 1.57022 96.40384 1.03e+02 #> k_parent_sink 0.04792 0.00365 0.04049 5.54e-02 #> k_parent_m1 0.05078 0.00205 0.04661 5.49e-02 #> k_m1_sink 0.00526 0.00070 0.00384 6.69e-03 #> sigma 3.12550 0.35852 2.39609 3.85e+00 print(fit.2.s$bpar, 3) #> Estimate se_notrans t value Pr(>t) Lower Upper #> parent_0 99.59848 1.57022 63.43 2.30e-36 96.40384 1.03e+02 #> k_parent_sink 0.04792 0.00365 13.11 6.13e-15 0.04049 5.54e-02 #> k_parent_m1 0.05078 0.00205 24.80 3.27e-23 0.04661 5.49e-02 #> k_m1_sink 0.00526 0.00070 7.51 6.16e-09 0.00384 6.69e-03 #> sigma 3.12550 0.35852 8.72 2.24e-10 2.39609 3.85e+00 # } initials <- fit$start$value names(initials) <- rownames(fit$start) transformed <- fit$start_transformed$value names(transformed) <- rownames(fit$start_transformed) transform_odeparms(initials, SFO_SFO) #> parent_0 log_k_parent_sink log_k_parent_m1 log_k_m1_sink #> 100.750000 -2.302585 -2.301586 -2.300587 backtransform_odeparms(transformed, SFO_SFO) #> parent_0 k_parent_sink k_parent_m1 k_m1_sink #> 100.7500 0.1000 0.1001 0.1002 # \\dontrun{ # The case of formation fractions (this is now the default) SFO_SFO.ff <- mkinmod( parent = list(type = \"SFO\", to = \"m1\", sink = TRUE), m1 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded fit.ff <- mkinfit(SFO_SFO.ff, FOCUS_D, quiet = TRUE) fit.ff.s <- summary(fit.ff) print(fit.ff.s$par, 3) #> Estimate Std. Error Lower Upper #> parent_0 99.5985 1.5702 96.404 102.79 #> log_k_parent -2.3157 0.0409 -2.399 -2.23 #> log_k_m1 -5.2475 0.1332 -5.518 -4.98 #> f_parent_qlogis 0.0579 0.0893 -0.124 0.24 #> sigma 3.1255 0.3585 2.396 3.85 print(fit.ff.s$bpar, 3) #> Estimate se_notrans t value Pr(>t) Lower Upper #> parent_0 99.59848 1.57022 63.43 2.30e-36 96.40383 102.7931 #> k_parent 0.09870 0.00403 24.47 4.96e-23 0.09082 0.1073 #> k_m1 0.00526 0.00070 7.51 6.16e-09 0.00401 0.0069 #> f_parent_to_m1 0.51448 0.02230 23.07 3.10e-22 0.46912 0.5596 #> sigma 3.12550 0.35852 8.72 2.24e-10 2.39609 3.8549 initials <- c(\"f_parent_to_m1\" = 0.5) transformed <- transform_odeparms(initials, SFO_SFO.ff) backtransform_odeparms(transformed, SFO_SFO.ff) #> f_parent_to_m1 #> 0.5 # And without sink SFO_SFO.ff.2 <- mkinmod( parent = list(type = \"SFO\", to = \"m1\", sink = FALSE), m1 = list(type = \"SFO\"), use_of_ff = \"max\") #> Temporary DLL for differentials generated and loaded fit.ff.2 <- mkinfit(SFO_SFO.ff.2, FOCUS_D, quiet = TRUE) fit.ff.2.s <- summary(fit.ff.2) print(fit.ff.2.s$par, 3) #> Estimate Std. Error Lower Upper #> parent_0 84.79 3.012 78.67 90.91 #> log_k_parent -2.76 0.082 -2.92 -2.59 #> log_k_m1 -4.21 0.123 -4.46 -3.96 #> sigma 8.22 0.943 6.31 10.14 print(fit.ff.2.s$bpar, 3) #> Estimate se_notrans t value Pr(>t) Lower Upper #> parent_0 84.7916 3.01203 28.15 1.92e-25 78.6704 90.913 #> k_parent 0.0635 0.00521 12.19 2.91e-14 0.0538 0.075 #> k_m1 0.0148 0.00182 8.13 8.81e-10 0.0115 0.019 #> sigma 8.2229 0.94323 8.72 1.73e-10 6.3060 10.140 # }"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/update.mkinfit.html","id":null,"dir":"Reference","previous_headings":"","what":"Update an mkinfit model with different arguments — update.mkinfit","title":"Update an mkinfit model with different arguments — update.mkinfit","text":"function return updated mkinfit object. fitted degradation model parameters old fit used starting values updated fit. Values specified 'parms.ini' /'state.ini' override starting values.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/update.mkinfit.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Update an mkinfit model with different arguments — update.mkinfit","text":"","code":"# S3 method for class 'mkinfit' update(object, ..., evaluate = TRUE)"},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/update.mkinfit.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Update an mkinfit model with different arguments — update.mkinfit","text":"object mkinfit object updated ... Arguments mkinfit replace arguments original call. Arguments set NULL remove arguments given original call evaluate call evaluated returned call","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/reference/update.mkinfit.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Update an mkinfit model with different arguments — update.mkinfit","text":"","code":"# \\dontrun{ fit <- mkinfit(\"SFO\", subset(FOCUS_2006_D, value != 0), quiet = TRUE) parms(fit) #> parent_0 k_parent sigma #> 99.44423885 0.09793574 3.39632469 plot_err(fit) fit_2 <- update(fit, error_model = \"tc\") parms(fit_2) #> parent_0 k_parent sigma_low rsd_high #> 1.008549e+02 1.005665e-01 3.752222e-03 6.763434e-02 plot_err(fit_2) # }"},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-129-2024-02-13","dir":"Changelog","previous_headings":"","what":"mkin 1.2.9 (2024-02-13)","title":"mkin 1.2.9 (2024-02-13)","text":"‘R/plot.mixed.R’: Support 25 datasets ‘R/mkinfit.R’: Support passing observed data ‘tibble’ ‘R/parplot.R’: Support multistart objects covariate models filter negative values scaled parameters (warning) plotting. ’R/create_deg_func.R: Make sure reversible reactions specified case two observed variables, supported","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-128-unreleased","dir":"Changelog","previous_headings":"","what":"mkin 1.2.8 (unreleased)","title":"mkin 1.2.8 (unreleased)","text":"‘R/{mhmkin,status}.R’: Deal ‘saem’ fits fail updating ‘mhmkin’ object","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-127-unreleased","dir":"Changelog","previous_headings":"","what":"mkin 1.2.7 (unreleased)","title":"mkin 1.2.7 (unreleased)","text":"‘R/illparms.R’: Fix bug prevented ill-defined random effect found one random effect model. Also add test .","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-126-2023-10-14","dir":"Changelog","previous_headings":"","what":"mkin 1.2.6 (2023-10-14)","title":"mkin 1.2.6 (2023-10-14)","text":"‘inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd’: Fix erroneous call ‘endpoints()’ function","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-125-2023-08-09","dir":"Changelog","previous_headings":"","what":"mkin 1.2.5 (2023-08-09)","title":"mkin 1.2.5 (2023-08-09)","text":"‘vignettes/mesotrione_parent_2023.rnw’: Prebuilt vignette showing covariate modelling can done relevant parent degradation models. ‘inst/testdata/mesotrione_soil_efsa_2016}.xlsx’: Another example spreadsheets use ‘read_spreadsheet()’, featuring pH dependent degradation R/illparms.R: Fix detection ill-defined slope error model parameters case estimate negative","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-124-2023-05-19","dir":"Changelog","previous_headings":"","what":"mkin 1.2.4 (2023-05-19)","title":"mkin 1.2.4 (2023-05-19)","text":"R/endpoints.R: Fix calculation endpoints user specified covariate values","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-1231-unreleased","dir":"Changelog","previous_headings":"","what":"mkin 1.2.3.1 (unreleased)","title":"mkin 1.2.3.1 (unreleased)","text":"Small fixes get online docs right (example code R/hierarchical_kinetics, cluster setup cyantraniliprole dmta pathway vignettes, graphics model comparison multistart vignette), rebuild online docs","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-123-2023-04-17","dir":"Changelog","previous_headings":"","what":"mkin 1.2.3 (2023-04-17)","title":"mkin 1.2.3 (2023-04-17)","text":"‘R/{endpoints,parms,plot.mixed.mmkin,summary.saem.mmkin}.R’: Calculate parameters endpoints plot population curves specific covariate values, specific percentiles covariate values used saem fits. Depend current deSolve version possibility avoid resolving symbols shared library (compiled models) , thanks Thomas Petzoldt. ‘inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd’: Start new cluster creating model stored user specified location, otherwise symbols found worker processes. ‘tests/testthat/test_compiled_symbols.R’: new tests control problems may introduced possibility use pre-resolved symbols. ‘R/mkinerrmin.R’: Fix typo subset (use = instead ==), thanks Sebastian Meyer spotting work R 4.3.0.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-122-unreleased","dir":"Changelog","previous_headings":"","what":"mkin 1.2.2 (unreleased)","title":"mkin 1.2.2 (unreleased)","text":"‘inst/rmarkdown/templates/hierarchical_kinetics’: R markdown template facilitate application hierarchical kinetic models. ‘inst/testdata/{cyantraniliprole_soil_efsa_2014,lambda-cyhalothrin_soil_efsa_2014}.xlsx’: Example spreadsheets use ‘read_spreadsheet()’. ‘R/mhmkin.R’: Allow ‘illparms.mhmkin’ object list suitable dimensions value argument ‘no_random_effects’, making possible exclude random effects ill-defined simpler variants set degradation models. Remove possibility exclude random effects based separate fits, work well. ‘R/summary.saem.mmkin.R’: List initial parameter values summary, including random effects error model parameters. Avoid redundant warnings occurred calculation correlations fixed effects case Fisher information matrix inverted. List correlations random effects specified user covariance model. ‘R/parplot.R’: Possibility select top ‘llquant’ fraction fits parameter plots, improved legend text. ‘R/illparms.R’: Also check confidence intervals slope parameters covariate models include zero. implemented fits obtained saemix backend. ‘R/parplot.R’: Make function work also case multistart runs failed. ‘R/intervals.R’: Include correlations random effects model case .","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-121-2022-11-19","dir":"Changelog","previous_headings":"","what":"mkin 1.2.1 (2022-11-19)","title":"mkin 1.2.1 (2022-11-19)","text":"‘{data,R}/ds_mixed.rda’: Include test data package instead generating ‘tests/testthat/setup_script.R’. Refactor generating code make consistent update tests. ‘tests/testthat/setup_script.R’: Excluded another ill-defined random effect DFOP fit ‘saem’, attempt avoid platform dependence surfaced Fedora systems CRAN check farm ‘tests/testthat/test_mixed.R’: Round parameters found saemix two significant digits printing, also help avoid platform dependence tests ‘R/saem.R’: Fix bug prevented ‘error.ini’ passed ‘saemix_model’, set default c(1, 1) avoid changing test results ‘R/parplot.R’: Show initial values error model parameters ‘R/loglik.mkinfit.R’: Add ‘nobs’ attribute resulting ‘logLik’ object, order make test_AIC.R succeed current R-devel","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-120-2022-11-17","dir":"Changelog","previous_headings":"","what":"mkin 1.2.0 (2022-11-17)","title":"mkin 1.2.0 (2022-11-17)","text":"‘R/saem.R’: ‘logLik’, ‘update’ ‘anova’ methods ‘saem.mmkin’ objects. ‘R/saem.R’: Automatic estimation start parameters random effects case mkin transformations, nicely improving convergence reducing problems iterative ODE solutions. ‘R/status.R’: New generic show status information fit array objects methods ‘mmkin’, ‘mhmkin’ ‘multistart’ objects. ‘R/mhmkin.R’: New method performing multiple hierarchical mkin fits one function call, optionally parallel. ‘R/mhmkin.R’: ‘anova.mhmkin’ conveniently comparing resulting fits. ‘R/illparms.R’: New generic show ill-defined parameters methods ‘mkinfit’, ‘mmkin’, ‘saem.mmkin’ ‘mhmkin’ objects. ‘R/multistart.R’: New method testing multiple start parameters hierarchical model fits, function ‘llhist’ new generic ‘parplot’ diagnostics, new generics ‘.best’ ‘best’ extracting fit highest likelihood ‘R/summary.mmkin.R’: Summary method mmkin objects. ‘R/saem.R’: Implement test saemix transformations FOMC HS. Also, error saemix transformations requested supported. ‘R/read_spreadsheet.R’: Conveniently read data spreadsheet file. ‘R/tex_listings.R’: Conveniently include summaries fit objects R markdown documents compiled LaTeX.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-111-2022-07-12","dir":"Changelog","previous_headings":"","what":"mkin 1.1.1 (2022-07-12)","title":"mkin 1.1.1 (2022-07-12)","text":"’R/{mkinmod,mkinpredict}.R: Store DLL information mkinmod objects use information mkinpredict avoid performance regression brought bugfix R 4.2.x. Thanks Tomas Kalibera analysis problem r-package-devel list suggestion fix . ‘vignettes/FOCUS_L.rmd’: Remove outdated note referring failure calculate covariance matrix DFOP L2 dataset. Since 0.9.45.5 covariance matrix available ‘vignettes/web_only/benchmarks.rmd’: Add first benchmark data using laptop system, therefore add CPU showing benchmark results. ‘dimethenamid_2018’: Update example code use saemix ‘CAKE_export’: Check validity map argument, updates ‘saem()’: Slightly improve speed case analytical solution saemix implemented, activate test respective code ‘mean_degparms’: New argument ‘default_log_parms’ makes possible supply surrogate value (default) log parameters fail t-test ‘plot.mixed.mmkin’: Pass frame argument also residual plots, take ‘default_log_parms’ argument ‘mean_degparms’ used constructing approximate population curves, plot population curve last avoid covered data ‘plot.mkinfit’: Respect argument ‘maxabs’ residual plots, make possible give ylim list, row layouts","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mixed-effects-models-1-1-0","dir":"Changelog","previous_headings":"","what":"Mixed-effects models","title":"mkin 1.1.0 (2022-03-14)","text":"Reintroduce interface saemix version 3.0 (now CRAN), particular generic function ‘saem’ generator ‘saem.mmkin’, currently using ‘saemix_model’ ‘saemix_data’, summary plot methods ‘mean_degparms’: New argument ‘test_log_parms’ makes function consider log-transformed parameters untransformed parameters pass t-test certain confidence level. can used obtain plausible starting parameters different mixed-effects model backends ‘plot.mixed.mmkin’: Gains arguments ‘test_log_parms’ ‘conf.level’ ‘vignettes/web_only/dimethenamid_2018.rmd’: Example evaluations dimethenamid data. ‘intervals’: Provide method nlme function ‘saem.mmkin’ objects.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-105-2021-09-15","dir":"Changelog","previous_headings":"","what":"mkin 1.0.5 (2021-09-15)","title":"mkin 1.0.5 (2021-09-15)","text":"‘dimethenamid_2018’: Correct data Borstel soil. five observations Staudenmaier (2013) previously stored “Borstel 2” actually just subset 16 observations “Borstel 1” now simply “Borstel”","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-104-2021-04-20","dir":"Changelog","previous_headings":"","what":"mkin 1.0.4 (2021-04-20)","title":"mkin 1.0.4 (2021-04-20)","text":"plotting functions setting graphical parameters: Use .exit() resetting graphical parameters ‘plot.mkinfit’: Use xlab xlim residual plot show_residuals TRUE ‘mmkin’: Use cores = 1 per default Windows make easier first time users","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-103-2021-02-15","dir":"Changelog","previous_headings":"","what":"mkin 1.0.3 (2021-02-15)","title":"mkin 1.0.3 (2021-02-15)","text":"Review update README, ‘Introduction mkin’ vignette help pages","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-102-unreleased","dir":"Changelog","previous_headings":"","what":"mkin 1.0.2 (Unreleased)","title":"mkin 1.0.2 (Unreleased)","text":"‘mkinfit’: Keep model names stored ‘mkinmod’ objects, avoiding loss ‘gmkin’","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-101-2021-02-10","dir":"Changelog","previous_headings":"","what":"mkin 1.0.1 (2021-02-10)","title":"mkin 1.0.1 (2021-02-10)","text":"‘confint.mmkin’, ‘nlme.mmkin’, ‘transform_odeparms’: Fix example code dontrun sections failed current defaults ‘logLik.mkinfit’: Improve example code avoid warnings show convenient syntax ‘mkinresplot’: Re-add Katrin Lindenberger coauthor accidentally removed long ago Remove tests relying non-convergence FOMC fit FOCUS dataset platform dependent (revealed new additional tests CRAN, thanks!) Increase test tolerance parameter comparisons also proved platform dependent","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"general-1-0-0","dir":"Changelog","previous_headings":"","what":"General","title":"mkin 1.0.0 (2021-02-03)","text":"‘mkinmod’ models gain arguments ‘name’ ‘dll_dir’ , conjunction current version ‘inline’ package, make possible still use DLL used fast ODE solutions ‘deSolve’ saving restoring ‘mkinmod’ object. ‘mkindsg’ R6 class groups ‘mkinds’ datasets metadata ‘f_norm_temp_focus’ generic function normalise time intervals using FOCUS method, methods numeric vectors ‘mkindsg’ objects ‘D24_2014’ ‘dimethenamid_2018’ datasets ‘focus_soil_moisture’ FOCUS default soil moisture data ‘update’ method ‘mmkin’ objects ‘transform_odeparms’, ‘backtransform_odeparms’: Use logit transformation solitary fractions like g parameter DFOP model, formation fractions pathway one target variable ‘plot.mmkin’: Add ylab argument, making possible customize y axis label panels left without affecting residual plots. Reduce legend size vertical distance panels ‘plot.mkinfit’: Change default ylab “Observed” “Residue”. Pass xlab residual plot show_residuals TRUE.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mixed-effects-models-1-0-0","dir":"Changelog","previous_headings":"","what":"Mixed-effects models","title":"mkin 1.0.0 (2021-02-03)","text":"‘mixed.mmkin’ New container mmkin objects plotting ‘plot.mixed.mmkin’ method ‘plot.mixed.mmkin’ method used ‘nlme.mmkin’ inheriting ‘mixed.mmkin’ (currently virtual) ‘plot’, ‘summary’ ‘print’ methods ‘nlme.mmkin’ objects","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09503-2020-10-08","dir":"Changelog","previous_headings":"","what":"mkin 0.9.50.3 (2020-10-08)","title":"mkin 0.9.50.3 (2020-10-08)","text":"‘parms’: Add method mmkin objects ‘mmkin’ ‘confint(method = ’profile’): Use cores detected parallel::detectCores() per default ‘confint(method = ’profile’): Choose accuracy based ‘rel_tol’ argument, relative bounds obtained quadratic approximation ‘mkinfit’: Make ‘use_of_ff’ = “max” also default models specified using short names like “SFO” “FOMC” ‘mkinfit’: Run ‘stats::shapiro.test()’ standardized residuals warn p < 0.05 ‘mkinfit’: ‘error_model_algorithm’ = ‘d_3’ fail direct fitting fails, reports results threestep algorithm returned ‘mmkin’: fail one fits fails, assign try-error respective position mmkin object ‘mkinfit’: Ignore components state.ini correspond state variables model ‘endpoints’: Back-calculate DT50 value DT90 also biphasic models DFOP, HS SFORB","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09502-2020-05-12","dir":"Changelog","previous_headings":"","what":"mkin 0.9.50.2 (2020-05-12)","title":"mkin 0.9.50.2 (2020-05-12)","text":"Increase tolerance platform specific test results Solaris test machine CRAN Updates corrections (using spelling package) documentation","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09501-2020-05-11","dir":"Changelog","previous_headings":"","what":"mkin 0.9.50.1 (2020-05-11)","title":"mkin 0.9.50.1 (2020-05-11)","text":"Support SFORB formation fractions ‘mkinmod’: Make ‘use_of_ff’ = “max” default Improve performance ) avoiding expensive calls cost function like merge() data.frame(), b) implementing analytical solutions SFO-SFO DFOP-SFO","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-094911-2020-04-20","dir":"Changelog","previous_headings":"","what":"mkin 0.9.49.11 (2020-04-20)","title":"mkin 0.9.49.11 (2020-04-20)","text":"Increase test tolerance make pass CRAN check machines","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-094910-2020-04-18","dir":"Changelog","previous_headings":"","what":"mkin 0.9.49.10 (2020-04-18)","title":"mkin 0.9.49.10 (2020-04-18)","text":"‘nlme.mmkin’: nlme method mmkin row objects associated S3 class print, plot, anova endpoint methods ‘mean_degparms, nlme_data, nlme_function’: Three new functions facilitate building nlme models mmkin row objects ‘endpoints’: Don’t return SFORB list component ’s empty. reduces distraction complies documentation Article compiled models: Add platform specific code suppress warnings zero values removed FOCUS D dataset ‘plot.mmkin’: Add argument ‘standardized’ avoid warnings occurred passed part additional arguments captured dots (…) ‘summary.mkinfit’: Add AIC, BIC log likelihood summary","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09499-2020-03-31","dir":"Changelog","previous_headings":"","what":"mkin 0.9.49.9 (2020-03-31)","title":"mkin 0.9.49.9 (2020-03-31)","text":"‘mkinmod’: Use pkgbuild::has_compiler instead Sys.(‘gcc’), latter often fail even Rtools installed ‘mkinds’: Use roxygen documenting fields methods R6 class","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09498-2020-01-09","dir":"Changelog","previous_headings":"","what":"mkin 0.9.49.8 (2020-01-09)","title":"mkin 0.9.49.8 (2020-01-09)","text":"‘aw’: Generic function calculating Akaike weights, methods mkinfit objects mmkin columns ‘loftest’: Add lack--fit test ‘plot_res’, ‘plot_sep’ ‘mkinerrplot’: Add possibility show standardized residuals make default fits error models ‘const’ ‘lrtest.mkinfit’: Improve naming compared fits case fixed parameters ‘confint.mkinfit’: Make quadratic approximation default, likelihood profiling takes lot time, especially fit three parameters","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09497-2019-11-01","dir":"Changelog","previous_headings":"","what":"mkin 0.9.49.7 (2019-11-01)","title":"mkin 0.9.49.7 (2019-11-01)","text":"Fix bug introduced 0.9.49.6 occurred direct optimisation yielded higher likelihood three-step optimisation d_3 algorithm, caused fitted parameters three-step optimisation returned instead parameters direct optimisation Add ‘nobs’ method mkinfit objects, enabling default ‘BIC’ method stats package. Also, add ‘BIC’ method mmkin column objects.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09496-2019-10-31","dir":"Changelog","previous_headings":"","what":"mkin 0.9.49.6 (2019-10-31)","title":"mkin 0.9.49.6 (2019-10-31)","text":"Implement likelihood ratio test method ‘lrtest’ lmtest package Add ‘update’ method mkinfit objects remembers fitted parameters appropriate Add ‘residuals’ method mkinfit objects supports scaling based error model Fix bug ‘mkinfit’ prevented summaries objects fitted fixed parameters generated Add ‘parms’ ‘confint’ methods mkinfit objects. Confidence intervals based quadratic approximation summary, based profile likelihood Move long-running tests tests/testthat/slow separate test log. currently take around 7 minutes system ‘mkinfit’: Clean code return functions calculate log-likelihood sum squared residuals Vignette ‘twa.html’: Add maximum time weighted average formulas hockey stick model Support frameless plots (‘frame = FALSE’) Support suppress chi2 error level (‘show_errmin = FALSE’) ‘plot.mmkin’ Update README introductory vignette Report ‘OLS’ error_model_algorithm summary case default error_model (‘const’) used Support summarizing ‘mkinfit’ objects generated versions < 0.9.49.5","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09495-2019-07-04","dir":"Changelog","previous_headings":"","what":"mkin 0.9.49.5 (2019-07-04)","title":"mkin 0.9.49.5 (2019-07-04)","text":"Several algorithms minimization negative log-likelihood non-constant error models (two-component variance variable). case error model constant variance, least squares used stable. default algorithm ‘d_3’ tries direct minimization three-step procedure, returns model highest likelihood. argument ‘reweight.method’ mkinfit mmkin now obsolete, use ‘error_model’ ‘error_model_algorithm’ instead Add test checks get best known AIC parent fits 12 test datasets. Add test datasets purpose. New function ‘mkinerrplot’. function also used residual plots ‘plot.mmkin’ argument ‘resplot = “errmod”’ given, ‘plot.mkinfit’ ‘show_errplot’ set TRUE. Remove dependency FME, use nlminb optimisation (‘Port’ algorithm). remember cases one optimisation algorithms preferable, except sometime used Levenberg-Marquardt speed cases expect get trapped local minimum. Use numDeriv package calculate hessians. results slightly different confidence intervals, takes bit longer, apparently robust Add simple benchmark vignette document impact performance. code manual weighting removed. functionality might get added later time. time , please use earlier version, e.g. 0.9.48.1 want manual weighting. fitting time reported summary now includes time used calculation hessians Adapt tests Fix error FOCUS chi2 error level calculations occurred parameters specified parms.ini model. warning already issued, fitting parallel via mmkin go unnoticed. Add example datasets obtained risk assessment reports published European Food Safety Agency.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09481-2019-03-04","dir":"Changelog","previous_headings":"","what":"mkin 0.9.48.1 (2019-03-04)","title":"mkin 0.9.48.1 (2019-03-04)","text":"Add function ‘logLik.mkinfit’ makes possible calculate AIC mkinfit objects Add function ‘AIC.mmkin’ make easy compare columns mmkin objects ‘add_err’: Respect argument giving number replicates synthetic dataset ‘max_twa_parent’: Support maximum time weighted average concentration calculations hockey stick (HS) model ‘mkinpredict’: Make function generic create method mkinfit objects ‘mkinfit’: Improve correctness fitted two component error model fitting mean absolute deviance observation observed values, weighting current two-component error model ‘tests/testthat/test_irls.R’: Test components error model used generate data can reproduced moderate accuracy Add function ‘CAKE_export’ facilitate cross-checking results Implement logistic model (tested parent fits) ‘nafta’: Add evaluations according NAFTA guidance","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09475-2018-09-14","dir":"Changelog","previous_headings":"","what":"mkin 0.9.47.5 (2018-09-14)","title":"mkin 0.9.47.5 (2018-09-14)","text":"Make two-component error model stop cases inadequate avoid nls crashes windows Move two vignettes location built CRAN (avoid NOTES long execution times) Exclude example code testing CRAN avoid NOTES long execution times","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09473","dir":"Changelog","previous_headings":"","what":"mkin 0.9.47.3","title":"mkin 0.9.47.3","text":"‘mkinfit’: Improve fitting error model reweight.method = ‘tc’. Add ‘manual’ possible arguments ‘weight’ Test FOCUS_2006_C can evaluated DFOP reweight.method = ‘tc’","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09472-2018-07-19","dir":"Changelog","previous_headings":"","what":"mkin 0.9.47.2 (2018-07-19)","title":"mkin 0.9.47.2 (2018-07-19)","text":"‘sigma_twocomp’: Rename ‘sigma_rl’ ‘sigma_twocomp’ Rocke Lorenzato model assumes lognormal distribution large y. Correct references Rocke Lorenzato model accordingly. ‘mkinfit’: Use 1.1 starting value N parameter IORE models obtain convergence difficult cases. Show parameter names ‘trace_parms’ ‘TRUE’.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09471-2018-02-06","dir":"Changelog","previous_headings":"","what":"mkin 0.9.47.1 (2018-02-06)","title":"mkin 0.9.47.1 (2018-02-06)","text":"Skip tests CRAN winbuilder avoid timeouts ‘test_data_from_UBA_2014’: Added list datasets containing experimental data used expertise 2014 ‘mkinfit’: Added iterative reweighting method ‘tc’ using two-component error model Rocke Lorenzato. NA values data returned . ‘mkinfit’: Work around bug current FME version prevented convergence message returned case non-convergence. ‘summary.mkinfit’: Improved output regarding weighting method. predictions returned NA values model (see ). ‘summary.mkinfit’: Show versions mkin R used fitting (ones used summary) fit generated mkin >= 0.9.47.1","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09463-2017-11-16","dir":"Changelog","previous_headings":"","what":"mkin 0.9.46.3 (2017-11-16)","title":"mkin 0.9.46.3 (2017-11-16)","text":"README.md, vignettes/mkin.Rmd: URLs updated synthetic_data_for_UBA: Add code used generate data interest reproducibility","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09462-2017-10-10","dir":"Changelog","previous_headings":"","what":"mkin 0.9.46.2 (2017-10-10)","title":"mkin 0.9.46.2 (2017-10-10)","text":"Converted vignette FOCUS_Z tex/pdf markdown/html DESCRIPTION: Add ORCID","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09461-2017-09-14","dir":"Changelog","previous_headings":"","what":"mkin 0.9.46.1 (2017-09-14)","title":"mkin 0.9.46.1 (2017-09-14)","text":"plot.mkinfit: Fix scaling residual plots case separate plots observed variable plot.mkinfit: Use data points fitted curve y axis scaling case separate plots observed variable Documentation updates","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-0946-2017-07-24","dir":"Changelog","previous_headings":"","what":"mkin 0.9.46 (2017-07-24)","title":"mkin 0.9.46 (2017-07-24)","text":"Remove test_FOMC_ill-defined.R platform dependent","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09452-2017-07-24","dir":"Changelog","previous_headings":"","what":"mkin 0.9.45.2 (2017-07-24)","title":"mkin 0.9.45.2 (2017-07-24)","text":"Rename twa max_twa_parent avoid conflict twa pfm package Update URLs documentation Limit test code one core pass windows Switch microbenchmark rbenchmark former supported platforms","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"new-features-0-9-45-1","dir":"Changelog","previous_headings":"","what":"New features","title":"mkin 0.9.45.1 (2016-12-20)","text":"twa function, calculating maximum time weighted average concentrations parent (SFO, FOMC DFOP).","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-45","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9.45 (2016-12-08)","text":"plot.mkinfit plot.mmkin: plotting device tikz, LaTeX markup used chi2 error graphs. Use pkgdown, successor staticdocs generating static HTML documentation. Include example output graphs also dontrun sections. plot.mkinfit: Plotting fail compiled model available, e.g. removed temporary directory. case, uncompiled model now used plotting","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-44","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9.44 (2016-06-29)","text":"test test_FOMC_ill-defined failed several architectures, test now skipped","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"major-changes-0-9-43","dir":"Changelog","previous_headings":"","what":"Major changes","title":"mkin 0.9.43 (2016-06-28)","text":"title changed Kinetic evaluations chemical degradation data plot.mkinfit: Add possibility show fits (residual plots requested) separately observed variables plot.mkinfit: Add possibility show chi2 error levels plot, similar way shown plot.mmkin plot_sep: Add function convenience wrapper plotting observed variables mkinfit objects separately, chi2 error values residual plots. Vignettes: main vignette mkin converted R markdown updated. vignettes also updated show current improved functionality. function add_err added package, making easy generate simulated data using error model based normal distribution","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-43","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9.43 (2016-06-28)","text":"Remove outdated reference inline package compiled_models vignette mkinfit: error cases fit converges, Jacobian untransformed model cost can estimated. Give warning instead return NA t-test results. summary.mkinfit: Give warning message covariance matrix can obtained. test added containing corresponding edge case check warnings correctly issued fit terminate. plot.mmkin: Round chi2 error value three significant digits, instead two decimal digits. mkinfit: Return err values used weighted fits column named err. Also include inverse weights column value observed data used, returned observed data component mkinfit object.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-43","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9.43 (2016-06-28)","text":"endpoints: name substance degrading metabolite (e.g. parent compound) used model formulation ended letter f, rate parameters listed formation fractions mixed names. also appear summary. mkinfit: Check observed variables checking user tried fix formation fractions fitting using ilr transformation. plot.mmkin: Set plot margins correctly, also case single fit plotted, main title placed reasonable way. plot.mkinfit: Correct default values col_obs, pch_obs lty_obs case obs_vars specified.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"major-changes-0-9-42","dir":"Changelog","previous_headings":"","what":"Major changes","title":"mkin 0.9.42 (2016-03-25)","text":"Add argument from_max_mean mkinfit, fitting decline maximum observed value models single observed variable","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-42","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9.42 (2016-03-25)","text":"Add plots compiled_models vignette Give explanatory error message mkinmod fails due missing definition target variable print.mkinmod(): Improve formatting printing mkinmod model definitions","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-41","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9-41 (2015-11-09)","text":"Add R6 class mkinds representing datasets printing method Add printing method mkinmod objects Make possible specify arbitrary strings names compounds mkinmod, show plot Use index.r file group help topics static documentation","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-41","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9-41 (2015-11-09)","text":"print.summary.mkinfit(): Avoid error occurred printing summaries generated mkin versions 0.9-36","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-40","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9-40 (2015-07-21)","text":"endpoints(): DFOP SFORB models, optimize() used, make use fact DT50 must DT50_k1 DT50_k2 (DFOP) DT50_b1 DT50_b2 (SFORB), optimize() sometimes find minimum. Likewise finding DT90 values. Also fit log scale make function efficient.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"internal-changes-0-9-40","dir":"Changelog","previous_headings":"","what":"Internal changes","title":"mkin 0.9-40 (2015-07-21)","text":"DESCRIPTION, NAMESPACE, R/*.R: Import () stats, graphics methods packages, qualify function calls non-base packages installed R avoid NOTES made R CMD check –-cran upcoming R versions.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"major-changes-0-9-39","dir":"Changelog","previous_headings":"","what":"Major changes","title":"mkin 0.9-39 (2015-06-26)","text":"New function mmkin(): function takes character vector model shorthand names, alternatively list mkinmod models, well list dataset main arguments. returns matrix mkinfit objects, row model column dataset. subsetting method single brackets available. Fitting models parallel using parallel package supported. New function plot.mmkin(): Plots single-row single-column mmkin objects including residual plots.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-39","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9-39 (2015-06-26)","text":"mkinparplot(): Fix x axis scaling rate constants formation fractions got confused introduction t-values transformed parameters.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-38","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9-38 (2015-06-24)","text":"vignettes/compiled_models.html: Show performance improvement factor actually obtained building vignette, well mkin version, system info CPU model used building vignette. GNUMakefile,vignettes/*: Clean vignette generation include table contents HTML vignettes.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-38","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9-38 (2015-06-24)","text":"mkinmod(): generating C code derivatives, declare time variable needed remove ‘-W--unused-variable’ compiler flag C compiler used CRAN checks Solaris know .","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"major-changes-0-9-36","dir":"Changelog","previous_headings":"","what":"Major changes","title":"mkin 0.9-36 (2015-06-21)","text":"summary.mkinfit(): one-sided t-test significant difference untransformed parameters zero now always shown, based assumption normal distribution estimators untransformed parameters. Use caution, assumption unrealistic e.g. rate constants nonlinear kinetic models. compiler (gcc) installed, use version differential equation model compiled C code, huge performance boost models deSolve method works. mkinmod(): Create list component $cf (class CFuncList) list returned mkinmod, version can compiled autogenerated C code (see ). mkinfit(): Set default solution_type deSolve compiled version model present, except analytical solution possible.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-36","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9-36 (2015-06-21)","text":"Added simple showcase vignette evaluation FOCUS example dataset D","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"major-changes-0-9-35","dir":"Changelog","previous_headings":"","what":"Major changes","title":"mkin 0.9-35 (2015-05-15)","text":"Switch RUnit testthat testing","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-35","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9-35 (2015-05-15)","text":"mkinparplot(): Avoid warnings occurred confidence intervals available summary fit print.summary.mkinfit(): Fix printing summary case number iterations available NAMESPACE: export S3 methods plot.mkinfit, summary.mkinfit print.summary.mkinfit satisfy R CMD check R-devel mkinparplot(): Avoid warning R CMD check undeclared global variable Lower","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"new-features-0-9-35","dir":"Changelog","previous_headings":"","what":"New features","title":"mkin 0.9-35 (2015-05-15)","text":"mkinfit(): Report successful termination quiet = FALSE. helpful difficult problems fitted reweight.method = obs, progress often indicated reweighting. first test using results established expertise written German Federal Environmental Agency (UBA) added. Add synthetic datasets generated expertise written German Federal Environmental Agency UBA Add tests based datasets","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"new-features-0-9-34","dir":"Changelog","previous_headings":"","what":"New features","title":"mkin 0.9-34 (2014-11-22)","text":"Add convenience function mkinsub() creating lists used mkinmod() Add possibility fit indeterminate order rate equation (IORE) models using analytical solution (parent ) numeric solution. Paths IORE compounds metabolites supported using formation fractions (use_of_ff = ‘max’). Note numerical solution (method.ode = ‘deSolve’) IORE differential equations sometimes fails due numerical problems. Switch using Port algorithm (using model/trust region approach) per default. needing iterations Levenberg-Marquardt algorithm previously used per default, less sensitive starting parameters.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-34","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9-34 (2014-11-22)","text":"formatting differential equations summary improved Always include 0 y axis plotting fit","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"new-features-0-9-33","dir":"Changelog","previous_headings":"","what":"New features","title":"mkin 0.9-33 (2014-10-22)","text":"initial value (state.ini) observed variable highest observed residue set 100 case time zero observation state.ini = \"auto\" basic unit test mkinerrmin() written","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-33","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9-33 (2014-10-22)","text":"mkinfit(): internally fitted parameter g named g_ilr even transform_fractions=FALSE mkinfit(): initial value (state.ini) parent compound set parent () variable highest value observed data. mkinerrmin(): checking degrees freedom metabolites, check time zero value fixed instead checking observed value zero. ensures correct calculation degrees freedom also cases metabolite residue time zero greater zero. plot.mkinfit(): Avoid warning message using first component ylim occurred ylim specified explicitly","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-33","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9-33 (2014-10-22)","text":"formatting differential equations summary improved wrapping overly long lines FOCUS_Z vignette rebuilt improvement using width 70 avoid output outside grey area print.summary.mkinfit(): Avoid warning occurred gmkin showed summaries initial fits without iterations mkinfit(): Avoid warning occurred summarising fit performed maxitmodFit = 0 done gmkin configuring new fits.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"new-features-0-9-32","dir":"Changelog","previous_headings":"","what":"New features","title":"mkin 0.9-32 (2014-07-24)","text":"number degrees freedom difficult define case ilr transformation formation fractions. Now source compartment number ilr parameters (=number optimised parameters) divided number pathways metabolites (=number affected data series) leads fractional degrees freedom cases. default initial value first state value now taken mean observations time zero, available. kinetic model can alternatively specified shorthand name parent degradation models, e.g. SFO, DFOP. Optimisation method, number model evaluations time elapsed optimisation given summary mkinfit objects. maximum number iterations optimisation algorithm can specified using argument maxit.modFit mkinfit function. mkinfit gives warning fit converge (apply SANN method). warning included summary.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-32","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9-32 (2014-07-24)","text":"Avoid plotting artificial 0 residual time zero mkinresplot determination degrees freedom mkinerrmin, formation fractions accounted multiple times case parallel formation metabolites. See new feature described solution. transform_rates=FALSE mkinfit now also works FOMC HS models. Initial values formation fractions set cases. warning given fit converge method default Levenberg-Marquardt method Marq used.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-32","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9-32 (2014-07-24)","text":"Vignettes rebuilt reflect changes summary method. Algorithm Pseudo excluded needs user-defined parameter limits supported. Algorithm Newton excluded different way specify maximum number iterations appear provide additional benefits.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"bug-fixes-0-9-31","dir":"Changelog","previous_headings":"","what":"Bug fixes","title":"mkin 0.9-31 (2014-07-14)","text":"internal renaming optimised parameters Version 0.9-30 led errors determination degrees freedom chi2 error level calulations mkinerrmin() used summary function.","code":""},{"path":[]},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"new-features-0-9-30","dir":"Changelog","previous_headings":"","what":"New features","title":"mkin 0.9-30 (2014-07-11)","text":"now possible use formation fractions combination turning sink mkinmod().","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"major-changes-0-9-30","dir":"Changelog","previous_headings":"","what":"Major changes","title":"mkin 0.9-30 (2014-07-11)","text":"original transformed parameters now different names (e.g. k_parent log_k_parent. also differ many formation fractions pathway sink. order information blocks print.summary.mkinfit.R() ordered logical way.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"minor-changes-0-9-30","dir":"Changelog","previous_headings":"","what":"Minor changes","title":"mkin 0.9-30 (2014-07-11)","text":"vignette FOCUS_Z simplified use formation fractions turning sink, slightly amended use new versions DT50 values calculated since mkin 0.9-29. vignettes rebuilt reflect changes. ChangeLog renamed NEWS.md entries converted markdown syntax compatible tools::news() function built R. test suite overhauled. Tests DFOP SFORB models dataset FOCUS_2006_A removed, much dependent optimisation algorithm /starting parameters, dataset SFO (compare kinfit vignette). Also, Schaefer complex case can now fitted using formation fractions, ‘Port’ optimisation method also fit A2 way published Piacenza paper. checks introduced mkinfit(), leading warnings stopping execution unsupported combinations methods parameters requested.","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09-29-2014-06-27","dir":"Changelog","previous_headings":"","what":"mkin 0.9-29 (2014-06-27)","title":"mkin 0.9-29 (2014-06-27)","text":"R/mkinresplot.R: Make possible specify xlim R/geometric_mean.R, man/geometric_mean.Rd: Add geometric mean function R/endpoints.R, man/endpoints.Rd: Calculate additional (pseudo)-DT50 values FOMC, DFOP, HS SFORB. Avoid calculation formation fractions rate constants directly fitted","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09-28-2014-05-20","dir":"Changelog","previous_headings":"","what":"mkin 0.9-28 (2014-05-20)","title":"mkin 0.9-28 (2014-05-20)","text":"backtransform confidence intervals formation fractions one compound formed, parameters define pathways set Add historical remarks background main package vignette Correct ‘isotropic’ ‘isometric’ ilr transformation","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09-27-2014-05-10","dir":"Changelog","previous_headings":"","what":"mkin 0.9-27 (2014-05-10)","title":"mkin 0.9-27 (2014-05-10)","text":"Fork GUI separate package gmkin DESCRIPTION, NAMESPACE, TODO: Adapt add copyright information Remove files belonging GUI Possibility fit without parameter transformations, using bounds implemented FME Add McCall 2,4,5-T dataset Enable selection observed variables plotting Add possibility show residual plot plot.mkinfit R/mkinparplot.R, man/mkinparplot.Rd: plot parameters confidence intervals Change vignette format Sweave knitr Split examples vignette FOCUS_L FOCUS_Z Remove warning constant formation fractions mkinmod based misconception Restrict unit test Schaefer data parent primary metabolites formation fraction DT50 A2 highly correlated passing test platform dependent. example, test fails 1 14 platforms CRAN today. Add Eurofins Regulatory AG copyright notices Import FME deSolve instead depending clean startup Add starter function GUI: gmkin() Change format workspace files gmkin can distributed documented package Add gmkin workspace datasets FOCUS_2006_gmkin FOCUS_2006_Z_gmkin","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09-24-2013-11-06","dir":"Changelog","previous_headings":"","what":"mkin 0.9-24 (2013-11-06)","title":"mkin 0.9-24 (2013-11-06)","text":"Bugfix re-enabling fixing combination initial values state variables Default values kinetic rate constants 0.1 “salted” small increment avoid numeric artefacts eigenvalue based solutions Backtransform fixed ODE parameters summary","code":""},{"path":"https://pkgdown.jrwb.de/mkin/dev/news/index.html","id":"mkin-09-22-2013-10-26","dir":"Changelog","previous_headings":"","what":"mkin 0.9-22 (2013-10-26)","title":"mkin 0.9-22 (2013-10-26)","text":"Get rid optimisation step mkinerrmin - unnecessary. Thanks KinGUII inspiration - actually equation 6-2 FOCUS kinetics p. 91 overlooked originally Fix plot.mkinfit passed graphical arguments like main solver use plot=TRUE mkinfit() example first successful fits simple GUI Fix iteratively reweighted least squares case many metabolites Unify naming initial values state variables Unify naming dataframes optimised fixed parameters summary Show weighting method residuals summary Correct output data case manual weighting Implement IRLS assuming different variances observed variables use 0 values time zero chi2 error level calculations. way done KinGUII makes sense. impact chi2 error levels output. Generally seem lower metabolites now, presumably mean observed values higher detailed list changes mkin source please consult commit history http://github.com/jranke/mkin","code":""}] diff --git a/docs/dev/sitemap.xml b/docs/dev/sitemap.xml new file mode 100644 index 00000000..962cd315 --- /dev/null +++ b/docs/dev/sitemap.xml @@ -0,0 +1,109 @@ + +https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_D.html +https://pkgdown.jrwb.de/mkin/dev/articles/FOCUS_L.html +https://pkgdown.jrwb.de/mkin/dev/articles/index.html +https://pkgdown.jrwb.de/mkin/dev/articles/mkin.html +https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_cyan_pathway.html +https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_parent.html +https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2022_dmta_pathway.html +https://pkgdown.jrwb.de/mkin/dev/articles/prebuilt/2023_mesotrione_parent.html +https://pkgdown.jrwb.de/mkin/dev/articles/twa.html +https://pkgdown.jrwb.de/mkin/dev/articles/web_only/FOCUS_Z.html +https://pkgdown.jrwb.de/mkin/dev/articles/web_only/NAFTA_examples.html +https://pkgdown.jrwb.de/mkin/dev/articles/web_only/benchmarks.html +https://pkgdown.jrwb.de/mkin/dev/articles/web_only/compiled_models.html +https://pkgdown.jrwb.de/mkin/dev/articles/web_only/dimethenamid_2018.html +https://pkgdown.jrwb.de/mkin/dev/articles/web_only/multistart.html +https://pkgdown.jrwb.de/mkin/dev/articles/web_only/saem_benchmarks.html +https://pkgdown.jrwb.de/mkin/dev/authors.html +https://pkgdown.jrwb.de/mkin/dev/index.html +https://pkgdown.jrwb.de/mkin/dev/news/index.html +https://pkgdown.jrwb.de/mkin/dev/reference/AIC.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/CAKE_export.html +https://pkgdown.jrwb.de/mkin/dev/reference/D24_2014.html +https://pkgdown.jrwb.de/mkin/dev/reference/DFOP.solution.html +https://pkgdown.jrwb.de/mkin/dev/reference/Extract.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_DFOP_ref_A_to_B.html +https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_FOMC_ref_A_to_F.html +https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_HS_ref_A_to_F.html +https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_SFO_ref_A_to_F.html +https://pkgdown.jrwb.de/mkin/dev/reference/FOCUS_2006_datasets.html +https://pkgdown.jrwb.de/mkin/dev/reference/FOMC.solution.html +https://pkgdown.jrwb.de/mkin/dev/reference/HS.solution.html +https://pkgdown.jrwb.de/mkin/dev/reference/IORE.solution.html +https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_2015.html +https://pkgdown.jrwb.de/mkin/dev/reference/NAFTA_SOP_Attachment.html +https://pkgdown.jrwb.de/mkin/dev/reference/SFO.solution.html +https://pkgdown.jrwb.de/mkin/dev/reference/SFORB.solution.html +https://pkgdown.jrwb.de/mkin/dev/reference/add_err.html +https://pkgdown.jrwb.de/mkin/dev/reference/anova.saem.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/aw.html +https://pkgdown.jrwb.de/mkin/dev/reference/check_failed.html +https://pkgdown.jrwb.de/mkin/dev/reference/confint.mkinfit.html +https://pkgdown.jrwb.de/mkin/dev/reference/create_deg_func.html +https://pkgdown.jrwb.de/mkin/dev/reference/dimethenamid_2018.html +https://pkgdown.jrwb.de/mkin/dev/reference/ds_mixed.html +https://pkgdown.jrwb.de/mkin/dev/reference/endpoints.html +https://pkgdown.jrwb.de/mkin/dev/reference/experimental_data_for_UBA.html +https://pkgdown.jrwb.de/mkin/dev/reference/f_time_norm_focus.html +https://pkgdown.jrwb.de/mkin/dev/reference/focus_soil_moisture.html +https://pkgdown.jrwb.de/mkin/dev/reference/get_deg_func.html +https://pkgdown.jrwb.de/mkin/dev/reference/hierarchical_kinetics.html +https://pkgdown.jrwb.de/mkin/dev/reference/illparms.html +https://pkgdown.jrwb.de/mkin/dev/reference/ilr.html +https://pkgdown.jrwb.de/mkin/dev/reference/index.html +https://pkgdown.jrwb.de/mkin/dev/reference/intervals.saem.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/llhist.html +https://pkgdown.jrwb.de/mkin/dev/reference/loftest.html +https://pkgdown.jrwb.de/mkin/dev/reference/logLik.mkinfit.html +https://pkgdown.jrwb.de/mkin/dev/reference/logLik.saem.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/logistic.solution.html +https://pkgdown.jrwb.de/mkin/dev/reference/lrtest.mkinfit.html +https://pkgdown.jrwb.de/mkin/dev/reference/max_twa_parent.html +https://pkgdown.jrwb.de/mkin/dev/reference/mccall81_245T.html +https://pkgdown.jrwb.de/mkin/dev/reference/mean_degparms.html +https://pkgdown.jrwb.de/mkin/dev/reference/mhmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/mixed.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkin_long_to_wide.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkin_wide_to_long.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinds.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkindsg.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrmin.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinerrplot.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinfit.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinmod.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinparplot.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinplot.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinpredict.html +https://pkgdown.jrwb.de/mkin/dev/reference/mkinresplot.html +https://pkgdown.jrwb.de/mkin/dev/reference/mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/multistart.html +https://pkgdown.jrwb.de/mkin/dev/reference/nafta.html +https://pkgdown.jrwb.de/mkin/dev/reference/nlme.html +https://pkgdown.jrwb.de/mkin/dev/reference/nlme.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/nobs.mkinfit.html +https://pkgdown.jrwb.de/mkin/dev/reference/parms.html +https://pkgdown.jrwb.de/mkin/dev/reference/parplot.html +https://pkgdown.jrwb.de/mkin/dev/reference/plot.mixed.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/plot.mkinfit.html +https://pkgdown.jrwb.de/mkin/dev/reference/plot.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/plot.nafta.html +https://pkgdown.jrwb.de/mkin/dev/reference/read_spreadsheet.html +https://pkgdown.jrwb.de/mkin/dev/reference/reexports.html +https://pkgdown.jrwb.de/mkin/dev/reference/residuals.mkinfit.html +https://pkgdown.jrwb.de/mkin/dev/reference/saem.html +https://pkgdown.jrwb.de/mkin/dev/reference/schaefer07_complex_case.html +https://pkgdown.jrwb.de/mkin/dev/reference/set_nd_nq.html +https://pkgdown.jrwb.de/mkin/dev/reference/sigma_twocomp.html +https://pkgdown.jrwb.de/mkin/dev/reference/status.html +https://pkgdown.jrwb.de/mkin/dev/reference/summary.mkinfit.html +https://pkgdown.jrwb.de/mkin/dev/reference/summary.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/summary.nlme.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/summary.saem.mmkin.html +https://pkgdown.jrwb.de/mkin/dev/reference/summary_listing.html +https://pkgdown.jrwb.de/mkin/dev/reference/synthetic_data_for_UBA_2014.html +https://pkgdown.jrwb.de/mkin/dev/reference/test_data_from_UBA_2014.html +https://pkgdown.jrwb.de/mkin/dev/reference/transform_odeparms.html +https://pkgdown.jrwb.de/mkin/dev/reference/update.mkinfit.html + + -- cgit v1.2.1