From 68dfb1366e29a9c06bd445806a5fac20e84093d4 Mon Sep 17 00:00:00 2001 From: AshesITR Date: Mon, 24 Jun 2024 07:30:08 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20AshesITR?= =?UTF-8?q?/reservr@5ae0eb2cd9030a5299f8a3002531b02f616a4127=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- articles/jss_paper.html | 6 +- articles/tensorflow.html | 184 +++++++++++++++++------------------ pkgdown.yml | 2 +- reference/Distribution.html | 2 +- reference/dist_trunc-1.png | Bin 99906 -> 100675 bytes reference/dist_uniform-1.png | Bin 88538 -> 90815 bytes search.json | 2 +- 7 files changed, 98 insertions(+), 98 deletions(-) diff --git a/articles/jss_paper.html b/articles/jss_paper.html index c02ccf4..1309d75 100644 --- a/articles/jss_paper.html +++ b/articles/jss_paper.html @@ -807,9 +807,9 @@

## # A tibble: 3 × 6
 ##   expression                            min  median `itr/sec` mem_alloc `gc/sec`
 ##   <bch:expr>                        <bch:t> <bch:t>     <dbl> <bch:byt>    <dbl>
-## 1 dist$density(-2:2, with_params =… 27.08µs 29.92µs    32435.        0B     16.2
-## 2 denscmp(-2:2, matrix(c(0, 1), nr…   4.1µs  4.79µs   200114.        0B     40.0
-## 3 dnorm(-2:2, mean = rep(0, 5L), s…  1.66µs  1.96µs   478716.    2.58KB      0
+## 1 dist$density(-2:2, with_params =… 26.01µs 28µs 34686. 0B 17.4 +## 2 denscmp(-2:2, matrix(c(0, 1), nr… 4.12µs 4.71µs 204950. 0B 41.0 +## 3 dnorm(-2:2, mean = rep(0, 5L), s… 1.68µs 1.92µs 492249. 2.58KB 0

diff --git a/articles/tensorflow.html b/articles/tensorflow.html index 1a09558..e8215ef 100644 --- a/articles/tensorflow.html +++ b/articles/tensorflow.html @@ -188,207 +188,207 @@

A simple linear model#> generated.

#> Epoch 0/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 483ms/step - loss: 56.18431/1 ━━━━━━━━━━━━━━━━━━━━ 0s 487ms/step - loss: 56.1843
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 341ms/step - loss: 56.18431/1 ━━━━━━━━━━━━━━━━━━━━ 0s 344ms/step - loss: 56.1843
 #> Epoch 1/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 46.63251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 46.6325
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 46.63251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 46.6325
 #> Epoch 2/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 39.75831/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 39.7583
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 39.75831/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 39.7583
 #> Epoch 3/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 35.50141/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 35.5014
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 35.50141/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 35.5014
 #> Epoch 4/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.62621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.6262
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.62621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.6262
 #> Epoch 5/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.64411/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.6441
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.64411/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.6441
 #> Epoch 6/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.80991/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 34.8099
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 34.80991/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.8099
 #> Epoch 7/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 36.28141/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 36.2814
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 36.28141/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 36.2814
 #> Epoch 8/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 37.38771/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 37.3877
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 37.38771/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 37.3877
 #> Epoch 9/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 37.80121/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 37.8012
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step - loss: 37.80121/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step - loss: 37.8012
 #> Epoch 10/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 37.51511/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 37.5151
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 37.51511/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 37.5151
 #> Epoch 11/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 36.71811/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 36.7181
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 36.71811/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 36.7181
 #> Epoch 12/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 35.67251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 35.6725
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 35.67251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 35.6725
 #> Epoch 13/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.63281/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.6328
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 34.63281/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.6328
 #> Epoch 14/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.79741/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.7974
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.79741/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.7974
 #> Epoch 15/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.28291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.2829
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.28291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.2829
 #> Epoch 16/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.11521/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.1152
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.11521/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.1152
 #> Epoch 17/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.23721/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.2372
 #> Epoch 18/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.53231/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.5323
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.53231/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.5323
 #> Epoch 19/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.86181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.8618
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.86181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.8618
 #> Epoch 20/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.10381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 34.1038
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.10381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.1038
 #> Epoch 21/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.18291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 34.1829
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 34.18291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.1829
 #> Epoch 22/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.08131/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 34.0813
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 34.08131/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.0813
 #> Epoch 23/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.83221/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.8322
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.83221/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.8322
 #> Epoch 24/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.50171/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.5017
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.50171/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.5017
 #> Epoch 25/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.16641/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.1664
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.16641/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.1664
 #> Epoch 26/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.89201/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8920
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.89201/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.8920
 #> Epoch 27/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.71911/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.7191
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.71911/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.7191
 #> Epoch 28/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.65621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.6562
 #> Epoch 29/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.68181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.6818
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.68181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.6818
 #> Epoch 30/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.75441/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.7544
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.75441/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.7544
 #> Epoch 31/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.82651/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8265
 #> Epoch 32/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.85911/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8591
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.85911/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.8591
 #> Epoch 33/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.83111/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8311
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.83111/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.8311
 #> Epoch 34/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.74251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.7425
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.74251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.7425
 #> Epoch 35/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.61121/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.6112
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.61121/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.6112
 #> Epoch 36/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.46491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.4649
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.46491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.4649
 #> Epoch 37/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.33131/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.3313
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.33131/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.3313
 #> Epoch 38/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.23041/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.2304
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.23041/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.2304
 #> Epoch 39/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.16951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1695
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.16951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1695
 #> Epoch 40/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.14301/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1430
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.14301/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1430
 #> Epoch 41/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.13571/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1357
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.13571/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1357
 #> Epoch 42/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.12951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1295
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.12951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1295
 #> Epoch 43/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.10861/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1086
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.10861/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1086
 #> Epoch 44/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.06491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.0649
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.06491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.0649
 #> Epoch 45/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.99891/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.9989
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 31.99891/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.9989
 #> Epoch 46/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.91821/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.9182
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 31.91821/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.9182
 #> Epoch 47/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.83421/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.8342
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.83421/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.8342
 #> Epoch 48/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.75761/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.7576
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.75761/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.7576
 #> Epoch 49/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.69491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.6949
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.69491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.6949
 #> Epoch 50/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.64701/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.6470
 #> Epoch 51/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.60981/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.6098
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.60981/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.6098
 #> Epoch 52/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.57631/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.5763
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.57631/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.5763
 #> Epoch 53/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.53921/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.5392
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.53921/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.5392
 #> Epoch 54/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step - loss: 31.49401/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step - loss: 31.4940
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.49401/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.4940
 #> Epoch 55/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.43951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.4395
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 31.43951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.4395
 #> Epoch 56/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.37821/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.3782
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.37821/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.3782
 #> Epoch 57/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.31441/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.3144
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.31441/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.3144
 #> Epoch 58/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.25271/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.2527
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step - loss: 31.25271/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step - loss: 31.2527
 #> Epoch 59/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.19611/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.1961
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.19611/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.1961
 #> Epoch 60/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.14541/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.1454
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.14541/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.1454
 #> Epoch 61/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.09891/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.0989
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.09891/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.0989
 #> Epoch 62/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.05381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.0538
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.05381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.0538
 #> Epoch 63/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.00711/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.0071
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.00711/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.0071
 #> Epoch 64/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.95711/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.9571
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.95711/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.9571
 #> Epoch 65/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.90341/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.9034
 #> Epoch 66/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.84721/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.8472
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.84721/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.8472
 #> Epoch 67/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.79051/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.7905
 #> Epoch 68/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.73501/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.7350
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.73501/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.7350
 #> Epoch 69/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.68181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.6818
 #> Epoch 70/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.63071/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.6307
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.63071/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.6307
 #> Epoch 71/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.58091/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.5809
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.58091/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.5809
 #> Epoch 72/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.53111/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.5311
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.53111/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.5311
 #> Epoch 73/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.48021/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.4802
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.48021/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.4802
 #> Epoch 74/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.42771/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.4277
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.42771/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.4277
 #> Epoch 75/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.37391/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.3739
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.37391/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.3739
 #> Epoch 76/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.31951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.3195
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.31951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.3195
 #> Epoch 77/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.26531/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.2653
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.26531/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.2653
 #> Epoch 78/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.21201/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.2120
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.21201/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.2120
 #> Epoch 79/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.15961/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.1596
 #> Epoch 80/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.10781/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.1078
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.10781/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.1078
 #> Epoch 81/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.05621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.0562
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.05621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.0562
 #> Epoch 82/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.00421/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.0042
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.00421/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.0042
 #> Epoch 83/100
 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.95161/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.9516
 #> Epoch 84/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.89851/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.8985
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.89851/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.8985
 #> Epoch 85/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.84501/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.8450
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.84501/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.8450
 #> Epoch 86/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.79171/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.7917
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.79171/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.7917
 #> Epoch 87/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.73871/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.7387
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.73871/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.7387
 #> Epoch 88/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.68611/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.6861
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.68611/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.6861
 #> Epoch 89/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.63381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.6338
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.63381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.6338
 #> Epoch 90/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.58161/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.5816
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.58161/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.5816
 #> Epoch 91/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.52921/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.5292
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.52921/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.5292
 #> Epoch 92/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.47661/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.4766
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.47661/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.4766
 #> Epoch 93/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.42371/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.4237
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.42371/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.4237
 #> Epoch 94/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.37081/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.3708
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.37081/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.3708
 #> Epoch 95/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.31801/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.3180
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.31801/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.3180
 #> Epoch 96/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.26531/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.2653
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.26531/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.2653
 #> Epoch 97/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.21291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.2129
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.21291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.2129
 #> Epoch 98/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.16051/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.1605
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.16051/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.1605
 #> Epoch 99/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.10831/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.1083
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.10831/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.1083
 #> Epoch 100/100
-#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.05601/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 29.0560
+#> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.05601/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.0560

#> [1] 4.854740 1.606937
 #> (Intercept)           x 
diff --git a/pkgdown.yml b/pkgdown.yml
index d5a2a8a..aecf3be 100644
--- a/pkgdown.yml
+++ b/pkgdown.yml
@@ -5,7 +5,7 @@ articles:
   distributions: distributions.html
   jss_paper: jss_paper.html
   tensorflow: tensorflow.html
-last_built: 2024-06-17T17:19Z
+last_built: 2024-06-24T07:29Z
 urls:
   reference: https://ashesitr.github.io/reservr/reference
   article: https://ashesitr.github.io/reservr/articles
diff --git a/reference/Distribution.html b/reference/Distribution.html
index 65a4e7c..77c6905 100644
--- a/reference/Distribution.html
+++ b/reference/Distribution.html
@@ -1425,7 +1425,7 @@ 

Examples#> jac_full[, grepl("^probs", nms)] <- 1 #> list(constraints = rowSums(prob_mat) - 1, jacobian = jac_full) #> } -#> <environment: 0x55da7f5f5a30> +#> <environment: 0x558ee951cb38> ## ------------------------------------------------ ## Method `Distribution$export_functions` diff --git a/reference/dist_trunc-1.png b/reference/dist_trunc-1.png index cce84cc969c3330eacd51878c19039c0e0e37bd2..dc58b63fd765f009ff61303e9015d0279d9b87f9 100644 GIT binary patch literal 100675 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≶JX0p)2s!45Fo*QWbN=})I02NYMS;=g_lO5$} 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 J%Q~loCIG$agk=B# diff --git a/reference/dist_uniform-1.png b/reference/dist_uniform-1.png index ea66f9c7cc638017868421b6a8d3f5627ca9ab64..3829da34a4f019c97d16def269d098109d76524f 100644 GIT binary patch literal 90815 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

&kCr{5SahXWk!$v=YD=(Z_Th${b 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¨26Q?3 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 RV=|Lbyx0f9iUm6hb5K_JM!5D4@o8VdNI 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

M-fnV5)2~ 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 I&#BA*16>kb{{R30 diff --git a/search.json b/search.json index a026880..6870fda 100644 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"distributions","dir":"Articles","previous_headings":"","what":"Distributions","title":"Working with Distributions","text":"Distributions set classes available reservr specify distribution families random variables. Distribution inherits R6 Class Distribution provides functionality necessary working specific family. Distribution can defined calling one constructor functions, prefixed dist_ package. constructors accept parameters family arguments. arguments specified, corresponding parameter considered fixed sense need specified computing something distribution assumed fixed calling fit() distribution instance.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"sample","dir":"Articles","previous_headings":"Distributions","what":"Sample","title":"Working with Distributions","text":"example, unspecified normal distribution can created calling dist_normal() without arguments. means parameters mean sd considered placeholders. want , e.g., sample norm, must specify placeholders with_params argument:","code":"library(reservr) set.seed(1L) # Instantiate an unspecified normal distribution norm <- dist_normal() x <- norm$sample(n = 10L, with_params = list(mean = 3, sd = 1)) set.seed(1L) norm2 <- dist_normal(sd = 1) x2 <- norm2$sample(n = 10L, with_params = list(mean = 3)) # the same RVs are drawn because the distribution parameters and the seed were the same stopifnot(identical(x, x2))"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"density","dir":"Articles","previous_headings":"Distributions","what":"Density","title":"Working with Distributions","text":"density() function computes density distribution respect natural measure. Use is_discrete_at() check point discrete mass lebesgue density. diff_density() computes gradient density respect free parameter. Setting log = TRUE computes gradient log-density, .e., gradient log f(x, params) instead.","code":"norm$density(x, with_params = list(mean = 3, sd = 1)) #> [1] 0.3278626 0.3922715 0.2813724 0.1117603 0.3778620 0.2849269 0.3542572 #> [8] 0.3037652 0.3380030 0.3807663 dnorm(x, mean = 3, sd = 1) #> [1] 0.3278626 0.3922715 0.2813724 0.1117603 0.3778620 0.2849269 0.3542572 #> [8] 0.3037652 0.3380030 0.3807663 norm$density(x, log = TRUE, with_params = list(mean = 3, sd = 1)) # log-density #> [1] -1.1151607 -0.9358010 -1.2680761 -2.1913990 -0.9732262 -1.2555227 #> [7] -1.0377321 -1.1915002 -1.0847006 -0.9655696 norm$is_discrete_at(x, with_params = list(mean = 3, sd = 1)) #> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # A discrete distribution with mass only at point = x[1]. dd <- dist_dirac(point = x[1]) dd$density(x) #> [1] 1 0 0 0 0 0 0 0 0 0 dd$is_discrete_at(x) #> [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE norm$diff_density(x, with_params = list(mean = 3, sd = 1)) #> $mean #> [1] -0.20539076 0.07203805 -0.23512285 0.17828905 0.12450847 -0.23377349 #> [7] 0.17267525 0.22427736 0.19461580 -0.11628160 #> #> $sd #> [1] -0.19919475 -0.37904224 -0.08489705 0.17266080 -0.33683550 -0.09312311 #> [7] -0.27009027 -0.13817569 -0.22594681 -0.34525522"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"probability","dir":"Articles","previous_headings":"Distributions","what":"Probability","title":"Working with Distributions","text":"probability(), c.d.f., survival function, logarithms can computed. discrete distributions, dist$probability(x, lower.tail = TRUE) returns \\(P(X \\le x)\\) dist$probability(x, lower.tail = FALSE) returns \\(P(X > x)\\). Gradients (log-)c.d.f. survival function respect parameters can computed using diff_probability().","code":"norm$probability(x, with_params = list(mean = 3, sd = 1)) #> [1] 0.2655087 0.5728534 0.2016819 0.9446753 0.6291140 0.2059746 0.6870228 #> [8] 0.7698414 0.7176185 0.3800352 pnorm(x, mean = 3, sd = 1) #> [1] 0.2655087 0.5728534 0.2016819 0.9446753 0.6291140 0.2059746 0.6870228 #> [8] 0.7698414 0.7176185 0.3800352 dd$probability(x) #> [1] 1 1 0 1 1 0 1 1 1 1 dd$probability(x, lower.tail = FALSE, log.p = TRUE) #> [1] -Inf -Inf 0 -Inf -Inf 0 -Inf -Inf -Inf -Inf norm$diff_probability(x, with_params = list(mean = 3, sd = 1)) #> $mean #> [1] -0.3278626 -0.3922715 -0.2813724 -0.1117603 -0.3778620 -0.2849269 #> [7] -0.3542572 -0.3037652 -0.3380030 -0.3807663 #> #> $sd #> [1] 0.20539076 -0.07203805 0.23512285 -0.17828905 -0.12450847 0.23377349 #> [7] -0.17267525 -0.22427736 -0.19461580 0.11628160"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"hazard","dir":"Articles","previous_headings":"Distributions","what":"Hazard","title":"Working with Distributions","text":"hazard rate defined \\(h(x, \\theta) = f(x, \\theta) / S(x, \\theta)\\), .e., ratio density survival function.","code":"norm$hazard(x, with_params = list(mean = 3, sd = 1)) #> [1] 0.4463805 0.9183533 0.3524565 2.0200785 1.0188091 0.3588385 1.1318948 #> [8] 1.3198083 1.1969728 0.6141740 norm$hazard(x, log = TRUE, with_params = list(mean = 3, sd = 1)) #> [1] -0.80658365 -0.08517306 -1.04282794 0.70313635 0.01863443 -1.02488292 #> [7] 0.12389301 0.27748652 0.17979571 -0.48747702"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"fitting","dir":"Articles","previous_headings":"Distributions","what":"Fitting","title":"Working with Distributions","text":"fit() generic defined Distributions perform maximum likelihood estimation. accepts weighted, censored truncated sample class trunc_obs, can automatically convert uncensored, untruncated observations without weight proper trunc_obs object.","code":"# Fit with mean, sd free fit1 <- fit(norm, x) # Fit with mean free fit2 <- fit(norm2, x) # Fit with sd free fit3 <- fit(dist_normal(mean = 3), x) # Fitted parameters fit1$params #> $mean #> [1] 3.132203 #> #> $sd #> [1] 0.7405289 fit2$params #> $mean #> [1] 3.132203 fit3$params #> $sd #> [1] 0.752237 # log-Likelihoods can be computed on AIC(fit1$logLik) #> [1] 26.37096 AIC(fit2$logLik) #> [1] 25.8626 AIC(fit3$logLik) #> [1] 24.68469 # Convergence checks fit1$opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\" fit2$opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\" fit3$opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\""},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"fitting-censored-data","dir":"Articles","previous_headings":"Distributions","what":"Fitting censored data","title":"Working with Distributions","text":"can also fit interval-censored data.","code":"params <- list(mean = 30, sd = 10) x <- norm$sample(100L, with_params = params) xl <- floor(x) xr <- ceiling(x) cens_fit <- fit(norm, trunc_obs(xmin = xl, xmax = xr)) print(cens_fit) #> $params #> $params$mean #> [1] 31.25 #> #> $params$sd #> [1] 9.112857 #> #> #> $opt #> $opt$par #> mean sd #> 31.250000 9.112857 #> #> $opt$value #> [1] 362.9126 #> #> $opt$iter #> [1] 5 #> #> $opt$convergence #> [1] 1 #> #> $opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\" #> #> #> $logLik #> 'log Lik.' -362.9126 (df=2)"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"fitting-truncated-data","dir":"Articles","previous_headings":"Distributions","what":"Fitting truncated data","title":"Working with Distributions","text":"possible fit randomly truncated samples, .e., samples truncation bound also random differs observed observation.","code":"params <- list(mean = 30, sd = 10) x <- norm$sample(100L, with_params = params) tl <- runif(length(x), min = 0, max = 20) tr <- runif(length(x), min = 0, max = 60) + tl # truncate_obs() also truncates observations. # if data is already truncated, use trunc_obs(x = ..., tmin = ..., tmax = ...) instead. trunc_fit <- fit(norm, truncate_obs(x, tl, tr)) print(trunc_fit) #> $params #> $params$mean #> [1] 26.72871 #> #> $params$sd #> [1] 8.242123 #> #> #> $opt #> $opt$par #> mean sd #> 26.728710 8.242123 #> #> $opt$value #> [1] 203.8095 #> #> $opt$iter #> [1] 9 #> #> $opt$convergence #> [1] 1 #> #> $opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\" #> #> #> $logLik #> 'log Lik.' -203.8095 (df=2) attr(trunc_fit$logLik, \"nobs\") #> [1] 62"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"plotting","dir":"Articles","previous_headings":"Distributions","what":"Plotting","title":"Working with Distributions","text":"Visualising different distributions, parametrizations, e.g., fits, can done plot_distributions()","code":"# Plot fitted densities plot_distributions( true = norm, fit1 = norm, fit2 = norm2, fit3 = dist_normal(3), .x = seq(-2, 7, 0.01), with_params = list( true = list(mean = 3, sd = 1), fit1 = fit1$params, fit2 = fit2$params, fit3 = fit3$params ), plots = \"density\" ) # Plot fitted densities, c.d.f.s and hazard rates plot_distributions( true = norm, cens_fit = norm, trunc_fit = norm, .x = seq(0, 60, length.out = 101L), with_params = list( true = list(mean = 30, sd = 10), cens_fit = cens_fit$params, trunc_fit = trunc_fit$params ) ) # More complex distributions plot_distributions( bdegp = dist_bdegp(2, 3, 10, 3), .x = c(seq(0, 12, length.out = 121), 1.5 - 1e-6), with_params = list( bdegp = list( dists = list( list(), list(), list( dists = list( list( dist = list( shapes = as.list(1:3), scale = 2.0, probs = list(0.2, 0.5, 0.3) ) ), list( sigmau = 0.4, xi = 0.2 ) ), probs = list(0.7, 0.3) ) ), probs = list(0.15, 0.1, 0.75) ) ) )"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Statistical analyses typically concerned modelling estimating distribution measured variable interest \\(Y\\), called outcome, possibly conditional value one several endogenous variables \\(X\\), called predictors. absence endogenous variables, process usually called distribution fitting, presence endogenous variables called regression. Classical regression, via generalized linear models (GLMs), concerned influence endogenous variables mean outcome, .e., \\(\\mathsf{E}(Y|X) = f(X)\\), often links parameters conditional outcome distribution mean. gentle introduction generalized linear models can found Dobson Barnett (2018). implementation GLMs available stats R package, part R (R Core Team 2023). models also allow specification additional parameters conditional outcome distribution, Generalized Additive Models Location, Scale Shape (Stasinopoulos Rigby 2007). recently, deep distributional regression proposed, allows flexible specification individual outcome distribution parameters (Rügamer et al. 2023). Statistical methods (described implemented previously mentioned papers) often require complete data, full information observations \\((X, Y)\\) interest. paper, describe R-package allows distributional regression three common observation schemes provide complete data. First , data interval censoring applied outcome \\(Y\\) refers case lower upper bounds \\(Y\\) observed, instead actual value. Next, truncated data misses observations outcome \\(Y\\) falls certain lower upper truncation bound. consider case random truncation, truncation bounds also random variables may vary observation. Finally, consider combination two, randomly truncated interval censoring. three scenarios can combined single general scheme: instead observing real-valued target variable \\(Y\\) (\\(\\mu\\)-density \\(f_\\theta\\) c.d.f. \\(F_\\theta\\), \\(\\mu\\) sigma-finite measure \\(\\mathbb R\\) \\(\\theta\\) parameter vector parameter space \\(\\Theta\\)), observe vector \\((M, V, L, U)\\), satisfies \\(L \\le M \\le V \\le U\\) \\(L C_1) + \\mathbf{1}(Y > C_2), \\end{align*}\\] define new random variables \\((M, V) = f(Y,C_1,C_2)\\) \\[\\begin{align*} (M, V) & := \\begin{cases} (-\\infty, C_1), & D = 0, \\\\ (C_1, C_2), & D = 1, \\\\ (C_2, \\infty), & D = 2. \\end{cases} \\end{align*}\\] Note \\(D\\) can reconstructed \\((M, V)\\): \\(D=0\\) \\(M=-\\infty\\), \\(D=1\\) \\(-\\infty m) \\\\ & = F_\\theta((m, \\infty]) \\cdot \\mathsf{P}(C_2 = m). \\end{align*}\\] assume distribution censoring variable \\((C_1,C_2)\\) non-informative, .e., distribution depend \\(\\theta\\), likelihood observing \\((M, V) = (m, v)\\) equal \\(F_\\theta((m, v])\\), factor depend \\(\\theta\\). similar argumentation can used non-discrete case. Overall, noting \\(F_\\infty((-\\infty, \\infty]) = 1\\), motivated likelihood contribution \\(F_\\theta((m, v]) \\cdot \\mathbf{1}(m < v)\\) censored, untruncated observation (1.1). Next, consider uncensored, truncated observation \\((m, v, l, u)\\) \\(y = m = v\\); may hence identify observation \\((y, l, u)\\). may proceed assume \\((L, U)\\) independent \\(Y\\) satisfies \\(L \\le U\\), \\(L\\) possibly equal \\(-\\infty\\) \\(U\\) possibly equal \\(\\infty\\). , \\((L, U)\\) shall density \\(f_{(L, U)}\\) respect dominating sigma-finite measure \\(\\nu\\). Truncation means happen observe \\((Y, L, U)\\) \\(L < Y \\le U\\). consequence, observed value \\(M = V\\) can regarded drawn \\((\\mu \\otimes \\nu)\\)-density \\[\\begin{align} f_{(Y, L, U) | L < Y \\le U}(y, l, u) = \\frac{f_{(L, U)}(l, u) f_\\theta(y)}{\\mathsf{P}(L < Y \\le U)} \\mathbf{1}(l < y \\le u). \\tag{1.4} \\end{align}\\] Subsequently, write \\((Y^{(t)}, L^{(t)}, U^{(t)})\\) random vector following density, .e., \\[\\begin{align*} f_{(Y^{(t)}, L^{(t)}, U^{(t)})}(y, l, u) = f_{(Y, L, U) | L < Y \\le U}(y, l, u). \\end{align*}\\] Conditioning density \\((L^{(t)}, U^{(t)}) = (l, u)\\), arrive expression involve nuisance density \\(f_{(L,U)}\\): \\[\\begin{align*} f_{Y^{(t)} | L^{(t)} = l, U^{(t)} = u}(y) & = \\frac{f_{(Y^{(t)}, L^{(t)}, U^{(t)})}(y, l, u)}{f_{(L^{(t)}, U^{(t)})}(l, u)} \\\\ & = \\frac{f_{(Y, L, U) | L < Y \\le U}(y, l, u)}{\\int_{(l, u]} f_{(Y, L, U) | L < Y \\le U}(z, l, u) \\,\\mathrm{d}\\mu(z)} = \\frac{f_\\theta(y)}{\\int_{(l, u]} f_\\theta(z) \\,\\mathrm{d}\\mu(z)}. \\end{align*}\\] Overall, arrive (conditional) log-likelihood contribution \\(\\log f_\\theta(y) - \\log F_\\theta((l, u])\\) uncensored, truncated observation (1.1). Finally, truncation censoring can occur time, .e., \\(l \\le m < v \\le u\\) either \\(l \\ne -\\infty\\) \\(u \\ne \\infty\\). accordance previous two cases, make assumption \\(Y, (C_1, C_2)\\) \\((L, U)\\) mutually independent satisfy \\(C_1 < C_2\\) \\(L < U\\). Define \\[\\begin{align*} D = \\mathbf{1}(Y > C_1) + \\mathbf{1}(Y > C_2) \\end{align*}\\] \\[\\begin{align*} (M, V) := \\begin{cases} (L, \\min(U, C_1)), & D = 0, \\\\ (\\max(L, C_1), \\min(C_2, U)), & D = 1, \\\\ (\\max(L,C_2), U), & D = 2. \\end{cases} \\end{align*}\\] simplicity, assume random variables discrete. observation \\((m, v, l, u)\\), one following four cases met \\[\\begin{align*} l < m < v < u, \\quad l = m < v < u, \\quad l < m < v = u, \\quad l = m < v = u. \\end{align*}\\] case \\(l < m < v < u\\), \\[\\begin{align*} \\mathsf{P}(M = m, V = v | L = l, U = u, L < Y \\le U) & = \\frac{\\mathsf{P}(C_1 = m, C_2 = v, Y \\(m, v], L = l, U = u)}{\\mathsf{P}(L = l, U = u, l < Y \\le u)} \\\\ & = \\frac{\\mathsf{P}(C_1 = m, C_2 = v) F_\\theta((m, v])}{F_\\theta((l, u])} \\end{align*}\\] independence assumption. factor front depend \\(\\theta\\) irrelevant (conditional) likelihood contribution. Likewise, case \\(l = m < v < u\\), \\[\\begin{align*} \\mathsf{P}(M = l, V = v | L = l, U = u, L < Y \\le U) & = \\frac{\\mathsf{P}(M = l, V = v, L = l, U = u, l < Y \\le u)}{\\mathsf{P}(L = l, U = u, l < Y \\le u)}. \\end{align*}\\] definition \\((M,V)\\), event numerator disjoint union following two sets: \\[\\begin{align*} & \\{D = 0, C_1 = v, L = l, U = u, l < Y \\le u\\} = \\{C_1 = v, L = l, U = u, Y \\(l, v]\\} \\\\ & \\{D = 1, C_1 \\le l, C_2 = v, L = l, U = u, l < Y \\le u\\} = \\{C_1 \\le l, C_2 = v, L = l, U = u, Y \\(l, v]\\}. \\end{align*}\\] independence, obtain \\[\\begin{align*} \\mathsf{P}(M = l, V = v | L = l, U = u, L < Y \\le U) = \\{\\mathsf{P}(C_1 = v) + \\mathsf{P}(C_1 \\le l, C_2 = v)\\} \\frac{F_\\theta((l, v])}{F_\\theta((l, u])}. \\end{align*}\\] , factor front fraction independent \\(\\theta\\) irrelevant likelihood. two cases \\(l < m < v = u\\) \\(l = m < v = u\\) can treated similarly; cases, likelihood contribution equal \\(F_\\theta((m, v]) /F_\\theta((l, u])\\) times factor depend \\(\\theta\\).","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"related-packages","dir":"Articles","previous_headings":"1 Introduction","what":"Related packages","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"less general cases non-informative censoring without random truncation fixed truncation, .e., \\((L, U)\\) constant observations, well estimation distribution parameters absence censoring random truncation, number R packages can fit distributions, also supporting weights. Among MASS (Venables Ripley 2002), fitdistrplus (Delignette-Muller Dutang 2015), survival (Therneau 2023), flexsurv (Jackson 2016). Note fixed truncation operation can baked distribution family whose parameters estimated, allowing classical maximum likelihood estimation. Many packages also support classic regression expected values given predictors. Distributional regression packages, gamlss (Stasinopoulos Rigby 2007) deepregression (Rügamer et al. 2023) currently support interval censoring random truncation. See following table overview available features package. Another R6-based interface provided ROOPSD (Robin 2022). reservr builds upon R packages tensorflow (Allaire Tang 2022) keras (Chollet, Allaire, et al. 2017) interface machine learning library TensorFlow (Abadi et al. 2015) perform distributional regression. underlying infrastructure shared distributional regression package deepregression (Rügamer et al. 2023). latter also supports distributional regression, time writing requires complete samples support truncation censoring. remaining parts paper structured follows: Section 2 details core functionality corresponding R package reservr. split definition samples \\(\\mathfrak{}\\) (Section 2.1), definition distribution families (Section 2.2), mathematical definitions available distribution families (Section 2.3), estimation distribution parameters (Section 2.4) distributional regression using tensorflow (Section 2.5). conclusion given Section 3.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"pkg-overview","dir":"Articles","previous_headings":"","what":"Usage of reservr","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"package serves two main goals: fitting distributions randomly truncated non-informatively interval censored data performing (deep) distributional regression randomly truncated non-informatively interval censored data. Four main components integrated facilitate analysis goals Methods representing randomly truncated non-informatively interval censored sample \\(\\mathfrak{}\\). Methods specifying parametrized distribution family \\(\\mathcal{F} = \\{F_\\theta | \\theta \\\\Theta\\}\\) fitted. Methods estimating distribution parameters \\(\\theta\\) given sample \\(\\mathfrak{}\\). Methods regression distribution parameters given regression sample \\(\\mathfrak{}_{\\text{reg}}\\), parametrized family \\(\\mathcal{F}\\) general tensorflow network \\(\\mathcal{G} : \\mathfrak{X} \\\\Theta\\) processes \\(X\\) estimate conditional distribution \\(Y | X = x\\) \\(F_{g(x)}\\) \\(g \\\\mathcal G\\). components described one one following sections.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"trunc-obs","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Working with samples","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"sample \\(\\mathfrak{} = \\{(m, v, l, u, w)_i\\}\\) represented tibble (package tibble). core function create tibble trunc_obs(). tibble created trunc_obs() consists five columns: x: observed, exact value random variable, referred \\(Y\\) Section 1. Otherwise NA. xmin: Lower interval censoring bound (\\(M\\) Section 1) observation. observation censored, xmin equal x. xmax: Upper interval censoring bound (\\(V\\) Section 1) observation. observation censored, xmax equal x. tmin: Lower truncation bound (\\(L\\) Section 1). observations \\(\\mathtt{x} \\ge \\mathtt{tmin}\\) observed. Can \\(-\\infty\\) indicate lower truncation. tmax: Upper truncation bound (\\(U\\) Section 1). observations \\(\\mathtt{x} \\le \\mathtt{tmax}\\) observed. Can \\(\\infty\\) indicate upper truncation. w: weight associated observation. Defaults \\(1\\). Note , unlike Section 1, lower bounds intervals trunc_obs included, , allow \\(\\mathtt{x} \\ge \\mathtt{tmin}\\) rather \\(\\mathtt{x} > \\mathtt{tmin}\\), unknown variable interest called \\(\\mathtt{x}\\) instead \\(Y\\). continuous random variables, formulas equivalent half-open formulation. discrete random variables, \\(\\mathtt{xmin}\\) \\(\\mathtt{tmin}\\) may appropriately shifted, e.g., replacing \\(\\mathtt{xmin}\\) \\(\\mathtt{xmin}-0.5\\) integer valued variables. following code defines sample size 1 without truncation censoring, realized value \\(1.3\\). Simulating randomly truncated interval censored data standard normal distribution \\(80\\%\\) observations randomly interval censored random uniform truncation \\(L \\sim \\mathrm{Unif}[-2, 0]\\) \\(U \\sim \\mathrm{Unif}[0, 2]\\) can simulated follows Observations look like: total number observations smaller base population \\(1000\\) due truncation: total number censored observations roughly \\(0.8 \\cdot \\mathtt{nrow(obs)}\\). addition trunc_obs() constructor function, functions as_trunc_obs() coercion, truncate_obs() artificially changing truncation bounds, repdel_obs() computing randomly truncated reporting delay observations general insurance claims data containing accident date, reporting delay evaluation date information. latter takes inputs form \\((T_\\text{acc}, D, \\tau)\\) \\(T_{\\text{acc}} < \\tau\\) accident dates corresponding reporting delays \\(D \\ge 0\\) \\(\\tau\\) calendar date observation. returns sample \\((\\mathtt{xmin} = \\mathtt{xmax} = D, \\mathtt{tmin} = 0, \\mathtt{tmax} = \\tau - T_{\\text{acc}}, \\mathtt{w} = 1)\\) suitable estimating reporting delay distribution claim observed reported evaluation date, .e., \\(T_{\\text{acc}} + D \\le \\tau\\). analysis performed using reservr .","code":"trunc_obs(1.3) ## # A data frame: 1 × 6 ## x xmin xmax tmin tmax w ## ## 1 1.3 1.3 1.3 -Inf Inf 1 set.seed(123) N <- 1000L x <- rnorm(N) is_censored <- rbinom(N, size = 1L, prob = 0.8) == 1L c_lower <- runif(sum(is_censored), min = -2.0, max = 0.0) c_upper <- c_lower + runif(sum(is_censored), min = 0, max = 1.0) x_lower <- x x_upper <- x x_lower[is_censored] <- dplyr::case_when( x[is_censored] <= c_lower ~ -Inf, x[is_censored] <= c_upper ~ c_lower, TRUE ~ c_upper ) x_upper[is_censored] <- dplyr::case_when( x[is_censored] <= c_lower ~ c_lower, x[is_censored] <= c_upper ~ c_upper, TRUE ~ Inf ) t_lower <- runif(N, min = -2.0, max = 0.0) t_upper <- runif(N, min = 0.0, max = 2.0) is_observed <- t_lower <= x & x <= t_upper obs <- trunc_obs( xmin = pmax(x_lower, t_lower)[is_observed], xmax = pmin(x_upper, t_upper)[is_observed], tmin = t_lower[is_observed], tmax = t_upper[is_observed] ) obs[8L:12L, ] ## # A tibble: 5 × 6 ## x xmin xmax tmin tmax w ## ## 1 NA -0.479 1.15 -1.93 1.15 1 ## 2 NA -0.177 1.79 -0.210 1.79 1 ## 3 -0.556 -0.556 -0.556 -0.957 0.791 1 ## 4 NA -0.379 0.616 -0.379 0.616 1 ## 5 NA 0.0575 1.45 -0.437 1.45 1 nrow(obs) ## [1] 623 sum(is.na(obs$x)) ## [1] 496"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"distributions","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Definition of distribution families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Distribution families implemented using R6 class system (Chang 2021). inherit class Distribution feature common interface manage fixed free parameters underlying familiy, use basic distribution functions random number generation computation density, cumulative distribution, hazard quantile function, use additional functions supporting parameter estimation procedures computing support presence point mass, compile performance enhanced functions speed basic functions repeated evaluation, provide tensorflow-specific implementations support (deep) distributional regression. Distribution object represents distribution family \\(\\mathcal{F}\\) supported subset real line parameterized fixed finite-dimensional parameter space \\(\\Theta\\). family may singleton, case rather distribution distribution family. reservr provides set basic distribution families, optionally fixed parameters, well transformations distribution families take one underlying distribution families. time writing, :","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"parameters","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"Parameters","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Parameters distribution families can either fixed constant value, free. Free parameters (placeholders) estimated data whereas fixed parameters held constant. Distribution methods argument with_params provide values free parameters need fully specified parameters work. example, generating samples distribution possible fully parameterized using fixed parameters with_params argument Distribution$sample(). now defined dist normal distribution family standard deviation \\(1\\) free mean. Since parameters required normal distribution fixed, dist$sample() error provided mean parameter. with_params argument can used provide free parameters override fixed parameters, necessary. two observations drawn standard normal normal distribution mean zero standard deviation \\(2\\), respectively. Since chosen seed identical, second sample exactly double first sample. Whenever output length greater one, taking one sample, with_params can optionally contain individual parameters entry. three observations drawn \\(\\mathcal{N}(\\mu = 0, \\sigma = 0.5)\\), \\(\\mathcal{N}(\\mu = 1, \\sigma = 0.5)\\) \\(\\mathcal{N}(\\mu = 2, \\sigma = 0.5)\\), respectively. Distributions set fields methods related managing parameters: active binding default_params gets sets list parameters fixed values, NULL represents free parameter. Component families included Distribution objects. get_params() gets list parameters fixed values, traversing component distribution families. get_placeholders() gets list free parameters NULL values. active binding param_bounds gets sets domain regular family parameters Interval object. Setting bound via param_bounds active binding allows restricting natural parameter space family. get_param_bounds() returns bounds free parameters list Intervals, traversing component distribution families. get_param_constraint() returns NULL function evaluates constraints parameter set. function must return vector constraint values (need equal \\(0\\) valid parameters) list elements constraints jacobian. returning list, jacobian element contain jacobian constraint function. Used nloptr::slsqp(heq=) estimation. example mixture families require probs parameters sum \\(1\\) addition box constraint parameter \\([0, 1]\\). Note box constraints handled param_bounds need specified constraint function. get_components() returns list component families transformations mixtures. list empty basic families. example normal family fixed standard deviation \\(\\sigma = 1\\) mixture distribution family two components, one specified normal distribution family:","code":"dist <- dist_normal(sd = 1.0) dist$sample(1L) ## Error in (function (n, mean = 0, sd = 1) : invalid arguments set.seed(10L) dist$sample(1L, with_params = list(mean = 0.0)) ## [1] 0.01874617 set.seed(10L) dist$sample(1L, with_params = list(mean = 0.0, sd = 2.0)) ## [1] 0.03749234 set.seed(10L) dist$sample(3L, with_params = list(mean = 0.0:2.0, sd = 0.5)) ## [1] 0.009373085 0.907873729 1.314334725 dist <- dist_normal(sd = 1.0) mix <- dist_mixture(dists = list(dist_normal(), NULL)) dist$default_params ## $mean ## NULL ## ## $sd ## [1] 1 mix$default_params ## $dists ## $dists[[1]] ## A NormalDistribution with 2 dof ## ## $dists[[2]] ## NULL ## ## ## $probs ## $probs[[1]] ## NULL ## ## $probs[[2]] ## NULL str(dist$get_placeholders()) ## List of 1 ## $ mean: NULL str(mix$get_placeholders()) ## List of 2 ## $ dists:List of 2 ## ..$ :List of 2 ## .. ..$ mean: NULL ## .. ..$ sd : NULL ## ..$ : NULL ## $ probs:List of 2 ## ..$ : NULL ## ..$ : NULL str(dist$param_bounds) ## List of 2 ## $ mean:Classes 'Interval', 'R6' (-Inf, Inf) ## $ sd :Classes 'Interval', 'R6' (0, Inf) str(mix$param_bounds) ## List of 2 ## $ dists:List of 1 ## ..$ : NULL ## $ probs:List of 1 ## ..$ :Classes 'Interval', 'R6' [0, 1] str(dist$get_param_bounds()) ## List of 1 ## $ mean:Classes 'Interval', 'R6' (-Inf, Inf) str(mix$get_param_bounds()) ## List of 2 ## $ dists:List of 1 ## ..$ :List of 2 ## .. ..$ mean:Classes 'Interval', 'R6' (-Inf, Inf) ## .. ..$ sd :Classes 'Interval', 'R6' (0, Inf) ## $ probs:List of 2 ## ..$ :Classes 'Interval', 'R6' [0, 1] ## ..$ :Classes 'Interval', 'R6' [0, 1] str(dist$get_param_constraints()) ## NULL str(mix$get_param_constraints()) ## function (params) dist$get_components() ## list() mix$get_components() ## [[1]] ## A NormalDistribution with 2 dof ## ## [[2]] ## NULL"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"basic-distribution-functions","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"Basic distribution functions","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"basic distribution functions (density, probability, hazard quantile function, well random number generation) provided distribution family. general, argument with_params can used specify missing parameters (placeholders) override fixed distribution parameters. provided parameters vectors length greater 1, must conform input dimension (e.g. length(x) density). case, parameters “vectorized” sense \\(\\)th output element computed using \\(\\)th entry parameter list. density(x, log = FALSE, with_params = list()) computes (log-)density. probability(q, lower.tail = TRUE, log.p = FALSE, with_params = list() computes (log-)cumulative distribution function (log-)survival function. hazard(x, log = FALSE. with_params = list()) computes (log-)hazard function. quantile(p, lower.tail = TRUE, log.p = FALSE, with_params = list()) computes upper lower quantiles. sample(n, with_params = list()) generates random sample size n. (with_params can contain length n vectors case).","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"additional-functions","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"Additional functions","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"addition basic functions, several supporting functions useful , e.g., estimation parameters. export_functions(name, with_params = list()) exports {d,p,q,r} functions adhering common R convention distribution functions. get_type() returns one \"continuous\", \"discrete\", \"mixed\" depending whether distribution family density respect Lebesgue measure, counting measure, sum Lebesgue measure one many point measures. is_continuous() is_discrete() testing particular type. has_capability(caps) gives information whether specific implementation provides features described. Possible capabilities \"sample\", \"density\", \"probability\", \"quantile\", \"diff_density\", \"diff_probability\", \"tf_logdensity\", \"tf_logprobability\". require_capability(caps) errors specified capabilities implemented family hand. is_discrete_at(x, with_params = list()) returns logical vector indicating whether distribution point mass x. is_in_support(x, with_params = list()) returns logical vector indicating whether distribution mass x.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"performance-enhancements","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"Performance enhancements","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"working larger data many calls distribution functions, performing fit, can beneficial just--time compile specialized functions avoid overhead dealing generic structure distributions parametrization. Distributions offer set “compiler” functions return simplified, faster, versions basic distribution functions, analytically compute gradients. functions necessarily implemented Distribution classes, automatically used , e.g., fit_dist() useful. input structure param_matrix can obtained flatten_params_matrix(dist$get_placeholders()) dist Distribution object question. compile_density() compiles fast function signature (x, param_matrix, log = FALSE) compute density fixed parameters hard-coded taking free parameters matrix defined layout instead nested list. compile_probability() compiles fast replacement probability signature (q, param_matrix, lower.tail = TRUE, log.p = FALSE). compile_probability_interval() compiles fast function signature (qmin, qmax, param_matrix, log.p = FALSE) computing \\(P(X \\[\\mathtt{qmin}, \\mathtt{qmax}])\\) logarithm efficiently. expression necessary computing truncation probabilities. compile_sample() compiles fast replacement sample signature (n, param_matrix). diff_density(x, log = FALSE, with_params = list()) computes (log-)gradients density function respect free distribution family parameters, useful maximum likelihood estimation. diff_probability(q, lower.tail = TRUE, log.p = FALSE, with_params = list()) computes (log-)gradients cumulative density function respect free distribution family parameters. useful conditional maximum likelihood estimation presence random truncation non-informative interval censoring.","code":"dist <- dist_normal() flatten_params_matrix(dist$get_placeholders()) ## mean sd ## [1,] NA NA denscmp <- dist$compile_density() if (requireNamespace(\"bench\", quietly = TRUE)) { bench::mark( dist$density(-2:2, with_params = list(mean = 0.0, sd = 1.0)), denscmp(-2:2, matrix(c(0.0, 1.0), nrow = 5L, ncol = 2L, byrow = TRUE)), dnorm(-2:2, mean = rep(0.0, 5L), sd = rep(1.0, 5L)) ) } ## # A tibble: 3 × 6 ## expression min median `itr/sec` mem_alloc `gc/sec` ## ## 1 dist$density(-2:2, with_params =… 27.08µs 29.92µs 32435. 0B 16.2 ## 2 denscmp(-2:2, matrix(c(0, 1), nr… 4.1µs 4.79µs 200114. 0B 40.0 ## 3 dnorm(-2:2, mean = rep(0, 5L), s… 1.66µs 1.96µs 478716. 2.58KB 0"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"tensorflow-interface","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"tensorflow interface","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Use distribution families within tensorflow networks requires specialized implementations using tensorflow APIs instead regular R functions. tailored needs maximizing (conditional) likelihoods weighted, censored randomly truncated data. Details working tensorflow can found Section 2.5. tf_compile_params(input, name_prefix = \"\") creates keras layers take input layer transform valid parametrization distribution family. tf_is_discrete_at() returns tensorflow-ready version is_discrete_at(). tf_logdensity() returns tensorflow-ready version compile_density() implied log = TRUE. tf_logprobability() returns tensorflow-ready version pf compile_probability_interval() implied log.p = TRUE. tf_make_constants() creates list constant tensors fixed distribution family parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-definitions","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Special families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"distribution families available reservr tailored algorithms parameter estimation, commonly known. section contains mathematical definitions function families.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-mixture","dir":"Articles","previous_headings":"2 Usage of reservr > 2.3 Special families","what":"Mixture distribution families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"mixture distribution family defined fixed number \\(k\\) component families \\(\\{\\mathcal{F}_i\\}_{= 1}^k\\) via set distributions \\[\\begin{align*} \\mathop{\\mathrm{Mixture}}(\\mathcal{F}_1, \\ldots, \\mathcal{F}_k) & := \\Bigl\\{ F = \\sum_{= 1}^k p_i F_i \\Bigm| F_i \\\\mathcal{F}_i, p_i \\[0, 1], \\sum_{= 1}^k p_i = 1 \\Bigr\\}. \\end{align*}\\]","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-erlangmix","dir":"Articles","previous_headings":"2 Usage of reservr > 2.3 Special families","what":"Erlang mixture distribution families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Erlang mixture distribution family defined number components \\(k\\) mixture Erlang distributions (Gamma distributions integer shape parameter) common scale parameter. \\(\\Gamma_{\\alpha, \\theta}\\) denotes Gamma distribution shape \\(\\alpha\\) scale \\(\\theta\\), erlang mixture family \\(k\\) components can defined follows: \\[\\begin{align*} \\mathop{\\mathrm{ErlangMixture}}(k) := \\Bigl\\{ F = \\sum_{= 1}^k p_i \\Gamma_{\\alpha_i, \\theta} \\Bigm| \\alpha_i \\\\mathbb{N}, \\theta \\(0, \\infty), p_i \\[0, 1], \\sum_{= 1}^k p_i = 1 \\Bigr\\}. \\end{align*}\\] Note \\(k \\\\infty\\), Erlang mixtures dense space distributions \\((0, \\infty)\\) respect weak convergence (Lee Lin 2012), making useful modeling choice general positive continuous distributions. However, tail index Erlang mixture distributions always zero due exponential decay Gamma densities.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-blended","dir":"Articles","previous_headings":"2 Usage of reservr > 2.3 Special families","what":"Blended distribution families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Blended distribution defined follows: Given two underlying distributions \\(P, Q\\) \\(\\mathbb{R}\\) cdfs \\(F(\\cdot)=P((-\\infty, \\cdot])\\) \\(G(\\cdot)=Q((-\\infty, \\cdot])\\), respectively, parameters \\(\\kappa \\\\mathbb{R}, \\varepsilon \\(0, \\infty), p_1, p_2 \\[0, 1], p_1 + p_2 = 1\\) \\(F(\\kappa) > 0\\) \\(G(\\kappa) < 1\\), define Blended Distribution \\(B = \\mathop{\\mathrm{Blended}}(P, Q; p, \\kappa, \\varepsilon)\\) \\(P\\) \\(Q\\) blending interval \\([\\kappa - \\varepsilon, \\kappa + \\varepsilon]\\) mixture probabilities \\(p\\) via cdf \\(F_B\\): \\[\\begin{align*} p_{\\kappa, \\varepsilon}(x) &= \\begin{cases} x & , x \\(-\\infty, \\kappa-\\varepsilon],\\\\ \\tfrac12 (x + \\kappa - \\varepsilon) + \\tfrac\\varepsilon\\pi \\cos\\Big( \\frac{\\pi (x - \\kappa)}{2 \\varepsilon} \\Big) &, x \\(\\kappa-\\varepsilon , \\kappa+\\varepsilon], \\\\ \\kappa &, x \\(\\kappa +\\varepsilon, \\infty), \\end{cases} \\\\ \\nonumber q_{\\kappa, \\varepsilon}(x) & = \\begin{cases} \\kappa & , x \\(-\\infty, \\kappa-\\varepsilon],\\\\ \\tfrac12 (x + \\kappa + \\varepsilon) - \\tfrac\\varepsilon\\pi \\cos\\Big( \\frac{\\pi (x - \\kappa)}{2 \\varepsilon} \\Big) &, x \\(\\kappa-\\varepsilon , \\kappa+\\varepsilon], \\\\ x &, x \\(\\kappa +\\varepsilon, \\infty), \\end{cases} \\\\ F_B(x) & = p_1 \\frac{F(p_{\\kappa, \\varepsilon}(x))}{F(\\kappa)} + p_2 \\frac{G(q_{\\kappa, \\varepsilon}(x)) - G(\\kappa)}{1 - G(\\kappa)}. \\end{align*}\\] following illustration shows components \\(\\mathrm{Blended}(\\mathcal{N}(\\mu = -1, \\sigma = 1), \\mathrm{Exp}(\\lambda = 1); p = (0.5, 0.5), \\kappa = 0, \\varepsilon = 1)\\) distribution. transformation original component distributions (\\(\\mathcal{N}\\) \\(\\mathrm{Exp}\\)) can illustrated first right- left-truncating \\(\\kappa = 0\\) respectively, applying blending transformations \\(p_{\\kappa, \\varepsilon}\\) \\(q_{\\kappa, \\varepsilon}\\). latter distributions can obtained reservr setting probability weights blended distribution \\(p = (1, 0)\\) \\(p = (0, 1)\\) respectively. Intermediate truncated distributions obtained via trunc_dist(), \\(\\kappa\\) upper lower bound respectively. show resulting density steps, final blended density obtained weighting blended component densities. definition blended distribution leads definition blended distribution family allowing \\(P, Q, \\kappa\\) \\(\\varepsilon\\) vary: Given two families \\(\\mathcal{F}, \\mathcal{G}\\) distributions \\(\\mathbb{R}\\), parameters \\(\\kappa \\\\mathbb{R}, \\varepsilon \\(0, \\infty)\\), define Blended Distribution family family Distributions \\[\\begin{align*} \\mathop{\\mathrm{Blended}}(\\mathcal{F}, \\mathcal{G}; \\kappa, \\varepsilon) & := \\{ \\mathop{\\mathrm{Blended}}(P, Q ; p, \\kappa, \\varepsilon) \\mid P \\\\mathcal{F}, Q \\\\mathcal{G}, p_1, p_2 \\[0, 1], p_1 + p_2 = 1 \\}. \\end{align*}\\] Blended distribution families can generalized number components \\(k\\) letting \\(\\kappa\\) \\(\\varepsilon\\) become vectors dimension \\(k - 1\\) \\(\\kappa_i + \\varepsilon_i \\le \\kappa_{+ 1} - \\varepsilon_{+ 1}\\) \\(= 1, \\ldots, k - 2\\). Compared piecewise distribution families obtained mixture truncated distribution families supports \\((-\\infty, \\kappa]\\) \\([\\kappa, \\infty)\\) commonly used extreme value modelling, blended distribution families exhibit continuous density within blending region \\((\\kappa - \\varepsilon, \\kappa + \\varepsilon)\\). reservr provides implementation via dist_blended(), limited support two component families.","code":"dist1 <- dist_normal(mean = -1.0, sd = 1.0) dist2 <- dist_exponential(rate = 1.0) distb <- dist_blended( dists = list(dist1, dist2), breaks = list(0.0), bandwidths = list(1.0), probs = list(0.5, 0.5) ) distt1 <- dist_trunc(dist1, min = -Inf, max = 0.0) distt2 <- dist_trunc(dist2, min = 0.0, max = Inf) distb1 <- distb$clone() distb1$default_params$probs <- list(1.0, 0.0) distb2 <- distb$clone() distb2$default_params$probs <- list(0.0, 1.0)"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-bdegp","dir":"Articles","previous_headings":"2 Usage of reservr > 2.3 Special families","what":"The Blended Dirac Erlang Generalized Pareto distribution family","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Using construction Blended distribution family, can define Blended Dirac Erlang Generalized Pareto (BDEGP) family follows, see . Given parameters \\(n \\\\mathbb{N}, m \\\\mathbb{N}, \\kappa \\\\mathbb{R}\\) \\(\\varepsilon \\(0, \\infty)\\), define Blended Dirac Erlang Generalized Pareto family family distributions \\[\\begin{align*} \\mathop{\\mathrm{BDEGP}}(n, m, \\kappa, \\varepsilon) := & \\mathop{\\mathrm{Mixture}}( \\\\ & \\qquad \\{\\delta_0\\}, \\{\\delta_1\\}, \\ldots, \\{\\delta_{n-1}\\}, \\\\ & \\qquad \\mathop{\\mathrm{Blended}}( \\\\ & \\qquad\\qquad \\mathop{\\mathrm{ErlangMixture}}(m), \\\\ & \\qquad\\qquad \\{ \\mathop{\\mathrm{GPD}}(\\kappa, \\sigma, \\xi) \\mid \\sigma \\(0, \\infty), \\xi \\[0, 1)) \\}; \\\\ & \\qquad\\qquad \\kappa, \\varepsilon \\\\ & \\qquad) \\\\ &), \\end{align*}\\] \\(\\delta_k\\) dirac distribution \\(k\\) \\(\\mathrm{GPD}\\) generalized Pareto distribution. Note constraint tail index \\(\\xi \\[0, 1)\\), guaranteeing finite expectation. distribution family three features making useful modelling general heavy-tailed distributions \\((0, \\infty)\\): maximally flexible lower tail flexible family distributions body flexible tail index due generalized Pareto component","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"fit-dist","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Methods of estimating distribution parameters","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"section describes functions problem estimating parameter \\(\\theta \\\\Theta\\) given sample \\(\\mathfrak{}\\) parameterized family \\(\\mathcal{F} = \\{F_\\theta \\mid \\theta \\\\Theta\\}\\). Sometimes, conditional log-likelihood (1.2) can directly maximized, yielding estimate \\(\\theta\\). default behavior reservr specialized estimation routine provided family \\(\\mathcal{F}_\\theta\\) defined. Depending whether box constraints, nonlinear constraints constraints parameter space \\(\\Theta\\), different implementations nonlinear optimization algorithms nloptr (Johnson 2007), particular truncated Newton (Dembo Steihaug 1983) unconstrained families, L-BFGS (Liu Nocedal 1989) box-constrained families SLSQP (Kraft 1994) general constrained families employed. addition naive direct optimization approach, families lend specialized estimation algorithms usually show faster convergence due making use special structures parameter space \\(\\Theta\\). Estimating distribution parameters truncated observations handled using generic fit() method. delegates fit_dist(), also generic signature: dist: distribution family fit obs: trunc_obs object, vector observed values start: Starting parameters, list compatible dist$get_placeholders(). time writing specialized algorithms six types families: Blended distribution families Erlang mixture distribution families Generalized pareto distribution families free lower bound u (estimated minimum xmin sample) Mixture distribution families Translated distribution families fixed offset multiplier (transform sample via \\(\\tfrac{\\cdot-\\text{offset}}{\\text{multiplier}}\\) fit component distribution family transformed sample) Uniform distribution families free lower bound min upper bound max (estimated minimum xmin, min, maximum xmax, max, sample) present, start parameter obtained via fit_dist_start() generic. generic implements family specific method generating valid starting values placeholder parameters. notable implementation fit_dist_start.ErlangMixtureDistribution() Erlang mixture distribution families. shape parameters free, different initialization strategies can chosen using additional arguments fit_dist_start(): init = \"shapes\" paired shapes = c(...) manually specifies starting shape parameters \\(\\alpha\\) init = \"fan\" paired spread = d uses \\(\\alpha = (1, 1 + d, \\ldots, 1 + (k - 1) \\cdot d)\\) default \\(d = 1\\) resulting \\(\\alpha = (1, \\ldots, k)\\) init = \"kmeans\" uses 1-dimensional K-means based clustering sample observations cluster corresponds unique shape init = \"cmm\" uses centralized method moments procedure described Re-using dist <- dist_normal(sd = 1.0) generated sample obs, can fit free parameter mean: Using function plot_distributions() can also assess quality fit. , density labelled empirical corresponds kernel density estimate automatic bandwidth selection. follow example fitting \\(\\mathrm{ErlangMixture}(3)\\) distribution family using various initialization strategies. Note , \"kmeans\" \"cmm\" use random number generator internal K-means clustering. necessitates setting constant seed running fit_dist_start() fit() ensure chosen starting parameters calls. noted different initialization methods considerable impact outcome example due discrete nature Erlang mixture distribution shape parameters thus combinatorial difficulty picking optimal shapes \\(\\alpha\\). fit() result Erlang mixture distribution families contains element named \"params_hist\". can populated passing trace = TRUE fit() record parameters ECME steps ECME-based estimation algorithms . element \"iter\" contains number full ECME-Iterations performed.","code":"dist <- dist_normal(sd = 1.0) the_fit <- fit(dist, obs) str(the_fit) ## List of 3 ## $ params:List of 1 ## ..$ mean: num 0.0822 ## $ opt :List of 5 ## ..$ par : Named num 0.0822 ## .. ..- attr(*, \"names\")= chr \"mean\" ## ..$ value : num 341 ## ..$ iter : int 7 ## ..$ convergence: int 1 ## ..$ message : chr \"NLOPT_SUCCESS: Generic success return value.\" ## $ logLik:Class 'logLik' : -341 (df=1) plot_distributions( true = dist, fitted = dist, empirical = dist_empirical(0.5 * (obs$xmin + obs$xmax)), .x = seq(-5, 5, length.out = 201), plots = \"density\", with_params = list( true = list(mean = 0.0, sd = 1.0), fitted = the_fit$params ) ) dist <- dist_erlangmix(list(NULL, NULL, NULL)) params <- list( shapes = list(1L, 4L, 12L), scale = 2.0, probs = list(0.5, 0.3, 0.2) ) set.seed(1234) x <- dist$sample(100L, with_params = params) set.seed(32) init_true <- fit_dist_start(dist, x, init = \"shapes\", shapes = as.numeric(params$shapes)) init_fan <- fit_dist_start(dist, x, init = \"fan\", spread = 3L) init_kmeans <- fit_dist_start(dist, x, init = \"kmeans\") init_cmm <- fit_dist_start(dist, x, init = \"cmm\") rbind( flatten_params(init_true), flatten_params(init_fan), flatten_params(init_kmeans), flatten_params(init_cmm) ) ## shapes[1] shapes[2] shapes[3] scale probs[1] probs[2] probs[3] ## [1,] 1 4 12 1.590800 0.43 0.33 0.24 ## [2,] 1 4 7 2.688103 0.55 0.32 0.13 ## [3,] 1 5 13 1.484960 0.43 0.36 0.21 ## [4,] 2 10 24 1.010531 0.56 0.27 0.17 set.seed(32) str(fit(dist, x, init = \"shapes\", shapes = as.numeric(params$shapes))) ## List of 4 ## $ params :List of 3 ## ..$ probs :List of 3 ## .. ..$ : num 0.43 ## .. ..$ : num 0.33 ## .. ..$ : num 0.24 ## ..$ shapes:List of 3 ## .. ..$ : num 1 ## .. ..$ : num 4 ## .. ..$ : num 13 ## ..$ scale : num 1.59 ## $ params_hist: list() ## $ iter : int 1 ## $ logLik :Class 'logLik' : -290 (df=6) fit(dist, x, init = \"fan\", spread = 3L)$logLik ## 'log Lik.' -292.0026 (df=6) fit(dist, x, init = \"kmeans\")$logLik ## 'log Lik.' -289.2834 (df=6) fit(dist, x, init = \"cmm\")$logLik ## 'log Lik.' -293.1273 (df=6)"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"tensorflow","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Distributional regression using tensorflow integration","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"maximization problem (1.3) delegated tensorflow, supplies ample stochastic optimization algorithms. Functions reservr necessary create suitable output layer tensorflow maps onto \\(\\Theta\\) provide implementation (negative) log-likelihood (1.3) loss function. two tasks combined tf_compile_model(). function returns object class reservr_keras_model, can used estimation procedure. Given input layers inputs intermediate output layer intermediate_output well family distributions dist, function Compiles loss dist defined (1.3) \\(l(g) = -\\tfrac{1}{\\#(\\mathfrak{}_{\\mathrm{reg}})} \\ell(g|\\mathfrak{}_{\\mathrm{reg}})\\), optionally disabling censoring truncation efficiency. Creates list final output layers mapping intermediate_output onto parameter space \\(\\Theta\\) dist using Distribution$tf_compile_params(). step adds additional degrees freedom overall model, approach described Runs keras3::compile() underlying keras.src.models.model.Model. following example defines linear model homoskedasticity assumption fits using \\(100\\) iterations Adam optimization algorithm (Kingma Ba 2015). First, simulate data \\((Y,X)\\) model defined \\(X \\sim \\mathrm{Unif}(10,20)\\) \\(Y | X =x \\sim \\mathcal{N}(\\mu = 2x, \\sigma = 1)\\). Next, specify distribution family \\(\\mathcal{F} = \\{\\mathcal{N}(\\mu, \\sigma = 1) | \\mu\\\\mathbb R\\}\\), incorporating homoskedasticity assumption. Using keras, define empty neural network, just taking \\(x\\) input performing transformation. , tf_compile_model() adapts input layer free parameter space \\(\\Theta = \\mathbb{R}\\). introduces two parameters function family \\(\\mathcal{G}\\) implies functional relationship \\(\\mu = g(x) := \\theta_1 \\cdot x + \\theta_0\\). Since sample fully observed, disable censoring truncation, leading simplified loss \\[\\begin{align*} l(g) = -\\tfrac{1}{100} \\sum_{x, y} \\log f_{g(x)}(y), \\end{align*}\\] \\(f_\\mu(y)\\) density \\(\\mathcal{N}(\\mu=\\mu, \\sigma=1)\\) evaluated \\(y\\). fit can now performed, modifying parameters (weights) nnet -place. Note argument y fit accepts trunc_obs object. example, vector y silently converted untruncated, uncensored trunc_obs object. fit() returns keras_training_history underlying call fit() keras.src.models.model.Model. training history can plotted, displaying loss epoch (black circles), blue smoothing line. predict() method reservr_keras_model takes input tensors returns predicted distribution parameters list compatible dist$get_placeholders(). can thus extract parameter mean compare OLS fit dataset: Since reservr_keras_model includes underlying keras.src.models.model.Model, parameters can also extracted compared OLS coefficients now discuss complex example involving censoring, using right-censored ovarian dataset bundled survival package (R Core Team 2023). goal predict rate parameter exponential survival time distribution cancer patients given four features \\(X = (\\mathtt{age}, \\mathtt{resid.ds}, \\mathtt{rx}, \\mathtt{ecog.ps})\\) collected study. variables \\(\\mathtt{resid.ds}, \\mathtt{rx}\\) \\(\\mathtt{ecog.ps}\\) indicator variables coded \\(\\{1, 2\\}\\). \\(\\mathtt{age}\\) continuous variable values \\((38, 75)\\). Due different scale \\(\\mathtt{age}\\) variable, useful separate variables order perform normalization. Normalization using keras3::layer_normalization() transforms input variables zero mean unit variance. step necessary categorical features. Next, define input layers shapes, conforming input predictor list dat$x. age normalized concatenated features, stored flags, resulting 4-dimensional representation. add two hidden ReLU-layers \\(5\\) neurons network compile result, adapting 5-dimensional hidden output parameter space \\(\\Theta = (0, \\infty)\\) rate parameter exponential distribution. accomplished using dense layer \\(1\\) neuron \\(\\mathrm{softplus}\\) activation function. stability reasons, default weight initialization optimal. circumvent , estimate global exponential distribution fit observations initialize final layer weights global fit initial prediction network. Finally, can train network visualize predictions. plot expected lifetime \\((\\mathtt{age}, \\mathtt{rx})\\) shows network learned longer expected lifetimes lower \\(\\mathtt{age}\\) treatment group (\\(\\mathtt{rx}\\)) 2. global fit included dashed blue line. Individual predictions observations can also plotted subject level.","code":"set.seed(1431L) keras3::set_random_seed(1432L) dataset <- tibble::tibble( x = runif(100, min = 10, max = 20), y = 2 * x + rnorm(100) ) dist <- dist_normal(sd = 1.0) nnet_input <- keras3::keras_input(shape = 1L, name = \"x_input\") nnet_output <- nnet_input nnet <- tf_compile_model( inputs = list(nnet_input), intermediate_output = nnet_output, dist = dist, optimizer = keras3::optimizer_adam(learning_rate = 0.1), censoring = FALSE, truncation = FALSE ) nnet$dist nnet$model nnet_fit <- fit( nnet, x = dataset$x, y = dataset$y, epochs = 100L, batch_size = 100L, shuffle = FALSE, verbose = FALSE ) # Fix weird behavior of keras3 nnet_fit$params$epochs <- max(nnet_fit$params$epochs, length(nnet_fit$metrics$loss)) plot(nnet_fit) pred_params <- predict(nnet, data = list(keras3::as_tensor(dataset$x, keras3::config_floatx()))) lm_fit <- lm(y ~ x, data = dataset) dataset$y_pred <- pred_params$mean dataset$y_lm <- predict(lm_fit, newdata = dataset, type = \"response\") library(ggplot2) ggplot(dataset, aes(x = x, y = y)) + geom_point() + geom_line(aes(y = y_pred), color = \"blue\") + geom_line(aes(y = y_lm), linetype = 2L, color = \"green\") coef_nnet <- rev(as.numeric(nnet$model$get_weights())) coef_lm <- unname(coef(lm_fit)) str(coef_nnet) str(coef_lm) set.seed(1219L) tensorflow::set_random_seed(1219L) keras3::config_set_floatx(\"float32\") dist <- dist_exponential() ovarian <- survival::ovarian dat <- list( y = trunc_obs( xmin = ovarian$futime, xmax = ifelse(ovarian$fustat == 1, ovarian$futime, Inf) ), x = list( age = keras3::as_tensor(ovarian$age, keras3::config_floatx(), shape = nrow(ovarian)), flags = k_matrix(ovarian[, c(\"resid.ds\", \"rx\", \"ecog.ps\")] - 1.0) ) ) nnet_inputs <- list( keras3::keras_input(shape = 1L, name = \"age\"), keras3::keras_input(shape = 3L, name = \"flags\") ) hidden1 <- keras3::layer_concatenate( keras3::layer_normalization(nnet_inputs[[1L]]), nnet_inputs[[2L]] ) hidden2 <- keras3::layer_dense( hidden1, units = 5L, activation = keras3::activation_relu ) nnet_output <- keras3::layer_dense( hidden2, units = 5L, activation = keras3::activation_relu ) nnet <- tf_compile_model( inputs = nnet_inputs, intermediate_output = nnet_output, dist = dist, optimizer = keras3::optimizer_adam(learning_rate = 0.01), censoring = TRUE, truncation = FALSE ) nnet$model str(predict(nnet, dat$x)) global_fit <- fit(dist, dat$y) tf_initialise_model(nnet, params = global_fit$params, mode = \"zero\") str(predict(nnet, dat$x)) nnet_fit <- fit( nnet, x = dat$x, y = dat$y, epochs = 100L, batch_size = nrow(dat$y), shuffle = FALSE, verbose = FALSE ) nnet_fit$params$epochs <- max(nnet_fit$params$epochs, length(nnet_fit$metrics$loss)) plot(nnet_fit) ovarian$expected_lifetime <- 1.0 / predict(nnet, dat$x)$rate"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"conclusion","dir":"Articles","previous_headings":"","what":"Conclusion","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"presented reservr, package supports distribution parameter estimation distributional regression using R. tasks supported samples without interval censoring without random truncation, general form truncation typical packages support. package includes facilities (1) description randomly truncated non-informatively interval censored samples, (2) definition distribution families consider, (3) global distribution parameter estimation ..d. assumption sample (4) distributional regression - employing tensorflow package flexibility speed.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"acknowledgements","dir":"Articles","previous_headings":"","what":"Acknowledgements","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Author like thank Axel Bücher proofreading valuable comments earlier version article.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/articles/tensorflow.html","id":"overview","dir":"Articles","previous_headings":"","what":"Overview","title":"TensorFlow Integration","text":"reservr capable fitting distributions censored truncated observations, directly allow modelling influence exogenous variables observed alongside primary outcome. integration TensorFlow comes . TensorFlow integration allows fit neural network simultaneously parameters distribution taking exogenous variables account. reservr accepts partial tensorflow networks yield single arbitrary-dimension rank 2 tensor (e.g. dense layer) output can connect suitable layers intermediate output complete network predicts parameters pre-specified distribution family. also dynamically compiles suitable conditional likelihood based loss, depending type problem (censoring, truncation), can optimized using keras3::fit implementation --box. means full flexibility respect callbacks, optimizers, mini-batching, etc.","code":"library(reservr) library(tensorflow) library(keras3) #> #> Attaching package: 'keras3' #> The following objects are masked from 'package:tensorflow': #> #> set_random_seed, shape library(tibble) library(ggplot2)"},{"path":"https://ashesitr.github.io/reservr/articles/tensorflow.html","id":"a-simple-linear-model","dir":"Articles","previous_headings":"Overview","what":"A simple linear model","title":"TensorFlow Integration","text":"following example show code necessary fit simple model assumptions OLS data. true relationship use \\(y = 2 x + \\epsilon\\) \\(\\epsilon \\sim \\mathcal{N}(0, 1)\\). use censoring truncation.","code":"if (reticulate::py_module_available(\"keras\")) { set.seed(1431L) tensorflow::set_random_seed(1432L) dataset <- tibble( x = runif(100, min = 10, max = 20), y = 2 * x + rnorm(100) ) print(qplot(x, y, data = dataset)) # Specify distributional assumption of OLS: dist <- dist_normal(sd = 1.0) # OLS assumption: homoskedasticity # Optional: Compute a global fit global_fit <- fit(dist, dataset$y) # Define a neural network nnet_input <- layer_input(shape = 1L, name = \"x_input\") # in practice, this would be deeper nnet_output <- nnet_input optimizer <- optimizer_adam(learning_rate = 0.1) nnet <- tf_compile_model( inputs = list(nnet_input), intermediate_output = nnet_output, dist = dist, optimizer = optimizer, censoring = FALSE, # Turn off unnecessary features for this problem truncation = FALSE ) nnet_fit <- fit(nnet, x = dataset$x, y = dataset$y, epochs = 100L, batch_size = 100L, shuffle = FALSE) # Fix weird behavior of keras3 nnet_fit$params$epochs <- max(nnet_fit$params$epochs, length(nnet_fit$metrics$loss)) print(plot(nnet_fit)) pred_params <- predict(nnet, data = list(as_tensor(dataset$x, config_floatx()))) lm_fit <- lm(y ~ x, data = dataset) dataset$y_pred <- pred_params$mean dataset$y_lm <- predict(lm_fit, newdata = dataset, type = \"response\") p <- ggplot(dataset, aes(x = x, y = y)) %+% geom_point() %+% geom_line(aes(y = y_pred)) %+% geom_line(aes(y = y_lm), linetype = 2L) print(p) coef_nnet <- rev(as.numeric(nnet$model$get_weights())) coef_lm <- coef(lm_fit) print(coef_nnet) print(coef_lm) } #> Warning: `qplot()` was deprecated in ggplot2 3.4.0. #> This warning is displayed once every 8 hours. #> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was #> generated. #> Epoch 0/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 483ms/step - loss: 56.18431/1 ━━━━━━━━━━━━━━━━━━━━ 0s 487ms/step - loss: 56.1843 #> Epoch 1/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 46.63251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 46.6325 #> Epoch 2/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 39.75831/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 39.7583 #> Epoch 3/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 35.50141/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 35.5014 #> Epoch 4/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.62621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.6262 #> Epoch 5/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.64411/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.6441 #> Epoch 6/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.80991/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 34.8099 #> Epoch 7/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 36.28141/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 36.2814 #> Epoch 8/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 37.38771/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 37.3877 #> Epoch 9/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 37.80121/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 37.8012 #> Epoch 10/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 37.51511/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 37.5151 #> Epoch 11/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 36.71811/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 36.7181 #> Epoch 12/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 35.67251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 35.6725 #> Epoch 13/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.63281/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.6328 #> Epoch 14/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.79741/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.7974 #> Epoch 15/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.28291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.2829 #> Epoch 16/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.11521/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.1152 #> Epoch 17/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.23721/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.2372 #> Epoch 18/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.53231/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.5323 #> Epoch 19/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.86181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.8618 #> Epoch 20/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.10381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 34.1038 #> Epoch 21/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.18291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 34.1829 #> Epoch 22/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.08131/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 34.0813 #> Epoch 23/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.83221/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.8322 #> Epoch 24/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.50171/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.5017 #> Epoch 25/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.16641/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 33.1664 #> Epoch 26/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.89201/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8920 #> Epoch 27/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.71911/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.7191 #> Epoch 28/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.65621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.6562 #> Epoch 29/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.68181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.6818 #> Epoch 30/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.75441/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.7544 #> Epoch 31/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.82651/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8265 #> Epoch 32/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.85911/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8591 #> Epoch 33/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.83111/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8311 #> Epoch 34/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.74251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.7425 #> Epoch 35/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.61121/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.6112 #> Epoch 36/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.46491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.4649 #> Epoch 37/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.33131/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.3313 #> Epoch 38/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.23041/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.2304 #> Epoch 39/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.16951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1695 #> Epoch 40/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.14301/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1430 #> Epoch 41/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.13571/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1357 #> Epoch 42/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.12951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1295 #> Epoch 43/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.10861/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.1086 #> Epoch 44/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.06491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.0649 #> Epoch 45/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.99891/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.9989 #> Epoch 46/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.91821/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.9182 #> Epoch 47/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.83421/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.8342 #> Epoch 48/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.75761/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.7576 #> Epoch 49/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.69491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.6949 #> Epoch 50/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.64701/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.6470 #> Epoch 51/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.60981/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.6098 #> Epoch 52/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.57631/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.5763 #> Epoch 53/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.53921/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.5392 #> Epoch 54/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 18ms/step - loss: 31.49401/1 ━━━━━━━━━━━━━━━━━━━━ 0s 19ms/step - loss: 31.4940 #> Epoch 55/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.43951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.4395 #> Epoch 56/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.37821/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.3782 #> Epoch 57/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.31441/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.3144 #> Epoch 58/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.25271/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.2527 #> Epoch 59/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.19611/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.1961 #> Epoch 60/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.14541/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.1454 #> Epoch 61/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.09891/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.0989 #> Epoch 62/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.05381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.0538 #> Epoch 63/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.00711/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.0071 #> Epoch 64/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.95711/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.9571 #> Epoch 65/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.90341/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.9034 #> Epoch 66/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.84721/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.8472 #> Epoch 67/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.79051/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.7905 #> Epoch 68/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.73501/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.7350 #> Epoch 69/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.68181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.6818 #> Epoch 70/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.63071/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.6307 #> Epoch 71/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.58091/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.5809 #> Epoch 72/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.53111/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.5311 #> Epoch 73/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.48021/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.4802 #> Epoch 74/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.42771/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.4277 #> Epoch 75/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.37391/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.3739 #> Epoch 76/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.31951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.3195 #> Epoch 77/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.26531/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.2653 #> Epoch 78/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.21201/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.2120 #> Epoch 79/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.15961/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.1596 #> Epoch 80/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.10781/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 30.1078 #> Epoch 81/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.05621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.0562 #> Epoch 82/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.00421/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.0042 #> Epoch 83/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.95161/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.9516 #> Epoch 84/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.89851/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.8985 #> Epoch 85/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.84501/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.8450 #> Epoch 86/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.79171/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.7917 #> Epoch 87/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.73871/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.7387 #> Epoch 88/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.68611/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.6861 #> Epoch 89/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.63381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.6338 #> Epoch 90/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.58161/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.5816 #> Epoch 91/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.52921/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.5292 #> Epoch 92/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.47661/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.4766 #> Epoch 93/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.42371/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.4237 #> Epoch 94/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.37081/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.3708 #> Epoch 95/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.31801/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.3180 #> Epoch 96/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.26531/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.2653 #> Epoch 97/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.21291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.2129 #> Epoch 98/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.16051/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.1605 #> Epoch 99/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.10831/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.1083 #> Epoch 100/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 29.05601/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 29.0560 #> [1] 4.854740 1.606937 #> (Intercept) x #> 0.5645856 1.9574191"},{"path":"https://ashesitr.github.io/reservr/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Alexander Rosenstock. Author, maintainer, copyright holder.","code":""},{"path":"https://ashesitr.github.io/reservr/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Rosenstock (2024). reservr: Fit Distributions Neural Networks Censored Truncated Data. R package version 0.0.3, https://github.com/AshesITR/reservr, https://ashesitr.github.io/reservr/.","code":"@Manual{, title = {reservr: Fit Distributions and Neural Networks to Censored and Truncated Data}, author = {Alexander Rosenstock}, year = {2024}, note = {R package version 0.0.3, https://github.com/AshesITR/reservr}, url = {https://ashesitr.github.io/reservr/}, }"},{"path":"https://ashesitr.github.io/reservr/index.html","id":"reservr","dir":"","previous_headings":"","what":"Fit Distributions and Neural Networks to Censored and Truncated Data","title":"Fit Distributions and Neural Networks to Censored and Truncated Data","text":"goal reservr provide flexible interface specifying distributions fitting (randomly) truncated possibly interval-censored data. provides custom fitting algorithms fit distributions ..d. samples well dynnamic TensorFlow integration allow training neural networks arbitrary output distributions. latter can used include explanatory variables distributional fits. Reservr also provides tools relevant working core functionality actuarial setting, namely functions prob_report() truncate_claims(), make assumptions type random truncation applied data. Please refer vignettes distributions.Rmd tensorflow.Rmd detailed introductions.","code":""},{"path":"https://ashesitr.github.io/reservr/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Fit Distributions and Neural Networks to Censored and Truncated Data","text":"reservr yet CRAN. can install latest development version reservr via can install released version reservr CRAN : want use reservrs features, make sure also install tensorflow.","code":"devtools::install_github(\"AshesITR/reservr\") install.packages(\"reservr\")"},{"path":"https://ashesitr.github.io/reservr/index.html","id":"example","dir":"","previous_headings":"","what":"Example","title":"Fit Distributions and Neural Networks to Censored and Truncated Data","text":"basic example shows fit normal distribution randomly truncated censored data.","code":"library(reservr) set.seed(123) mu <- 0 sigma <- 1 N <- 1000 p_cens <- 0.8 x <- rnorm(N, mean = mu, sd = sigma) is_censored <- rbinom(N, size = 1L, prob = p_cens) == 1L x_lower <- x x_lower[is_censored] <- x[is_censored] - runif(sum(is_censored), min = 0, max = 0.5) x_upper <- x x_upper[is_censored] <- x[is_censored] + runif(sum(is_censored), min = 0, max = 0.5) t_lower <- runif(N, min = -2, max = 0) t_upper <- runif(N, min = 0, max = 2) is_observed <- t_lower <= x & x <= t_upper obs <- trunc_obs( xmin = pmax(x_lower, t_lower)[is_observed], xmax = pmin(x_upper, t_upper)[is_observed], tmin = t_lower[is_observed], tmax = t_upper[is_observed] ) # Summary of the simulation cat(sprintf( \"simulated samples: %d\\nobserved samples: %d\\ncensored samples: %d\\n\", N, nrow(obs), sum(is.na(obs$x)) )) # Define outcome distribution and perform fit to truncated and (partially) censored sample dist <- dist_normal() the_fit <- fit(dist, obs) # Visualize resulting parameters and show a kernel density estimate of the samples. # We replace interval-censored samples with their midpoint for the kernel density estimate. plot_distributions( true = dist, fitted = dist, empirical = dist_empirical(0.5 * (obs$xmin + obs$xmax)), .x = seq(-5, 5, length.out = 201), plots = \"density\", with_params = list( true = list(mean = mu, sd = sigma), fitted = the_fit$params ) )"},{"path":"https://ashesitr.github.io/reservr/index.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Fit Distributions and Neural Networks to Censored and Truncated Data","text":"Please note reservr project released Contributor Code Conduct. contributing project, agree abide terms.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":null,"dir":"Reference","previous_headings":"","what":"Base class for Distributions — Distribution","title":"Base class for Distributions — Distribution","text":"Represents modifiable Distribution family","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"active-bindings","dir":"Reference","previous_headings":"","what":"Active bindings","title":"Base class for Distributions — Distribution","text":"default_params Get set (non-recursive) default parameters Distribution param_bounds Get set (non-recursive) parameter bounds (box constraints) Distribution","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Base class for Distributions — Distribution","text":"Distribution$new() Distribution$sample() Distribution$density() Distribution$tf_logdensity() Distribution$probability() Distribution$tf_logprobability() Distribution$quantile() Distribution$hazard() Distribution$diff_density() Distribution$diff_probability() Distribution$is_in_support() Distribution$is_discrete_at() Distribution$tf_is_discrete_at() Distribution$has_capability() Distribution$get_type() Distribution$get_components() Distribution$is_discrete() Distribution$is_continuous() Distribution$require_capability() Distribution$get_dof() Distribution$get_placeholders() Distribution$get_params() Distribution$tf_make_constants() Distribution$tf_compile_params() Distribution$get_param_bounds() Distribution$get_param_constraints() Distribution$export_functions() Distribution$clone()","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$new(type, caps, params, name, default_params)"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"type Type distribution. string constant default implementation. Distributions non-constant type must override get_type() function. caps Character vector capabilities fuel default implementations has_capability() require_capability(). Distributions dynamic capabilities must override has_capability() function. params Initial parameter bounds structure, backing param_bounds active binding (usually list intervals). name Name Distribution class. CamelCase end \"Distribution\". default_params Initial fixed parameters backing default_params active binding (usually list numeric / NULLs).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Construct Distribution instance Used internally dist_* functions.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$sample(n, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"n number samples draw. with_params Distribution parameters use. parameter value can also numeric vector length n. case -th sample use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-1","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Sample Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"length n vector ..d. random samples Distribution specified parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential(rate = 2.0)$sample(10)"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$density(x, log = FALSE, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points evaluate density . log Flag. TRUE, return log-density instead. with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th density point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-2","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Density Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-1","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"numeric vector (log-)densities","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-1","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$density(c(1.0, 2.0), with_params = list(rate = 2.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_logdensity()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-3","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Compile TensorFlow function log-density evaluation","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-2","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"tf_function taking arguments x args returning log-density Distribution evaluated x parameters args.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-4","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$probability( q, lower.tail = TRUE, log.p = FALSE, with_params = list() )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-3","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"q Vector points evaluate probability function . lower.tail TRUE, return P(X <= q). Otherwise return P(X > q). log.p TRUE, probabilities returned log(p). with_params Distribution parameters use. parameter value can also numeric vector length length(q). case, -th probability point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-4","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Cumulative probability Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-3","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"numeric vector (log-)probabilities","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-2","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$probability( c(1.0, 2.0), with_params = list(rate = 2.0) )"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-5","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_logprobability()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-5","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Compile TensorFlow function log-probability evaluation","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-4","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"tf_function taking arguments qmin, qmax args returning log-probability Distribution evaluated closed interval [qmin, qmax] parameters args.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-6","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$quantile( p, lower.tail = TRUE, log.p = FALSE, with_params = list() )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-4","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"p Vector probabilities. lower.tail TRUE, return P(X <= q). Otherwise return P(X > q). log.p TRUE, probabilities returned log(p). with_params Distribution parameters use. parameter value can also numeric vector length length(p). case, -th quantile use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-6","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Quantile function Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-5","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"numeric vector quantiles","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-3","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$quantile(c(0.1, 0.5), with_params = list(rate = 2.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-7","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$hazard(x, log = FALSE, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-5","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points. log Flag. TRUE, return log-hazard instead. with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th hazard point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-7","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Hazard function Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-6","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"numeric vector (log-)hazards","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-4","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential(rate = 2.0)$hazard(c(1.0, 2.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-8","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$diff_density(x, log = FALSE, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-6","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points. log Flag. TRUE, return gradient log-density instead. with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th density point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-8","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Gradients density Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-7","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list structure containing (log-)density gradients free parameters Distribution evaluated x.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-5","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$diff_density( c(1.0, 2.0), with_params = list(rate = 2.0) )"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-9","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$diff_probability( q, lower.tail = TRUE, log.p = FALSE, with_params = list() )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-7","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"q Vector points evaluate probability function . lower.tail TRUE, return P(X <= q). Otherwise return P(X > q). log.p TRUE, probabilities returned log(p). with_params Distribution parameters use. parameter value can also numeric vector length length(q). case, -th probability point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-9","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Gradients cumulative probability Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-8","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list structure containing cumulative (log-)probability gradients free parameters Distribution evaluated q.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-6","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$diff_probability( c(1.0, 2.0), with_params = list(rate = 2.0) )"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-10","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$is_in_support(x, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-8","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-10","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Determine value support Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-9","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"logical vector length x indicating whether x part support distribution given parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-7","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential(rate = 1.0)$is_in_support(c(-1.0, 0.0, 1.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-11","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$is_discrete_at(x, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-9","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-11","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Determine value positive probability","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-10","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"logical vector length x indicating whether positive probability mass x given Distribution parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-8","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_dirac(point = 0.0)$is_discrete_at(c(0.0, 1.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-12","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_is_discrete_at()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-12","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Compile TensorFlow function discrete support checking","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-11","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"tf_function taking arguments x args returning whether Distribution point mass x given parameters args.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-13","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$has_capability(caps)"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-10","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"caps Character vector capabilities","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-13","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Check capability present","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-12","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"logical vector length caps.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-9","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$has_capability(\"density\")"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-14","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_type()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-14","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get type Distribution. Type can one discrete, continuous mixed.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-13","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"string representing type Distribution.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-10","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$get_type() dist_dirac()$get_type() dist_mixture(list(dist_dirac(), dist_exponential()))$get_type() dist_mixture(list(dist_dirac(), dist_binomial()))$get_type()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-15","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_components()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-15","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get component Distributions transformed Distribution.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-14","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"possibly empty list Distributions","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-11","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_trunc(dist_exponential())$get_components() dist_dirac()$get_components() dist_mixture(list(dist_exponential(), dist_gamma()))$get_components()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-16","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$is_discrete()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-16","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Check Distribution discrete, .e. density respect counting measure.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-15","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"TRUE Distribution discrete, FALSE otherwise. Note mixed distributions discrete can point masses.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-12","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$is_discrete() dist_dirac()$is_discrete()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-17","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$is_continuous()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-17","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Check Distribution continuous, .e. density respect Lebesgue measure.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-16","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"TRUE Distribution continuous, FALSE otherwise. Note mixed distributions continuous.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-13","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$is_continuous() dist_dirac()$is_continuous()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-18","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$require_capability( caps, fun_name = paste0(sys.call(-1)[[1]], \"()\") )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-11","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"caps Character vector Capabilities require fun_name Frienly text use generating error message case failure.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-18","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Ensure Distribution required capabilities. throw error capability missing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-17","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"Invisibly TRUE.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-14","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$require_capability(\"diff_density\")"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-19","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_dof()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-19","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get number degrees freedom Distribution family. parameters without fixed default considered free.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-18","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"integer representing degrees freedom suitable e.g. AIC calculations.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-15","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$get_dof() dist_exponential(rate = 1.0)$get_dof()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-20","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_placeholders()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-20","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get Placeholders Distribution family. Returns list free parameters family. values NULL. Distribution Distributions parameters, placeholders computed recursively.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-19","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"named list containing combination (named unnamed) lists NULLs.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-16","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$get_placeholders() dist_mixture(list(dist_dirac(), dist_exponential()))$get_placeholders()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-21","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_params(with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-12","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"with_params Optional parameter overrides structure dist$get_params(). Given Parameter values expected length 1.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-21","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get full list parameters, possibly including placeholders.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-20","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list representing (recursive) parameter structure Distribution values specified parameters NULL free parameters missing Distributions parameters with_params.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-17","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_mixture(list(dist_dirac(), dist_exponential()))$get_params( with_params = list(probs = list(0.5, 0.5)) )"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-22","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_make_constants(with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-13","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"with_params Optional parameter overrides structure dist$tf_make_constants(). Given Parameter values expected length 1.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-22","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get list constant TensorFlow parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-21","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list representing (recursive) constant parameters Distribution values sprecified parameters. constant TensorFlow Tensor dtype floatx.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-23","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_compile_params(input, name_prefix = \"\")"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-14","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"input keras layer bind outputs name_prefix Prefix use layer names","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-23","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Compile distribution parameters tensorflow outputs","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-22","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list two elements outputs flat list keras output layers, one parameter. output_inflater function taking keras output layers transforming list structure suitable passing loss function returned tf_compile_model()","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-24","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_param_bounds()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-24","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get Interval bounds Distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-23","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list representing free (recursive) parameter structure Distribution Interval objects values representing bounds respective free parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-18","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_mixture( list(dist_dirac(), dist_exponential()), probs = list(0.5, 0.5) )$get_param_bounds() dist_mixture( list(dist_dirac(), dist_exponential()) )$get_param_bounds() dist_genpareto()$get_param_bounds() dist_genpareto1()$get_param_bounds()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-25","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_param_constraints()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-25","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get additional (non-linear) equality constraints Distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-24","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"NULL box constraints specified dist$get_param_bounds() sufficient, function taking full Distribution parameters returning either numeric vector (must 0 valid parameter combinations) list elements constraints: numeric vector constraints jacobian: Jacobi matrix constraints respect parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-19","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_mixture( list(dist_dirac(), dist_exponential()) )$get_param_constraints()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-26","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$export_functions( name, envir = parent.frame(), with_params = list() )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-15","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"name common suffix exported functions envir Environment export functions with_params Optional list parameters use default values exported functions","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-26","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Export sampling, density, probability quantile functions plain R functions Creates new functions envir named {r,d,p,q} implement dist$sample, dist$density, dist$probability dist$quantile plain functions default arguments specified with_params fixed parameters. resulting functions signatures taking parameters separate arguments.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-25","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"Invisibly NULL.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-20","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"tmp_env <- new.env(parent = globalenv()) dist_exponential()$export_functions( name = \"exp\", envir = tmp_env, with_params = list(rate = 2.0) ) evalq( fitdistrplus::fitdist(rexp(100), \"exp\"), envir = tmp_env )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Base class for Distributions — Distribution","text":"objects class cloneable method.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-27","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$clone(deep = FALSE)"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-16","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"deep Whether make deep clone.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"# Example for param_bounds: # Create an Exponential Distribution with rate constrained to (0, 2) # instead of (0, Inf) my_exp <- dist_exponential() my_exp$param_bounds$rate <- interval(c(0, 2)) my_exp$get_param_bounds() #> $rate #> (0, 2) #> fit_dist(my_exp, rexp(100, rate = 3), start = list(rate = 1))$params$rate #> [1] 2 ## ------------------------------------------------ ## Method `Distribution$sample` ## ------------------------------------------------ dist_exponential(rate = 2.0)$sample(10) #> [1] 0.13286615 0.01112249 0.07288815 1.51862540 0.08488557 0.42304793 #> [7] 0.10249917 0.08983756 0.25915838 0.33607531 ## ------------------------------------------------ ## Method `Distribution$density` ## ------------------------------------------------ dist_exponential()$density(c(1.0, 2.0), with_params = list(rate = 2.0)) #> [1] 0.27067057 0.03663128 ## ------------------------------------------------ ## Method `Distribution$probability` ## ------------------------------------------------ dist_exponential()$probability( c(1.0, 2.0), with_params = list(rate = 2.0) ) #> [1] 0.8646647 0.9816844 ## ------------------------------------------------ ## Method `Distribution$quantile` ## ------------------------------------------------ dist_exponential()$quantile(c(0.1, 0.5), with_params = list(rate = 2.0)) #> [1] 0.05268026 0.34657359 ## ------------------------------------------------ ## Method `Distribution$hazard` ## ------------------------------------------------ dist_exponential(rate = 2.0)$hazard(c(1.0, 2.0)) #> [1] 2 2 ## ------------------------------------------------ ## Method `Distribution$diff_density` ## ------------------------------------------------ dist_exponential()$diff_density( c(1.0, 2.0), with_params = list(rate = 2.0) ) #> $rate #> [1] -0.13533528 -0.05494692 #> ## ------------------------------------------------ ## Method `Distribution$diff_probability` ## ------------------------------------------------ dist_exponential()$diff_probability( c(1.0, 2.0), with_params = list(rate = 2.0) ) #> $rate #> [1] 0.13533528 0.03663128 #> ## ------------------------------------------------ ## Method `Distribution$is_in_support` ## ------------------------------------------------ dist_exponential(rate = 1.0)$is_in_support(c(-1.0, 0.0, 1.0)) #> [1] FALSE FALSE TRUE ## ------------------------------------------------ ## Method `Distribution$is_discrete_at` ## ------------------------------------------------ dist_dirac(point = 0.0)$is_discrete_at(c(0.0, 1.0)) #> [1] TRUE FALSE ## ------------------------------------------------ ## Method `Distribution$has_capability` ## ------------------------------------------------ dist_exponential()$has_capability(\"density\") #> [1] TRUE ## ------------------------------------------------ ## Method `Distribution$get_type` ## ------------------------------------------------ dist_exponential()$get_type() #> [1] \"continuous\" dist_dirac()$get_type() #> [1] \"discrete\" dist_mixture(list(dist_dirac(), dist_exponential()))$get_type() #> [1] \"mixed\" dist_mixture(list(dist_dirac(), dist_binomial()))$get_type() #> [1] \"discrete\" ## ------------------------------------------------ ## Method `Distribution$get_components` ## ------------------------------------------------ dist_trunc(dist_exponential())$get_components() #> [[1]] #> An ExponentialDistribution with 1 dof #> dist_dirac()$get_components() #> list() dist_mixture(list(dist_exponential(), dist_gamma()))$get_components() #> [[1]] #> An ExponentialDistribution with 1 dof #> #> [[2]] #> A GammaDistribution with 2 dof #> ## ------------------------------------------------ ## Method `Distribution$is_discrete` ## ------------------------------------------------ dist_exponential()$is_discrete() #> [1] FALSE dist_dirac()$is_discrete() #> [1] TRUE ## ------------------------------------------------ ## Method `Distribution$is_continuous` ## ------------------------------------------------ dist_exponential()$is_continuous() #> [1] TRUE dist_dirac()$is_continuous() #> [1] FALSE ## ------------------------------------------------ ## Method `Distribution$require_capability` ## ------------------------------------------------ dist_exponential()$require_capability(\"diff_density\") ## ------------------------------------------------ ## Method `Distribution$get_dof` ## ------------------------------------------------ dist_exponential()$get_dof() #> [1] 1 dist_exponential(rate = 1.0)$get_dof() #> [1] 0 ## ------------------------------------------------ ## Method `Distribution$get_placeholders` ## ------------------------------------------------ dist_exponential()$get_placeholders() #> $rate #> NULL #> dist_mixture(list(dist_dirac(), dist_exponential()))$get_placeholders() #> $dists #> $dists[[1]] #> $dists[[1]]$point #> NULL #> #> #> $dists[[2]] #> $dists[[2]]$rate #> NULL #> #> #> #> $probs #> $probs[[1]] #> NULL #> #> $probs[[2]] #> NULL #> #> ## ------------------------------------------------ ## Method `Distribution$get_params` ## ------------------------------------------------ dist_mixture(list(dist_dirac(), dist_exponential()))$get_params( with_params = list(probs = list(0.5, 0.5)) ) #> $dists #> $dists[[1]] #> $dists[[1]]$point #> NULL #> #> #> $dists[[2]] #> $dists[[2]]$rate #> NULL #> #> #> #> $probs #> $probs[[1]] #> [1] 0.5 #> #> $probs[[2]] #> [1] 0.5 #> #> ## ------------------------------------------------ ## Method `Distribution$get_param_bounds` ## ------------------------------------------------ dist_mixture( list(dist_dirac(), dist_exponential()), probs = list(0.5, 0.5) )$get_param_bounds() #> $dists #> $dists[[1]] #> $dists[[1]]$point #> (-Inf, Inf) #> #> #> $dists[[2]] #> $dists[[2]]$rate #> (0, Inf) #> #> #> #> $probs #> list() #> dist_mixture( list(dist_dirac(), dist_exponential()) )$get_param_bounds() #> $dists #> $dists[[1]] #> $dists[[1]]$point #> (-Inf, Inf) #> #> #> $dists[[2]] #> $dists[[2]]$rate #> (0, Inf) #> #> #> #> $probs #> $probs[[1]] #> [0, 1] #> #> $probs[[2]] #> [0, 1] #> #> dist_genpareto()$get_param_bounds() #> $u #> (-Inf, Inf) #> #> $sigmau #> (0, Inf) #> #> $xi #> (-Inf, Inf) #> dist_genpareto1()$get_param_bounds() #> $u #> (-Inf, Inf) #> #> $sigmau #> (0, Inf) #> #> $xi #> [0, 1] #> ## ------------------------------------------------ ## Method `Distribution$get_param_constraints` ## ------------------------------------------------ dist_mixture( list(dist_dirac(), dist_exponential()) )$get_param_constraints() #> function (params) #> { #> prob_mat <- do.call(cbind, params$probs) #> nms <- names(flatten_params(params)) #> jac_full <- matrix(0, nrow = nrow(prob_mat), ncol = length(nms)) #> jac_full[, grepl(\"^probs\", nms)] <- 1 #> list(constraints = rowSums(prob_mat) - 1, jacobian = jac_full) #> } #> ## ------------------------------------------------ ## Method `Distribution$export_functions` ## ------------------------------------------------ tmp_env <- new.env(parent = globalenv()) dist_exponential()$export_functions( name = \"exp\", envir = tmp_env, with_params = list(rate = 2.0) ) #> Exported `dexp()`. #> Exported `rexp()`. #> Exported `pexp()`. #> Exported `qexp()`. evalq( fitdistrplus::fitdist(rexp(100), \"exp\"), envir = tmp_env ) #> Fitting of the distribution ' exp ' by maximum likelihood #> Parameters: #> estimate Std. Error #> rate 2.131976 0.2131975"},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":null,"dir":"Reference","previous_headings":"","what":"The Generalized Pareto Distribution (GPD) — GenPareto","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"functions provide information generalized Pareto distribution threshold u. dgpd gives density, pgpd gives distribution function, qgpd gives quantile function rgpd generates random deviates.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"","code":"rgpd(n = 1L, u = 0, sigmau = 1, xi = 0) dgpd(x, u = 0, sigmau = 1, xi = 0, log = FALSE) pgpd(q, u = 0, sigmau = 1, xi = 0, lower.tail = TRUE, log.p = FALSE) qgpd(p, u = 0, sigmau = 1, xi = 0, lower.tail = TRUE, log.p = FALSE)"},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"n integer number observations. u threshold parameter (minimum value). sigmau scale parameter (must positive). xi shape parameter x, q vector quantiles. log, log.p logical; TRUE, probabilities/densities p given log(p). lower.tail logical; TRUE (default), probabilities \\(P(X \\le x)\\), otherwise \\(P(X > x)\\). p vector probabilities.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"rgpd generates random deviates. dgpd gives density. pgpd gives distribution function. qgpd gives quantile function.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"u, sigmau xi specified, assume default values 0, 1 0 respectively. generalized Pareto distribution density $$f(x) = 1 / \\sigma_u (1 + \\xi z)^(- 1 / \\xi - 1)$$ \\(z = (x - u) / \\sigma_u\\) \\(f(x) = exp(-z)\\) \\(\\xi\\) 0. support \\(x \\ge u\\) \\(\\xi \\ge 0\\) \\(u \\le x \\le u - \\sigma_u / \\xi\\) \\(\\xi < 0\\). Expected value exists \\(\\xi < 1\\) equal $$E(X) = u + \\sigma_u / (1 - \\xi)$$ k-th moments exist general \\(k\\xi < 1\\).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"https://en.wikipedia.org/wiki/Generalized_Pareto_distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"","code":"x <- rgpd(1000, u = 1, sigmau = 0.5, xi = 0.1) xx <- seq(-1, 10, 0.01) hist(x, breaks = 100, freq = FALSE, xlim = c(-1, 10)) lines(xx, dgpd(xx, u = 1, sigmau = 0.5, xi = 0.1)) plot(xx, dgpd(xx, u = 1, sigmau = 1, xi = 0), type = \"l\") lines(xx, dgpd(xx, u = 0.5, sigmau = 1, xi = -0.3), col = \"blue\", lwd = 2) lines(xx, dgpd(xx, u = 1.5, sigmau = 1, xi = 0.3), col = \"red\", lwd = 2) plot(xx, dgpd(xx, u = 1, sigmau = 1, xi = 0), type = \"l\") lines(xx, dgpd(xx, u = 1, sigmau = 0.5, xi = 0), col = \"blue\", lwd = 2) lines(xx, dgpd(xx, u = 1, sigmau = 2, xi = 0), col = \"red\", lwd = 2)"},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":null,"dir":"Reference","previous_headings":"","what":"The Pareto Distribution — Pareto","title":"The Pareto Distribution — Pareto","text":"functions provide information Pareto distribution. dpareto gives density, ppareto gives distribution function, qpareto gives quantile function rpareto generates random deviates.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"The Pareto Distribution — Pareto","text":"","code":"rpareto(n = 1L, shape = 0, scale = 1) dpareto(x, shape = 1, scale = 1, log = FALSE) ppareto(q, shape = 1, scale = 1, lower.tail = TRUE, log.p = FALSE) qpareto(p, shape = 1, scale = 1, lower.tail = TRUE, log.p = FALSE)"},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"The Pareto Distribution — Pareto","text":"n integer number observations. shape shape parameter (must positive). scale scale parameter (must positive). x, q vector quantiles. log, log.p logical; TRUE, probabilities/densities p given log(p). lower.tail logical; TRUE (default), probabilities \\(P(X \\le x)\\), otherwise \\(P(X > x)\\). p vector probabilities.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"The Pareto Distribution — Pareto","text":"rpareto generates random deviates. dpareto gives density. ppareto gives distribution function. qpareto gives quantile function.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"The Pareto Distribution — Pareto","text":"shape scale specified, assume default values 1. Pareto distribution scale \\(\\theta\\) shape \\(\\xi\\) density $$f(x) = \\xi \\theta^\\xi / (x + \\theta)^(\\xi + 1)$$ support \\(x \\ge 0\\). Expected value exists \\(\\xi > 1\\) equal $$E(X) = \\theta / (\\xi - 1)$$ k-th moments exist general \\(k < \\xi\\).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"The Pareto Distribution — Pareto","text":"https://en.wikipedia.org/wiki/Pareto_distribution - named Lomax therein.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"The Pareto Distribution — Pareto","text":"","code":"x <- rpareto(1000, shape = 10, scale = 5) xx <- seq(-1, 10, 0.01) hist(x, breaks = 100, freq = FALSE, xlim = c(-1, 10)) lines(xx, dpareto(xx, shape = 10, scale = 5)) plot(xx, dpareto(xx, shape = 10, scale = 5), type = \"l\") lines(xx, dpareto(xx, shape = 3, scale = 5), col = \"red\", lwd = 2) plot(xx, dpareto(xx, shape = 10, scale = 10), type = \"l\") lines(xx, dpareto(xx, shape = 10, scale = 5), col = \"blue\", lwd = 2) lines(xx, dpareto(xx, shape = 10, scale = 20), col = \"red\", lwd = 2)"},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert TensorFlow tensors to distribution parameters recursively — as_params","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"Convert TensorFlow tensors distribution parameters recursively","code":""},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"","code":"as_params(x)"},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"x possibly nested list structure tensorflow.tensors","code":""},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"nested list vectors suitable distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"","code":"if (interactive()) { tf_params <- list( probs = k_matrix(t(c(0.5, 0.3, 0.2))), shapes = k_matrix(t(c(1L, 2L, 3L)), dtype = \"int32\"), scale = keras3::as_tensor(1.0, keras3::config_floatx()) ) params <- as_params(tf_params) dist <- dist_erlangmix(vector(\"list\", 3L)) dist$sample(10L, with_params = params) }"},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":null,"dir":"Reference","previous_headings":"","what":"Transition functions for blended distributions — blended_transition","title":"Transition functions for blended distributions — blended_transition","text":"Transition functions blended distributions","code":""},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transition functions for blended distributions — blended_transition","text":"","code":"blended_transition(x, u, eps, .gradient = FALSE, .extend_na = FALSE) blended_transition_inv(x, u, eps, .component)"},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transition functions for blended distributions — blended_transition","text":"x Points evaluate u Sorted vector blending thresholds, rowwise sorted matrix blending thresholds eps Corresponding vector matrix blending bandwidths. Must positive dimensions u, scalar. rowwise blending regions (u - eps, u + eps) may overlap. .gradient Also evaluate gradient respect x? .extend_na Extend -range transitions last -range value (.e. corresponding u) NA? .component Component index (length(u) + 1) invert.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Transition functions for blended distributions — blended_transition","text":"blended_transition returns matrix length(x) rows length(u) + 1 columns containing transformed values blending components. .gradient TRUE, attribute \"gradient\" attached dimensions, containing derivative respective transition component respect x. blended_transition_inv returns vector length(x) values containing inverse transformed values .componentth blending component.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Transition functions for blended distributions — blended_transition","text":"","code":"library(ggplot2) xx <- seq(from = 0, to = 20, length.out = 101) blend_mat <- blended_transition(xx, u = 10, eps = 3, .gradient = TRUE) ggplot( data.frame( x = rep(xx, 2L), fun = rep(c(\"p\", \"q\"), each = length(xx)), y = as.numeric(blend_mat), relevant = c(xx <= 13, xx >= 7) ), aes(x = x, y = y, color = fun, linetype = relevant) ) %+% geom_line() %+% theme_bw() %+% theme( legend.position = \"bottom\", legend.box = \"horizontal\" ) %+% guides(color = guide_legend(direction = \"horizontal\", title = \"\"), linetype = guide_none()) %+% scale_linetype_manual(values = c(\"TRUE\" = 1, \"FALSE\" = 3)) ggplot( data.frame( x = rep(xx, 2L), fun = rep(c(\"p'\", \"q'\"), each = length(xx)), y = as.numeric(attr(blend_mat, \"gradient\")), relevant = c(xx <= 13, xx >= 7) ), aes(x = x, y = y, color = fun, linetype = relevant) ) %+% geom_line() %+% theme_bw() %+% theme( legend.position = \"bottom\", legend.box = \"horizontal\" ) %+% guides(color = guide_legend(direction = \"horizontal\", title = \"\"), linetype = guide_none()) %+% scale_linetype_manual(values = c(\"TRUE\" = 1, \"FALSE\" = 3))"},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":null,"dir":"Reference","previous_headings":"","what":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"Provides keras callback similar keras3::callback_reduce_lr_on_plateau() also restores weights best seen far whenever learning rate reduction occurs, slightly restrictive improvement detection.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"","code":"callback_adaptive_lr( monitor = \"val_loss\", factor = 0.1, patience = 10L, verbose = 0L, mode = c(\"auto\", \"min\", \"max\"), delta_abs = 1e-04, delta_rel = 0, cooldown = 0L, min_lr = 0, restore_weights = TRUE )"},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"monitor quantity monitored. factor factor learning rate reduced. new_lr = old_lr * factor. patience number epochs significant improvement learning rate reduced. verbose integer. Set 1 receive update messages. mode Optimisation mode. \"auto\" detects mode name monitor. \"min\" monitors decreasing metrics. \"max\" monitors increasing metrics. delta_abs Minimum absolute metric improvement per epoch. learning rate reduced average improvement less delta_abs per epoch patience epochs. delta_rel Minimum relative metric improvement per epoch. learning rate reduced average improvement less |metric| * delta_rel per epoch patience epochs. cooldown number epochs wait resuming normal operation learning rate reduced. minimum number epochs two learning rate reductions patience + cooldown. min_lr lower bound learning rate. learning rate reduction lower learning rate min_lr, clipped min_lr instead reductions performed. restore_weights Bool. TRUE, best weights restored learning rate reduction. useful metric oscillates.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"KerasCallback suitable passing keras3::fit().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"Note keras3::callback_reduce_lr_on_plateau() automatically logs learning rate metric 'lr', currently impossible R. Thus, want also log learning rate, add keras3::callback_reduce_lr_on_plateau() high min_lr effectively disable callback still monitor learning rate.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"","code":"dist <- dist_exponential() group <- sample(c(0, 1), size = 100, replace = TRUE) x <- dist$sample(100, with_params = list(rate = group + 1)) global_fit <- fit(dist, x) if (interactive()) { library(keras3) l_in <- layer_input(shape = 1L) mod <- tf_compile_model( inputs = list(l_in), intermediate_output = l_in, dist = dist, optimizer = optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_initialise_model(mod, global_fit$params) fit_history <- fit( mod, x = as_tensor(group, config_floatx()), y = as_trunc_obs(x), epochs = 20L, callbacks = list( callback_adaptive_lr(\"loss\", factor = 0.5, patience = 2L, verbose = 1L, min_lr = 1.0e-4), callback_reduce_lr_on_plateau(\"loss\", min_lr = 1.0) # to track lr ) ) plot(fit_history) predicted_means <- predict(mod, data = as_tensor(c(0, 1), config_floatx())) }"},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":null,"dir":"Reference","previous_headings":"","what":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"Provides keras callback monitor individual components censored truncated likelihood. Useful debugging TensorFlow implementations Distributions.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"","code":"callback_debug_dist_gradients( object, data, obs, keep_grads = FALSE, stop_on_na = TRUE, verbose = TRUE )"},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"object reservr_keras_model created tf_compile_model(). data Input data model. obs Observations associated data. keep_grads Log actual gradients? (memory hungry!) stop_on_na Stop likelihood component NaN gradients? verbose Print message training halted? Message contain information likelihood components NaN gradients.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"KerasCallback suitable passing keras3::fit().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"","code":"dist <- dist_exponential() group <- sample(c(0, 1), size = 100, replace = TRUE) x <- dist$sample(100, with_params = list(rate = group + 1)) global_fit <- fit(dist, x) if (interactive()) { library(keras3) l_in <- layer_input(shape = 1L) mod <- tf_compile_model( inputs = list(l_in), intermediate_output = l_in, dist = dist, optimizer = optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_initialise_model(mod, global_fit$params) gradient_tracker <- callback_debug_dist_gradients( mod, as_tensor(group, config_floatx()), x, keep_grads = TRUE ) fit_history <- fit( mod, x = as_tensor(group, config_floatx()), y = x, epochs = 20L, callbacks = list( callback_adaptive_lr(\"loss\", factor = 0.5, patience = 2L, verbose = 1L, min_lr = 1.0e-4), gradient_tracker, callback_reduce_lr_on_plateau(\"loss\", min_lr = 1.0) # to track lr ) ) gradient_tracker$gradient_logs[[20]]$dens plot(fit_history) predicted_means <- predict(mod, data = as_tensor(c(0, 1), config_floatx())) }"},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":null,"dir":"Reference","previous_headings":"","what":"Construct a BDEGP-Family — dist_bdegp","title":"Construct a BDEGP-Family — dist_bdegp","text":"Constructs BDEGP-Family distribution fixed number components blending interval.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Construct a BDEGP-Family — dist_bdegp","text":"","code":"dist_bdegp(n, m, u, epsilon)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Construct a BDEGP-Family — dist_bdegp","text":"n Number dirac components, starting point mass 0. m Number erlang components, translated n - 0.5. u Blending cut-, must positive real. epsilon Blending radius, must positive real less u. blending interval u - epsilon < x < u + epsilon.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Construct a BDEGP-Family — dist_bdegp","text":"MixtureDistribution n DiracDistributions 0 .. n - 1 BlendedDistribution object child Distributions TranslatedDistribution offset n - 0.5 ErlangMixtureDistribution m shapes GeneralizedParetoDistribution shape parameter restricted [0, 1] location parameter fixed u break u bandwidth epsilon.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Construct a BDEGP-Family — dist_bdegp","text":"","code":"dist <- dist_bdegp(n = 1, m = 2, u = 10, epsilon = 3) params <- list( dists = list( list(), list( dists = list( list( dist = list( shapes = list(1L, 2L), scale = 1.0, probs = list(0.7, 0.3) ) ), list( sigmau = 1.0, xi = 0.1 ) ), probs = list(0.1, 0.9) ) ), probs = list(0.95, 0.05) ) x <- dist$sample(100, with_params = params) plot_distributions( theoretical = dist, empirical = dist_empirical(x), .x = seq(0, 20, length.out = 101), with_params = list(theoretical = params) ) #> Warning: Removed 33 rows containing missing values or values outside the scale range #> (`geom_line()`)."},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":null,"dir":"Reference","previous_headings":"","what":"Beta Distribution — dist_beta","title":"Beta Distribution — dist_beta","text":"See stats::Beta","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Beta Distribution — dist_beta","text":"","code":"dist_beta(shape1 = NULL, shape2 = NULL, ncp = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Beta Distribution — dist_beta","text":"shape1 First scalar shape parameter, NULL placeholder. shape2 Second scalar shape parameter, NULL placeholder. ncp Scalar non-centrality parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Beta Distribution — dist_beta","text":"BetaDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Beta Distribution — dist_beta","text":"parameters can overridden with_params = list(shape = ..., scale = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Beta Distribution — dist_beta","text":"","code":"d_beta <- dist_beta(shape1 = 2, shape2 = 2, ncp = 0) x <- d_beta$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_beta, estimated = d_beta, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"beta\")$estimate ) ), .x = seq(0, 2, length.out = 100) ) #> Warning: Removed 141 rows containing missing values or values outside the scale range #> (`geom_line()`)."},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":null,"dir":"Reference","previous_headings":"","what":"Binomial Distribution — dist_binomial","title":"Binomial Distribution — dist_binomial","text":"See stats::Binomial","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Binomial Distribution — dist_binomial","text":"","code":"dist_binomial(size = NULL, prob = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Binomial Distribution — dist_binomial","text":"size Number trials parameter (integer), NULL placeholder. prob Success probability parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Binomial Distribution — dist_binomial","text":"BinomialDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Binomial Distribution — dist_binomial","text":"parameters can overridden with_params = list(size = ..., prob = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Binomial Distribution — dist_binomial","text":"","code":"d_binom <- dist_binomial(size = 10, prob = 0.5) x <- d_binom$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_binom, estimated = d_binom, with_params = list( estimated = list( size = max(x), prob = mean(x) / max(x) ) ), .x = 0:max(x) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":null,"dir":"Reference","previous_headings":"","what":"Blended distribution — dist_blended","title":"Blended distribution — dist_blended","text":"Blended distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Blended distribution — dist_blended","text":"","code":"dist_blended(dists, probs = NULL, breaks = NULL, bandwidths = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Blended distribution — dist_blended","text":"dists list k >= 2 component Distributions. probs k Mixture weight parameters breaks k - 1 Centers blending zones. dists[] blend dists[+ 1] around breaks[]. bandwidths k - 1 Radii blending zones. -th blending zone begin breaks[] - bandwidths[] end breaks[] + bandwidths[]. bandwidth 0 corresponds hard cut-, .e. jump discontinuity density blended Distribution.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Blended distribution — dist_blended","text":"BlendedDistribution object.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Blended distribution — dist_blended","text":"","code":"bd <- dist_blended( list( dist_normal(mean = 0.0, sd = 1.0), dist_genpareto(u = 3.0, sigmau = 1.0, xi = 3.0) ), breaks = list(3.0), bandwidths = list(0.5), probs = list(0.9, 0.1) ) plot_distributions( bd, .x = seq(-3, 10, length.out = 100), plots = c(\"d\", \"p\") )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":null,"dir":"Reference","previous_headings":"","what":"Dirac (degenerate point) Distribution — dist_dirac","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"degenerate distribution mass single point.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"","code":"dist_dirac(point = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"point point probability mass 1.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"DiracDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"parameter can overridden with_params = list(point = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"","code":"d_dirac <- dist_dirac(1.5) d_dirac$sample(2L) #> [1] 1.5 1.5 d_dirac$sample(2L, list(point = 42.0)) #> [1] 42 42"},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":null,"dir":"Reference","previous_headings":"","what":"Discrete Distribution — dist_discrete","title":"Discrete Distribution — dist_discrete","text":"full-flexibility discrete distribution values 1 size.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Discrete Distribution — dist_discrete","text":"","code":"dist_discrete(size = NULL, probs = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Discrete Distribution — dist_discrete","text":"size Number classes parameter (integer). Required probs NULL. probs Vector probabilties parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Discrete Distribution — dist_discrete","text":"DiscreteDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Discrete Distribution — dist_discrete","text":"Parameters can overridden with_params = list(probs = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Discrete Distribution — dist_discrete","text":"","code":"d_discrete <- dist_discrete(probs = list(0.5, 0.25, 0.15, 0.1)) x <- d_discrete$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_discrete, estimated = d_discrete, with_params = list( estimated = list( size = max(x), probs = as.list(unname(table(x)) / 100) ) ), .x = 0:max(x) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":null,"dir":"Reference","previous_headings":"","what":"Empirical distribution — dist_empirical","title":"Empirical distribution — dist_empirical","text":"Creates empirical distribution object sample. Assumes iid. samples. with_params used distribution estimation relevant indicators happens construction.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Empirical distribution — dist_empirical","text":"","code":"dist_empirical(sample, positive = FALSE, bw = \"nrd0\")"},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Empirical distribution — dist_empirical","text":"sample Sample build empirical distribution positive underlying distribution known positive? effect density estimation procedure. positive = FALSE uses kernel density estimate produced density(), positive = TRUE uses log-kernel density estimate produced logKDE::logdensity_fft(). latter can improve density estimation near zero. bw Bandwidth parameter density estimation. Passed density estimation function selected positive.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Empirical distribution — dist_empirical","text":"EmpiricalDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Empirical distribution — dist_empirical","text":"sample() samples iid. sample. approach similar bootstrapping. density() evaluates kernel density estimate, approximating zero outside known support. estimate either obtained using stats::density logKDE::logdensity_fft, depending positive. probability() evaluates empirical cumulative density function obtained stats::ecdf. quantile() evaluates empirical quantiles using stats::quantile hazard() estimates hazard rate using density estimate empirical cumulative density function: h(t) = df(t) / (1 - cdf(t)).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Empirical distribution — dist_empirical","text":"","code":"x <- rexp(20, rate = 1) dx <- dist_empirical(sample = x, positive = TRUE) y <- rnorm(20) dy <- dist_empirical(sample = y) plot_distributions( exponential = dx, normal = dy, .x = seq(-3, 3, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":null,"dir":"Reference","previous_headings":"","what":"Erlang Mixture distribution — dist_erlangmix","title":"Erlang Mixture distribution — dist_erlangmix","text":"Erlang Mixture distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Erlang Mixture distribution — dist_erlangmix","text":"","code":"dist_erlangmix(shapes, scale = NULL, probs = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Erlang Mixture distribution — dist_erlangmix","text":"shapes Shape parameters, trunc_erlangmix fit, NULL placeholder. scale Common scale parameter, NULL placeholder. probs Mixing probabilities, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Erlang Mixture distribution — dist_erlangmix","text":"ErlangMixtureDistribution object.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Erlang Mixture distribution — dist_erlangmix","text":"","code":"params <- list(scale = 1.0, probs = list(0.5, 0.3, 0.2), shapes = list(1L, 2L, 3L)) dist <- dist_erlangmix(vector(\"list\", 3L)) x <- dist$sample(20, with_params = params) d_emp <- dist_empirical(x, positive = TRUE) plot_distributions( empirical = d_emp, theoretical = dist, with_params = list( theoretical = params ), .x = seq(1e-4, 5, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":null,"dir":"Reference","previous_headings":"","what":"Exponential distribution — dist_exponential","title":"Exponential distribution — dist_exponential","text":"See stats::Exponential.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Exponential distribution — dist_exponential","text":"","code":"dist_exponential(rate = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Exponential distribution — dist_exponential","text":"rate Scalar rate parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Exponential distribution — dist_exponential","text":"ExponentialDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Exponential distribution — dist_exponential","text":"parameter can overridden with_params = list(rate = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Exponential distribution — dist_exponential","text":"","code":"rate <- 1 d_exp <- dist_exponential() x <- d_exp$sample(20, with_params = list(rate = rate)) d_emp <- dist_empirical(x, positive = TRUE) plot_distributions( empirical = d_emp, theoretical = d_exp, estimated = d_exp, with_params = list( theoretical = list(rate = rate), estimated = list(rate = 1 / mean(x)) ), .x = seq(1e-4, 5, length.out = 100) ) #> Warning: Removed 27 rows containing missing values or values outside the scale range #> (`geom_line()`)."},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":null,"dir":"Reference","previous_headings":"","what":"Gamma distribution — dist_gamma","title":"Gamma distribution — dist_gamma","text":"See stats::GammaDist.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Gamma distribution — dist_gamma","text":"","code":"dist_gamma(shape = NULL, rate = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Gamma distribution — dist_gamma","text":"shape Scalar shape parameter, NULL placeholder. rate Scalar rate parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Gamma distribution — dist_gamma","text":"GammaDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Gamma distribution — dist_gamma","text":"parameters can overridden with_params = list(shape = ..., rate = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Gamma distribution — dist_gamma","text":"","code":"alpha <- 2 beta <- 2 d_gamma <- dist_gamma(shape = alpha, rate = beta) x <- d_gamma$sample(100) d_emp <- dist_empirical(x, positive = TRUE) plot_distributions( empirical = d_emp, theoretical = d_gamma, estimated = d_gamma, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"gamma\")$estimate ) ), .x = seq(1e-3, max(x), length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":null,"dir":"Reference","previous_headings":"","what":"Generalized Pareto Distribution — dist_genpareto","title":"Generalized Pareto Distribution — dist_genpareto","text":"See evmix::gpd","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generalized Pareto Distribution — dist_genpareto","text":"","code":"dist_genpareto(u = NULL, sigmau = NULL, xi = NULL) dist_genpareto1(u = NULL, sigmau = NULL, xi = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generalized Pareto Distribution — dist_genpareto","text":"u Scalar location parameter, NULL placeholder. sigmau Scalar scale parameter, NULL placeholder. xi Scalar shape parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generalized Pareto Distribution — dist_genpareto","text":"GeneralizedParetoDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generalized Pareto Distribution — dist_genpareto","text":"parameters can overridden with_params = list(u = ..., sigmau = ..., xi = ...). dist_genpareto1 equivalent dist_genpareto enforces bound constraints xi [0, 1]. ensures unboundedness finite expected value unless xi == 1.0.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generalized Pareto Distribution — dist_genpareto","text":"","code":"d_genpareto <- dist_genpareto(u = 0, sigmau = 1, xi = 1) x <- d_genpareto$sample(100) d_emp <- dist_empirical(x) d_genpareto$export_functions(\"gpd\") # so fitdistrplus finds it #> Exported `dgpd()`. #> Exported `rgpd()`. #> Exported `pgpd()`. #> Exported `qgpd()`. plot_distributions( empirical = d_emp, theoretical = d_genpareto, estimated = d_genpareto, with_params = list( estimated = fit(dist_genpareto(), x)$params ), .x = seq(0, 5, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":null,"dir":"Reference","previous_headings":"","what":"Log Normal distribution — dist_lognormal","title":"Log Normal distribution — dist_lognormal","text":"See stats::Lognormal.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Log Normal distribution — dist_lognormal","text":"","code":"dist_lognormal(meanlog = NULL, sdlog = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Log Normal distribution — dist_lognormal","text":"meanlog Scalar mean parameter log scale, NULL placeholder. sdlog Scalar standard deviation parameter log scale, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Log Normal distribution — dist_lognormal","text":"LognormalDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Log Normal distribution — dist_lognormal","text":"parameters can overridden with_params = list(meanlog = ..., sdlog = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Log Normal distribution — dist_lognormal","text":"","code":"mu <- 0 sigma <- 1 d_lnorm <- dist_lognormal(meanlog = mu, sdlog = sigma) x <- d_lnorm$sample(20) d_emp <- dist_empirical(x, positive = TRUE) plot_distributions( empirical = d_emp, theoretical = d_lnorm, estimated = d_lnorm, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"lnorm\")$estimate ) ), .x = seq(1e-3, 5, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":null,"dir":"Reference","previous_headings":"","what":"Mixture distribution — dist_mixture","title":"Mixture distribution — dist_mixture","text":"Parameters mixing components can overridden with_params = list(dists = list(..., ..., ...)). #' Mixing probabilites can overridden with_params = list(probs = list(..., ..., ...)). number components overridden.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Mixture distribution — dist_mixture","text":"","code":"dist_mixture(dists = list(), probs = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Mixture distribution — dist_mixture","text":"dists list mixing distributions. May contain placeholders duplicates. probs list mixing probabilities length dists. normalized sum one NULL can used placeholder within probs. reduce number required parameters, probs least partly specified (probs = list(NULL, NULL, ..., 1) k - 1 NULLs k number mixing components).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Mixture distribution — dist_mixture","text":"MixtureDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Mixture distribution — dist_mixture","text":"support quantile() capability!","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Mixture distribution — dist_mixture","text":"","code":"# A complicated way to define a uniform distribution on \\[0, 2\\] dist_mixture( dists = list( dist_uniform(min = 0, max = 1), dist_uniform(min = 1, max = 2) ), probs = list(0.5, 0.5) ) #> A Mixture with 0 dof"},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":null,"dir":"Reference","previous_headings":"","what":"Negative binomial Distribution — dist_negbinomial","title":"Negative binomial Distribution — dist_negbinomial","text":"See stats::NegBinomial","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Negative binomial Distribution — dist_negbinomial","text":"","code":"dist_negbinomial(size = NULL, mu = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Negative binomial Distribution — dist_negbinomial","text":"size Number successful trials parameter, NULL placeholder. Non-integer values > 0 allowed. mu Mean parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Negative binomial Distribution — dist_negbinomial","text":"NegativeBinomialDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Negative binomial Distribution — dist_negbinomial","text":"parameters can overridden with_params = list(size = ..., prob = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Negative binomial Distribution — dist_negbinomial","text":"","code":"d_nbinom <- dist_negbinomial(size = 3.5, mu = 8.75) x <- d_nbinom$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_nbinom, estimated = d_nbinom, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"nbinom\")$estimate ) ), .x = 0:max(x) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":null,"dir":"Reference","previous_headings":"","what":"Normal distribution — dist_normal","title":"Normal distribution — dist_normal","text":"See stats::Normal.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Normal distribution — dist_normal","text":"","code":"dist_normal(mean = NULL, sd = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Normal distribution — dist_normal","text":"mean Scalar mean parameter, NULL placeholder. sd Scalar standard deviation parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Normal distribution — dist_normal","text":"NormalDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Normal distribution — dist_normal","text":"parameters can overridden with_params = list(mean = ..., sd = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Normal distribution — dist_normal","text":"","code":"mu <- 0 sigma <- 1 d_norm <- dist_normal(mean = mu, sd = sigma) x <- d_norm$sample(20) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_norm, estimated = d_norm, with_params = list( estimated = list(mean = mean(x), sd = sd(x)) ), .x = seq(-3, 3, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":null,"dir":"Reference","previous_headings":"","what":"Pareto Distribution — dist_pareto","title":"Pareto Distribution — dist_pareto","text":"See Pareto","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Pareto Distribution — dist_pareto","text":"","code":"dist_pareto(shape = NULL, scale = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Pareto Distribution — dist_pareto","text":"shape Scalar shape parameter, NULL placeholder. scale Scalar scale parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Pareto Distribution — dist_pareto","text":"ParetoDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Pareto Distribution — dist_pareto","text":"parameters can overridden with_params = list(shape = ..., scale = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Pareto Distribution — dist_pareto","text":"","code":"d_pareto <- dist_pareto(shape = 3, scale = 1) x <- d_pareto$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_pareto, estimated = d_pareto, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"pareto\")$estimate ) ), .x = seq(0, 2, length.out = 100) ) #> Warning: The dpareto function should return a vector of with NaN values when input has inconsistent values and not raise an error"},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":null,"dir":"Reference","previous_headings":"","what":"Poisson Distribution — dist_poisson","title":"Poisson Distribution — dist_poisson","text":"See stats::Poisson","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Poisson Distribution — dist_poisson","text":"","code":"dist_poisson(lambda = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Poisson Distribution — dist_poisson","text":"lambda Scalar rate parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Poisson Distribution — dist_poisson","text":"PoissonDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Poisson Distribution — dist_poisson","text":"parameter can overridden with_params = list(lambda = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Poisson Distribution — dist_poisson","text":"","code":"d_pois <- dist_poisson(lambda = 5.0) x <- d_pois$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_pois, estimated = d_pois, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"pois\")$estimate ) ), .x = 0:max(x) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":null,"dir":"Reference","previous_headings":"","what":"Tranlsated distribution — dist_translate","title":"Tranlsated distribution — dist_translate","text":"Tranlsated distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tranlsated distribution — dist_translate","text":"","code":"dist_translate(dist = NULL, offset = NULL, multiplier = 1)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tranlsated distribution — dist_translate","text":"dist underlying distribution, NULL placeholder. offset Offset added observation, NULL placeholder. multiplier Factor multiply observation , NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Tranlsated distribution — dist_translate","text":"TranslatedDistribution object.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tranlsated distribution — dist_translate","text":"","code":"d_norm <- dist_normal(mean = 0, sd = 1) d_tnorm <- dist_translate(dist = d_norm, offset = 1) plot_distributions(d_norm, d_tnorm, .x = seq(-2, 3, length.out = 100))"},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":null,"dir":"Reference","previous_headings":"","what":"Truncated distribution — dist_trunc","title":"Truncated distribution — dist_trunc","text":"Truncated distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Truncated distribution — dist_trunc","text":"","code":"dist_trunc(dist = NULL, min = NULL, max = NULL, offset = 0, max_retry = 100)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Truncated distribution — dist_trunc","text":"dist underlying distribution, NULL placeholder. min Minimum value truncate (exclusive), NULL placeholder. max Maxmimum value truncate (inclusive), NULL placeholder. offset Offset added observation truncation, NULL placeholder. Truncation dist occur (min, max]. offset added deterministically. max_retry Maximum number resample attempts trying sample rejection.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Truncated distribution — dist_trunc","text":"TruncatedDistribution object.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Truncated distribution — dist_trunc","text":"","code":"d_norm <- dist_normal(mean = 0, sd = 1) d_tnorm <- dist_trunc(dist = d_norm, min = -2, max = 2, offset = 1) plot_distributions(d_norm, d_tnorm, .x = seq(-2, 3, length.out = 100))"},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":null,"dir":"Reference","previous_headings":"","what":"Uniform distribution — dist_uniform","title":"Uniform distribution — dist_uniform","text":"See stats::Uniform","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Uniform distribution — dist_uniform","text":"","code":"dist_uniform(min = NULL, max = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Uniform distribution — dist_uniform","text":"min Lower limit, NULL placeholder. max Upper limit, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Uniform distribution — dist_uniform","text":"UniformDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Uniform distribution — dist_uniform","text":"parameters can overridden with_params = list(min = ..., max = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Uniform distribution — dist_uniform","text":"","code":"d_unif <- dist_uniform(min = 0, max = 1) x <- d_unif$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_unif, estimated = d_unif, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"unif\")$estimate ) ), .x = seq(0, 1, length.out = 100) ) #> Warning: Removed 2 rows containing missing values or values outside the scale range #> (`geom_line()`)."},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":null,"dir":"Reference","previous_headings":"","what":"Weibull Distribution — dist_weibull","title":"Weibull Distribution — dist_weibull","text":"See stats::Weibull","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Weibull Distribution — dist_weibull","text":"","code":"dist_weibull(shape = NULL, scale = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Weibull Distribution — dist_weibull","text":"shape Scalar shape parameter, NULL placeholder. scale Scalar scale parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Weibull Distribution — dist_weibull","text":"WeibullDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Weibull Distribution — dist_weibull","text":"parameters can overridden with_params = list(shape = ..., scale = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Weibull Distribution — dist_weibull","text":"","code":"d_weibull <- dist_weibull(shape = 3, scale = 1) x <- d_weibull$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_weibull, estimated = d_weibull, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"weibull\")$estimate ) ), .x = seq(0, 2, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a neural network based distribution model to data — fit.reservr_keras_model","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"function delegates work keras3::fit.keras.src.models.model.Model() performs additional consistency checks make sure tf_compile_model() called appropriate options support fitting observations y well automatically converting y n x 6 matrix needed compiled loss function.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"","code":"# S3 method for reservr_keras_model fit( object, x, y, batch_size = NULL, epochs = 10, verbose = getOption(\"keras.fit_verbose\", default = 1), callbacks = NULL, view_metrics = getOption(\"keras.view_metrics\", default = \"auto\"), validation_split = 0, validation_data = NULL, shuffle = TRUE, class_weight = NULL, sample_weight = NULL, initial_epoch = 0, steps_per_epoch = NULL, validation_steps = NULL, ... )"},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"object compiled reservr_keras_model obtained tf_compile_model(). x list input tensors (predictors) y trunc_obs tibble observed outcomes, something convertible via as_trunc_obs(). batch_size Integer NULL. Number samples per gradient update. unspecified, batch_size default 32. specify batch_size data form TF Datasets generators, (since generate batches). epochs Integer. Number epochs train model. epoch iteration entire x y data provided (unless steps_per_epoch flag set something NULL). Note conjunction initial_epoch, epochs understood \"final epoch\". model trained number iterations given epochs, merely epoch index epochs reached. verbose \"auto\", 0, 1, 2. Verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per epoch. \"auto\" becomes 1 cases, 2 knitr render running distributed training server. Note progress bar particularly useful logged file, verbose=2 recommended running interactively (e.g., production environment). Defaults \"auto\". callbacks List Callback() instances. List callbacks apply training. See callback_*. view_metrics View realtime plot training metrics (epoch). default (\"auto\") display plot running within RStudio, metrics specified model compile(), epochs > 1 verbose > 0. Set global options(keras.view_metrics = ) option establish different default. validation_split Float 0 1. Fraction training data used validation data. model set apart fraction training data, train , evaluate loss model metrics data end epoch. validation data selected last samples x y data provided, shuffling. argument supported x TF Dataset generator. validation_data validation_split provided, validation_data override validation_split. validation_data Data evaluate loss model metrics end epoch. model trained data. Thus, note fact validation loss data provided using validation_split validation_data affected regularization layers like noise dropout. validation_data override validation_split. : tuple (x_val, y_val) arrays tensors. tuple (x_val, y_val, val_sample_weights) arrays. generator returning (inputs, targets) (inputs, targets, sample_weights). shuffle Boolean, whether shuffle training data epoch. argument ignored x generator TF Dataset. class_weight Optional named list mapping class indices (integers, 0-based) weight (float) value, used weighting loss function (training ). can useful tell model \"pay attention\" samples -represented class. class_weight specified targets rank 2 greater, either y must one-hot encoded, explicit final dimension 1 must included sparse class labels. sample_weight Optional array weights training samples, used weighting loss function (training ). can either pass flat (1D) array/vector length input samples (1:1 mapping weights samples), case temporal data, can pass 2D array (matrix) shape (samples, sequence_length), apply different weight every timestep every sample. argument supported x TF Dataset generator, instead provide sample_weights third element x. Note sample weighting apply metrics specified via metrics argument compile(). apply sample weighting metrics, can specify via weighted_metrics compile() instead. initial_epoch Integer. Epoch start training (useful resuming previous training run). steps_per_epoch Integer NULL. Total number steps (batches samples) declaring one epoch finished starting next epoch. training input tensors backend-native tensors, default NULL equal number samples dataset divided batch size, 1 determined. x TF Dataset, steps_per_epoch NULL, epoch run input dataset exhausted. passing infinitely repeating dataset, must specify steps_per_epoch argument. steps_per_epoch = -1 training run indefinitely infinitely repeating dataset. validation_steps relevant validation_data provided. Total number steps (batches samples) draw stopping performing validation end every epoch. validation_steps NULL, validation run validation_data dataset exhausted. case infinitely repeated dataset, run infinite loop. validation_steps specified part dataset consumed, evaluation start beginning dataset epoch. ensures validation samples used every time. ... Unused. old arguments supplied, error message raised informing fix issue.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"history object contains information collected training. model object updated -place side-effect.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"Additionally, default batch_size min(nrow(y), 10000) instead keras default 32 latter bad choice fitting distributions since involved loss much less stable typical losses used machine learning, leading divergence small batch sizes.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"","code":"dist <- dist_exponential() params <- list(rate = 1.0) N <- 100L rand_input <- runif(N) x <- dist$sample(N, with_params = params) if (interactive()) { tf_in <- keras3::layer_input(1L) mod <- tf_compile_model( inputs = list(tf_in), intermediate_output = tf_in, dist = dist, optimizer = keras3::optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_fit <- fit( object = mod, x = k_matrix(rand_input), y = x, epochs = 10L, callbacks = list( callback_debug_dist_gradients(mod, k_matrix(rand_input), x, keep_grads = TRUE) ) ) }"},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"Fit Blended mixture using ECME-Algorithm","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"","code":"fit_blended( dist, obs, start, min_iter = 0L, max_iter = 100L, skip_first_e = FALSE, tolerance = 1e-05, trace = FALSE, ... )"},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"dist BlendedDistribution. assumed, breaks bandwidths placeholder weights estimated. obs Set observations produced trunc_obs() convertible via as_trunc_obs(). start Initial values placeholder parameters. missing, starting values obtained fit_dist_start(). min_iter Minimum number EM-Iterations max_iter Maximum number EM-Iterations (weight updates) skip_first_e Skip first E-Step (update Probability weights)? can help initial values cause mixture component vanish first E-Step starting values can improved. tolerance Numerical tolerance. trace Include tracing information output? TRUE, additional tracing information added result list. ... Passed fit_dist_start() start missing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"list elements params fitted parameters structure init. params_hist (trace TRUE) history parameters (e- m- step) iter number outer EM-iterations logLik final log-likelihood","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"","code":"dist <- dist_blended( list( dist_exponential(), dist_genpareto() ) ) params <- list( probs = list(0.9, 0.1), dists = list( list(rate = 2.0), list(u = 1.5, xi = 0.2, sigmau = 1.0) ), breaks = list(1.5), bandwidths = list(0.3) ) x <- dist$sample(100L, with_params = params) dist$default_params$breaks <- params$breaks dist$default_params$bandwidths <- params$bandwidths if (interactive()) { fit_blended(dist, x) }"},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a general distribution to observations — fit_dist","title":"Fit a general distribution to observations — fit_dist","text":"default implementation performs maximum likelihood estimation placeholder parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a general distribution to observations — fit_dist","text":"","code":"fit_dist(dist, obs, start, ...) fit_dist_direct(dist, obs, start, ..., .start_with_default = FALSE) # S3 method for Distribution fit(object, obs, start, ...)"},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a general distribution to observations — fit_dist","text":"dist Distribution object. obs Set observations produced trunc_obs() convertible via as_trunc_obs(). start Initial values placeholder parameters. missing, starting values obtained fit_dist_start(). ... Distribution-specific arguments fitting procedure .start_with_default directly optimising likelihood, use optimised algorithm finding better starting values? object parameter dist","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a general distribution to observations — fit_dist","text":"list least elements params fitted parameters structure init. logLik final log-likelihood Additional information may provided depending dist.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit a general distribution to observations — fit_dist","text":"Erlang mixture distributions Mixture distributions, EM-Algorithm instead used improve stability. fit() fit_dist() chose optimisation method optimized specific distribution given. fit_dist_direct() can used force direct maximisation likelihood.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a general distribution to observations — fit_dist","text":"","code":"x <- rexp(100) lambda_hat <- 1 / mean(x) lambda_hat2 <- fit_dist(dist_exponential(), x)$params$rate identical(lambda_hat, lambda_hat2) #> [1] TRUE dist <- dist_mixture(list(dist_normal(), dist_translate(dist_exponential(), offset = 6))) params <- list( dists = list(list(mean = 5, sd = 1), list(dist = list(rate = 1))), probs = list(0.95, 0.05) ) set.seed(2000) u <- runif(100, 10, 20) x <- dist$sample(100, with_params = params) obs <- trunc_obs(x = x[x <= u], tmin = -Inf, tmax = u[x <= u]) default_fit <- fit_dist(dist, obs) direct_fit <- fit_dist_direct(dist, obs) # NB: direct optimisation steps with pre-run take a few seconds # \\donttest{ direct_fit_init <- fit_dist_direct(dist, obs, start = default_fit$params) direct_fit_auto_init <- fit_dist_direct(dist, obs, .start_with_default = TRUE) stopifnot(direct_fit_init$logLik == direct_fit_auto_init$logLik) c(default_fit$logLik, direct_fit$logLik, direct_fit_init$logLik) #> [1] -153.0052 -153.0052 -153.0052 # }"},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":null,"dir":"Reference","previous_headings":"","what":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"Find starting values distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"","code":"# S3 method for MixtureDistribution fit_dist_start(dist, obs, dists_start = NULL, ...) fit_dist_start(dist, obs, ...)"},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"dist Distribution object. obs Observations fit . dists_start List initial parameters component distributions. left empty, initialisation automatically performed using fit_dist_start() observations support respective component. ... Additional arguments initialisation procedure","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"list initial parameters suitable passing fit_dist().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"","code":"fit_dist_start(dist_exponential(), rexp(100)) #> $rate #> [1] 1.258531 #>"},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"Fit Erlang mixture using ECME-Algorithm","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"","code":"fit_erlang_mixture( dist, obs, start, min_iter = 0L, max_iter = 100L, skip_first_e = FALSE, tolerance = 1e-05, trace = FALSE, parallel = FALSE, ... )"},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"dist ErlangMixtureDistribution. assumed, probs scale estimated. obs Set observations produced trunc_obs() convertible via as_trunc_obs(). start Initial values placeholder parameters. missing, starting values obtained fit_dist_start(). min_iter Minimum number EM-Iterations max_iter Maximum number EM-Iterations (weight updates) skip_first_e Skip first E-Step (update Probability weights)? can help initial values cause mixture component vanish first E-Step starting values can improved. tolerance Numerical tolerance. trace Include tracing information output? TRUE, additional tracing information added result list. parallel Enable experimental parallel evaluation expected log-likelihood? ... Passed fit_dist_start() start missing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"list elements params fitted parameters structure init. params_hist (trace TRUE) history parameters (e- m- step). Otherwise empty list. iter number outer EM-iterations logLik final log-likelihood","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"","code":"dist <- dist_erlangmix(list(NULL, NULL, NULL)) params <- list( shapes = list(1L, 4L, 12L), scale = 2.0, probs = list(0.5, 0.3, 0.2) ) x <- dist$sample(100L, with_params = params) fit_erlang_mixture(dist, x, init = \"kmeans\") #> $params #> $params$probs #> $params$probs[[1]] #> [1] 0.31 #> #> $params$probs[[2]] #> [1] 0.43 #> #> $params$probs[[3]] #> [1] 0.26 #> #> #> $params$shapes #> $params$shapes[[1]] #> [1] 1 #> #> $params$shapes[[2]] #> [1] 4 #> #> $params$shapes[[3]] #> [1] 13 #> #> #> $params$scale #> [1] 1.686607 #> #> #> $params_hist #> list() #> #> $iter #> [1] 1 #> #> $logLik #> 'log Lik.' -310.162 (df=6) #>"},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"Fit generic mixture using ECME-Algorithm","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"","code":"fit_mixture( dist, obs, start, min_iter = 0L, max_iter = 100L, skip_first_e = FALSE, tolerance = 1e-05, trace = FALSE, ... )"},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"dist MixtureDistribution specifying structure mixture. Free parameters optimised. dominating measure likelihoods must constant, example dist_dirac() may point parameter free. obs Set observations produced trunc_obs() convertible via as_trunc_obs(). start Initial values placeholder parameters. missing, starting values obtained fit_dist_start(). min_iter Minimum number EM-Iterations max_iter Maximum number EM-Iterations (weight updates) skip_first_e Skip first E-Step (update Probability weights)? can help initial values cause mixture component vanish first E-Step starting values can improved. tolerance Numerical tolerance. trace Include tracing information output? TRUE, additional tracing information added result list. ... Passed fit_dist_start() start missing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"list elements params fitted parameters structure init. params_hist (trace TRUE) history parameters (e- m- step) iter number outer EM-iterations logLik final log-likelihood","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"","code":"dist <- dist_mixture( list( dist_dirac(0.0), dist_exponential() ) ) params <- list( probs = list(0.1, 0.9), dists = list( list(), list(rate = 1.0) ) ) x <- dist$sample(100L, with_params = params) fit_mixture(dist, x) #> $params #> $params$dists #> $params$dists[[1]] #> list() #> #> $params$dists[[2]] #> $params$dists[[2]]$rate #> [1] 0.8578941 #> #> #> #> $params$probs #> $params$probs[[1]] #> [1] 0.11 #> #> $params$probs[[2]] #> [1] 0.89 #> #> #> #> $iter #> [1] 1 #> #> $logLik #> 'log Lik.' -137.293 (df=2) #>"},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":null,"dir":"Reference","previous_headings":"","what":"Flatten / Inflate parameter lists / vectors — flatten_params","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"Flatten / Inflate parameter lists / vectors","code":""},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"","code":"flatten_params(params) flatten_params_matrix(params) flatten_bounds(bounds) inflate_params(flat_params)"},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"params named list parameters flattened. form passed with_params argument distribution functions. bounds List parameter bounds returned dist$get_param_bounds() flat_params named numeric vector parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"flatten_params returns 'flattened' vector parameters. intended adapter multi-dimensional optimisation functions distribution objects. flatten_params_matrix returns 'flattened' matrix parameters. intended adapter multi-dimensional optimisation functions distribution objects. column corresponds one input element. flatten_bounds returns named list vectors names lower upper. Containing upper lower bounds parameter. inflate_params returns 'inflated' list parameters. can passed with_params argument distribution functions.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"","code":"library(ggplot2) mm <- dist_mixture(list( dist_exponential(NULL), dist_lognormal(0.5, NULL) ), list(NULL, 1)) ph <- mm$get_placeholders() ph_flat <- flatten_params(ph) ph_reinflated <- inflate_params(ph_flat) ph_flat[] <- c(1, 1, 6) ph_sample <- inflate_params(ph_flat) x <- mm$sample( 100, with_params = ph_sample ) emp_cdf <- ecdf(x) ggplot(data.frame(t = seq(from = min(x), to = max(x), length.out = 100))) %+% geom_point(aes(x = t, y = emp_cdf(t))) %+% geom_line(aes(x = t, y = mm$probability(t, with_params = ph_sample)), linetype = 2)"},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":null,"dir":"Reference","previous_headings":"","what":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"Integrates fun bounds [ lower, upper ] vectorized lower upper. Vectorized list structures parameters can also passed.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"","code":"integrate_gk( fun, lower, upper, params = list(), .tolerance = .Machine$double.eps^0.25, .max_iter = 100L )"},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"fun function integrate. Must vectorized take one two arguments, first points evaluate second (optionally) parameters apply. must return numeric vector length first input. Currently, infinite bounds supported. lower, upper Integration bounds. Must length. params Parameters pass second argument fun. actual parameters must length number integrals compute. Can possibly nested list structures containing numeric vectors. Alternatively, can matrix number rows number integrals compute. .tolerance Absolute element-wise tolerance. .max_iter Maximum number iterations. number integration intervals length(lower) * .max_iter. Therefor maximum number function evaluations per integration interval 15 * .max_iter.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"vector integrals -th entry containing approximation integral fun(t, pick_params_at(params, )) dt interval lower[] upper[]","code":""},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"integration error estimated Gauss-Kronrod quadrature absolute difference 7-point quadrature 15-point quadrature. Integrals converge bisected midpoint. params object recursively subsetted numeric vectors length number observations.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"","code":"# Argument recycling and parallel integration of two intervals integrate_gk(sin, 0, c(pi, 2 * pi)) #> [1] 2.000000e+00 -3.141135e-16 dist <- dist_exponential() integrate_gk( function(x, p) dist$density(x, with_params = p), lower = 0, upper = 1:10, params = list(rate = 1 / 1:10) ) #> [1] 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 #> [8] 0.6321206 0.6321206 0.6321206 dist$probability(1:10, with_params = list(rate = 1 / 1:10)) #> [1] 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 #> [8] 0.6321206 0.6321206 0.6321206"},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":null,"dir":"Reference","previous_headings":"","what":"Convex union and intersection of intervals — interval-operations","title":"Convex union and intersection of intervals — interval-operations","text":"Convex union intersection intervals","code":""},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convex union and intersection of intervals — interval-operations","text":"","code":"interval_union(..., intervals = list()) interval_intersection(..., intervals = list())"},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convex union and intersection of intervals — interval-operations","text":"... appened intervals present. intervals list Intervals.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convex union and intersection of intervals — interval-operations","text":"interval_union returns convex union intervals intervals. smallest interval completely containing intervals. interval_intersection returns set intersection intervals intervals. empty set represented open interval (0, 0).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convex union and intersection of intervals — interval-operations","text":"","code":"interval_union( interval(c(0, 1), closed = TRUE), interval(c(1, 2)) ) #> [0, 2) interval_union( interval(c(0, 5)), interval(c(1, 4), closed = TRUE) ) #> (0, 5) # Convex union is not equal to set union: interval_union( interval(c(0, 1)), interval(c(2, 3)) ) #> (0, 3) # The empty union is {} interval_union() #> {} interval_intersection( interval(c(0, 1)), interval(c(0.5, 2)) ) #> (0.5, 1) interval_intersection( interval(c(0, Inf)), interval(c(-Inf, 0)) ) #> {} interval_intersection( interval(c(0, Inf), include_lowest = TRUE), interval(c(-Inf, 0), include_highest = TRUE) ) #> {0} interval_intersection( interval(c(0, 5)), interval(c(1, 6), closed = TRUE) ) #> [1, 5) # The empty intersection is (-Inf, Inf) interval_intersection() #> (-Inf, Inf)"},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":null,"dir":"Reference","previous_headings":"","what":"Intervals — interval","title":"Intervals — interval","text":"Intervals","code":""},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Intervals — interval","text":"","code":"interval( range = c(-Inf, Inf), ..., include_lowest = closed, include_highest = closed, closed = FALSE, integer = FALSE, read_only = FALSE ) is.Interval(x)"},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Intervals — interval","text":"range interval boundaries sorted two-element numeric vector. ... First argument used endpoint range length 1. Additional arguments, range length 2, cause warning ignored. include_lowest lower boundary part interval? include_highest upper boundary part interval? closed interval closed? integer interval integers? read_only Make interval object read-? x object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Intervals — interval","text":"interval returns Interval. .Interval returns TRUE x Interval, FALSE otherwise.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Intervals — interval","text":"","code":"# The real line interval() #> (-Inf, Inf) # Closed unit interval interval(c(0, 1), closed = TRUE) #> [0, 1] # Alternative form interval(0, 1, closed = TRUE) #> [0, 1] # Non-negative real line interval(c(0, Inf), include_lowest = TRUE) #> [0, Inf)"},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":null,"dir":"Reference","previous_headings":"","what":"Test if object is a Distribution — is.Distribution","title":"Test if object is a Distribution — is.Distribution","text":"Test object Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Test if object is a Distribution — is.Distribution","text":"","code":"is.Distribution(object)"},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Test if object is a Distribution — is.Distribution","text":"object R object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Test if object is a Distribution — is.Distribution","text":"TRUE object Distribution, FALSE otherwise.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Test if object is a Distribution — is.Distribution","text":"","code":"is.Distribution(dist_dirac()) #> [1] TRUE"},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Cast to a TensorFlow matrix — k_matrix","title":"Cast to a TensorFlow matrix — k_matrix","text":"Cast TensorFlow matrix","code":""},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Cast to a TensorFlow matrix — k_matrix","text":"","code":"k_matrix(x, dtype = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Cast to a TensorFlow matrix — k_matrix","text":"x Numeric object converted matrix Tensor. dtype Type elements resulting tensor. Defaults keras3::config_floatx().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Cast to a TensorFlow matrix — k_matrix","text":"two-dimensional tf.Tensor values x. shape (nrow(x), ncol(x)) x first converted R matrix via .matrix().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Cast to a TensorFlow matrix — k_matrix","text":"","code":"if (interactive()) { k_matrix(diag(1:3)) k_matrix(diag(1:3), dtype = \"int32\") # Vectors are converted to columns: k_matrix(1:3) }"},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot several distributions — plot_distributions","title":"Plot several distributions — plot_distributions","text":"Plot several distributions","code":""},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot several distributions — plot_distributions","text":"","code":"plot_distributions( ..., distributions = list(), .x, plots = c(\"density\", \"probability\", \"hazard\"), with_params = list(), as_list = FALSE )"},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot several distributions — plot_distributions","text":"... distribution objects (must named) distributions Named list distribution objects. concatenated .... .x Numeric vector points evaluate . plots Plots created. May abbreviated. plots stacked order given top bottom. with_params list distribution parameters given distribution using with_params. named, names matched distribution names. Otherwise, allocated positionally, index 1 corresponding first element distributions, elements distributions followed arguments ... order. as_list return list ggplots instead patchwork?","code":""},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot several distributions — plot_distributions","text":"stacked patchwork requested ggplots","code":""},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Plot several distributions — plot_distributions","text":"","code":"rate <- 1 x <- rexp(20, rate) d_emp <- dist_empirical(x, positive = TRUE) d_exp <- dist_exponential() plot_distributions( empirical = d_emp, theoretical = d_exp, estimated = d_exp, with_params = list( theoretical = list(rate = rate), estimated = list(rate = 1 / mean(x)) ), .x = seq(1e-4, 5, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":null,"dir":"Reference","previous_headings":"","what":"Predict individual distribution parameters — predict.reservr_keras_model","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"Predict individual distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"","code":"# S3 method for reservr_keras_model predict(object, data, as_matrix = FALSE, ...)"},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"object compiled trained reservr_keras_model. data Input data compatible model. as_matrix Return parameter matrix instead list structure? ... ignored","code":""},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"parameter list suitable with_params argument distribution family used model. Contains one set parameters per row data.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"","code":"if (interactive()) { dist <- dist_exponential() params <- list(rate = 1.0) N <- 100L rand_input <- runif(N) x <- dist$sample(N, with_params = params) tf_in <- keras3::layer_input(1L) mod <- tf_compile_model( inputs = list(tf_in), intermediate_output = tf_in, dist = dist, optimizer = keras3::optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_fit <- fit( object = mod, x = k_matrix(rand_input), y = x, epochs = 10L, callbacks = list( callback_debug_dist_gradients(mod, k_matrix(rand_input), x) ) ) tf_preds <- predict(mod, data = k_matrix(rand_input)) }"},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":null,"dir":"Reference","previous_headings":"","what":"Determine probability of reporting under a Poisson arrival Process — prob_report","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"Determines probability claims occuring Poisson process arrival intensity expo reporting delay distribution dist time t_min t_max reported tau_min tau_max.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"","code":"prob_report( dist, intervals, expo = NULL, with_params = list(), .tolerance = .Machine$double.eps^0.5, .max_iter = 100L, .try_compile = TRUE )"},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"dist reporting delay Distribution, compiled interval probability function. intervals data frame columns xmin, xmax, tmin, tmax. Claims occur within [xmin, xmax] reported within [tmin, tmax]. expo Poisson intensity. given, must vectorised function yields intensity claim arrival process specified time. expo = NULL equivalent constant intensity function. expo relevant multiplicative constant. with_params Parameters dist use. Can parameter set different values interval. dist compiled interval probability function, with_params can matrix instead. .tolerance Absolute element-wise tolerance. .max_iter Maximum number iterations. number integration intervals length(lower) * .max_iter. Therefor maximum number function evaluations per integration interval 15 * .max_iter. .try_compile Try compiling distributions probability function speed integration?","code":""},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"vector reporting probabilities, one entry per row intervals.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"reporting probability given P(x + d [tmin, tmax] | x [xmin, xmax]) = E(P(x + d [tmin, tmax] | x) | x [xmin, xmax]) / P(x [xmin, xmax]) = int_[xmin, xmax] expo(x) P(x + d [tmin, tmax]) dx = int_[xmin, xmax] expo(x) P(d [tmin - x, tmax - x]) dx / int_[xmin, xmax] expo(x) dx prob_report uses integrate_gk() compute two integrals.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"","code":"dist <- dist_exponential() ints <- data.frame( xmin = 0, xmax = 1, tmin = seq_len(10) - 1.0, tmax = seq_len(10) ) params <- list(rate = rep(c(1, 0.5), each = 5)) prob_report(dist, ints, with_params = params) #> [1] 0.367879441 0.399576401 0.146995943 0.054076785 0.019893738 0.041904709 #> [7] 0.025416491 0.015415881 0.009350204 0.005671186"},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":null,"dir":"Reference","previous_headings":"","what":"Quantiles of Distributions — quantile.Distribution","title":"Quantiles of Distributions — quantile.Distribution","text":"Produces quantiles corresponding given probabilities configurable distribution parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Quantiles of Distributions — quantile.Distribution","text":"","code":"# S3 method for Distribution quantile(x, probs = seq(0, 1, 0.25), with_params = list(), ..., .start = 0)"},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Quantiles of Distributions — quantile.Distribution","text":"x Distribution. probs Quantiles compute. with_params Optional list distribution parameters. Note x$has_capability(\"quantile\") false, with_params assumed contain one set parameters. ... ignored .start Starting value quantiles computed numerically. Must within support x.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Quantiles of Distributions — quantile.Distribution","text":"quantiles x corresponding probs parameters with_params.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Quantiles of Distributions — quantile.Distribution","text":"x$has_capability(\"quantile\") true, returns x$quantile(probs, with_params = with_params). case, with_params may contain separate sets parameters quantile determined. Otherwise, numerical estimation quantiles done using density probability function. method assumes with_params cantain one set parameters. strategy uses two steps: Find smallest largest quantiles probs using newton method starting .start. Find remaining quantiles bisection using stats::uniroot().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Quantiles of Distributions — quantile.Distribution","text":"","code":"# With quantiles available dist <- dist_normal(sd = 1) qqs <- quantile(dist, probs = rep(0.5, 3), with_params = list(mean = 1:3)) stopifnot(all.equal(qqs, 1:3)) # Without quantiles available dist <- dist_erlangmix(shapes = list(1, 2, 3), scale = 1.0) my_probs <- c(0, 0.01, 0.25, 0.5, 0.75, 1) qqs <- quantile( dist, probs = my_probs, with_params = list(probs = list(0.5, 0.3, 0.2)), .start = 2 ) all.equal(dist$probability(qqs, with_params = list(probs = list(0.5, 0.3, 0.2))), my_probs) #> [1] \"Mean relative difference: 2.890015e-06\" # Careful: Numerical estimation of extreme quantiles can result in out-of-bounds values. # The correct 0-quantile would be 0 in this case, but it was estimated < 0. qqs[1L] #> [1] -1.138089"},{"path":"https://ashesitr.github.io/reservr/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. generics fit","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":null,"dir":"Reference","previous_headings":"","what":"Soft-Max function — softmax","title":"Soft-Max function — softmax","text":"Softmax vector x defined ","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Soft-Max function — softmax","text":"","code":"softmax(x) dsoftmax(x)"},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Soft-Max function — softmax","text":"x numeric vector matrix","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Soft-Max function — softmax","text":"softmax returns softmax x; rowwise x matrix. dsoftmax returns Jacobi-matrix softmax(x) x. x must vector.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Soft-Max function — softmax","text":"\\(s_i = \\exp(x_i) / \\sum_k \\exp(x_k)\\) satisfies sum(s) == 1.0 can used smoothly enforce sum constraint.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Soft-Max function — softmax","text":"","code":"softmax(c(5, 5)) #> [1] 0.5 0.5 softmax(diag(nrow = 5, ncol = 6)) #> [,1] [,2] [,3] [,4] [,5] [,6] #> [1,] 0.3521874 0.1295625 0.1295625 0.1295625 0.1295625 0.1295625 #> [2,] 0.1295625 0.3521874 0.1295625 0.1295625 0.1295625 0.1295625 #> [3,] 0.1295625 0.1295625 0.3521874 0.1295625 0.1295625 0.1295625 #> [4,] 0.1295625 0.1295625 0.1295625 0.3521874 0.1295625 0.1295625 #> [5,] 0.1295625 0.1295625 0.1295625 0.1295625 0.3521874 0.1295625"},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":null,"dir":"Reference","previous_headings":"","what":"Compile a Keras model for truncated data under dist — tf_compile_model","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"Compile Keras model truncated data dist","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"","code":"tf_compile_model( inputs, intermediate_output, dist, optimizer, censoring = TRUE, truncation = TRUE, metrics = NULL, weighted_metrics = NULL )"},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"inputs List keras input layers intermediate_output Intermediate model layer used input distribution parameters dist Distribution use compiling loss parameter outputs optimizer String (name optimizer) optimizer instance. See optimizer_* family. censoring flag, whether compiled model support censored observations. Set FALSE higher efficiency. fit(...) error resulting model used fit censored observations. truncation flag, whether compiled model support truncated observations. Set FALSE higher efficiency. fit(...) warn resuting model used fit truncated observations. metrics List metrics evaluated model training testing. can : string (name built-function), function, optionally \"name\" attribute Metric() instance. See metric_* family functions. Typically use metrics = c('accuracy'). function callable signature result = fn(y_true, y_pred). specify different metrics different outputs multi-output model, also pass named list, metrics = list(= 'accuracy', b = c('accuracy', 'mse')). can also pass list specify metric list metrics output, metrics = list(c('accuracy'), c('accuracy', 'mse')) metrics = list('accuracy', c('accuracy', 'mse')). pass strings 'accuracy' 'acc', convert one metric_binary_accuracy(), metric_categorical_accuracy(), metric_sparse_categorical_accuracy() based shapes targets model output. similar conversion done strings \"crossentropy\" \"ce\" well. metrics passed evaluated without sample weighting; like sample weighting apply, can specify metrics via weighted_metrics argument instead. providing anonymous R function, can customize printed name training assigning attr(, \"name\") <- \"my_custom_metric_name\", calling custom_metric(\"my_custom_metric_name\", ) weighted_metrics List metrics evaluated weighted sample_weight class_weight training testing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"reservr_keras_model can used train truncated censored observations dist based input data inputs.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"","code":"dist <- dist_exponential() params <- list(rate = 1.0) N <- 100L rand_input <- runif(N) x <- dist$sample(N, with_params = params) if (interactive()) { tf_in <- keras3::layer_input(1L) mod <- tf_compile_model( inputs = list(tf_in), intermediate_output = tf_in, dist = dist, optimizer = keras3::optimizer_adam(), censoring = FALSE, truncation = FALSE ) }"},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":null,"dir":"Reference","previous_headings":"","what":"Initialise model weights to a global parameter fit — tf_initialise_model","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"Initialises compiled reservr_keras_model weights predictions equal , close , distribution parameters given params.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"","code":"tf_initialise_model( model, params, mode = c(\"scale\", \"perturb\", \"zero\", \"none\") )"},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"model reservr_compiled_model obtained tf_compile_model(). params list distribution parameters compatible model. mode initialisation mode scale Initialise biases according params kernels uniform [-0.1, 0.1] * bias scale. perturb Initialise biases according params leave kernels . zero Initialise biases according params set kernel zero. none modify weights.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"Invisibly model changed weights","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"","code":"dist <- dist_exponential() group <- sample(c(0, 1), size = 100, replace = TRUE) x <- dist$sample(100, with_params = list(rate = group + 1)) global_fit <- fit(dist, x) if (interactive()) { library(keras3) l_in <- layer_input(shape = 1L) mod <- tf_compile_model( inputs = list(l_in), intermediate_output = l_in, dist = dist, optimizer = optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_initialise_model(mod, global_fit$params) fit_history <- fit( mod, x = group, y = x, epochs = 200L ) predicted_means <- predict(mod, data = as_tensor(c(0, 1), config_floatx())) }"},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":null,"dir":"Reference","previous_headings":"","what":"Define a set of truncated observations — trunc_obs","title":"Define a set of truncated observations — trunc_obs","text":"x missing, xmin xmax must specified.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Define a set of truncated observations — trunc_obs","text":"","code":"trunc_obs(x, xmin = x, xmax = x, tmin = -Inf, tmax = Inf, w = 1) as_trunc_obs(.data) truncate_obs(.data, tmin_new = -Inf, tmax_new = Inf, .partial = FALSE) repdel_obs(.data, accident, delay, time, .truncate = FALSE)"},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Define a set of truncated observations — trunc_obs","text":"x Observations xmin, xmax Censoring bounds. xmin != xmax, x must NA. tmin, tmax Truncation bounds. May vary per observation. w Case weights .data data frame numeric vector. tmin_new New truncation minimum tmax_new New truncation maximum .partial Enable partial truncation censored observations? potentially create inconsistent data actual observation lies outside truncation bounds censoring interval overlaps. accident accident time (unquoted, evaluated .data) delay reporting delay (unquoted, evaluated .data) time evaluation time (unquoted, evaluated .data) .truncate claims reported time silently discarded? claims reported time .truncate FALSE, error raised.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Define a set of truncated observations — trunc_obs","text":"trunc_obs: trunc_obs tibble columns x, xmin, xmax, tmin tmax describing possibly interval-censored observations truncation as_trunc_obs returns trunc_obs tibble. truncate_obs returns trunc_obs tibble possibly fewer observations .data updated truncation bounds. repdel_obs returns trunc_obs tibble corresponding reporting delay observations claim. .truncate FALSE, result guaranteed number rows .data.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Define a set of truncated observations — trunc_obs","text":"Uncensored observations must satisfy tmin <= xmin = x = xmax <= tmax. Censored observations must satisfy tmin <= xmin < xmax <= tmax x = NA.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Define a set of truncated observations — trunc_obs","text":"","code":"N <- 100 x <- rexp(N, 0.5) # Random, observation dependent truncation intervals tmin <- runif(N, 0, 1) tmax <- tmin + runif(N, 1, 2) oob <- x < tmin | x > tmax x <- x[!oob] tmin <- tmin[!oob] tmax <- tmax[!oob] # Number of observations after truncation N <- length(x) # Randomly interval censor 30% of observations cens <- rbinom(N, 1, 0.3) == 1L xmin <- x xmax <- x xmin[cens] <- pmax(tmin[cens], floor(x[cens])) xmax[cens] <- pmin(tmax[cens], ceiling(x[cens])) x[cens] <- NA trunc_obs(x, xmin, xmax, tmin, tmax) #> # A tibble: 44 × 6 #> x xmin xmax tmin tmax w #> #> 1 NA 0.832 1 0.832 2.08 1 #> 2 NA 1 2 0.464 2.24 1 #> 3 1.46 1.46 1.46 0.450 2.36 1 #> 4 0.665 0.665 0.665 0.487 1.80 1 #> 5 0.979 0.979 0.979 0.0436 1.11 1 #> 6 1.03 1.03 1.03 0.560 2.19 1 #> 7 0.657 0.657 0.657 0.185 1.98 1 #> 8 NA 1 2 0.612 2.36 1 #> 9 0.526 0.526 0.526 0.240 2.03 1 #> 10 1.60 1.60 1.60 0.668 2.38 1 #> # ℹ 34 more rows as_trunc_obs(c(1, 2, 3)) #> # A tibble: 3 × 6 #> x xmin xmax tmin tmax w #> #> 1 1 1 1 -Inf Inf 1 #> 2 2 2 2 -Inf Inf 1 #> 3 3 3 3 -Inf Inf 1 as_trunc_obs(data.frame(x = 1:3, tmin = 0, tmax = 10)) #> # A tibble: 3 × 6 #> x xmin xmax tmin tmax w #> #> 1 1 1 1 0 10 1 #> 2 2 2 2 0 10 1 #> 3 3 3 3 0 10 1 as_trunc_obs(data.frame(x = c(1, NA), xmin = c(1, 2), xmax = c(1, 3))) #> # A tibble: 2 × 6 #> x xmin xmax tmin tmax w #> #> 1 1 1 1 -Inf Inf 1 #> 2 NA 2 3 -Inf Inf 1 truncate_obs(1:10, tmin_new = 2.0, tmax_new = 8.0) #> # A tibble: 7 × 6 #> x xmin xmax tmin tmax w #> #> 1 2 2 2 2 8 1 #> 2 3 3 3 2 8 1 #> 3 4 4 4 2 8 1 #> 4 5 5 5 2 8 1 #> 5 6 6 6 2 8 1 #> 6 7 7 7 2 8 1 #> 7 8 8 8 2 8 1"},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":null,"dir":"Reference","previous_headings":"","what":"Truncate claims data subject to reporting delay — truncate_claims","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"Truncate claims data subject reporting delay","code":""},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"","code":"truncate_claims(data, accident, delay, time, .report_col = \"report\")"},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"data Full claims data including IBNR accident Accident times. May unquoted column name data. delay Reporting delays. May unquoted column name data. time Observation time (scalar number one per claim). Claims accident + delay > time truncated. Set time = Inf compute reporting times perform truncation. .report_col NULL column name store reporting time report = accident + delay.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"Truncated data. reporting time stored colnumn named .report_col unless .report_col NULL. .report_col NULL time contains Infs, warning issued since data returned unchanged work done.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"","code":"claims_full <- data.frame( acc = runif(100), repdel = rexp(100) ) tau <- 2.0 truncate_claims(claims_full, acc, repdel, tau) #> acc repdel report #> 1 1.341272e-01 0.028235584 0.16236281 #> 2 7.952195e-02 0.008358716 0.08788066 #> 3 3.443970e-02 0.140290387 0.17473009 #> 4 7.098971e-01 1.152279972 1.86217711 #> 5 2.960615e-01 1.574453000 1.87051447 #> 6 7.289446e-01 0.088894959 0.81783959 #> 7 1.101838e-01 1.216726908 1.32691067 #> 8 5.654015e-01 1.387287179 1.95268864 #> 9 7.189693e-01 0.069208830 0.78817813 #> 10 8.909014e-01 0.152164621 1.04306601 #> 11 4.515028e-01 0.206191922 0.65769476 #> 13 1.224872e-01 0.514714528 0.63720168 #> 14 1.555099e-05 0.319640385 0.31965594 #> 15 6.111351e-01 0.932906239 1.54404130 #> 17 3.713955e-02 0.471633688 0.50877323 #> 18 7.302117e-01 0.470371407 1.20058307 #> 19 4.125354e-01 0.825975930 1.23851137 #> 21 5.602826e-01 0.078439292 0.63872193 #> 23 5.899033e-01 0.356895571 0.94679888 #> 24 5.889085e-01 0.886226820 1.47513534 #> 25 1.670153e-01 0.177537690 0.34455295 #> 26 6.828304e-01 0.163108702 0.84593913 #> 27 3.082466e-01 0.319356196 0.62760279 #> 28 7.793431e-01 0.952858891 1.73220199 #> 29 3.284492e-01 1.587426414 1.91587561 #> 30 4.171246e-02 1.250061904 1.29177437 #> 31 1.383127e-01 1.177008377 1.31532110 #> 32 2.560620e-01 0.055133459 0.31119549 #> 33 4.429471e-01 0.267354952 0.71030207 #> 34 2.050347e-01 0.464885217 0.66991992 #> 35 7.792969e-01 0.157671728 0.93696860 #> 37 7.766178e-01 1.075450784 1.85206859 #> 39 1.776113e-01 1.112906751 1.29051807 #> 42 5.313195e-01 0.137196474 0.66851598 #> 43 4.677886e-01 0.664616256 1.13240482 #> 44 1.206373e-01 0.297930363 0.41856766 #> 45 6.348620e-01 1.141797280 1.77665926 #> 46 8.912517e-01 0.680814184 1.57206585 #> 47 8.781296e-01 0.540906635 1.41903623 #> 48 2.148099e-02 0.518280302 0.53976129 #> 50 5.886034e-01 0.705613201 1.29421661 #> 51 1.850858e-01 0.508072750 0.69315858 #> 52 5.010168e-01 0.352654210 0.85367102 #> 54 9.485277e-01 0.332760828 1.28128852 #> 55 1.860526e-01 0.110473518 0.29652609 #> 56 9.358294e-01 0.568551742 1.50438114 #> 57 7.175151e-01 0.091612742 0.80912781 #> 58 3.182253e-01 0.436845455 0.75507071 #> 59 5.823165e-01 0.114667189 0.69698367 #> 61 6.969247e-01 0.476378988 1.17330367 #> 62 7.630700e-01 0.010118335 0.77318837 #> 63 1.971220e-01 1.478337746 1.67545979 #> 64 1.982628e-01 1.151255731 1.34951853 #> 65 3.902595e-01 1.343615915 1.73387538 #> 66 6.074760e-01 0.774707003 1.38218298 #> 67 5.993708e-01 0.646028800 1.24539964 #> 68 7.847457e-01 0.986775468 1.77152118 #> 69 5.605707e-01 0.550733615 1.11130433 #> 70 4.787836e-01 0.947700852 1.42648449 #> 71 9.189584e-01 0.396267166 1.31522557 #> 72 1.237870e-02 0.390503512 0.40288222 #> 74 5.759545e-01 0.819434726 1.39538924 #> 75 3.667410e-01 0.043780853 0.41052181 #> 76 1.393693e-01 0.232285622 0.37165496 #> 78 8.949839e-01 0.206483914 1.10146782 #> 79 2.749953e-01 0.453207363 0.72820271 #> 80 2.195253e-01 0.777957749 0.99748306 #> 81 7.483612e-02 0.264012017 0.33884814 #> 82 2.389014e-01 0.022741144 0.26164256 #> 84 2.821164e-01 0.205027999 0.48714435 #> 86 2.685969e-01 0.517190858 0.78578778 #> 87 3.688022e-01 0.114156616 0.48295881 #> 90 1.491891e-01 1.768341100 1.91753016 #> 91 2.765223e-01 0.306067371 0.58258966 #> 92 7.019701e-01 0.056862872 0.75883296 #> 94 6.576286e-01 1.223552487 1.88118109 #> 95 4.837228e-01 0.368050174 0.85177300 #> 97 6.680541e-01 0.381928012 1.04998212 #> 98 1.240903e-01 0.434685851 0.55877612 #> 99 4.515315e-01 0.622061988 1.07359347 #> 100 3.454657e-01 0.470663017 0.81612874"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute weighted moments — weighted_moments","title":"Compute weighted moments — weighted_moments","text":"Compute weighted moments","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute weighted moments — weighted_moments","text":"","code":"weighted_moments(x, w, n = 2L, center = TRUE)"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute weighted moments — weighted_moments","text":"x Observations w Case weights (optional) n Number moments calculate center Calculate centralized moments (default) noncentralized moments, .e. E((X - E(X))^k) E(X^k).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute weighted moments — weighted_moments","text":"vector length n kth entry kth weighted moment x weights w. center TRUE moments centralized, .e. E((X - E(X))^k). first moment never centralized. moments scaled 1 / sum(w), de-biased. e.g. second central weighted moment weighted_moment(x, w)[2L] equal var(rep(x, w)) * (sum(w) - 1) / sum(w) integer w","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute weighted moments — weighted_moments","text":"","code":"weighted_moments(rexp(100)) #> [1] 0.9877458 1.2957378 weighted_moments(c(1, 2, 3), c(1, 2, 3)) #> [1] 2.3333333 0.5555556 c(mean(rep(1:3, 1:3)), var(rep(1:3, 1:3)) * 5 / 6) #> [1] 2.3333333 0.5555556"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute weighted quantiles — weighted_quantile","title":"Compute weighted quantiles — weighted_quantile","text":"Compute weighted quantiles","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute weighted quantiles — weighted_quantile","text":"","code":"weighted_quantile(x, w, probs) weighted_median(x, w)"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute weighted quantiles — weighted_quantile","text":"x Observations w Case weights (optional) probs Quantiles calculate","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute weighted quantiles — weighted_quantile","text":"vector length probs corresponding weighted quantiles x weight w. integer weights, equivalent quantile(rep(x, w), probs) weighted median x weights w. integer weights, equivalent median(rep(x, w))","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute weighted quantiles — weighted_quantile","text":"","code":"weighted_median(1:6) #> [1] 3.5 weighted_median(1:3, c(1, 4, 9)) #> [1] 3 weighted_median(1:3, c(9, 4, 1)) #> [1] 1 weighted_quantile(1:3, c(1, 4, 9), seq(0.0, 1.0, by = 0.25)) #> [1] 1 2 3 3 3 quantile(rep(1:3, c(1, 4, 9)), seq(0.0, 1.0, by = 0.25)) #> 0% 25% 50% 75% 100% #> 1 2 3 3 3"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute weighted tabulations — weighted_tabulate","title":"Compute weighted tabulations — weighted_tabulate","text":"Computes sum w grouped bin. w missing result equivalent tabulate(bin, nbins)","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute weighted tabulations — weighted_tabulate","text":"","code":"weighted_tabulate(bin, w, nbins = max(1L, bin, na.rm = TRUE))"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute weighted tabulations — weighted_tabulate","text":"bin integer vector values 1L nbins w Weights per entry bin. nbins Number bins","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute weighted tabulations — weighted_tabulate","text":"vector length nbins ith result equal sum(w[bin == ]) sum(bin == ) w missing. integer weights, equivalent tabulate(rep(bin, w), nbins).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute weighted tabulations — weighted_tabulate","text":"","code":"weighted_tabulate(c(1, 1, 2)) #> [1] 2 1 weighted_tabulate(c(1, 1, 2), nbins = 3L) #> [1] 2 1 0 weighted_tabulate(c(1, 1, 2), w = c(0.5, 0.5, 1), nbins = 3L) #> [1] 1 1 0"},{"path":"https://ashesitr.github.io/reservr/news/index.html","id":"reservr-003","dir":"Changelog","previous_headings":"","what":"reservr 0.0.3","title":"reservr 0.0.3","text":"Fixed segfaults r-devel caused zero-length input C++ routines. Migrated keras3 keras support.","code":""},{"path":"https://ashesitr.github.io/reservr/news/index.html","id":"reservr-002","dir":"Changelog","previous_headings":"","what":"reservr 0.0.2","title":"reservr 0.0.2","text":"CRAN release: 2023-10-18 Fixed tensorflow log-density implementation dist_erlangmix() dist_exponential() work censored data. Multiple bug fixes related tensorflow training integration, input tensor shapes can unknown. Improved testing tensorflow integration.","code":""},{"path":"https://ashesitr.github.io/reservr/news/index.html","id":"reservr-001","dir":"Changelog","previous_headings":"","what":"reservr 0.0.1","title":"reservr 0.0.1","text":"CRAN release: 2022-12-09 Initial CRAN release","code":""}] +[{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"distributions","dir":"Articles","previous_headings":"","what":"Distributions","title":"Working with Distributions","text":"Distributions set classes available reservr specify distribution families random variables. Distribution inherits R6 Class Distribution provides functionality necessary working specific family. Distribution can defined calling one constructor functions, prefixed dist_ package. constructors accept parameters family arguments. arguments specified, corresponding parameter considered fixed sense need specified computing something distribution assumed fixed calling fit() distribution instance.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"sample","dir":"Articles","previous_headings":"Distributions","what":"Sample","title":"Working with Distributions","text":"example, unspecified normal distribution can created calling dist_normal() without arguments. means parameters mean sd considered placeholders. want , e.g., sample norm, must specify placeholders with_params argument:","code":"library(reservr) set.seed(1L) # Instantiate an unspecified normal distribution norm <- dist_normal() x <- norm$sample(n = 10L, with_params = list(mean = 3, sd = 1)) set.seed(1L) norm2 <- dist_normal(sd = 1) x2 <- norm2$sample(n = 10L, with_params = list(mean = 3)) # the same RVs are drawn because the distribution parameters and the seed were the same stopifnot(identical(x, x2))"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"density","dir":"Articles","previous_headings":"Distributions","what":"Density","title":"Working with Distributions","text":"density() function computes density distribution respect natural measure. Use is_discrete_at() check point discrete mass lebesgue density. diff_density() computes gradient density respect free parameter. Setting log = TRUE computes gradient log-density, .e., gradient log f(x, params) instead.","code":"norm$density(x, with_params = list(mean = 3, sd = 1)) #> [1] 0.3278626 0.3922715 0.2813724 0.1117603 0.3778620 0.2849269 0.3542572 #> [8] 0.3037652 0.3380030 0.3807663 dnorm(x, mean = 3, sd = 1) #> [1] 0.3278626 0.3922715 0.2813724 0.1117603 0.3778620 0.2849269 0.3542572 #> [8] 0.3037652 0.3380030 0.3807663 norm$density(x, log = TRUE, with_params = list(mean = 3, sd = 1)) # log-density #> [1] -1.1151607 -0.9358010 -1.2680761 -2.1913990 -0.9732262 -1.2555227 #> [7] -1.0377321 -1.1915002 -1.0847006 -0.9655696 norm$is_discrete_at(x, with_params = list(mean = 3, sd = 1)) #> [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # A discrete distribution with mass only at point = x[1]. dd <- dist_dirac(point = x[1]) dd$density(x) #> [1] 1 0 0 0 0 0 0 0 0 0 dd$is_discrete_at(x) #> [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE norm$diff_density(x, with_params = list(mean = 3, sd = 1)) #> $mean #> [1] -0.20539076 0.07203805 -0.23512285 0.17828905 0.12450847 -0.23377349 #> [7] 0.17267525 0.22427736 0.19461580 -0.11628160 #> #> $sd #> [1] -0.19919475 -0.37904224 -0.08489705 0.17266080 -0.33683550 -0.09312311 #> [7] -0.27009027 -0.13817569 -0.22594681 -0.34525522"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"probability","dir":"Articles","previous_headings":"Distributions","what":"Probability","title":"Working with Distributions","text":"probability(), c.d.f., survival function, logarithms can computed. discrete distributions, dist$probability(x, lower.tail = TRUE) returns \\(P(X \\le x)\\) dist$probability(x, lower.tail = FALSE) returns \\(P(X > x)\\). Gradients (log-)c.d.f. survival function respect parameters can computed using diff_probability().","code":"norm$probability(x, with_params = list(mean = 3, sd = 1)) #> [1] 0.2655087 0.5728534 0.2016819 0.9446753 0.6291140 0.2059746 0.6870228 #> [8] 0.7698414 0.7176185 0.3800352 pnorm(x, mean = 3, sd = 1) #> [1] 0.2655087 0.5728534 0.2016819 0.9446753 0.6291140 0.2059746 0.6870228 #> [8] 0.7698414 0.7176185 0.3800352 dd$probability(x) #> [1] 1 1 0 1 1 0 1 1 1 1 dd$probability(x, lower.tail = FALSE, log.p = TRUE) #> [1] -Inf -Inf 0 -Inf -Inf 0 -Inf -Inf -Inf -Inf norm$diff_probability(x, with_params = list(mean = 3, sd = 1)) #> $mean #> [1] -0.3278626 -0.3922715 -0.2813724 -0.1117603 -0.3778620 -0.2849269 #> [7] -0.3542572 -0.3037652 -0.3380030 -0.3807663 #> #> $sd #> [1] 0.20539076 -0.07203805 0.23512285 -0.17828905 -0.12450847 0.23377349 #> [7] -0.17267525 -0.22427736 -0.19461580 0.11628160"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"hazard","dir":"Articles","previous_headings":"Distributions","what":"Hazard","title":"Working with Distributions","text":"hazard rate defined \\(h(x, \\theta) = f(x, \\theta) / S(x, \\theta)\\), .e., ratio density survival function.","code":"norm$hazard(x, with_params = list(mean = 3, sd = 1)) #> [1] 0.4463805 0.9183533 0.3524565 2.0200785 1.0188091 0.3588385 1.1318948 #> [8] 1.3198083 1.1969728 0.6141740 norm$hazard(x, log = TRUE, with_params = list(mean = 3, sd = 1)) #> [1] -0.80658365 -0.08517306 -1.04282794 0.70313635 0.01863443 -1.02488292 #> [7] 0.12389301 0.27748652 0.17979571 -0.48747702"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"fitting","dir":"Articles","previous_headings":"Distributions","what":"Fitting","title":"Working with Distributions","text":"fit() generic defined Distributions perform maximum likelihood estimation. accepts weighted, censored truncated sample class trunc_obs, can automatically convert uncensored, untruncated observations without weight proper trunc_obs object.","code":"# Fit with mean, sd free fit1 <- fit(norm, x) # Fit with mean free fit2 <- fit(norm2, x) # Fit with sd free fit3 <- fit(dist_normal(mean = 3), x) # Fitted parameters fit1$params #> $mean #> [1] 3.132203 #> #> $sd #> [1] 0.7405289 fit2$params #> $mean #> [1] 3.132203 fit3$params #> $sd #> [1] 0.752237 # log-Likelihoods can be computed on AIC(fit1$logLik) #> [1] 26.37096 AIC(fit2$logLik) #> [1] 25.8626 AIC(fit3$logLik) #> [1] 24.68469 # Convergence checks fit1$opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\" fit2$opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\" fit3$opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\""},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"fitting-censored-data","dir":"Articles","previous_headings":"Distributions","what":"Fitting censored data","title":"Working with Distributions","text":"can also fit interval-censored data.","code":"params <- list(mean = 30, sd = 10) x <- norm$sample(100L, with_params = params) xl <- floor(x) xr <- ceiling(x) cens_fit <- fit(norm, trunc_obs(xmin = xl, xmax = xr)) print(cens_fit) #> $params #> $params$mean #> [1] 31.25 #> #> $params$sd #> [1] 9.112857 #> #> #> $opt #> $opt$par #> mean sd #> 31.250000 9.112857 #> #> $opt$value #> [1] 362.9126 #> #> $opt$iter #> [1] 5 #> #> $opt$convergence #> [1] 1 #> #> $opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\" #> #> #> $logLik #> 'log Lik.' -362.9126 (df=2)"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"fitting-truncated-data","dir":"Articles","previous_headings":"Distributions","what":"Fitting truncated data","title":"Working with Distributions","text":"possible fit randomly truncated samples, .e., samples truncation bound also random differs observed observation.","code":"params <- list(mean = 30, sd = 10) x <- norm$sample(100L, with_params = params) tl <- runif(length(x), min = 0, max = 20) tr <- runif(length(x), min = 0, max = 60) + tl # truncate_obs() also truncates observations. # if data is already truncated, use trunc_obs(x = ..., tmin = ..., tmax = ...) instead. trunc_fit <- fit(norm, truncate_obs(x, tl, tr)) print(trunc_fit) #> $params #> $params$mean #> [1] 26.72871 #> #> $params$sd #> [1] 8.242123 #> #> #> $opt #> $opt$par #> mean sd #> 26.728710 8.242123 #> #> $opt$value #> [1] 203.8095 #> #> $opt$iter #> [1] 9 #> #> $opt$convergence #> [1] 1 #> #> $opt$message #> [1] \"NLOPT_SUCCESS: Generic success return value.\" #> #> #> $logLik #> 'log Lik.' -203.8095 (df=2) attr(trunc_fit$logLik, \"nobs\") #> [1] 62"},{"path":"https://ashesitr.github.io/reservr/articles/distributions.html","id":"plotting","dir":"Articles","previous_headings":"Distributions","what":"Plotting","title":"Working with Distributions","text":"Visualising different distributions, parametrizations, e.g., fits, can done plot_distributions()","code":"# Plot fitted densities plot_distributions( true = norm, fit1 = norm, fit2 = norm2, fit3 = dist_normal(3), .x = seq(-2, 7, 0.01), with_params = list( true = list(mean = 3, sd = 1), fit1 = fit1$params, fit2 = fit2$params, fit3 = fit3$params ), plots = \"density\" ) # Plot fitted densities, c.d.f.s and hazard rates plot_distributions( true = norm, cens_fit = norm, trunc_fit = norm, .x = seq(0, 60, length.out = 101L), with_params = list( true = list(mean = 30, sd = 10), cens_fit = cens_fit$params, trunc_fit = trunc_fit$params ) ) # More complex distributions plot_distributions( bdegp = dist_bdegp(2, 3, 10, 3), .x = c(seq(0, 12, length.out = 121), 1.5 - 1e-6), with_params = list( bdegp = list( dists = list( list(), list(), list( dists = list( list( dist = list( shapes = as.list(1:3), scale = 2.0, probs = list(0.2, 0.5, 0.3) ) ), list( sigmau = 0.4, xi = 0.2 ) ), probs = list(0.7, 0.3) ) ), probs = list(0.15, 0.1, 0.75) ) ) )"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Statistical analyses typically concerned modelling estimating distribution measured variable interest \\(Y\\), called outcome, possibly conditional value one several endogenous variables \\(X\\), called predictors. absence endogenous variables, process usually called distribution fitting, presence endogenous variables called regression. Classical regression, via generalized linear models (GLMs), concerned influence endogenous variables mean outcome, .e., \\(\\mathsf{E}(Y|X) = f(X)\\), often links parameters conditional outcome distribution mean. gentle introduction generalized linear models can found Dobson Barnett (2018). implementation GLMs available stats R package, part R (R Core Team 2023). models also allow specification additional parameters conditional outcome distribution, Generalized Additive Models Location, Scale Shape (Stasinopoulos Rigby 2007). recently, deep distributional regression proposed, allows flexible specification individual outcome distribution parameters (Rügamer et al. 2023). Statistical methods (described implemented previously mentioned papers) often require complete data, full information observations \\((X, Y)\\) interest. paper, describe R-package allows distributional regression three common observation schemes provide complete data. First , data interval censoring applied outcome \\(Y\\) refers case lower upper bounds \\(Y\\) observed, instead actual value. Next, truncated data misses observations outcome \\(Y\\) falls certain lower upper truncation bound. consider case random truncation, truncation bounds also random variables may vary observation. Finally, consider combination two, randomly truncated interval censoring. three scenarios can combined single general scheme: instead observing real-valued target variable \\(Y\\) (\\(\\mu\\)-density \\(f_\\theta\\) c.d.f. \\(F_\\theta\\), \\(\\mu\\) sigma-finite measure \\(\\mathbb R\\) \\(\\theta\\) parameter vector parameter space \\(\\Theta\\)), observe vector \\((M, V, L, U)\\), satisfies \\(L \\le M \\le V \\le U\\) \\(L C_1) + \\mathbf{1}(Y > C_2), \\end{align*}\\] define new random variables \\((M, V) = f(Y,C_1,C_2)\\) \\[\\begin{align*} (M, V) & := \\begin{cases} (-\\infty, C_1), & D = 0, \\\\ (C_1, C_2), & D = 1, \\\\ (C_2, \\infty), & D = 2. \\end{cases} \\end{align*}\\] Note \\(D\\) can reconstructed \\((M, V)\\): \\(D=0\\) \\(M=-\\infty\\), \\(D=1\\) \\(-\\infty m) \\\\ & = F_\\theta((m, \\infty]) \\cdot \\mathsf{P}(C_2 = m). \\end{align*}\\] assume distribution censoring variable \\((C_1,C_2)\\) non-informative, .e., distribution depend \\(\\theta\\), likelihood observing \\((M, V) = (m, v)\\) equal \\(F_\\theta((m, v])\\), factor depend \\(\\theta\\). similar argumentation can used non-discrete case. Overall, noting \\(F_\\infty((-\\infty, \\infty]) = 1\\), motivated likelihood contribution \\(F_\\theta((m, v]) \\cdot \\mathbf{1}(m < v)\\) censored, untruncated observation (1.1). Next, consider uncensored, truncated observation \\((m, v, l, u)\\) \\(y = m = v\\); may hence identify observation \\((y, l, u)\\). may proceed assume \\((L, U)\\) independent \\(Y\\) satisfies \\(L \\le U\\), \\(L\\) possibly equal \\(-\\infty\\) \\(U\\) possibly equal \\(\\infty\\). , \\((L, U)\\) shall density \\(f_{(L, U)}\\) respect dominating sigma-finite measure \\(\\nu\\). Truncation means happen observe \\((Y, L, U)\\) \\(L < Y \\le U\\). consequence, observed value \\(M = V\\) can regarded drawn \\((\\mu \\otimes \\nu)\\)-density \\[\\begin{align} f_{(Y, L, U) | L < Y \\le U}(y, l, u) = \\frac{f_{(L, U)}(l, u) f_\\theta(y)}{\\mathsf{P}(L < Y \\le U)} \\mathbf{1}(l < y \\le u). \\tag{1.4} \\end{align}\\] Subsequently, write \\((Y^{(t)}, L^{(t)}, U^{(t)})\\) random vector following density, .e., \\[\\begin{align*} f_{(Y^{(t)}, L^{(t)}, U^{(t)})}(y, l, u) = f_{(Y, L, U) | L < Y \\le U}(y, l, u). \\end{align*}\\] Conditioning density \\((L^{(t)}, U^{(t)}) = (l, u)\\), arrive expression involve nuisance density \\(f_{(L,U)}\\): \\[\\begin{align*} f_{Y^{(t)} | L^{(t)} = l, U^{(t)} = u}(y) & = \\frac{f_{(Y^{(t)}, L^{(t)}, U^{(t)})}(y, l, u)}{f_{(L^{(t)}, U^{(t)})}(l, u)} \\\\ & = \\frac{f_{(Y, L, U) | L < Y \\le U}(y, l, u)}{\\int_{(l, u]} f_{(Y, L, U) | L < Y \\le U}(z, l, u) \\,\\mathrm{d}\\mu(z)} = \\frac{f_\\theta(y)}{\\int_{(l, u]} f_\\theta(z) \\,\\mathrm{d}\\mu(z)}. \\end{align*}\\] Overall, arrive (conditional) log-likelihood contribution \\(\\log f_\\theta(y) - \\log F_\\theta((l, u])\\) uncensored, truncated observation (1.1). Finally, truncation censoring can occur time, .e., \\(l \\le m < v \\le u\\) either \\(l \\ne -\\infty\\) \\(u \\ne \\infty\\). accordance previous two cases, make assumption \\(Y, (C_1, C_2)\\) \\((L, U)\\) mutually independent satisfy \\(C_1 < C_2\\) \\(L < U\\). Define \\[\\begin{align*} D = \\mathbf{1}(Y > C_1) + \\mathbf{1}(Y > C_2) \\end{align*}\\] \\[\\begin{align*} (M, V) := \\begin{cases} (L, \\min(U, C_1)), & D = 0, \\\\ (\\max(L, C_1), \\min(C_2, U)), & D = 1, \\\\ (\\max(L,C_2), U), & D = 2. \\end{cases} \\end{align*}\\] simplicity, assume random variables discrete. observation \\((m, v, l, u)\\), one following four cases met \\[\\begin{align*} l < m < v < u, \\quad l = m < v < u, \\quad l < m < v = u, \\quad l = m < v = u. \\end{align*}\\] case \\(l < m < v < u\\), \\[\\begin{align*} \\mathsf{P}(M = m, V = v | L = l, U = u, L < Y \\le U) & = \\frac{\\mathsf{P}(C_1 = m, C_2 = v, Y \\(m, v], L = l, U = u)}{\\mathsf{P}(L = l, U = u, l < Y \\le u)} \\\\ & = \\frac{\\mathsf{P}(C_1 = m, C_2 = v) F_\\theta((m, v])}{F_\\theta((l, u])} \\end{align*}\\] independence assumption. factor front depend \\(\\theta\\) irrelevant (conditional) likelihood contribution. Likewise, case \\(l = m < v < u\\), \\[\\begin{align*} \\mathsf{P}(M = l, V = v | L = l, U = u, L < Y \\le U) & = \\frac{\\mathsf{P}(M = l, V = v, L = l, U = u, l < Y \\le u)}{\\mathsf{P}(L = l, U = u, l < Y \\le u)}. \\end{align*}\\] definition \\((M,V)\\), event numerator disjoint union following two sets: \\[\\begin{align*} & \\{D = 0, C_1 = v, L = l, U = u, l < Y \\le u\\} = \\{C_1 = v, L = l, U = u, Y \\(l, v]\\} \\\\ & \\{D = 1, C_1 \\le l, C_2 = v, L = l, U = u, l < Y \\le u\\} = \\{C_1 \\le l, C_2 = v, L = l, U = u, Y \\(l, v]\\}. \\end{align*}\\] independence, obtain \\[\\begin{align*} \\mathsf{P}(M = l, V = v | L = l, U = u, L < Y \\le U) = \\{\\mathsf{P}(C_1 = v) + \\mathsf{P}(C_1 \\le l, C_2 = v)\\} \\frac{F_\\theta((l, v])}{F_\\theta((l, u])}. \\end{align*}\\] , factor front fraction independent \\(\\theta\\) irrelevant likelihood. two cases \\(l < m < v = u\\) \\(l = m < v = u\\) can treated similarly; cases, likelihood contribution equal \\(F_\\theta((m, v]) /F_\\theta((l, u])\\) times factor depend \\(\\theta\\).","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"related-packages","dir":"Articles","previous_headings":"1 Introduction","what":"Related packages","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"less general cases non-informative censoring without random truncation fixed truncation, .e., \\((L, U)\\) constant observations, well estimation distribution parameters absence censoring random truncation, number R packages can fit distributions, also supporting weights. Among MASS (Venables Ripley 2002), fitdistrplus (Delignette-Muller Dutang 2015), survival (Therneau 2023), flexsurv (Jackson 2016). Note fixed truncation operation can baked distribution family whose parameters estimated, allowing classical maximum likelihood estimation. Many packages also support classic regression expected values given predictors. Distributional regression packages, gamlss (Stasinopoulos Rigby 2007) deepregression (Rügamer et al. 2023) currently support interval censoring random truncation. See following table overview available features package. Another R6-based interface provided ROOPSD (Robin 2022). reservr builds upon R packages tensorflow (Allaire Tang 2022) keras (Chollet, Allaire, et al. 2017) interface machine learning library TensorFlow (Abadi et al. 2015) perform distributional regression. underlying infrastructure shared distributional regression package deepregression (Rügamer et al. 2023). latter also supports distributional regression, time writing requires complete samples support truncation censoring. remaining parts paper structured follows: Section 2 details core functionality corresponding R package reservr. split definition samples \\(\\mathfrak{}\\) (Section 2.1), definition distribution families (Section 2.2), mathematical definitions available distribution families (Section 2.3), estimation distribution parameters (Section 2.4) distributional regression using tensorflow (Section 2.5). conclusion given Section 3.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"pkg-overview","dir":"Articles","previous_headings":"","what":"Usage of reservr","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"package serves two main goals: fitting distributions randomly truncated non-informatively interval censored data performing (deep) distributional regression randomly truncated non-informatively interval censored data. Four main components integrated facilitate analysis goals Methods representing randomly truncated non-informatively interval censored sample \\(\\mathfrak{}\\). Methods specifying parametrized distribution family \\(\\mathcal{F} = \\{F_\\theta | \\theta \\\\Theta\\}\\) fitted. Methods estimating distribution parameters \\(\\theta\\) given sample \\(\\mathfrak{}\\). Methods regression distribution parameters given regression sample \\(\\mathfrak{}_{\\text{reg}}\\), parametrized family \\(\\mathcal{F}\\) general tensorflow network \\(\\mathcal{G} : \\mathfrak{X} \\\\Theta\\) processes \\(X\\) estimate conditional distribution \\(Y | X = x\\) \\(F_{g(x)}\\) \\(g \\\\mathcal G\\). components described one one following sections.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"trunc-obs","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Working with samples","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"sample \\(\\mathfrak{} = \\{(m, v, l, u, w)_i\\}\\) represented tibble (package tibble). core function create tibble trunc_obs(). tibble created trunc_obs() consists five columns: x: observed, exact value random variable, referred \\(Y\\) Section 1. Otherwise NA. xmin: Lower interval censoring bound (\\(M\\) Section 1) observation. observation censored, xmin equal x. xmax: Upper interval censoring bound (\\(V\\) Section 1) observation. observation censored, xmax equal x. tmin: Lower truncation bound (\\(L\\) Section 1). observations \\(\\mathtt{x} \\ge \\mathtt{tmin}\\) observed. Can \\(-\\infty\\) indicate lower truncation. tmax: Upper truncation bound (\\(U\\) Section 1). observations \\(\\mathtt{x} \\le \\mathtt{tmax}\\) observed. Can \\(\\infty\\) indicate upper truncation. w: weight associated observation. Defaults \\(1\\). Note , unlike Section 1, lower bounds intervals trunc_obs included, , allow \\(\\mathtt{x} \\ge \\mathtt{tmin}\\) rather \\(\\mathtt{x} > \\mathtt{tmin}\\), unknown variable interest called \\(\\mathtt{x}\\) instead \\(Y\\). continuous random variables, formulas equivalent half-open formulation. discrete random variables, \\(\\mathtt{xmin}\\) \\(\\mathtt{tmin}\\) may appropriately shifted, e.g., replacing \\(\\mathtt{xmin}\\) \\(\\mathtt{xmin}-0.5\\) integer valued variables. following code defines sample size 1 without truncation censoring, realized value \\(1.3\\). Simulating randomly truncated interval censored data standard normal distribution \\(80\\%\\) observations randomly interval censored random uniform truncation \\(L \\sim \\mathrm{Unif}[-2, 0]\\) \\(U \\sim \\mathrm{Unif}[0, 2]\\) can simulated follows Observations look like: total number observations smaller base population \\(1000\\) due truncation: total number censored observations roughly \\(0.8 \\cdot \\mathtt{nrow(obs)}\\). addition trunc_obs() constructor function, functions as_trunc_obs() coercion, truncate_obs() artificially changing truncation bounds, repdel_obs() computing randomly truncated reporting delay observations general insurance claims data containing accident date, reporting delay evaluation date information. latter takes inputs form \\((T_\\text{acc}, D, \\tau)\\) \\(T_{\\text{acc}} < \\tau\\) accident dates corresponding reporting delays \\(D \\ge 0\\) \\(\\tau\\) calendar date observation. returns sample \\((\\mathtt{xmin} = \\mathtt{xmax} = D, \\mathtt{tmin} = 0, \\mathtt{tmax} = \\tau - T_{\\text{acc}}, \\mathtt{w} = 1)\\) suitable estimating reporting delay distribution claim observed reported evaluation date, .e., \\(T_{\\text{acc}} + D \\le \\tau\\). analysis performed using reservr .","code":"trunc_obs(1.3) ## # A data frame: 1 × 6 ## x xmin xmax tmin tmax w ## ## 1 1.3 1.3 1.3 -Inf Inf 1 set.seed(123) N <- 1000L x <- rnorm(N) is_censored <- rbinom(N, size = 1L, prob = 0.8) == 1L c_lower <- runif(sum(is_censored), min = -2.0, max = 0.0) c_upper <- c_lower + runif(sum(is_censored), min = 0, max = 1.0) x_lower <- x x_upper <- x x_lower[is_censored] <- dplyr::case_when( x[is_censored] <= c_lower ~ -Inf, x[is_censored] <= c_upper ~ c_lower, TRUE ~ c_upper ) x_upper[is_censored] <- dplyr::case_when( x[is_censored] <= c_lower ~ c_lower, x[is_censored] <= c_upper ~ c_upper, TRUE ~ Inf ) t_lower <- runif(N, min = -2.0, max = 0.0) t_upper <- runif(N, min = 0.0, max = 2.0) is_observed <- t_lower <= x & x <= t_upper obs <- trunc_obs( xmin = pmax(x_lower, t_lower)[is_observed], xmax = pmin(x_upper, t_upper)[is_observed], tmin = t_lower[is_observed], tmax = t_upper[is_observed] ) obs[8L:12L, ] ## # A tibble: 5 × 6 ## x xmin xmax tmin tmax w ## ## 1 NA -0.479 1.15 -1.93 1.15 1 ## 2 NA -0.177 1.79 -0.210 1.79 1 ## 3 -0.556 -0.556 -0.556 -0.957 0.791 1 ## 4 NA -0.379 0.616 -0.379 0.616 1 ## 5 NA 0.0575 1.45 -0.437 1.45 1 nrow(obs) ## [1] 623 sum(is.na(obs$x)) ## [1] 496"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"distributions","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Definition of distribution families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Distribution families implemented using R6 class system (Chang 2021). inherit class Distribution feature common interface manage fixed free parameters underlying familiy, use basic distribution functions random number generation computation density, cumulative distribution, hazard quantile function, use additional functions supporting parameter estimation procedures computing support presence point mass, compile performance enhanced functions speed basic functions repeated evaluation, provide tensorflow-specific implementations support (deep) distributional regression. Distribution object represents distribution family \\(\\mathcal{F}\\) supported subset real line parameterized fixed finite-dimensional parameter space \\(\\Theta\\). family may singleton, case rather distribution distribution family. reservr provides set basic distribution families, optionally fixed parameters, well transformations distribution families take one underlying distribution families. time writing, :","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"parameters","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"Parameters","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Parameters distribution families can either fixed constant value, free. Free parameters (placeholders) estimated data whereas fixed parameters held constant. Distribution methods argument with_params provide values free parameters need fully specified parameters work. example, generating samples distribution possible fully parameterized using fixed parameters with_params argument Distribution$sample(). now defined dist normal distribution family standard deviation \\(1\\) free mean. Since parameters required normal distribution fixed, dist$sample() error provided mean parameter. with_params argument can used provide free parameters override fixed parameters, necessary. two observations drawn standard normal normal distribution mean zero standard deviation \\(2\\), respectively. Since chosen seed identical, second sample exactly double first sample. Whenever output length greater one, taking one sample, with_params can optionally contain individual parameters entry. three observations drawn \\(\\mathcal{N}(\\mu = 0, \\sigma = 0.5)\\), \\(\\mathcal{N}(\\mu = 1, \\sigma = 0.5)\\) \\(\\mathcal{N}(\\mu = 2, \\sigma = 0.5)\\), respectively. Distributions set fields methods related managing parameters: active binding default_params gets sets list parameters fixed values, NULL represents free parameter. Component families included Distribution objects. get_params() gets list parameters fixed values, traversing component distribution families. get_placeholders() gets list free parameters NULL values. active binding param_bounds gets sets domain regular family parameters Interval object. Setting bound via param_bounds active binding allows restricting natural parameter space family. get_param_bounds() returns bounds free parameters list Intervals, traversing component distribution families. get_param_constraint() returns NULL function evaluates constraints parameter set. function must return vector constraint values (need equal \\(0\\) valid parameters) list elements constraints jacobian. returning list, jacobian element contain jacobian constraint function. Used nloptr::slsqp(heq=) estimation. example mixture families require probs parameters sum \\(1\\) addition box constraint parameter \\([0, 1]\\). Note box constraints handled param_bounds need specified constraint function. get_components() returns list component families transformations mixtures. list empty basic families. example normal family fixed standard deviation \\(\\sigma = 1\\) mixture distribution family two components, one specified normal distribution family:","code":"dist <- dist_normal(sd = 1.0) dist$sample(1L) ## Error in (function (n, mean = 0, sd = 1) : invalid arguments set.seed(10L) dist$sample(1L, with_params = list(mean = 0.0)) ## [1] 0.01874617 set.seed(10L) dist$sample(1L, with_params = list(mean = 0.0, sd = 2.0)) ## [1] 0.03749234 set.seed(10L) dist$sample(3L, with_params = list(mean = 0.0:2.0, sd = 0.5)) ## [1] 0.009373085 0.907873729 1.314334725 dist <- dist_normal(sd = 1.0) mix <- dist_mixture(dists = list(dist_normal(), NULL)) dist$default_params ## $mean ## NULL ## ## $sd ## [1] 1 mix$default_params ## $dists ## $dists[[1]] ## A NormalDistribution with 2 dof ## ## $dists[[2]] ## NULL ## ## ## $probs ## $probs[[1]] ## NULL ## ## $probs[[2]] ## NULL str(dist$get_placeholders()) ## List of 1 ## $ mean: NULL str(mix$get_placeholders()) ## List of 2 ## $ dists:List of 2 ## ..$ :List of 2 ## .. ..$ mean: NULL ## .. ..$ sd : NULL ## ..$ : NULL ## $ probs:List of 2 ## ..$ : NULL ## ..$ : NULL str(dist$param_bounds) ## List of 2 ## $ mean:Classes 'Interval', 'R6' (-Inf, Inf) ## $ sd :Classes 'Interval', 'R6' (0, Inf) str(mix$param_bounds) ## List of 2 ## $ dists:List of 1 ## ..$ : NULL ## $ probs:List of 1 ## ..$ :Classes 'Interval', 'R6' [0, 1] str(dist$get_param_bounds()) ## List of 1 ## $ mean:Classes 'Interval', 'R6' (-Inf, Inf) str(mix$get_param_bounds()) ## List of 2 ## $ dists:List of 1 ## ..$ :List of 2 ## .. ..$ mean:Classes 'Interval', 'R6' (-Inf, Inf) ## .. ..$ sd :Classes 'Interval', 'R6' (0, Inf) ## $ probs:List of 2 ## ..$ :Classes 'Interval', 'R6' [0, 1] ## ..$ :Classes 'Interval', 'R6' [0, 1] str(dist$get_param_constraints()) ## NULL str(mix$get_param_constraints()) ## function (params) dist$get_components() ## list() mix$get_components() ## [[1]] ## A NormalDistribution with 2 dof ## ## [[2]] ## NULL"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"basic-distribution-functions","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"Basic distribution functions","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"basic distribution functions (density, probability, hazard quantile function, well random number generation) provided distribution family. general, argument with_params can used specify missing parameters (placeholders) override fixed distribution parameters. provided parameters vectors length greater 1, must conform input dimension (e.g. length(x) density). case, parameters “vectorized” sense \\(\\)th output element computed using \\(\\)th entry parameter list. density(x, log = FALSE, with_params = list()) computes (log-)density. probability(q, lower.tail = TRUE, log.p = FALSE, with_params = list() computes (log-)cumulative distribution function (log-)survival function. hazard(x, log = FALSE. with_params = list()) computes (log-)hazard function. quantile(p, lower.tail = TRUE, log.p = FALSE, with_params = list()) computes upper lower quantiles. sample(n, with_params = list()) generates random sample size n. (with_params can contain length n vectors case).","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"additional-functions","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"Additional functions","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"addition basic functions, several supporting functions useful , e.g., estimation parameters. export_functions(name, with_params = list()) exports {d,p,q,r} functions adhering common R convention distribution functions. get_type() returns one \"continuous\", \"discrete\", \"mixed\" depending whether distribution family density respect Lebesgue measure, counting measure, sum Lebesgue measure one many point measures. is_continuous() is_discrete() testing particular type. has_capability(caps) gives information whether specific implementation provides features described. Possible capabilities \"sample\", \"density\", \"probability\", \"quantile\", \"diff_density\", \"diff_probability\", \"tf_logdensity\", \"tf_logprobability\". require_capability(caps) errors specified capabilities implemented family hand. is_discrete_at(x, with_params = list()) returns logical vector indicating whether distribution point mass x. is_in_support(x, with_params = list()) returns logical vector indicating whether distribution mass x.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"performance-enhancements","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"Performance enhancements","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"working larger data many calls distribution functions, performing fit, can beneficial just--time compile specialized functions avoid overhead dealing generic structure distributions parametrization. Distributions offer set “compiler” functions return simplified, faster, versions basic distribution functions, analytically compute gradients. functions necessarily implemented Distribution classes, automatically used , e.g., fit_dist() useful. input structure param_matrix can obtained flatten_params_matrix(dist$get_placeholders()) dist Distribution object question. compile_density() compiles fast function signature (x, param_matrix, log = FALSE) compute density fixed parameters hard-coded taking free parameters matrix defined layout instead nested list. compile_probability() compiles fast replacement probability signature (q, param_matrix, lower.tail = TRUE, log.p = FALSE). compile_probability_interval() compiles fast function signature (qmin, qmax, param_matrix, log.p = FALSE) computing \\(P(X \\[\\mathtt{qmin}, \\mathtt{qmax}])\\) logarithm efficiently. expression necessary computing truncation probabilities. compile_sample() compiles fast replacement sample signature (n, param_matrix). diff_density(x, log = FALSE, with_params = list()) computes (log-)gradients density function respect free distribution family parameters, useful maximum likelihood estimation. diff_probability(q, lower.tail = TRUE, log.p = FALSE, with_params = list()) computes (log-)gradients cumulative density function respect free distribution family parameters. useful conditional maximum likelihood estimation presence random truncation non-informative interval censoring.","code":"dist <- dist_normal() flatten_params_matrix(dist$get_placeholders()) ## mean sd ## [1,] NA NA denscmp <- dist$compile_density() if (requireNamespace(\"bench\", quietly = TRUE)) { bench::mark( dist$density(-2:2, with_params = list(mean = 0.0, sd = 1.0)), denscmp(-2:2, matrix(c(0.0, 1.0), nrow = 5L, ncol = 2L, byrow = TRUE)), dnorm(-2:2, mean = rep(0.0, 5L), sd = rep(1.0, 5L)) ) } ## # A tibble: 3 × 6 ## expression min median `itr/sec` mem_alloc `gc/sec` ## ## 1 dist$density(-2:2, with_params =… 26.01µs 28µs 34686. 0B 17.4 ## 2 denscmp(-2:2, matrix(c(0, 1), nr… 4.12µs 4.71µs 204950. 0B 41.0 ## 3 dnorm(-2:2, mean = rep(0, 5L), s… 1.68µs 1.92µs 492249. 2.58KB 0"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"tensorflow-interface","dir":"Articles","previous_headings":"2 Usage of reservr > 2.2 Definition of distribution families","what":"tensorflow interface","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Use distribution families within tensorflow networks requires specialized implementations using tensorflow APIs instead regular R functions. tailored needs maximizing (conditional) likelihoods weighted, censored randomly truncated data. Details working tensorflow can found Section 2.5. tf_compile_params(input, name_prefix = \"\") creates keras layers take input layer transform valid parametrization distribution family. tf_is_discrete_at() returns tensorflow-ready version is_discrete_at(). tf_logdensity() returns tensorflow-ready version compile_density() implied log = TRUE. tf_logprobability() returns tensorflow-ready version pf compile_probability_interval() implied log.p = TRUE. tf_make_constants() creates list constant tensors fixed distribution family parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-definitions","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Special families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"distribution families available reservr tailored algorithms parameter estimation, commonly known. section contains mathematical definitions function families.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-mixture","dir":"Articles","previous_headings":"2 Usage of reservr > 2.3 Special families","what":"Mixture distribution families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"mixture distribution family defined fixed number \\(k\\) component families \\(\\{\\mathcal{F}_i\\}_{= 1}^k\\) via set distributions \\[\\begin{align*} \\mathop{\\mathrm{Mixture}}(\\mathcal{F}_1, \\ldots, \\mathcal{F}_k) & := \\Bigl\\{ F = \\sum_{= 1}^k p_i F_i \\Bigm| F_i \\\\mathcal{F}_i, p_i \\[0, 1], \\sum_{= 1}^k p_i = 1 \\Bigr\\}. \\end{align*}\\]","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-erlangmix","dir":"Articles","previous_headings":"2 Usage of reservr > 2.3 Special families","what":"Erlang mixture distribution families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Erlang mixture distribution family defined number components \\(k\\) mixture Erlang distributions (Gamma distributions integer shape parameter) common scale parameter. \\(\\Gamma_{\\alpha, \\theta}\\) denotes Gamma distribution shape \\(\\alpha\\) scale \\(\\theta\\), erlang mixture family \\(k\\) components can defined follows: \\[\\begin{align*} \\mathop{\\mathrm{ErlangMixture}}(k) := \\Bigl\\{ F = \\sum_{= 1}^k p_i \\Gamma_{\\alpha_i, \\theta} \\Bigm| \\alpha_i \\\\mathbb{N}, \\theta \\(0, \\infty), p_i \\[0, 1], \\sum_{= 1}^k p_i = 1 \\Bigr\\}. \\end{align*}\\] Note \\(k \\\\infty\\), Erlang mixtures dense space distributions \\((0, \\infty)\\) respect weak convergence (Lee Lin 2012), making useful modeling choice general positive continuous distributions. However, tail index Erlang mixture distributions always zero due exponential decay Gamma densities.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-blended","dir":"Articles","previous_headings":"2 Usage of reservr > 2.3 Special families","what":"Blended distribution families","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Blended distribution defined follows: Given two underlying distributions \\(P, Q\\) \\(\\mathbb{R}\\) cdfs \\(F(\\cdot)=P((-\\infty, \\cdot])\\) \\(G(\\cdot)=Q((-\\infty, \\cdot])\\), respectively, parameters \\(\\kappa \\\\mathbb{R}, \\varepsilon \\(0, \\infty), p_1, p_2 \\[0, 1], p_1 + p_2 = 1\\) \\(F(\\kappa) > 0\\) \\(G(\\kappa) < 1\\), define Blended Distribution \\(B = \\mathop{\\mathrm{Blended}}(P, Q; p, \\kappa, \\varepsilon)\\) \\(P\\) \\(Q\\) blending interval \\([\\kappa - \\varepsilon, \\kappa + \\varepsilon]\\) mixture probabilities \\(p\\) via cdf \\(F_B\\): \\[\\begin{align*} p_{\\kappa, \\varepsilon}(x) &= \\begin{cases} x & , x \\(-\\infty, \\kappa-\\varepsilon],\\\\ \\tfrac12 (x + \\kappa - \\varepsilon) + \\tfrac\\varepsilon\\pi \\cos\\Big( \\frac{\\pi (x - \\kappa)}{2 \\varepsilon} \\Big) &, x \\(\\kappa-\\varepsilon , \\kappa+\\varepsilon], \\\\ \\kappa &, x \\(\\kappa +\\varepsilon, \\infty), \\end{cases} \\\\ \\nonumber q_{\\kappa, \\varepsilon}(x) & = \\begin{cases} \\kappa & , x \\(-\\infty, \\kappa-\\varepsilon],\\\\ \\tfrac12 (x + \\kappa + \\varepsilon) - \\tfrac\\varepsilon\\pi \\cos\\Big( \\frac{\\pi (x - \\kappa)}{2 \\varepsilon} \\Big) &, x \\(\\kappa-\\varepsilon , \\kappa+\\varepsilon], \\\\ x &, x \\(\\kappa +\\varepsilon, \\infty), \\end{cases} \\\\ F_B(x) & = p_1 \\frac{F(p_{\\kappa, \\varepsilon}(x))}{F(\\kappa)} + p_2 \\frac{G(q_{\\kappa, \\varepsilon}(x)) - G(\\kappa)}{1 - G(\\kappa)}. \\end{align*}\\] following illustration shows components \\(\\mathrm{Blended}(\\mathcal{N}(\\mu = -1, \\sigma = 1), \\mathrm{Exp}(\\lambda = 1); p = (0.5, 0.5), \\kappa = 0, \\varepsilon = 1)\\) distribution. transformation original component distributions (\\(\\mathcal{N}\\) \\(\\mathrm{Exp}\\)) can illustrated first right- left-truncating \\(\\kappa = 0\\) respectively, applying blending transformations \\(p_{\\kappa, \\varepsilon}\\) \\(q_{\\kappa, \\varepsilon}\\). latter distributions can obtained reservr setting probability weights blended distribution \\(p = (1, 0)\\) \\(p = (0, 1)\\) respectively. Intermediate truncated distributions obtained via trunc_dist(), \\(\\kappa\\) upper lower bound respectively. show resulting density steps, final blended density obtained weighting blended component densities. definition blended distribution leads definition blended distribution family allowing \\(P, Q, \\kappa\\) \\(\\varepsilon\\) vary: Given two families \\(\\mathcal{F}, \\mathcal{G}\\) distributions \\(\\mathbb{R}\\), parameters \\(\\kappa \\\\mathbb{R}, \\varepsilon \\(0, \\infty)\\), define Blended Distribution family family Distributions \\[\\begin{align*} \\mathop{\\mathrm{Blended}}(\\mathcal{F}, \\mathcal{G}; \\kappa, \\varepsilon) & := \\{ \\mathop{\\mathrm{Blended}}(P, Q ; p, \\kappa, \\varepsilon) \\mid P \\\\mathcal{F}, Q \\\\mathcal{G}, p_1, p_2 \\[0, 1], p_1 + p_2 = 1 \\}. \\end{align*}\\] Blended distribution families can generalized number components \\(k\\) letting \\(\\kappa\\) \\(\\varepsilon\\) become vectors dimension \\(k - 1\\) \\(\\kappa_i + \\varepsilon_i \\le \\kappa_{+ 1} - \\varepsilon_{+ 1}\\) \\(= 1, \\ldots, k - 2\\). Compared piecewise distribution families obtained mixture truncated distribution families supports \\((-\\infty, \\kappa]\\) \\([\\kappa, \\infty)\\) commonly used extreme value modelling, blended distribution families exhibit continuous density within blending region \\((\\kappa - \\varepsilon, \\kappa + \\varepsilon)\\). reservr provides implementation via dist_blended(), limited support two component families.","code":"dist1 <- dist_normal(mean = -1.0, sd = 1.0) dist2 <- dist_exponential(rate = 1.0) distb <- dist_blended( dists = list(dist1, dist2), breaks = list(0.0), bandwidths = list(1.0), probs = list(0.5, 0.5) ) distt1 <- dist_trunc(dist1, min = -Inf, max = 0.0) distt2 <- dist_trunc(dist2, min = 0.0, max = Inf) distb1 <- distb$clone() distb1$default_params$probs <- list(1.0, 0.0) distb2 <- distb$clone() distb2$default_params$probs <- list(0.0, 1.0)"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"dist-bdegp","dir":"Articles","previous_headings":"2 Usage of reservr > 2.3 Special families","what":"The Blended Dirac Erlang Generalized Pareto distribution family","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Using construction Blended distribution family, can define Blended Dirac Erlang Generalized Pareto (BDEGP) family follows, see . Given parameters \\(n \\\\mathbb{N}, m \\\\mathbb{N}, \\kappa \\\\mathbb{R}\\) \\(\\varepsilon \\(0, \\infty)\\), define Blended Dirac Erlang Generalized Pareto family family distributions \\[\\begin{align*} \\mathop{\\mathrm{BDEGP}}(n, m, \\kappa, \\varepsilon) := & \\mathop{\\mathrm{Mixture}}( \\\\ & \\qquad \\{\\delta_0\\}, \\{\\delta_1\\}, \\ldots, \\{\\delta_{n-1}\\}, \\\\ & \\qquad \\mathop{\\mathrm{Blended}}( \\\\ & \\qquad\\qquad \\mathop{\\mathrm{ErlangMixture}}(m), \\\\ & \\qquad\\qquad \\{ \\mathop{\\mathrm{GPD}}(\\kappa, \\sigma, \\xi) \\mid \\sigma \\(0, \\infty), \\xi \\[0, 1)) \\}; \\\\ & \\qquad\\qquad \\kappa, \\varepsilon \\\\ & \\qquad) \\\\ &), \\end{align*}\\] \\(\\delta_k\\) dirac distribution \\(k\\) \\(\\mathrm{GPD}\\) generalized Pareto distribution. Note constraint tail index \\(\\xi \\[0, 1)\\), guaranteeing finite expectation. distribution family three features making useful modelling general heavy-tailed distributions \\((0, \\infty)\\): maximally flexible lower tail flexible family distributions body flexible tail index due generalized Pareto component","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"fit-dist","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Methods of estimating distribution parameters","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"section describes functions problem estimating parameter \\(\\theta \\\\Theta\\) given sample \\(\\mathfrak{}\\) parameterized family \\(\\mathcal{F} = \\{F_\\theta \\mid \\theta \\\\Theta\\}\\). Sometimes, conditional log-likelihood (1.2) can directly maximized, yielding estimate \\(\\theta\\). default behavior reservr specialized estimation routine provided family \\(\\mathcal{F}_\\theta\\) defined. Depending whether box constraints, nonlinear constraints constraints parameter space \\(\\Theta\\), different implementations nonlinear optimization algorithms nloptr (Johnson 2007), particular truncated Newton (Dembo Steihaug 1983) unconstrained families, L-BFGS (Liu Nocedal 1989) box-constrained families SLSQP (Kraft 1994) general constrained families employed. addition naive direct optimization approach, families lend specialized estimation algorithms usually show faster convergence due making use special structures parameter space \\(\\Theta\\). Estimating distribution parameters truncated observations handled using generic fit() method. delegates fit_dist(), also generic signature: dist: distribution family fit obs: trunc_obs object, vector observed values start: Starting parameters, list compatible dist$get_placeholders(). time writing specialized algorithms six types families: Blended distribution families Erlang mixture distribution families Generalized pareto distribution families free lower bound u (estimated minimum xmin sample) Mixture distribution families Translated distribution families fixed offset multiplier (transform sample via \\(\\tfrac{\\cdot-\\text{offset}}{\\text{multiplier}}\\) fit component distribution family transformed sample) Uniform distribution families free lower bound min upper bound max (estimated minimum xmin, min, maximum xmax, max, sample) present, start parameter obtained via fit_dist_start() generic. generic implements family specific method generating valid starting values placeholder parameters. notable implementation fit_dist_start.ErlangMixtureDistribution() Erlang mixture distribution families. shape parameters free, different initialization strategies can chosen using additional arguments fit_dist_start(): init = \"shapes\" paired shapes = c(...) manually specifies starting shape parameters \\(\\alpha\\) init = \"fan\" paired spread = d uses \\(\\alpha = (1, 1 + d, \\ldots, 1 + (k - 1) \\cdot d)\\) default \\(d = 1\\) resulting \\(\\alpha = (1, \\ldots, k)\\) init = \"kmeans\" uses 1-dimensional K-means based clustering sample observations cluster corresponds unique shape init = \"cmm\" uses centralized method moments procedure described Re-using dist <- dist_normal(sd = 1.0) generated sample obs, can fit free parameter mean: Using function plot_distributions() can also assess quality fit. , density labelled empirical corresponds kernel density estimate automatic bandwidth selection. follow example fitting \\(\\mathrm{ErlangMixture}(3)\\) distribution family using various initialization strategies. Note , \"kmeans\" \"cmm\" use random number generator internal K-means clustering. necessitates setting constant seed running fit_dist_start() fit() ensure chosen starting parameters calls. noted different initialization methods considerable impact outcome example due discrete nature Erlang mixture distribution shape parameters thus combinatorial difficulty picking optimal shapes \\(\\alpha\\). fit() result Erlang mixture distribution families contains element named \"params_hist\". can populated passing trace = TRUE fit() record parameters ECME steps ECME-based estimation algorithms . element \"iter\" contains number full ECME-Iterations performed.","code":"dist <- dist_normal(sd = 1.0) the_fit <- fit(dist, obs) str(the_fit) ## List of 3 ## $ params:List of 1 ## ..$ mean: num 0.0822 ## $ opt :List of 5 ## ..$ par : Named num 0.0822 ## .. ..- attr(*, \"names\")= chr \"mean\" ## ..$ value : num 341 ## ..$ iter : int 7 ## ..$ convergence: int 1 ## ..$ message : chr \"NLOPT_SUCCESS: Generic success return value.\" ## $ logLik:Class 'logLik' : -341 (df=1) plot_distributions( true = dist, fitted = dist, empirical = dist_empirical(0.5 * (obs$xmin + obs$xmax)), .x = seq(-5, 5, length.out = 201), plots = \"density\", with_params = list( true = list(mean = 0.0, sd = 1.0), fitted = the_fit$params ) ) dist <- dist_erlangmix(list(NULL, NULL, NULL)) params <- list( shapes = list(1L, 4L, 12L), scale = 2.0, probs = list(0.5, 0.3, 0.2) ) set.seed(1234) x <- dist$sample(100L, with_params = params) set.seed(32) init_true <- fit_dist_start(dist, x, init = \"shapes\", shapes = as.numeric(params$shapes)) init_fan <- fit_dist_start(dist, x, init = \"fan\", spread = 3L) init_kmeans <- fit_dist_start(dist, x, init = \"kmeans\") init_cmm <- fit_dist_start(dist, x, init = \"cmm\") rbind( flatten_params(init_true), flatten_params(init_fan), flatten_params(init_kmeans), flatten_params(init_cmm) ) ## shapes[1] shapes[2] shapes[3] scale probs[1] probs[2] probs[3] ## [1,] 1 4 12 1.590800 0.43 0.33 0.24 ## [2,] 1 4 7 2.688103 0.55 0.32 0.13 ## [3,] 1 5 13 1.484960 0.43 0.36 0.21 ## [4,] 2 10 24 1.010531 0.56 0.27 0.17 set.seed(32) str(fit(dist, x, init = \"shapes\", shapes = as.numeric(params$shapes))) ## List of 4 ## $ params :List of 3 ## ..$ probs :List of 3 ## .. ..$ : num 0.43 ## .. ..$ : num 0.33 ## .. ..$ : num 0.24 ## ..$ shapes:List of 3 ## .. ..$ : num 1 ## .. ..$ : num 4 ## .. ..$ : num 13 ## ..$ scale : num 1.59 ## $ params_hist: list() ## $ iter : int 1 ## $ logLik :Class 'logLik' : -290 (df=6) fit(dist, x, init = \"fan\", spread = 3L)$logLik ## 'log Lik.' -292.0026 (df=6) fit(dist, x, init = \"kmeans\")$logLik ## 'log Lik.' -289.2834 (df=6) fit(dist, x, init = \"cmm\")$logLik ## 'log Lik.' -293.1273 (df=6)"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"tensorflow","dir":"Articles","previous_headings":"2 Usage of reservr","what":"Distributional regression using tensorflow integration","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"maximization problem (1.3) delegated tensorflow, supplies ample stochastic optimization algorithms. Functions reservr necessary create suitable output layer tensorflow maps onto \\(\\Theta\\) provide implementation (negative) log-likelihood (1.3) loss function. two tasks combined tf_compile_model(). function returns object class reservr_keras_model, can used estimation procedure. Given input layers inputs intermediate output layer intermediate_output well family distributions dist, function Compiles loss dist defined (1.3) \\(l(g) = -\\tfrac{1}{\\#(\\mathfrak{}_{\\mathrm{reg}})} \\ell(g|\\mathfrak{}_{\\mathrm{reg}})\\), optionally disabling censoring truncation efficiency. Creates list final output layers mapping intermediate_output onto parameter space \\(\\Theta\\) dist using Distribution$tf_compile_params(). step adds additional degrees freedom overall model, approach described Runs keras3::compile() underlying keras.src.models.model.Model. following example defines linear model homoskedasticity assumption fits using \\(100\\) iterations Adam optimization algorithm (Kingma Ba 2015). First, simulate data \\((Y,X)\\) model defined \\(X \\sim \\mathrm{Unif}(10,20)\\) \\(Y | X =x \\sim \\mathcal{N}(\\mu = 2x, \\sigma = 1)\\). Next, specify distribution family \\(\\mathcal{F} = \\{\\mathcal{N}(\\mu, \\sigma = 1) | \\mu\\\\mathbb R\\}\\), incorporating homoskedasticity assumption. Using keras, define empty neural network, just taking \\(x\\) input performing transformation. , tf_compile_model() adapts input layer free parameter space \\(\\Theta = \\mathbb{R}\\). introduces two parameters function family \\(\\mathcal{G}\\) implies functional relationship \\(\\mu = g(x) := \\theta_1 \\cdot x + \\theta_0\\). Since sample fully observed, disable censoring truncation, leading simplified loss \\[\\begin{align*} l(g) = -\\tfrac{1}{100} \\sum_{x, y} \\log f_{g(x)}(y), \\end{align*}\\] \\(f_\\mu(y)\\) density \\(\\mathcal{N}(\\mu=\\mu, \\sigma=1)\\) evaluated \\(y\\). fit can now performed, modifying parameters (weights) nnet -place. Note argument y fit accepts trunc_obs object. example, vector y silently converted untruncated, uncensored trunc_obs object. fit() returns keras_training_history underlying call fit() keras.src.models.model.Model. training history can plotted, displaying loss epoch (black circles), blue smoothing line. predict() method reservr_keras_model takes input tensors returns predicted distribution parameters list compatible dist$get_placeholders(). can thus extract parameter mean compare OLS fit dataset: Since reservr_keras_model includes underlying keras.src.models.model.Model, parameters can also extracted compared OLS coefficients now discuss complex example involving censoring, using right-censored ovarian dataset bundled survival package (R Core Team 2023). goal predict rate parameter exponential survival time distribution cancer patients given four features \\(X = (\\mathtt{age}, \\mathtt{resid.ds}, \\mathtt{rx}, \\mathtt{ecog.ps})\\) collected study. variables \\(\\mathtt{resid.ds}, \\mathtt{rx}\\) \\(\\mathtt{ecog.ps}\\) indicator variables coded \\(\\{1, 2\\}\\). \\(\\mathtt{age}\\) continuous variable values \\((38, 75)\\). Due different scale \\(\\mathtt{age}\\) variable, useful separate variables order perform normalization. Normalization using keras3::layer_normalization() transforms input variables zero mean unit variance. step necessary categorical features. Next, define input layers shapes, conforming input predictor list dat$x. age normalized concatenated features, stored flags, resulting 4-dimensional representation. add two hidden ReLU-layers \\(5\\) neurons network compile result, adapting 5-dimensional hidden output parameter space \\(\\Theta = (0, \\infty)\\) rate parameter exponential distribution. accomplished using dense layer \\(1\\) neuron \\(\\mathrm{softplus}\\) activation function. stability reasons, default weight initialization optimal. circumvent , estimate global exponential distribution fit observations initialize final layer weights global fit initial prediction network. Finally, can train network visualize predictions. plot expected lifetime \\((\\mathtt{age}, \\mathtt{rx})\\) shows network learned longer expected lifetimes lower \\(\\mathtt{age}\\) treatment group (\\(\\mathtt{rx}\\)) 2. global fit included dashed blue line. Individual predictions observations can also plotted subject level.","code":"set.seed(1431L) keras3::set_random_seed(1432L) dataset <- tibble::tibble( x = runif(100, min = 10, max = 20), y = 2 * x + rnorm(100) ) dist <- dist_normal(sd = 1.0) nnet_input <- keras3::keras_input(shape = 1L, name = \"x_input\") nnet_output <- nnet_input nnet <- tf_compile_model( inputs = list(nnet_input), intermediate_output = nnet_output, dist = dist, optimizer = keras3::optimizer_adam(learning_rate = 0.1), censoring = FALSE, truncation = FALSE ) nnet$dist nnet$model nnet_fit <- fit( nnet, x = dataset$x, y = dataset$y, epochs = 100L, batch_size = 100L, shuffle = FALSE, verbose = FALSE ) # Fix weird behavior of keras3 nnet_fit$params$epochs <- max(nnet_fit$params$epochs, length(nnet_fit$metrics$loss)) plot(nnet_fit) pred_params <- predict(nnet, data = list(keras3::as_tensor(dataset$x, keras3::config_floatx()))) lm_fit <- lm(y ~ x, data = dataset) dataset$y_pred <- pred_params$mean dataset$y_lm <- predict(lm_fit, newdata = dataset, type = \"response\") library(ggplot2) ggplot(dataset, aes(x = x, y = y)) + geom_point() + geom_line(aes(y = y_pred), color = \"blue\") + geom_line(aes(y = y_lm), linetype = 2L, color = \"green\") coef_nnet <- rev(as.numeric(nnet$model$get_weights())) coef_lm <- unname(coef(lm_fit)) str(coef_nnet) str(coef_lm) set.seed(1219L) tensorflow::set_random_seed(1219L) keras3::config_set_floatx(\"float32\") dist <- dist_exponential() ovarian <- survival::ovarian dat <- list( y = trunc_obs( xmin = ovarian$futime, xmax = ifelse(ovarian$fustat == 1, ovarian$futime, Inf) ), x = list( age = keras3::as_tensor(ovarian$age, keras3::config_floatx(), shape = nrow(ovarian)), flags = k_matrix(ovarian[, c(\"resid.ds\", \"rx\", \"ecog.ps\")] - 1.0) ) ) nnet_inputs <- list( keras3::keras_input(shape = 1L, name = \"age\"), keras3::keras_input(shape = 3L, name = \"flags\") ) hidden1 <- keras3::layer_concatenate( keras3::layer_normalization(nnet_inputs[[1L]]), nnet_inputs[[2L]] ) hidden2 <- keras3::layer_dense( hidden1, units = 5L, activation = keras3::activation_relu ) nnet_output <- keras3::layer_dense( hidden2, units = 5L, activation = keras3::activation_relu ) nnet <- tf_compile_model( inputs = nnet_inputs, intermediate_output = nnet_output, dist = dist, optimizer = keras3::optimizer_adam(learning_rate = 0.01), censoring = TRUE, truncation = FALSE ) nnet$model str(predict(nnet, dat$x)) global_fit <- fit(dist, dat$y) tf_initialise_model(nnet, params = global_fit$params, mode = \"zero\") str(predict(nnet, dat$x)) nnet_fit <- fit( nnet, x = dat$x, y = dat$y, epochs = 100L, batch_size = nrow(dat$y), shuffle = FALSE, verbose = FALSE ) nnet_fit$params$epochs <- max(nnet_fit$params$epochs, length(nnet_fit$metrics$loss)) plot(nnet_fit) ovarian$expected_lifetime <- 1.0 / predict(nnet, dat$x)$rate"},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"conclusion","dir":"Articles","previous_headings":"","what":"Conclusion","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"presented reservr, package supports distribution parameter estimation distributional regression using R. tasks supported samples without interval censoring without random truncation, general form truncation typical packages support. package includes facilities (1) description randomly truncated non-informatively interval censored samples, (2) definition distribution families consider, (3) global distribution parameter estimation ..d. assumption sample (4) distributional regression - employing tensorflow package flexibility speed.","code":""},{"path":"https://ashesitr.github.io/reservr/articles/jss_paper.html","id":"acknowledgements","dir":"Articles","previous_headings":"","what":"Acknowledgements","title":"Fitting Distributions and Neural Networks to Censored and Truncated Data: The R Package reservr","text":"Author like thank Axel Bücher proofreading valuable comments earlier version article.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/articles/tensorflow.html","id":"overview","dir":"Articles","previous_headings":"","what":"Overview","title":"TensorFlow Integration","text":"reservr capable fitting distributions censored truncated observations, directly allow modelling influence exogenous variables observed alongside primary outcome. integration TensorFlow comes . TensorFlow integration allows fit neural network simultaneously parameters distribution taking exogenous variables account. reservr accepts partial tensorflow networks yield single arbitrary-dimension rank 2 tensor (e.g. dense layer) output can connect suitable layers intermediate output complete network predicts parameters pre-specified distribution family. also dynamically compiles suitable conditional likelihood based loss, depending type problem (censoring, truncation), can optimized using keras3::fit implementation --box. means full flexibility respect callbacks, optimizers, mini-batching, etc.","code":"library(reservr) library(tensorflow) library(keras3) #> #> Attaching package: 'keras3' #> The following objects are masked from 'package:tensorflow': #> #> set_random_seed, shape library(tibble) library(ggplot2)"},{"path":"https://ashesitr.github.io/reservr/articles/tensorflow.html","id":"a-simple-linear-model","dir":"Articles","previous_headings":"Overview","what":"A simple linear model","title":"TensorFlow Integration","text":"following example show code necessary fit simple model assumptions OLS data. true relationship use \\(y = 2 x + \\epsilon\\) \\(\\epsilon \\sim \\mathcal{N}(0, 1)\\). use censoring truncation.","code":"if (reticulate::py_module_available(\"keras\")) { set.seed(1431L) tensorflow::set_random_seed(1432L) dataset <- tibble( x = runif(100, min = 10, max = 20), y = 2 * x + rnorm(100) ) print(qplot(x, y, data = dataset)) # Specify distributional assumption of OLS: dist <- dist_normal(sd = 1.0) # OLS assumption: homoskedasticity # Optional: Compute a global fit global_fit <- fit(dist, dataset$y) # Define a neural network nnet_input <- layer_input(shape = 1L, name = \"x_input\") # in practice, this would be deeper nnet_output <- nnet_input optimizer <- optimizer_adam(learning_rate = 0.1) nnet <- tf_compile_model( inputs = list(nnet_input), intermediate_output = nnet_output, dist = dist, optimizer = optimizer, censoring = FALSE, # Turn off unnecessary features for this problem truncation = FALSE ) nnet_fit <- fit(nnet, x = dataset$x, y = dataset$y, epochs = 100L, batch_size = 100L, shuffle = FALSE) # Fix weird behavior of keras3 nnet_fit$params$epochs <- max(nnet_fit$params$epochs, length(nnet_fit$metrics$loss)) print(plot(nnet_fit)) pred_params <- predict(nnet, data = list(as_tensor(dataset$x, config_floatx()))) lm_fit <- lm(y ~ x, data = dataset) dataset$y_pred <- pred_params$mean dataset$y_lm <- predict(lm_fit, newdata = dataset, type = \"response\") p <- ggplot(dataset, aes(x = x, y = y)) %+% geom_point() %+% geom_line(aes(y = y_pred)) %+% geom_line(aes(y = y_lm), linetype = 2L) print(p) coef_nnet <- rev(as.numeric(nnet$model$get_weights())) coef_lm <- coef(lm_fit) print(coef_nnet) print(coef_lm) } #> Warning: `qplot()` was deprecated in ggplot2 3.4.0. #> This warning is displayed once every 8 hours. #> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was #> generated. #> Epoch 0/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 341ms/step - loss: 56.18431/1 ━━━━━━━━━━━━━━━━━━━━ 0s 344ms/step - loss: 56.1843 #> Epoch 1/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 46.63251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 46.6325 #> Epoch 2/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 39.75831/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 39.7583 #> Epoch 3/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 35.50141/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 35.5014 #> Epoch 4/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.62621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.6262 #> Epoch 5/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.64411/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.6441 #> Epoch 6/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 34.80991/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.8099 #> Epoch 7/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 36.28141/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 36.2814 #> Epoch 8/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 37.38771/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 37.3877 #> Epoch 9/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step - loss: 37.80121/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step - loss: 37.8012 #> Epoch 10/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 37.51511/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 37.5151 #> Epoch 11/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 36.71811/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 36.7181 #> Epoch 12/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 35.67251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 35.6725 #> Epoch 13/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 34.63281/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.6328 #> Epoch 14/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.79741/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.7974 #> Epoch 15/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.28291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.2829 #> Epoch 16/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.11521/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.1152 #> Epoch 17/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.23721/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.2372 #> Epoch 18/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.53231/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.5323 #> Epoch 19/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.86181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.8618 #> Epoch 20/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.10381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.1038 #> Epoch 21/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 34.18291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.1829 #> Epoch 22/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 34.08131/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 34.0813 #> Epoch 23/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.83221/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.8322 #> Epoch 24/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.50171/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.5017 #> Epoch 25/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 33.16641/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 33.1664 #> Epoch 26/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.89201/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.8920 #> Epoch 27/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.71911/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.7191 #> Epoch 28/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.65621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.6562 #> Epoch 29/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.68181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.6818 #> Epoch 30/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.75441/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.7544 #> Epoch 31/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.82651/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 32.8265 #> Epoch 32/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.85911/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.8591 #> Epoch 33/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.83111/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.8311 #> Epoch 34/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.74251/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.7425 #> Epoch 35/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.61121/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.6112 #> Epoch 36/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.46491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.4649 #> Epoch 37/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.33131/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.3313 #> Epoch 38/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.23041/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.2304 #> Epoch 39/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.16951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1695 #> Epoch 40/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.14301/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1430 #> Epoch 41/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.13571/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1357 #> Epoch 42/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.12951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1295 #> Epoch 43/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.10861/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.1086 #> Epoch 44/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 32.06491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 32.0649 #> Epoch 45/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 31.99891/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.9989 #> Epoch 46/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 31.91821/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.9182 #> Epoch 47/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.83421/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.8342 #> Epoch 48/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.75761/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.7576 #> Epoch 49/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.69491/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.6949 #> Epoch 50/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.64701/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.6470 #> Epoch 51/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 13ms/step - loss: 31.60981/1 ━━━━━━━━━━━━━━━━━━━━ 0s 14ms/step - loss: 31.6098 #> Epoch 52/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.57631/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.5763 #> Epoch 53/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.53921/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.5392 #> Epoch 54/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.49401/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.4940 #> Epoch 55/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 31.43951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.4395 #> Epoch 56/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.37821/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.3782 #> Epoch 57/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.31441/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.3144 #> Epoch 58/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 20ms/step - loss: 31.25271/1 ━━━━━━━━━━━━━━━━━━━━ 0s 21ms/step - loss: 31.2527 #> Epoch 59/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.19611/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.1961 #> Epoch 60/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.14541/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.1454 #> Epoch 61/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.09891/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.0989 #> Epoch 62/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.05381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.0538 #> Epoch 63/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.00711/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 31.0071 #> Epoch 64/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.95711/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.9571 #> Epoch 65/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.90341/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.9034 #> Epoch 66/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.84721/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.8472 #> Epoch 67/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.79051/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.7905 #> Epoch 68/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.73501/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.7350 #> Epoch 69/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.68181/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.6818 #> Epoch 70/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.63071/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.6307 #> Epoch 71/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.58091/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.5809 #> Epoch 72/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.53111/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.5311 #> Epoch 73/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.48021/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.4802 #> Epoch 74/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.42771/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.4277 #> Epoch 75/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.37391/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.3739 #> Epoch 76/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.31951/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.3195 #> Epoch 77/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.26531/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.2653 #> Epoch 78/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.21201/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.2120 #> Epoch 79/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.15961/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.1596 #> Epoch 80/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.10781/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.1078 #> Epoch 81/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.05621/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.0562 #> Epoch 82/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 30.00421/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 30.0042 #> Epoch 83/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.95161/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.9516 #> Epoch 84/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.89851/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.8985 #> Epoch 85/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.84501/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.8450 #> Epoch 86/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.79171/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.7917 #> Epoch 87/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.73871/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.7387 #> Epoch 88/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.68611/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.6861 #> Epoch 89/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.63381/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.6338 #> Epoch 90/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.58161/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.5816 #> Epoch 91/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.52921/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.5292 #> Epoch 92/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.47661/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.4766 #> Epoch 93/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.42371/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.4237 #> Epoch 94/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.37081/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.3708 #> Epoch 95/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.31801/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.3180 #> Epoch 96/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.26531/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.2653 #> Epoch 97/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.21291/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.2129 #> Epoch 98/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.16051/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.1605 #> Epoch 99/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.10831/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.1083 #> Epoch 100/100 #> 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 11ms/step - loss: 29.05601/1 ━━━━━━━━━━━━━━━━━━━━ 0s 12ms/step - loss: 29.0560 #> [1] 4.854740 1.606937 #> (Intercept) x #> 0.5645856 1.9574191"},{"path":"https://ashesitr.github.io/reservr/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Alexander Rosenstock. Author, maintainer, copyright holder.","code":""},{"path":"https://ashesitr.github.io/reservr/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Rosenstock (2024). reservr: Fit Distributions Neural Networks Censored Truncated Data. R package version 0.0.3, https://github.com/AshesITR/reservr, https://ashesitr.github.io/reservr/.","code":"@Manual{, title = {reservr: Fit Distributions and Neural Networks to Censored and Truncated Data}, author = {Alexander Rosenstock}, year = {2024}, note = {R package version 0.0.3, https://github.com/AshesITR/reservr}, url = {https://ashesitr.github.io/reservr/}, }"},{"path":"https://ashesitr.github.io/reservr/index.html","id":"reservr","dir":"","previous_headings":"","what":"Fit Distributions and Neural Networks to Censored and Truncated Data","title":"Fit Distributions and Neural Networks to Censored and Truncated Data","text":"goal reservr provide flexible interface specifying distributions fitting (randomly) truncated possibly interval-censored data. provides custom fitting algorithms fit distributions ..d. samples well dynnamic TensorFlow integration allow training neural networks arbitrary output distributions. latter can used include explanatory variables distributional fits. Reservr also provides tools relevant working core functionality actuarial setting, namely functions prob_report() truncate_claims(), make assumptions type random truncation applied data. Please refer vignettes distributions.Rmd tensorflow.Rmd detailed introductions.","code":""},{"path":"https://ashesitr.github.io/reservr/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Fit Distributions and Neural Networks to Censored and Truncated Data","text":"reservr yet CRAN. can install latest development version reservr via can install released version reservr CRAN : want use reservrs features, make sure also install tensorflow.","code":"devtools::install_github(\"AshesITR/reservr\") install.packages(\"reservr\")"},{"path":"https://ashesitr.github.io/reservr/index.html","id":"example","dir":"","previous_headings":"","what":"Example","title":"Fit Distributions and Neural Networks to Censored and Truncated Data","text":"basic example shows fit normal distribution randomly truncated censored data.","code":"library(reservr) set.seed(123) mu <- 0 sigma <- 1 N <- 1000 p_cens <- 0.8 x <- rnorm(N, mean = mu, sd = sigma) is_censored <- rbinom(N, size = 1L, prob = p_cens) == 1L x_lower <- x x_lower[is_censored] <- x[is_censored] - runif(sum(is_censored), min = 0, max = 0.5) x_upper <- x x_upper[is_censored] <- x[is_censored] + runif(sum(is_censored), min = 0, max = 0.5) t_lower <- runif(N, min = -2, max = 0) t_upper <- runif(N, min = 0, max = 2) is_observed <- t_lower <= x & x <= t_upper obs <- trunc_obs( xmin = pmax(x_lower, t_lower)[is_observed], xmax = pmin(x_upper, t_upper)[is_observed], tmin = t_lower[is_observed], tmax = t_upper[is_observed] ) # Summary of the simulation cat(sprintf( \"simulated samples: %d\\nobserved samples: %d\\ncensored samples: %d\\n\", N, nrow(obs), sum(is.na(obs$x)) )) # Define outcome distribution and perform fit to truncated and (partially) censored sample dist <- dist_normal() the_fit <- fit(dist, obs) # Visualize resulting parameters and show a kernel density estimate of the samples. # We replace interval-censored samples with their midpoint for the kernel density estimate. plot_distributions( true = dist, fitted = dist, empirical = dist_empirical(0.5 * (obs$xmin + obs$xmax)), .x = seq(-5, 5, length.out = 201), plots = \"density\", with_params = list( true = list(mean = mu, sd = sigma), fitted = the_fit$params ) )"},{"path":"https://ashesitr.github.io/reservr/index.html","id":"code-of-conduct","dir":"","previous_headings":"","what":"Code of Conduct","title":"Fit Distributions and Neural Networks to Censored and Truncated Data","text":"Please note reservr project released Contributor Code Conduct. contributing project, agree abide terms.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":null,"dir":"Reference","previous_headings":"","what":"Base class for Distributions — Distribution","title":"Base class for Distributions — Distribution","text":"Represents modifiable Distribution family","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"active-bindings","dir":"Reference","previous_headings":"","what":"Active bindings","title":"Base class for Distributions — Distribution","text":"default_params Get set (non-recursive) default parameters Distribution param_bounds Get set (non-recursive) parameter bounds (box constraints) Distribution","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"public-methods","dir":"Reference","previous_headings":"","what":"Public methods","title":"Base class for Distributions — Distribution","text":"Distribution$new() Distribution$sample() Distribution$density() Distribution$tf_logdensity() Distribution$probability() Distribution$tf_logprobability() Distribution$quantile() Distribution$hazard() Distribution$diff_density() Distribution$diff_probability() Distribution$is_in_support() Distribution$is_discrete_at() Distribution$tf_is_discrete_at() Distribution$has_capability() Distribution$get_type() Distribution$get_components() Distribution$is_discrete() Distribution$is_continuous() Distribution$require_capability() Distribution$get_dof() Distribution$get_placeholders() Distribution$get_params() Distribution$tf_make_constants() Distribution$tf_compile_params() Distribution$get_param_bounds() Distribution$get_param_constraints() Distribution$export_functions() Distribution$clone()","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$new(type, caps, params, name, default_params)"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"type Type distribution. string constant default implementation. Distributions non-constant type must override get_type() function. caps Character vector capabilities fuel default implementations has_capability() require_capability(). Distributions dynamic capabilities must override has_capability() function. params Initial parameter bounds structure, backing param_bounds active binding (usually list intervals). name Name Distribution class. CamelCase end \"Distribution\". default_params Initial fixed parameters backing default_params active binding (usually list numeric / NULLs).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Construct Distribution instance Used internally dist_* functions.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-1","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$sample(n, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-1","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"n number samples draw. with_params Distribution parameters use. parameter value can also numeric vector length n. case -th sample use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-1","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Sample Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"length n vector ..d. random samples Distribution specified parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential(rate = 2.0)$sample(10)"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-2","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$density(x, log = FALSE, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-2","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points evaluate density . log Flag. TRUE, return log-density instead. with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th density point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-2","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Density Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-1","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"numeric vector (log-)densities","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-1","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$density(c(1.0, 2.0), with_params = list(rate = 2.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-3","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_logdensity()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-3","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Compile TensorFlow function log-density evaluation","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-2","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"tf_function taking arguments x args returning log-density Distribution evaluated x parameters args.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-4","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$probability( q, lower.tail = TRUE, log.p = FALSE, with_params = list() )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-3","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"q Vector points evaluate probability function . lower.tail TRUE, return P(X <= q). Otherwise return P(X > q). log.p TRUE, probabilities returned log(p). with_params Distribution parameters use. parameter value can also numeric vector length length(q). case, -th probability point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-4","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Cumulative probability Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-3","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"numeric vector (log-)probabilities","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-2","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$probability( c(1.0, 2.0), with_params = list(rate = 2.0) )"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-5","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_logprobability()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-5","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Compile TensorFlow function log-probability evaluation","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-4","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"tf_function taking arguments qmin, qmax args returning log-probability Distribution evaluated closed interval [qmin, qmax] parameters args.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-6","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$quantile( p, lower.tail = TRUE, log.p = FALSE, with_params = list() )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-4","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"p Vector probabilities. lower.tail TRUE, return P(X <= q). Otherwise return P(X > q). log.p TRUE, probabilities returned log(p). with_params Distribution parameters use. parameter value can also numeric vector length length(p). case, -th quantile use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-6","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Quantile function Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-5","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"numeric vector quantiles","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-3","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$quantile(c(0.1, 0.5), with_params = list(rate = 2.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-7","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$hazard(x, log = FALSE, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-5","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points. log Flag. TRUE, return log-hazard instead. with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th hazard point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-7","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Hazard function Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-6","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"numeric vector (log-)hazards","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-4","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential(rate = 2.0)$hazard(c(1.0, 2.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-8","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$diff_density(x, log = FALSE, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-6","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points. log Flag. TRUE, return gradient log-density instead. with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th density point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-8","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Gradients density Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-7","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list structure containing (log-)density gradients free parameters Distribution evaluated x.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-5","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$diff_density( c(1.0, 2.0), with_params = list(rate = 2.0) )"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-9","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$diff_probability( q, lower.tail = TRUE, log.p = FALSE, with_params = list() )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-7","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"q Vector points evaluate probability function . lower.tail TRUE, return P(X <= q). Otherwise return P(X > q). log.p TRUE, probabilities returned log(p). with_params Distribution parameters use. parameter value can also numeric vector length length(q). case, -th probability point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-9","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Gradients cumulative probability Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-8","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list structure containing cumulative (log-)probability gradients free parameters Distribution evaluated q.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-6","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$diff_probability( c(1.0, 2.0), with_params = list(rate = 2.0) )"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-10","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$is_in_support(x, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-8","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-10","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Determine value support Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-9","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"logical vector length x indicating whether x part support distribution given parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-7","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential(rate = 1.0)$is_in_support(c(-1.0, 0.0, 1.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-11","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$is_discrete_at(x, with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-9","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"x Vector points with_params Distribution parameters use. parameter value can also numeric vector length length(x). case, -th point use -th parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-11","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Determine value positive probability","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-10","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"logical vector length x indicating whether positive probability mass x given Distribution parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-8","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_dirac(point = 0.0)$is_discrete_at(c(0.0, 1.0))"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-12","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_is_discrete_at()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-12","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Compile TensorFlow function discrete support checking","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-11","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"tf_function taking arguments x args returning whether Distribution point mass x given parameters args.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-13","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$has_capability(caps)"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-10","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"caps Character vector capabilities","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-13","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Check capability present","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-12","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"logical vector length caps.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-9","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$has_capability(\"density\")"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-14","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_type()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-14","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get type Distribution. Type can one discrete, continuous mixed.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-13","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"string representing type Distribution.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-10","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$get_type() dist_dirac()$get_type() dist_mixture(list(dist_dirac(), dist_exponential()))$get_type() dist_mixture(list(dist_dirac(), dist_binomial()))$get_type()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-15","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_components()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-15","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get component Distributions transformed Distribution.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-14","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"possibly empty list Distributions","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-11","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_trunc(dist_exponential())$get_components() dist_dirac()$get_components() dist_mixture(list(dist_exponential(), dist_gamma()))$get_components()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-16","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$is_discrete()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-16","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Check Distribution discrete, .e. density respect counting measure.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-15","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"TRUE Distribution discrete, FALSE otherwise. Note mixed distributions discrete can point masses.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-12","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$is_discrete() dist_dirac()$is_discrete()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-17","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$is_continuous()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-17","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Check Distribution continuous, .e. density respect Lebesgue measure.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-16","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"TRUE Distribution continuous, FALSE otherwise. Note mixed distributions continuous.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-13","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$is_continuous() dist_dirac()$is_continuous()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-18","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$require_capability( caps, fun_name = paste0(sys.call(-1)[[1]], \"()\") )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-11","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"caps Character vector Capabilities require fun_name Frienly text use generating error message case failure.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-18","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Ensure Distribution required capabilities. throw error capability missing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-17","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"Invisibly TRUE.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-14","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$require_capability(\"diff_density\")"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-19","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_dof()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-19","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get number degrees freedom Distribution family. parameters without fixed default considered free.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-18","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"integer representing degrees freedom suitable e.g. AIC calculations.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-15","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$get_dof() dist_exponential(rate = 1.0)$get_dof()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-20","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_placeholders()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-20","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get Placeholders Distribution family. Returns list free parameters family. values NULL. Distribution Distributions parameters, placeholders computed recursively.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-19","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"named list containing combination (named unnamed) lists NULLs.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-16","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_exponential()$get_placeholders() dist_mixture(list(dist_dirac(), dist_exponential()))$get_placeholders()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-21","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_params(with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-12","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"with_params Optional parameter overrides structure dist$get_params(). Given Parameter values expected length 1.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-21","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get full list parameters, possibly including placeholders.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-20","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list representing (recursive) parameter structure Distribution values specified parameters NULL free parameters missing Distributions parameters with_params.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-17","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_mixture(list(dist_dirac(), dist_exponential()))$get_params( with_params = list(probs = list(0.5, 0.5)) )"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-22","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_make_constants(with_params = list())"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-13","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"with_params Optional parameter overrides structure dist$tf_make_constants(). Given Parameter values expected length 1.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-22","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get list constant TensorFlow parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-21","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list representing (recursive) constant parameters Distribution values sprecified parameters. constant TensorFlow Tensor dtype floatx.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-23","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$tf_compile_params(input, name_prefix = \"\")"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-14","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"input keras layer bind outputs name_prefix Prefix use layer names","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-23","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Compile distribution parameters tensorflow outputs","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-22","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list two elements outputs flat list keras output layers, one parameter. output_inflater function taking keras output layers transforming list structure suitable passing loss function returned tf_compile_model()","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-24","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_param_bounds()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-24","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get Interval bounds Distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-23","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"list representing free (recursive) parameter structure Distribution Interval objects values representing bounds respective free parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-18","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_mixture( list(dist_dirac(), dist_exponential()), probs = list(0.5, 0.5) )$get_param_bounds() dist_mixture( list(dist_dirac(), dist_exponential()) )$get_param_bounds() dist_genpareto()$get_param_bounds() dist_genpareto1()$get_param_bounds()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-25","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$get_param_constraints()"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-25","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Get additional (non-linear) equality constraints Distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-24","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"NULL box constraints specified dist$get_param_bounds() sufficient, function taking full Distribution parameters returning either numeric vector (must 0 valid parameter combinations) list elements constraints: numeric vector constraints jacobian: Jacobi matrix constraints respect parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-19","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"dist_mixture( list(dist_dirac(), dist_exponential()) )$get_param_constraints()"},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-26","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$export_functions( name, envir = parent.frame(), with_params = list() )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-15","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"name common suffix exported functions envir Environment export functions with_params Optional list parameters use default values exported functions","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"details-26","dir":"Reference","previous_headings":"","what":"Details","title":"Base class for Distributions — Distribution","text":"Export sampling, density, probability quantile functions plain R functions Creates new functions envir named {r,d,p,q} implement dist$sample, dist$density, dist$probability dist$quantile plain functions default arguments specified with_params fixed parameters. resulting functions signatures taking parameters separate arguments.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"returns-25","dir":"Reference","previous_headings":"","what":"Returns","title":"Base class for Distributions — Distribution","text":"Invisibly NULL.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"examples-20","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"tmp_env <- new.env(parent = globalenv()) dist_exponential()$export_functions( name = \"exp\", envir = tmp_env, with_params = list(rate = 2.0) ) evalq( fitdistrplus::fitdist(rexp(100), \"exp\"), envir = tmp_env )"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"method-clone-","dir":"Reference","previous_headings":"","what":"Method clone()","title":"Base class for Distributions — Distribution","text":"objects class cloneable method.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"usage-27","dir":"Reference","previous_headings":"","what":"Usage","title":"Base class for Distributions — Distribution","text":"","code":"Distribution$clone(deep = FALSE)"},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"arguments-16","dir":"Reference","previous_headings":"","what":"Arguments","title":"Base class for Distributions — Distribution","text":"deep Whether make deep clone.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Distribution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Base class for Distributions — Distribution","text":"","code":"# Example for param_bounds: # Create an Exponential Distribution with rate constrained to (0, 2) # instead of (0, Inf) my_exp <- dist_exponential() my_exp$param_bounds$rate <- interval(c(0, 2)) my_exp$get_param_bounds() #> $rate #> (0, 2) #> fit_dist(my_exp, rexp(100, rate = 3), start = list(rate = 1))$params$rate #> [1] 2 ## ------------------------------------------------ ## Method `Distribution$sample` ## ------------------------------------------------ dist_exponential(rate = 2.0)$sample(10) #> [1] 0.13286615 0.01112249 0.07288815 1.51862540 0.08488557 0.42304793 #> [7] 0.10249917 0.08983756 0.25915838 0.33607531 ## ------------------------------------------------ ## Method `Distribution$density` ## ------------------------------------------------ dist_exponential()$density(c(1.0, 2.0), with_params = list(rate = 2.0)) #> [1] 0.27067057 0.03663128 ## ------------------------------------------------ ## Method `Distribution$probability` ## ------------------------------------------------ dist_exponential()$probability( c(1.0, 2.0), with_params = list(rate = 2.0) ) #> [1] 0.8646647 0.9816844 ## ------------------------------------------------ ## Method `Distribution$quantile` ## ------------------------------------------------ dist_exponential()$quantile(c(0.1, 0.5), with_params = list(rate = 2.0)) #> [1] 0.05268026 0.34657359 ## ------------------------------------------------ ## Method `Distribution$hazard` ## ------------------------------------------------ dist_exponential(rate = 2.0)$hazard(c(1.0, 2.0)) #> [1] 2 2 ## ------------------------------------------------ ## Method `Distribution$diff_density` ## ------------------------------------------------ dist_exponential()$diff_density( c(1.0, 2.0), with_params = list(rate = 2.0) ) #> $rate #> [1] -0.13533528 -0.05494692 #> ## ------------------------------------------------ ## Method `Distribution$diff_probability` ## ------------------------------------------------ dist_exponential()$diff_probability( c(1.0, 2.0), with_params = list(rate = 2.0) ) #> $rate #> [1] 0.13533528 0.03663128 #> ## ------------------------------------------------ ## Method `Distribution$is_in_support` ## ------------------------------------------------ dist_exponential(rate = 1.0)$is_in_support(c(-1.0, 0.0, 1.0)) #> [1] FALSE FALSE TRUE ## ------------------------------------------------ ## Method `Distribution$is_discrete_at` ## ------------------------------------------------ dist_dirac(point = 0.0)$is_discrete_at(c(0.0, 1.0)) #> [1] TRUE FALSE ## ------------------------------------------------ ## Method `Distribution$has_capability` ## ------------------------------------------------ dist_exponential()$has_capability(\"density\") #> [1] TRUE ## ------------------------------------------------ ## Method `Distribution$get_type` ## ------------------------------------------------ dist_exponential()$get_type() #> [1] \"continuous\" dist_dirac()$get_type() #> [1] \"discrete\" dist_mixture(list(dist_dirac(), dist_exponential()))$get_type() #> [1] \"mixed\" dist_mixture(list(dist_dirac(), dist_binomial()))$get_type() #> [1] \"discrete\" ## ------------------------------------------------ ## Method `Distribution$get_components` ## ------------------------------------------------ dist_trunc(dist_exponential())$get_components() #> [[1]] #> An ExponentialDistribution with 1 dof #> dist_dirac()$get_components() #> list() dist_mixture(list(dist_exponential(), dist_gamma()))$get_components() #> [[1]] #> An ExponentialDistribution with 1 dof #> #> [[2]] #> A GammaDistribution with 2 dof #> ## ------------------------------------------------ ## Method `Distribution$is_discrete` ## ------------------------------------------------ dist_exponential()$is_discrete() #> [1] FALSE dist_dirac()$is_discrete() #> [1] TRUE ## ------------------------------------------------ ## Method `Distribution$is_continuous` ## ------------------------------------------------ dist_exponential()$is_continuous() #> [1] TRUE dist_dirac()$is_continuous() #> [1] FALSE ## ------------------------------------------------ ## Method `Distribution$require_capability` ## ------------------------------------------------ dist_exponential()$require_capability(\"diff_density\") ## ------------------------------------------------ ## Method `Distribution$get_dof` ## ------------------------------------------------ dist_exponential()$get_dof() #> [1] 1 dist_exponential(rate = 1.0)$get_dof() #> [1] 0 ## ------------------------------------------------ ## Method `Distribution$get_placeholders` ## ------------------------------------------------ dist_exponential()$get_placeholders() #> $rate #> NULL #> dist_mixture(list(dist_dirac(), dist_exponential()))$get_placeholders() #> $dists #> $dists[[1]] #> $dists[[1]]$point #> NULL #> #> #> $dists[[2]] #> $dists[[2]]$rate #> NULL #> #> #> #> $probs #> $probs[[1]] #> NULL #> #> $probs[[2]] #> NULL #> #> ## ------------------------------------------------ ## Method `Distribution$get_params` ## ------------------------------------------------ dist_mixture(list(dist_dirac(), dist_exponential()))$get_params( with_params = list(probs = list(0.5, 0.5)) ) #> $dists #> $dists[[1]] #> $dists[[1]]$point #> NULL #> #> #> $dists[[2]] #> $dists[[2]]$rate #> NULL #> #> #> #> $probs #> $probs[[1]] #> [1] 0.5 #> #> $probs[[2]] #> [1] 0.5 #> #> ## ------------------------------------------------ ## Method `Distribution$get_param_bounds` ## ------------------------------------------------ dist_mixture( list(dist_dirac(), dist_exponential()), probs = list(0.5, 0.5) )$get_param_bounds() #> $dists #> $dists[[1]] #> $dists[[1]]$point #> (-Inf, Inf) #> #> #> $dists[[2]] #> $dists[[2]]$rate #> (0, Inf) #> #> #> #> $probs #> list() #> dist_mixture( list(dist_dirac(), dist_exponential()) )$get_param_bounds() #> $dists #> $dists[[1]] #> $dists[[1]]$point #> (-Inf, Inf) #> #> #> $dists[[2]] #> $dists[[2]]$rate #> (0, Inf) #> #> #> #> $probs #> $probs[[1]] #> [0, 1] #> #> $probs[[2]] #> [0, 1] #> #> dist_genpareto()$get_param_bounds() #> $u #> (-Inf, Inf) #> #> $sigmau #> (0, Inf) #> #> $xi #> (-Inf, Inf) #> dist_genpareto1()$get_param_bounds() #> $u #> (-Inf, Inf) #> #> $sigmau #> (0, Inf) #> #> $xi #> [0, 1] #> ## ------------------------------------------------ ## Method `Distribution$get_param_constraints` ## ------------------------------------------------ dist_mixture( list(dist_dirac(), dist_exponential()) )$get_param_constraints() #> function (params) #> { #> prob_mat <- do.call(cbind, params$probs) #> nms <- names(flatten_params(params)) #> jac_full <- matrix(0, nrow = nrow(prob_mat), ncol = length(nms)) #> jac_full[, grepl(\"^probs\", nms)] <- 1 #> list(constraints = rowSums(prob_mat) - 1, jacobian = jac_full) #> } #> ## ------------------------------------------------ ## Method `Distribution$export_functions` ## ------------------------------------------------ tmp_env <- new.env(parent = globalenv()) dist_exponential()$export_functions( name = \"exp\", envir = tmp_env, with_params = list(rate = 2.0) ) #> Exported `dexp()`. #> Exported `rexp()`. #> Exported `pexp()`. #> Exported `qexp()`. evalq( fitdistrplus::fitdist(rexp(100), \"exp\"), envir = tmp_env ) #> Fitting of the distribution ' exp ' by maximum likelihood #> Parameters: #> estimate Std. Error #> rate 2.131976 0.2131975"},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":null,"dir":"Reference","previous_headings":"","what":"The Generalized Pareto Distribution (GPD) — GenPareto","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"functions provide information generalized Pareto distribution threshold u. dgpd gives density, pgpd gives distribution function, qgpd gives quantile function rgpd generates random deviates.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"","code":"rgpd(n = 1L, u = 0, sigmau = 1, xi = 0) dgpd(x, u = 0, sigmau = 1, xi = 0, log = FALSE) pgpd(q, u = 0, sigmau = 1, xi = 0, lower.tail = TRUE, log.p = FALSE) qgpd(p, u = 0, sigmau = 1, xi = 0, lower.tail = TRUE, log.p = FALSE)"},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"n integer number observations. u threshold parameter (minimum value). sigmau scale parameter (must positive). xi shape parameter x, q vector quantiles. log, log.p logical; TRUE, probabilities/densities p given log(p). lower.tail logical; TRUE (default), probabilities \\(P(X \\le x)\\), otherwise \\(P(X > x)\\). p vector probabilities.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"rgpd generates random deviates. dgpd gives density. pgpd gives distribution function. qgpd gives quantile function.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"u, sigmau xi specified, assume default values 0, 1 0 respectively. generalized Pareto distribution density $$f(x) = 1 / \\sigma_u (1 + \\xi z)^(- 1 / \\xi - 1)$$ \\(z = (x - u) / \\sigma_u\\) \\(f(x) = exp(-z)\\) \\(\\xi\\) 0. support \\(x \\ge u\\) \\(\\xi \\ge 0\\) \\(u \\le x \\le u - \\sigma_u / \\xi\\) \\(\\xi < 0\\). Expected value exists \\(\\xi < 1\\) equal $$E(X) = u + \\sigma_u / (1 - \\xi)$$ k-th moments exist general \\(k\\xi < 1\\).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"https://en.wikipedia.org/wiki/Generalized_Pareto_distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/GenPareto.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"The Generalized Pareto Distribution (GPD) — GenPareto","text":"","code":"x <- rgpd(1000, u = 1, sigmau = 0.5, xi = 0.1) xx <- seq(-1, 10, 0.01) hist(x, breaks = 100, freq = FALSE, xlim = c(-1, 10)) lines(xx, dgpd(xx, u = 1, sigmau = 0.5, xi = 0.1)) plot(xx, dgpd(xx, u = 1, sigmau = 1, xi = 0), type = \"l\") lines(xx, dgpd(xx, u = 0.5, sigmau = 1, xi = -0.3), col = \"blue\", lwd = 2) lines(xx, dgpd(xx, u = 1.5, sigmau = 1, xi = 0.3), col = \"red\", lwd = 2) plot(xx, dgpd(xx, u = 1, sigmau = 1, xi = 0), type = \"l\") lines(xx, dgpd(xx, u = 1, sigmau = 0.5, xi = 0), col = \"blue\", lwd = 2) lines(xx, dgpd(xx, u = 1, sigmau = 2, xi = 0), col = \"red\", lwd = 2)"},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":null,"dir":"Reference","previous_headings":"","what":"The Pareto Distribution — Pareto","title":"The Pareto Distribution — Pareto","text":"functions provide information Pareto distribution. dpareto gives density, ppareto gives distribution function, qpareto gives quantile function rpareto generates random deviates.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"The Pareto Distribution — Pareto","text":"","code":"rpareto(n = 1L, shape = 0, scale = 1) dpareto(x, shape = 1, scale = 1, log = FALSE) ppareto(q, shape = 1, scale = 1, lower.tail = TRUE, log.p = FALSE) qpareto(p, shape = 1, scale = 1, lower.tail = TRUE, log.p = FALSE)"},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"The Pareto Distribution — Pareto","text":"n integer number observations. shape shape parameter (must positive). scale scale parameter (must positive). x, q vector quantiles. log, log.p logical; TRUE, probabilities/densities p given log(p). lower.tail logical; TRUE (default), probabilities \\(P(X \\le x)\\), otherwise \\(P(X > x)\\). p vector probabilities.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"The Pareto Distribution — Pareto","text":"rpareto generates random deviates. dpareto gives density. ppareto gives distribution function. qpareto gives quantile function.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"The Pareto Distribution — Pareto","text":"shape scale specified, assume default values 1. Pareto distribution scale \\(\\theta\\) shape \\(\\xi\\) density $$f(x) = \\xi \\theta^\\xi / (x + \\theta)^(\\xi + 1)$$ support \\(x \\ge 0\\). Expected value exists \\(\\xi > 1\\) equal $$E(X) = \\theta / (\\xi - 1)$$ k-th moments exist general \\(k < \\xi\\).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"The Pareto Distribution — Pareto","text":"https://en.wikipedia.org/wiki/Pareto_distribution - named Lomax therein.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/Pareto.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"The Pareto Distribution — Pareto","text":"","code":"x <- rpareto(1000, shape = 10, scale = 5) xx <- seq(-1, 10, 0.01) hist(x, breaks = 100, freq = FALSE, xlim = c(-1, 10)) lines(xx, dpareto(xx, shape = 10, scale = 5)) plot(xx, dpareto(xx, shape = 10, scale = 5), type = \"l\") lines(xx, dpareto(xx, shape = 3, scale = 5), col = \"red\", lwd = 2) plot(xx, dpareto(xx, shape = 10, scale = 10), type = \"l\") lines(xx, dpareto(xx, shape = 10, scale = 5), col = \"blue\", lwd = 2) lines(xx, dpareto(xx, shape = 10, scale = 20), col = \"red\", lwd = 2)"},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert TensorFlow tensors to distribution parameters recursively — as_params","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"Convert TensorFlow tensors distribution parameters recursively","code":""},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"","code":"as_params(x)"},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"x possibly nested list structure tensorflow.tensors","code":""},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"nested list vectors suitable distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/as_params.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert TensorFlow tensors to distribution parameters recursively — as_params","text":"","code":"if (interactive()) { tf_params <- list( probs = k_matrix(t(c(0.5, 0.3, 0.2))), shapes = k_matrix(t(c(1L, 2L, 3L)), dtype = \"int32\"), scale = keras3::as_tensor(1.0, keras3::config_floatx()) ) params <- as_params(tf_params) dist <- dist_erlangmix(vector(\"list\", 3L)) dist$sample(10L, with_params = params) }"},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":null,"dir":"Reference","previous_headings":"","what":"Transition functions for blended distributions — blended_transition","title":"Transition functions for blended distributions — blended_transition","text":"Transition functions blended distributions","code":""},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transition functions for blended distributions — blended_transition","text":"","code":"blended_transition(x, u, eps, .gradient = FALSE, .extend_na = FALSE) blended_transition_inv(x, u, eps, .component)"},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transition functions for blended distributions — blended_transition","text":"x Points evaluate u Sorted vector blending thresholds, rowwise sorted matrix blending thresholds eps Corresponding vector matrix blending bandwidths. Must positive dimensions u, scalar. rowwise blending regions (u - eps, u + eps) may overlap. .gradient Also evaluate gradient respect x? .extend_na Extend -range transitions last -range value (.e. corresponding u) NA? .component Component index (length(u) + 1) invert.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Transition functions for blended distributions — blended_transition","text":"blended_transition returns matrix length(x) rows length(u) + 1 columns containing transformed values blending components. .gradient TRUE, attribute \"gradient\" attached dimensions, containing derivative respective transition component respect x. blended_transition_inv returns vector length(x) values containing inverse transformed values .componentth blending component.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/blended_transition.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Transition functions for blended distributions — blended_transition","text":"","code":"library(ggplot2) xx <- seq(from = 0, to = 20, length.out = 101) blend_mat <- blended_transition(xx, u = 10, eps = 3, .gradient = TRUE) ggplot( data.frame( x = rep(xx, 2L), fun = rep(c(\"p\", \"q\"), each = length(xx)), y = as.numeric(blend_mat), relevant = c(xx <= 13, xx >= 7) ), aes(x = x, y = y, color = fun, linetype = relevant) ) %+% geom_line() %+% theme_bw() %+% theme( legend.position = \"bottom\", legend.box = \"horizontal\" ) %+% guides(color = guide_legend(direction = \"horizontal\", title = \"\"), linetype = guide_none()) %+% scale_linetype_manual(values = c(\"TRUE\" = 1, \"FALSE\" = 3)) ggplot( data.frame( x = rep(xx, 2L), fun = rep(c(\"p'\", \"q'\"), each = length(xx)), y = as.numeric(attr(blend_mat, \"gradient\")), relevant = c(xx <= 13, xx >= 7) ), aes(x = x, y = y, color = fun, linetype = relevant) ) %+% geom_line() %+% theme_bw() %+% theme( legend.position = \"bottom\", legend.box = \"horizontal\" ) %+% guides(color = guide_legend(direction = \"horizontal\", title = \"\"), linetype = guide_none()) %+% scale_linetype_manual(values = c(\"TRUE\" = 1, \"FALSE\" = 3))"},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":null,"dir":"Reference","previous_headings":"","what":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"Provides keras callback similar keras3::callback_reduce_lr_on_plateau() also restores weights best seen far whenever learning rate reduction occurs, slightly restrictive improvement detection.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"","code":"callback_adaptive_lr( monitor = \"val_loss\", factor = 0.1, patience = 10L, verbose = 0L, mode = c(\"auto\", \"min\", \"max\"), delta_abs = 1e-04, delta_rel = 0, cooldown = 0L, min_lr = 0, restore_weights = TRUE )"},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"monitor quantity monitored. factor factor learning rate reduced. new_lr = old_lr * factor. patience number epochs significant improvement learning rate reduced. verbose integer. Set 1 receive update messages. mode Optimisation mode. \"auto\" detects mode name monitor. \"min\" monitors decreasing metrics. \"max\" monitors increasing metrics. delta_abs Minimum absolute metric improvement per epoch. learning rate reduced average improvement less delta_abs per epoch patience epochs. delta_rel Minimum relative metric improvement per epoch. learning rate reduced average improvement less |metric| * delta_rel per epoch patience epochs. cooldown number epochs wait resuming normal operation learning rate reduced. minimum number epochs two learning rate reductions patience + cooldown. min_lr lower bound learning rate. learning rate reduction lower learning rate min_lr, clipped min_lr instead reductions performed. restore_weights Bool. TRUE, best weights restored learning rate reduction. useful metric oscillates.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"KerasCallback suitable passing keras3::fit().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"Note keras3::callback_reduce_lr_on_plateau() automatically logs learning rate metric 'lr', currently impossible R. Thus, want also log learning rate, add keras3::callback_reduce_lr_on_plateau() high min_lr effectively disable callback still monitor learning rate.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_adaptive_lr.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Keras Callback for adaptive learning rate with weight restoration — callback_adaptive_lr","text":"","code":"dist <- dist_exponential() group <- sample(c(0, 1), size = 100, replace = TRUE) x <- dist$sample(100, with_params = list(rate = group + 1)) global_fit <- fit(dist, x) if (interactive()) { library(keras3) l_in <- layer_input(shape = 1L) mod <- tf_compile_model( inputs = list(l_in), intermediate_output = l_in, dist = dist, optimizer = optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_initialise_model(mod, global_fit$params) fit_history <- fit( mod, x = as_tensor(group, config_floatx()), y = as_trunc_obs(x), epochs = 20L, callbacks = list( callback_adaptive_lr(\"loss\", factor = 0.5, patience = 2L, verbose = 1L, min_lr = 1.0e-4), callback_reduce_lr_on_plateau(\"loss\", min_lr = 1.0) # to track lr ) ) plot(fit_history) predicted_means <- predict(mod, data = as_tensor(c(0, 1), config_floatx())) }"},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":null,"dir":"Reference","previous_headings":"","what":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"Provides keras callback monitor individual components censored truncated likelihood. Useful debugging TensorFlow implementations Distributions.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"","code":"callback_debug_dist_gradients( object, data, obs, keep_grads = FALSE, stop_on_na = TRUE, verbose = TRUE )"},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"object reservr_keras_model created tf_compile_model(). data Input data model. obs Observations associated data. keep_grads Log actual gradients? (memory hungry!) stop_on_na Stop likelihood component NaN gradients? verbose Print message training halted? Message contain information likelihood components NaN gradients.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"KerasCallback suitable passing keras3::fit().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/callback_debug_dist_gradients.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Callback to monitor likelihood gradient components — callback_debug_dist_gradients","text":"","code":"dist <- dist_exponential() group <- sample(c(0, 1), size = 100, replace = TRUE) x <- dist$sample(100, with_params = list(rate = group + 1)) global_fit <- fit(dist, x) if (interactive()) { library(keras3) l_in <- layer_input(shape = 1L) mod <- tf_compile_model( inputs = list(l_in), intermediate_output = l_in, dist = dist, optimizer = optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_initialise_model(mod, global_fit$params) gradient_tracker <- callback_debug_dist_gradients( mod, as_tensor(group, config_floatx()), x, keep_grads = TRUE ) fit_history <- fit( mod, x = as_tensor(group, config_floatx()), y = x, epochs = 20L, callbacks = list( callback_adaptive_lr(\"loss\", factor = 0.5, patience = 2L, verbose = 1L, min_lr = 1.0e-4), gradient_tracker, callback_reduce_lr_on_plateau(\"loss\", min_lr = 1.0) # to track lr ) ) gradient_tracker$gradient_logs[[20]]$dens plot(fit_history) predicted_means <- predict(mod, data = as_tensor(c(0, 1), config_floatx())) }"},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":null,"dir":"Reference","previous_headings":"","what":"Construct a BDEGP-Family — dist_bdegp","title":"Construct a BDEGP-Family — dist_bdegp","text":"Constructs BDEGP-Family distribution fixed number components blending interval.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Construct a BDEGP-Family — dist_bdegp","text":"","code":"dist_bdegp(n, m, u, epsilon)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Construct a BDEGP-Family — dist_bdegp","text":"n Number dirac components, starting point mass 0. m Number erlang components, translated n - 0.5. u Blending cut-, must positive real. epsilon Blending radius, must positive real less u. blending interval u - epsilon < x < u + epsilon.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Construct a BDEGP-Family — dist_bdegp","text":"MixtureDistribution n DiracDistributions 0 .. n - 1 BlendedDistribution object child Distributions TranslatedDistribution offset n - 0.5 ErlangMixtureDistribution m shapes GeneralizedParetoDistribution shape parameter restricted [0, 1] location parameter fixed u break u bandwidth epsilon.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_bdegp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Construct a BDEGP-Family — dist_bdegp","text":"","code":"dist <- dist_bdegp(n = 1, m = 2, u = 10, epsilon = 3) params <- list( dists = list( list(), list( dists = list( list( dist = list( shapes = list(1L, 2L), scale = 1.0, probs = list(0.7, 0.3) ) ), list( sigmau = 1.0, xi = 0.1 ) ), probs = list(0.1, 0.9) ) ), probs = list(0.95, 0.05) ) x <- dist$sample(100, with_params = params) plot_distributions( theoretical = dist, empirical = dist_empirical(x), .x = seq(0, 20, length.out = 101), with_params = list(theoretical = params) ) #> Warning: Removed 33 rows containing missing values or values outside the scale range #> (`geom_line()`)."},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":null,"dir":"Reference","previous_headings":"","what":"Beta Distribution — dist_beta","title":"Beta Distribution — dist_beta","text":"See stats::Beta","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Beta Distribution — dist_beta","text":"","code":"dist_beta(shape1 = NULL, shape2 = NULL, ncp = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Beta Distribution — dist_beta","text":"shape1 First scalar shape parameter, NULL placeholder. shape2 Second scalar shape parameter, NULL placeholder. ncp Scalar non-centrality parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Beta Distribution — dist_beta","text":"BetaDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Beta Distribution — dist_beta","text":"parameters can overridden with_params = list(shape = ..., scale = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_beta.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Beta Distribution — dist_beta","text":"","code":"d_beta <- dist_beta(shape1 = 2, shape2 = 2, ncp = 0) x <- d_beta$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_beta, estimated = d_beta, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"beta\")$estimate ) ), .x = seq(0, 2, length.out = 100) ) #> Warning: Removed 141 rows containing missing values or values outside the scale range #> (`geom_line()`)."},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":null,"dir":"Reference","previous_headings":"","what":"Binomial Distribution — dist_binomial","title":"Binomial Distribution — dist_binomial","text":"See stats::Binomial","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Binomial Distribution — dist_binomial","text":"","code":"dist_binomial(size = NULL, prob = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Binomial Distribution — dist_binomial","text":"size Number trials parameter (integer), NULL placeholder. prob Success probability parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Binomial Distribution — dist_binomial","text":"BinomialDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Binomial Distribution — dist_binomial","text":"parameters can overridden with_params = list(size = ..., prob = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_binomial.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Binomial Distribution — dist_binomial","text":"","code":"d_binom <- dist_binomial(size = 10, prob = 0.5) x <- d_binom$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_binom, estimated = d_binom, with_params = list( estimated = list( size = max(x), prob = mean(x) / max(x) ) ), .x = 0:max(x) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":null,"dir":"Reference","previous_headings":"","what":"Blended distribution — dist_blended","title":"Blended distribution — dist_blended","text":"Blended distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Blended distribution — dist_blended","text":"","code":"dist_blended(dists, probs = NULL, breaks = NULL, bandwidths = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Blended distribution — dist_blended","text":"dists list k >= 2 component Distributions. probs k Mixture weight parameters breaks k - 1 Centers blending zones. dists[] blend dists[+ 1] around breaks[]. bandwidths k - 1 Radii blending zones. -th blending zone begin breaks[] - bandwidths[] end breaks[] + bandwidths[]. bandwidth 0 corresponds hard cut-, .e. jump discontinuity density blended Distribution.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Blended distribution — dist_blended","text":"BlendedDistribution object.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_blended.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Blended distribution — dist_blended","text":"","code":"bd <- dist_blended( list( dist_normal(mean = 0.0, sd = 1.0), dist_genpareto(u = 3.0, sigmau = 1.0, xi = 3.0) ), breaks = list(3.0), bandwidths = list(0.5), probs = list(0.9, 0.1) ) plot_distributions( bd, .x = seq(-3, 10, length.out = 100), plots = c(\"d\", \"p\") )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":null,"dir":"Reference","previous_headings":"","what":"Dirac (degenerate point) Distribution — dist_dirac","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"degenerate distribution mass single point.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"","code":"dist_dirac(point = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"point point probability mass 1.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"DiracDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"parameter can overridden with_params = list(point = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_dirac.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Dirac (degenerate point) Distribution — dist_dirac","text":"","code":"d_dirac <- dist_dirac(1.5) d_dirac$sample(2L) #> [1] 1.5 1.5 d_dirac$sample(2L, list(point = 42.0)) #> [1] 42 42"},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":null,"dir":"Reference","previous_headings":"","what":"Discrete Distribution — dist_discrete","title":"Discrete Distribution — dist_discrete","text":"full-flexibility discrete distribution values 1 size.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Discrete Distribution — dist_discrete","text":"","code":"dist_discrete(size = NULL, probs = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Discrete Distribution — dist_discrete","text":"size Number classes parameter (integer). Required probs NULL. probs Vector probabilties parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Discrete Distribution — dist_discrete","text":"DiscreteDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Discrete Distribution — dist_discrete","text":"Parameters can overridden with_params = list(probs = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_discrete.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Discrete Distribution — dist_discrete","text":"","code":"d_discrete <- dist_discrete(probs = list(0.5, 0.25, 0.15, 0.1)) x <- d_discrete$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_discrete, estimated = d_discrete, with_params = list( estimated = list( size = max(x), probs = as.list(unname(table(x)) / 100) ) ), .x = 0:max(x) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":null,"dir":"Reference","previous_headings":"","what":"Empirical distribution — dist_empirical","title":"Empirical distribution — dist_empirical","text":"Creates empirical distribution object sample. Assumes iid. samples. with_params used distribution estimation relevant indicators happens construction.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Empirical distribution — dist_empirical","text":"","code":"dist_empirical(sample, positive = FALSE, bw = \"nrd0\")"},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Empirical distribution — dist_empirical","text":"sample Sample build empirical distribution positive underlying distribution known positive? effect density estimation procedure. positive = FALSE uses kernel density estimate produced density(), positive = TRUE uses log-kernel density estimate produced logKDE::logdensity_fft(). latter can improve density estimation near zero. bw Bandwidth parameter density estimation. Passed density estimation function selected positive.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Empirical distribution — dist_empirical","text":"EmpiricalDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Empirical distribution — dist_empirical","text":"sample() samples iid. sample. approach similar bootstrapping. density() evaluates kernel density estimate, approximating zero outside known support. estimate either obtained using stats::density logKDE::logdensity_fft, depending positive. probability() evaluates empirical cumulative density function obtained stats::ecdf. quantile() evaluates empirical quantiles using stats::quantile hazard() estimates hazard rate using density estimate empirical cumulative density function: h(t) = df(t) / (1 - cdf(t)).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_empirical.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Empirical distribution — dist_empirical","text":"","code":"x <- rexp(20, rate = 1) dx <- dist_empirical(sample = x, positive = TRUE) y <- rnorm(20) dy <- dist_empirical(sample = y) plot_distributions( exponential = dx, normal = dy, .x = seq(-3, 3, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":null,"dir":"Reference","previous_headings":"","what":"Erlang Mixture distribution — dist_erlangmix","title":"Erlang Mixture distribution — dist_erlangmix","text":"Erlang Mixture distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Erlang Mixture distribution — dist_erlangmix","text":"","code":"dist_erlangmix(shapes, scale = NULL, probs = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Erlang Mixture distribution — dist_erlangmix","text":"shapes Shape parameters, trunc_erlangmix fit, NULL placeholder. scale Common scale parameter, NULL placeholder. probs Mixing probabilities, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Erlang Mixture distribution — dist_erlangmix","text":"ErlangMixtureDistribution object.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_erlangmix.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Erlang Mixture distribution — dist_erlangmix","text":"","code":"params <- list(scale = 1.0, probs = list(0.5, 0.3, 0.2), shapes = list(1L, 2L, 3L)) dist <- dist_erlangmix(vector(\"list\", 3L)) x <- dist$sample(20, with_params = params) d_emp <- dist_empirical(x, positive = TRUE) plot_distributions( empirical = d_emp, theoretical = dist, with_params = list( theoretical = params ), .x = seq(1e-4, 5, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":null,"dir":"Reference","previous_headings":"","what":"Exponential distribution — dist_exponential","title":"Exponential distribution — dist_exponential","text":"See stats::Exponential.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Exponential distribution — dist_exponential","text":"","code":"dist_exponential(rate = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Exponential distribution — dist_exponential","text":"rate Scalar rate parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Exponential distribution — dist_exponential","text":"ExponentialDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Exponential distribution — dist_exponential","text":"parameter can overridden with_params = list(rate = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_exponential.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Exponential distribution — dist_exponential","text":"","code":"rate <- 1 d_exp <- dist_exponential() x <- d_exp$sample(20, with_params = list(rate = rate)) d_emp <- dist_empirical(x, positive = TRUE) plot_distributions( empirical = d_emp, theoretical = d_exp, estimated = d_exp, with_params = list( theoretical = list(rate = rate), estimated = list(rate = 1 / mean(x)) ), .x = seq(1e-4, 5, length.out = 100) ) #> Warning: Removed 27 rows containing missing values or values outside the scale range #> (`geom_line()`)."},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":null,"dir":"Reference","previous_headings":"","what":"Gamma distribution — dist_gamma","title":"Gamma distribution — dist_gamma","text":"See stats::GammaDist.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Gamma distribution — dist_gamma","text":"","code":"dist_gamma(shape = NULL, rate = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Gamma distribution — dist_gamma","text":"shape Scalar shape parameter, NULL placeholder. rate Scalar rate parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Gamma distribution — dist_gamma","text":"GammaDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Gamma distribution — dist_gamma","text":"parameters can overridden with_params = list(shape = ..., rate = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_gamma.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Gamma distribution — dist_gamma","text":"","code":"alpha <- 2 beta <- 2 d_gamma <- dist_gamma(shape = alpha, rate = beta) x <- d_gamma$sample(100) d_emp <- dist_empirical(x, positive = TRUE) plot_distributions( empirical = d_emp, theoretical = d_gamma, estimated = d_gamma, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"gamma\")$estimate ) ), .x = seq(1e-3, max(x), length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":null,"dir":"Reference","previous_headings":"","what":"Generalized Pareto Distribution — dist_genpareto","title":"Generalized Pareto Distribution — dist_genpareto","text":"See evmix::gpd","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generalized Pareto Distribution — dist_genpareto","text":"","code":"dist_genpareto(u = NULL, sigmau = NULL, xi = NULL) dist_genpareto1(u = NULL, sigmau = NULL, xi = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generalized Pareto Distribution — dist_genpareto","text":"u Scalar location parameter, NULL placeholder. sigmau Scalar scale parameter, NULL placeholder. xi Scalar shape parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generalized Pareto Distribution — dist_genpareto","text":"GeneralizedParetoDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Generalized Pareto Distribution — dist_genpareto","text":"parameters can overridden with_params = list(u = ..., sigmau = ..., xi = ...). dist_genpareto1 equivalent dist_genpareto enforces bound constraints xi [0, 1]. ensures unboundedness finite expected value unless xi == 1.0.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_genpareto.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Generalized Pareto Distribution — dist_genpareto","text":"","code":"d_genpareto <- dist_genpareto(u = 0, sigmau = 1, xi = 1) x <- d_genpareto$sample(100) d_emp <- dist_empirical(x) d_genpareto$export_functions(\"gpd\") # so fitdistrplus finds it #> Exported `dgpd()`. #> Exported `rgpd()`. #> Exported `pgpd()`. #> Exported `qgpd()`. plot_distributions( empirical = d_emp, theoretical = d_genpareto, estimated = d_genpareto, with_params = list( estimated = fit(dist_genpareto(), x)$params ), .x = seq(0, 5, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":null,"dir":"Reference","previous_headings":"","what":"Log Normal distribution — dist_lognormal","title":"Log Normal distribution — dist_lognormal","text":"See stats::Lognormal.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Log Normal distribution — dist_lognormal","text":"","code":"dist_lognormal(meanlog = NULL, sdlog = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Log Normal distribution — dist_lognormal","text":"meanlog Scalar mean parameter log scale, NULL placeholder. sdlog Scalar standard deviation parameter log scale, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Log Normal distribution — dist_lognormal","text":"LognormalDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Log Normal distribution — dist_lognormal","text":"parameters can overridden with_params = list(meanlog = ..., sdlog = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_lognormal.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Log Normal distribution — dist_lognormal","text":"","code":"mu <- 0 sigma <- 1 d_lnorm <- dist_lognormal(meanlog = mu, sdlog = sigma) x <- d_lnorm$sample(20) d_emp <- dist_empirical(x, positive = TRUE) plot_distributions( empirical = d_emp, theoretical = d_lnorm, estimated = d_lnorm, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"lnorm\")$estimate ) ), .x = seq(1e-3, 5, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":null,"dir":"Reference","previous_headings":"","what":"Mixture distribution — dist_mixture","title":"Mixture distribution — dist_mixture","text":"Parameters mixing components can overridden with_params = list(dists = list(..., ..., ...)). #' Mixing probabilites can overridden with_params = list(probs = list(..., ..., ...)). number components overridden.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Mixture distribution — dist_mixture","text":"","code":"dist_mixture(dists = list(), probs = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Mixture distribution — dist_mixture","text":"dists list mixing distributions. May contain placeholders duplicates. probs list mixing probabilities length dists. normalized sum one NULL can used placeholder within probs. reduce number required parameters, probs least partly specified (probs = list(NULL, NULL, ..., 1) k - 1 NULLs k number mixing components).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Mixture distribution — dist_mixture","text":"MixtureDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Mixture distribution — dist_mixture","text":"support quantile() capability!","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_mixture.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Mixture distribution — dist_mixture","text":"","code":"# A complicated way to define a uniform distribution on \\[0, 2\\] dist_mixture( dists = list( dist_uniform(min = 0, max = 1), dist_uniform(min = 1, max = 2) ), probs = list(0.5, 0.5) ) #> A Mixture with 0 dof"},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":null,"dir":"Reference","previous_headings":"","what":"Negative binomial Distribution — dist_negbinomial","title":"Negative binomial Distribution — dist_negbinomial","text":"See stats::NegBinomial","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Negative binomial Distribution — dist_negbinomial","text":"","code":"dist_negbinomial(size = NULL, mu = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Negative binomial Distribution — dist_negbinomial","text":"size Number successful trials parameter, NULL placeholder. Non-integer values > 0 allowed. mu Mean parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Negative binomial Distribution — dist_negbinomial","text":"NegativeBinomialDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Negative binomial Distribution — dist_negbinomial","text":"parameters can overridden with_params = list(size = ..., prob = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_negbinomial.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Negative binomial Distribution — dist_negbinomial","text":"","code":"d_nbinom <- dist_negbinomial(size = 3.5, mu = 8.75) x <- d_nbinom$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_nbinom, estimated = d_nbinom, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"nbinom\")$estimate ) ), .x = 0:max(x) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":null,"dir":"Reference","previous_headings":"","what":"Normal distribution — dist_normal","title":"Normal distribution — dist_normal","text":"See stats::Normal.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Normal distribution — dist_normal","text":"","code":"dist_normal(mean = NULL, sd = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Normal distribution — dist_normal","text":"mean Scalar mean parameter, NULL placeholder. sd Scalar standard deviation parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Normal distribution — dist_normal","text":"NormalDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Normal distribution — dist_normal","text":"parameters can overridden with_params = list(mean = ..., sd = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_normal.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Normal distribution — dist_normal","text":"","code":"mu <- 0 sigma <- 1 d_norm <- dist_normal(mean = mu, sd = sigma) x <- d_norm$sample(20) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_norm, estimated = d_norm, with_params = list( estimated = list(mean = mean(x), sd = sd(x)) ), .x = seq(-3, 3, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":null,"dir":"Reference","previous_headings":"","what":"Pareto Distribution — dist_pareto","title":"Pareto Distribution — dist_pareto","text":"See Pareto","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Pareto Distribution — dist_pareto","text":"","code":"dist_pareto(shape = NULL, scale = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Pareto Distribution — dist_pareto","text":"shape Scalar shape parameter, NULL placeholder. scale Scalar scale parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Pareto Distribution — dist_pareto","text":"ParetoDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Pareto Distribution — dist_pareto","text":"parameters can overridden with_params = list(shape = ..., scale = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_pareto.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Pareto Distribution — dist_pareto","text":"","code":"d_pareto <- dist_pareto(shape = 3, scale = 1) x <- d_pareto$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_pareto, estimated = d_pareto, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"pareto\")$estimate ) ), .x = seq(0, 2, length.out = 100) ) #> Warning: The dpareto function should return a vector of with NaN values when input has inconsistent values and not raise an error"},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":null,"dir":"Reference","previous_headings":"","what":"Poisson Distribution — dist_poisson","title":"Poisson Distribution — dist_poisson","text":"See stats::Poisson","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Poisson Distribution — dist_poisson","text":"","code":"dist_poisson(lambda = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Poisson Distribution — dist_poisson","text":"lambda Scalar rate parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Poisson Distribution — dist_poisson","text":"PoissonDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Poisson Distribution — dist_poisson","text":"parameter can overridden with_params = list(lambda = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_poisson.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Poisson Distribution — dist_poisson","text":"","code":"d_pois <- dist_poisson(lambda = 5.0) x <- d_pois$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_pois, estimated = d_pois, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"pois\")$estimate ) ), .x = 0:max(x) )"},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":null,"dir":"Reference","previous_headings":"","what":"Tranlsated distribution — dist_translate","title":"Tranlsated distribution — dist_translate","text":"Tranlsated distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Tranlsated distribution — dist_translate","text":"","code":"dist_translate(dist = NULL, offset = NULL, multiplier = 1)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Tranlsated distribution — dist_translate","text":"dist underlying distribution, NULL placeholder. offset Offset added observation, NULL placeholder. multiplier Factor multiply observation , NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Tranlsated distribution — dist_translate","text":"TranslatedDistribution object.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_translate.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Tranlsated distribution — dist_translate","text":"","code":"d_norm <- dist_normal(mean = 0, sd = 1) d_tnorm <- dist_translate(dist = d_norm, offset = 1) plot_distributions(d_norm, d_tnorm, .x = seq(-2, 3, length.out = 100))"},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":null,"dir":"Reference","previous_headings":"","what":"Truncated distribution — dist_trunc","title":"Truncated distribution — dist_trunc","text":"Truncated distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Truncated distribution — dist_trunc","text":"","code":"dist_trunc(dist = NULL, min = NULL, max = NULL, offset = 0, max_retry = 100)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Truncated distribution — dist_trunc","text":"dist underlying distribution, NULL placeholder. min Minimum value truncate (exclusive), NULL placeholder. max Maxmimum value truncate (inclusive), NULL placeholder. offset Offset added observation truncation, NULL placeholder. Truncation dist occur (min, max]. offset added deterministically. max_retry Maximum number resample attempts trying sample rejection.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Truncated distribution — dist_trunc","text":"TruncatedDistribution object.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_trunc.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Truncated distribution — dist_trunc","text":"","code":"d_norm <- dist_normal(mean = 0, sd = 1) d_tnorm <- dist_trunc(dist = d_norm, min = -2, max = 2, offset = 1) plot_distributions(d_norm, d_tnorm, .x = seq(-2, 3, length.out = 100))"},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":null,"dir":"Reference","previous_headings":"","what":"Uniform distribution — dist_uniform","title":"Uniform distribution — dist_uniform","text":"See stats::Uniform","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Uniform distribution — dist_uniform","text":"","code":"dist_uniform(min = NULL, max = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Uniform distribution — dist_uniform","text":"min Lower limit, NULL placeholder. max Upper limit, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Uniform distribution — dist_uniform","text":"UniformDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Uniform distribution — dist_uniform","text":"parameters can overridden with_params = list(min = ..., max = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_uniform.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Uniform distribution — dist_uniform","text":"","code":"d_unif <- dist_uniform(min = 0, max = 1) x <- d_unif$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_unif, estimated = d_unif, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"unif\")$estimate ) ), .x = seq(0, 1, length.out = 100) ) #> Warning: Removed 2 rows containing missing values or values outside the scale range #> (`geom_line()`)."},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":null,"dir":"Reference","previous_headings":"","what":"Weibull Distribution — dist_weibull","title":"Weibull Distribution — dist_weibull","text":"See stats::Weibull","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Weibull Distribution — dist_weibull","text":"","code":"dist_weibull(shape = NULL, scale = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Weibull Distribution — dist_weibull","text":"shape Scalar shape parameter, NULL placeholder. scale Scalar scale parameter, NULL placeholder.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Weibull Distribution — dist_weibull","text":"WeibullDistribution object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Weibull Distribution — dist_weibull","text":"parameters can overridden with_params = list(shape = ..., scale = ...).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/dist_weibull.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Weibull Distribution — dist_weibull","text":"","code":"d_weibull <- dist_weibull(shape = 3, scale = 1) x <- d_weibull$sample(100) d_emp <- dist_empirical(x) plot_distributions( empirical = d_emp, theoretical = d_weibull, estimated = d_weibull, with_params = list( estimated = inflate_params( fitdistrplus::fitdist(x, distr = \"weibull\")$estimate ) ), .x = seq(0, 2, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a neural network based distribution model to data — fit.reservr_keras_model","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"function delegates work keras3::fit.keras.src.models.model.Model() performs additional consistency checks make sure tf_compile_model() called appropriate options support fitting observations y well automatically converting y n x 6 matrix needed compiled loss function.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"","code":"# S3 method for reservr_keras_model fit( object, x, y, batch_size = NULL, epochs = 10, verbose = getOption(\"keras.fit_verbose\", default = 1), callbacks = NULL, view_metrics = getOption(\"keras.view_metrics\", default = \"auto\"), validation_split = 0, validation_data = NULL, shuffle = TRUE, class_weight = NULL, sample_weight = NULL, initial_epoch = 0, steps_per_epoch = NULL, validation_steps = NULL, ... )"},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"object compiled reservr_keras_model obtained tf_compile_model(). x list input tensors (predictors) y trunc_obs tibble observed outcomes, something convertible via as_trunc_obs(). batch_size Integer NULL. Number samples per gradient update. unspecified, batch_size default 32. specify batch_size data form TF Datasets generators, (since generate batches). epochs Integer. Number epochs train model. epoch iteration entire x y data provided (unless steps_per_epoch flag set something NULL). Note conjunction initial_epoch, epochs understood \"final epoch\". model trained number iterations given epochs, merely epoch index epochs reached. verbose \"auto\", 0, 1, 2. Verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per epoch. \"auto\" becomes 1 cases, 2 knitr render running distributed training server. Note progress bar particularly useful logged file, verbose=2 recommended running interactively (e.g., production environment). Defaults \"auto\". callbacks List Callback() instances. List callbacks apply training. See callback_*. view_metrics View realtime plot training metrics (epoch). default (\"auto\") display plot running within RStudio, metrics specified model compile(), epochs > 1 verbose > 0. Set global options(keras.view_metrics = ) option establish different default. validation_split Float 0 1. Fraction training data used validation data. model set apart fraction training data, train , evaluate loss model metrics data end epoch. validation data selected last samples x y data provided, shuffling. argument supported x TF Dataset generator. validation_data validation_split provided, validation_data override validation_split. validation_data Data evaluate loss model metrics end epoch. model trained data. Thus, note fact validation loss data provided using validation_split validation_data affected regularization layers like noise dropout. validation_data override validation_split. : tuple (x_val, y_val) arrays tensors. tuple (x_val, y_val, val_sample_weights) arrays. generator returning (inputs, targets) (inputs, targets, sample_weights). shuffle Boolean, whether shuffle training data epoch. argument ignored x generator TF Dataset. class_weight Optional named list mapping class indices (integers, 0-based) weight (float) value, used weighting loss function (training ). can useful tell model \"pay attention\" samples -represented class. class_weight specified targets rank 2 greater, either y must one-hot encoded, explicit final dimension 1 must included sparse class labels. sample_weight Optional array weights training samples, used weighting loss function (training ). can either pass flat (1D) array/vector length input samples (1:1 mapping weights samples), case temporal data, can pass 2D array (matrix) shape (samples, sequence_length), apply different weight every timestep every sample. argument supported x TF Dataset generator, instead provide sample_weights third element x. Note sample weighting apply metrics specified via metrics argument compile(). apply sample weighting metrics, can specify via weighted_metrics compile() instead. initial_epoch Integer. Epoch start training (useful resuming previous training run). steps_per_epoch Integer NULL. Total number steps (batches samples) declaring one epoch finished starting next epoch. training input tensors backend-native tensors, default NULL equal number samples dataset divided batch size, 1 determined. x TF Dataset, steps_per_epoch NULL, epoch run input dataset exhausted. passing infinitely repeating dataset, must specify steps_per_epoch argument. steps_per_epoch = -1 training run indefinitely infinitely repeating dataset. validation_steps relevant validation_data provided. Total number steps (batches samples) draw stopping performing validation end every epoch. validation_steps NULL, validation run validation_data dataset exhausted. case infinitely repeated dataset, run infinite loop. validation_steps specified part dataset consumed, evaluation start beginning dataset epoch. ensures validation samples used every time. ... Unused. old arguments supplied, error message raised informing fix issue.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"history object contains information collected training. model object updated -place side-effect.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"Additionally, default batch_size min(nrow(y), 10000) instead keras default 32 latter bad choice fitting distributions since involved loss much less stable typical losses used machine learning, leading divergence small batch sizes.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit.reservr_keras_model.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a neural network based distribution model to data — fit.reservr_keras_model","text":"","code":"dist <- dist_exponential() params <- list(rate = 1.0) N <- 100L rand_input <- runif(N) x <- dist$sample(N, with_params = params) if (interactive()) { tf_in <- keras3::layer_input(1L) mod <- tf_compile_model( inputs = list(tf_in), intermediate_output = tf_in, dist = dist, optimizer = keras3::optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_fit <- fit( object = mod, x = k_matrix(rand_input), y = x, epochs = 10L, callbacks = list( callback_debug_dist_gradients(mod, k_matrix(rand_input), x, keep_grads = TRUE) ) ) }"},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"Fit Blended mixture using ECME-Algorithm","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"","code":"fit_blended( dist, obs, start, min_iter = 0L, max_iter = 100L, skip_first_e = FALSE, tolerance = 1e-05, trace = FALSE, ... )"},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"dist BlendedDistribution. assumed, breaks bandwidths placeholder weights estimated. obs Set observations produced trunc_obs() convertible via as_trunc_obs(). start Initial values placeholder parameters. missing, starting values obtained fit_dist_start(). min_iter Minimum number EM-Iterations max_iter Maximum number EM-Iterations (weight updates) skip_first_e Skip first E-Step (update Probability weights)? can help initial values cause mixture component vanish first E-Step starting values can improved. tolerance Numerical tolerance. trace Include tracing information output? TRUE, additional tracing information added result list. ... Passed fit_dist_start() start missing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"list elements params fitted parameters structure init. params_hist (trace TRUE) history parameters (e- m- step) iter number outer EM-iterations logLik final log-likelihood","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit_blended.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a Blended mixture using an ECME-Algorithm — fit_blended","text":"","code":"dist <- dist_blended( list( dist_exponential(), dist_genpareto() ) ) params <- list( probs = list(0.9, 0.1), dists = list( list(rate = 2.0), list(u = 1.5, xi = 0.2, sigmau = 1.0) ), breaks = list(1.5), bandwidths = list(0.3) ) x <- dist$sample(100L, with_params = params) dist$default_params$breaks <- params$breaks dist$default_params$bandwidths <- params$bandwidths if (interactive()) { fit_blended(dist, x) }"},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a general distribution to observations — fit_dist","title":"Fit a general distribution to observations — fit_dist","text":"default implementation performs maximum likelihood estimation placeholder parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a general distribution to observations — fit_dist","text":"","code":"fit_dist(dist, obs, start, ...) fit_dist_direct(dist, obs, start, ..., .start_with_default = FALSE) # S3 method for Distribution fit(object, obs, start, ...)"},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a general distribution to observations — fit_dist","text":"dist Distribution object. obs Set observations produced trunc_obs() convertible via as_trunc_obs(). start Initial values placeholder parameters. missing, starting values obtained fit_dist_start(). ... Distribution-specific arguments fitting procedure .start_with_default directly optimising likelihood, use optimised algorithm finding better starting values? object parameter dist","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a general distribution to observations — fit_dist","text":"list least elements params fitted parameters structure init. logLik final log-likelihood Additional information may provided depending dist.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit a general distribution to observations — fit_dist","text":"Erlang mixture distributions Mixture distributions, EM-Algorithm instead used improve stability. fit() fit_dist() chose optimisation method optimized specific distribution given. fit_dist_direct() can used force direct maximisation likelihood.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a general distribution to observations — fit_dist","text":"","code":"x <- rexp(100) lambda_hat <- 1 / mean(x) lambda_hat2 <- fit_dist(dist_exponential(), x)$params$rate identical(lambda_hat, lambda_hat2) #> [1] TRUE dist <- dist_mixture(list(dist_normal(), dist_translate(dist_exponential(), offset = 6))) params <- list( dists = list(list(mean = 5, sd = 1), list(dist = list(rate = 1))), probs = list(0.95, 0.05) ) set.seed(2000) u <- runif(100, 10, 20) x <- dist$sample(100, with_params = params) obs <- trunc_obs(x = x[x <= u], tmin = -Inf, tmax = u[x <= u]) default_fit <- fit_dist(dist, obs) direct_fit <- fit_dist_direct(dist, obs) # NB: direct optimisation steps with pre-run take a few seconds # \\donttest{ direct_fit_init <- fit_dist_direct(dist, obs, start = default_fit$params) direct_fit_auto_init <- fit_dist_direct(dist, obs, .start_with_default = TRUE) stopifnot(direct_fit_init$logLik == direct_fit_auto_init$logLik) c(default_fit$logLik, direct_fit$logLik, direct_fit_init$logLik) #> [1] -153.0052 -153.0052 -153.0052 # }"},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":null,"dir":"Reference","previous_headings":"","what":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"Find starting values distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"","code":"# S3 method for MixtureDistribution fit_dist_start(dist, obs, dists_start = NULL, ...) fit_dist_start(dist, obs, ...)"},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"dist Distribution object. obs Observations fit . dists_start List initial parameters component distributions. left empty, initialisation automatically performed using fit_dist_start() observations support respective component. ... Additional arguments initialisation procedure","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"list initial parameters suitable passing fit_dist().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_dist_start.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find starting values for distribution parameters — fit_dist_start.MixtureDistribution","text":"","code":"fit_dist_start(dist_exponential(), rexp(100)) #> $rate #> [1] 1.258531 #>"},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"Fit Erlang mixture using ECME-Algorithm","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"","code":"fit_erlang_mixture( dist, obs, start, min_iter = 0L, max_iter = 100L, skip_first_e = FALSE, tolerance = 1e-05, trace = FALSE, parallel = FALSE, ... )"},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"dist ErlangMixtureDistribution. assumed, probs scale estimated. obs Set observations produced trunc_obs() convertible via as_trunc_obs(). start Initial values placeholder parameters. missing, starting values obtained fit_dist_start(). min_iter Minimum number EM-Iterations max_iter Maximum number EM-Iterations (weight updates) skip_first_e Skip first E-Step (update Probability weights)? can help initial values cause mixture component vanish first E-Step starting values can improved. tolerance Numerical tolerance. trace Include tracing information output? TRUE, additional tracing information added result list. parallel Enable experimental parallel evaluation expected log-likelihood? ... Passed fit_dist_start() start missing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"list elements params fitted parameters structure init. params_hist (trace TRUE) history parameters (e- m- step). Otherwise empty list. iter number outer EM-iterations logLik final log-likelihood","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit_erlang_mixture.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit an Erlang mixture using an ECME-Algorithm — fit_erlang_mixture","text":"","code":"dist <- dist_erlangmix(list(NULL, NULL, NULL)) params <- list( shapes = list(1L, 4L, 12L), scale = 2.0, probs = list(0.5, 0.3, 0.2) ) x <- dist$sample(100L, with_params = params) fit_erlang_mixture(dist, x, init = \"kmeans\") #> $params #> $params$probs #> $params$probs[[1]] #> [1] 0.31 #> #> $params$probs[[2]] #> [1] 0.43 #> #> $params$probs[[3]] #> [1] 0.26 #> #> #> $params$shapes #> $params$shapes[[1]] #> [1] 1 #> #> $params$shapes[[2]] #> [1] 4 #> #> $params$shapes[[3]] #> [1] 13 #> #> #> $params$scale #> [1] 1.686607 #> #> #> $params_hist #> list() #> #> $iter #> [1] 1 #> #> $logLik #> 'log Lik.' -310.162 (df=6) #>"},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"Fit generic mixture using ECME-Algorithm","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"","code":"fit_mixture( dist, obs, start, min_iter = 0L, max_iter = 100L, skip_first_e = FALSE, tolerance = 1e-05, trace = FALSE, ... )"},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"dist MixtureDistribution specifying structure mixture. Free parameters optimised. dominating measure likelihoods must constant, example dist_dirac() may point parameter free. obs Set observations produced trunc_obs() convertible via as_trunc_obs(). start Initial values placeholder parameters. missing, starting values obtained fit_dist_start(). min_iter Minimum number EM-Iterations max_iter Maximum number EM-Iterations (weight updates) skip_first_e Skip first E-Step (update Probability weights)? can help initial values cause mixture component vanish first E-Step starting values can improved. tolerance Numerical tolerance. trace Include tracing information output? TRUE, additional tracing information added result list. ... Passed fit_dist_start() start missing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"list elements params fitted parameters structure init. params_hist (trace TRUE) history parameters (e- m- step) iter number outer EM-iterations logLik final log-likelihood","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/fit_mixture.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit a generic mixture using an ECME-Algorithm — fit_mixture","text":"","code":"dist <- dist_mixture( list( dist_dirac(0.0), dist_exponential() ) ) params <- list( probs = list(0.1, 0.9), dists = list( list(), list(rate = 1.0) ) ) x <- dist$sample(100L, with_params = params) fit_mixture(dist, x) #> $params #> $params$dists #> $params$dists[[1]] #> list() #> #> $params$dists[[2]] #> $params$dists[[2]]$rate #> [1] 0.8578941 #> #> #> #> $params$probs #> $params$probs[[1]] #> [1] 0.11 #> #> $params$probs[[2]] #> [1] 0.89 #> #> #> #> $iter #> [1] 1 #> #> $logLik #> 'log Lik.' -137.293 (df=2) #>"},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":null,"dir":"Reference","previous_headings":"","what":"Flatten / Inflate parameter lists / vectors — flatten_params","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"Flatten / Inflate parameter lists / vectors","code":""},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"","code":"flatten_params(params) flatten_params_matrix(params) flatten_bounds(bounds) inflate_params(flat_params)"},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"params named list parameters flattened. form passed with_params argument distribution functions. bounds List parameter bounds returned dist$get_param_bounds() flat_params named numeric vector parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"flatten_params returns 'flattened' vector parameters. intended adapter multi-dimensional optimisation functions distribution objects. flatten_params_matrix returns 'flattened' matrix parameters. intended adapter multi-dimensional optimisation functions distribution objects. column corresponds one input element. flatten_bounds returns named list vectors names lower upper. Containing upper lower bounds parameter. inflate_params returns 'inflated' list parameters. can passed with_params argument distribution functions.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/flatten_params.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Flatten / Inflate parameter lists / vectors — flatten_params","text":"","code":"library(ggplot2) mm <- dist_mixture(list( dist_exponential(NULL), dist_lognormal(0.5, NULL) ), list(NULL, 1)) ph <- mm$get_placeholders() ph_flat <- flatten_params(ph) ph_reinflated <- inflate_params(ph_flat) ph_flat[] <- c(1, 1, 6) ph_sample <- inflate_params(ph_flat) x <- mm$sample( 100, with_params = ph_sample ) emp_cdf <- ecdf(x) ggplot(data.frame(t = seq(from = min(x), to = max(x), length.out = 100))) %+% geom_point(aes(x = t, y = emp_cdf(t))) %+% geom_line(aes(x = t, y = mm$probability(t, with_params = ph_sample)), linetype = 2)"},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":null,"dir":"Reference","previous_headings":"","what":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"Integrates fun bounds [ lower, upper ] vectorized lower upper. Vectorized list structures parameters can also passed.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"","code":"integrate_gk( fun, lower, upper, params = list(), .tolerance = .Machine$double.eps^0.25, .max_iter = 100L )"},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"fun function integrate. Must vectorized take one two arguments, first points evaluate second (optionally) parameters apply. must return numeric vector length first input. Currently, infinite bounds supported. lower, upper Integration bounds. Must length. params Parameters pass second argument fun. actual parameters must length number integrals compute. Can possibly nested list structures containing numeric vectors. Alternatively, can matrix number rows number integrals compute. .tolerance Absolute element-wise tolerance. .max_iter Maximum number iterations. number integration intervals length(lower) * .max_iter. Therefor maximum number function evaluations per integration interval 15 * .max_iter.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"vector integrals -th entry containing approximation integral fun(t, pick_params_at(params, )) dt interval lower[] upper[]","code":""},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"integration error estimated Gauss-Kronrod quadrature absolute difference 7-point quadrature 15-point quadrature. Integrals converge bisected midpoint. params object recursively subsetted numeric vectors length number observations.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/integrate_gk.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Adaptive Gauss-Kronrod Quadrature for multiple limits — integrate_gk","text":"","code":"# Argument recycling and parallel integration of two intervals integrate_gk(sin, 0, c(pi, 2 * pi)) #> [1] 2.000000e+00 -3.141135e-16 dist <- dist_exponential() integrate_gk( function(x, p) dist$density(x, with_params = p), lower = 0, upper = 1:10, params = list(rate = 1 / 1:10) ) #> [1] 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 #> [8] 0.6321206 0.6321206 0.6321206 dist$probability(1:10, with_params = list(rate = 1 / 1:10)) #> [1] 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 0.6321206 #> [8] 0.6321206 0.6321206 0.6321206"},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":null,"dir":"Reference","previous_headings":"","what":"Convex union and intersection of intervals — interval-operations","title":"Convex union and intersection of intervals — interval-operations","text":"Convex union intersection intervals","code":""},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convex union and intersection of intervals — interval-operations","text":"","code":"interval_union(..., intervals = list()) interval_intersection(..., intervals = list())"},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convex union and intersection of intervals — interval-operations","text":"... appened intervals present. intervals list Intervals.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convex union and intersection of intervals — interval-operations","text":"interval_union returns convex union intervals intervals. smallest interval completely containing intervals. interval_intersection returns set intersection intervals intervals. empty set represented open interval (0, 0).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/interval-operations.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convex union and intersection of intervals — interval-operations","text":"","code":"interval_union( interval(c(0, 1), closed = TRUE), interval(c(1, 2)) ) #> [0, 2) interval_union( interval(c(0, 5)), interval(c(1, 4), closed = TRUE) ) #> (0, 5) # Convex union is not equal to set union: interval_union( interval(c(0, 1)), interval(c(2, 3)) ) #> (0, 3) # The empty union is {} interval_union() #> {} interval_intersection( interval(c(0, 1)), interval(c(0.5, 2)) ) #> (0.5, 1) interval_intersection( interval(c(0, Inf)), interval(c(-Inf, 0)) ) #> {} interval_intersection( interval(c(0, Inf), include_lowest = TRUE), interval(c(-Inf, 0), include_highest = TRUE) ) #> {0} interval_intersection( interval(c(0, 5)), interval(c(1, 6), closed = TRUE) ) #> [1, 5) # The empty intersection is (-Inf, Inf) interval_intersection() #> (-Inf, Inf)"},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":null,"dir":"Reference","previous_headings":"","what":"Intervals — interval","title":"Intervals — interval","text":"Intervals","code":""},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Intervals — interval","text":"","code":"interval( range = c(-Inf, Inf), ..., include_lowest = closed, include_highest = closed, closed = FALSE, integer = FALSE, read_only = FALSE ) is.Interval(x)"},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Intervals — interval","text":"range interval boundaries sorted two-element numeric vector. ... First argument used endpoint range length 1. Additional arguments, range length 2, cause warning ignored. include_lowest lower boundary part interval? include_highest upper boundary part interval? closed interval closed? integer interval integers? read_only Make interval object read-? x object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Intervals — interval","text":"interval returns Interval. .Interval returns TRUE x Interval, FALSE otherwise.","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/interval.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Intervals — interval","text":"","code":"# The real line interval() #> (-Inf, Inf) # Closed unit interval interval(c(0, 1), closed = TRUE) #> [0, 1] # Alternative form interval(0, 1, closed = TRUE) #> [0, 1] # Non-negative real line interval(c(0, Inf), include_lowest = TRUE) #> [0, Inf)"},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":null,"dir":"Reference","previous_headings":"","what":"Test if object is a Distribution — is.Distribution","title":"Test if object is a Distribution — is.Distribution","text":"Test object Distribution","code":""},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Test if object is a Distribution — is.Distribution","text":"","code":"is.Distribution(object)"},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Test if object is a Distribution — is.Distribution","text":"object R object.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Test if object is a Distribution — is.Distribution","text":"TRUE object Distribution, FALSE otherwise.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/is.Distribution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Test if object is a Distribution — is.Distribution","text":"","code":"is.Distribution(dist_dirac()) #> [1] TRUE"},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Cast to a TensorFlow matrix — k_matrix","title":"Cast to a TensorFlow matrix — k_matrix","text":"Cast TensorFlow matrix","code":""},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Cast to a TensorFlow matrix — k_matrix","text":"","code":"k_matrix(x, dtype = NULL)"},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Cast to a TensorFlow matrix — k_matrix","text":"x Numeric object converted matrix Tensor. dtype Type elements resulting tensor. Defaults keras3::config_floatx().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Cast to a TensorFlow matrix — k_matrix","text":"two-dimensional tf.Tensor values x. shape (nrow(x), ncol(x)) x first converted R matrix via .matrix().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/k_matrix.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Cast to a TensorFlow matrix — k_matrix","text":"","code":"if (interactive()) { k_matrix(diag(1:3)) k_matrix(diag(1:3), dtype = \"int32\") # Vectors are converted to columns: k_matrix(1:3) }"},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot several distributions — plot_distributions","title":"Plot several distributions — plot_distributions","text":"Plot several distributions","code":""},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot several distributions — plot_distributions","text":"","code":"plot_distributions( ..., distributions = list(), .x, plots = c(\"density\", \"probability\", \"hazard\"), with_params = list(), as_list = FALSE )"},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot several distributions — plot_distributions","text":"... distribution objects (must named) distributions Named list distribution objects. concatenated .... .x Numeric vector points evaluate . plots Plots created. May abbreviated. plots stacked order given top bottom. with_params list distribution parameters given distribution using with_params. named, names matched distribution names. Otherwise, allocated positionally, index 1 corresponding first element distributions, elements distributions followed arguments ... order. as_list return list ggplots instead patchwork?","code":""},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot several distributions — plot_distributions","text":"stacked patchwork requested ggplots","code":""},{"path":"https://ashesitr.github.io/reservr/reference/plot_distributions.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Plot several distributions — plot_distributions","text":"","code":"rate <- 1 x <- rexp(20, rate) d_emp <- dist_empirical(x, positive = TRUE) d_exp <- dist_exponential() plot_distributions( empirical = d_emp, theoretical = d_exp, estimated = d_exp, with_params = list( theoretical = list(rate = rate), estimated = list(rate = 1 / mean(x)) ), .x = seq(1e-4, 5, length.out = 100) )"},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":null,"dir":"Reference","previous_headings":"","what":"Predict individual distribution parameters — predict.reservr_keras_model","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"Predict individual distribution parameters","code":""},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"","code":"# S3 method for reservr_keras_model predict(object, data, as_matrix = FALSE, ...)"},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"object compiled trained reservr_keras_model. data Input data compatible model. as_matrix Return parameter matrix instead list structure? ... ignored","code":""},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"parameter list suitable with_params argument distribution family used model. Contains one set parameters per row data.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/predict.reservr_keras_model.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Predict individual distribution parameters — predict.reservr_keras_model","text":"","code":"if (interactive()) { dist <- dist_exponential() params <- list(rate = 1.0) N <- 100L rand_input <- runif(N) x <- dist$sample(N, with_params = params) tf_in <- keras3::layer_input(1L) mod <- tf_compile_model( inputs = list(tf_in), intermediate_output = tf_in, dist = dist, optimizer = keras3::optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_fit <- fit( object = mod, x = k_matrix(rand_input), y = x, epochs = 10L, callbacks = list( callback_debug_dist_gradients(mod, k_matrix(rand_input), x) ) ) tf_preds <- predict(mod, data = k_matrix(rand_input)) }"},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":null,"dir":"Reference","previous_headings":"","what":"Determine probability of reporting under a Poisson arrival Process — prob_report","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"Determines probability claims occuring Poisson process arrival intensity expo reporting delay distribution dist time t_min t_max reported tau_min tau_max.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"","code":"prob_report( dist, intervals, expo = NULL, with_params = list(), .tolerance = .Machine$double.eps^0.5, .max_iter = 100L, .try_compile = TRUE )"},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"dist reporting delay Distribution, compiled interval probability function. intervals data frame columns xmin, xmax, tmin, tmax. Claims occur within [xmin, xmax] reported within [tmin, tmax]. expo Poisson intensity. given, must vectorised function yields intensity claim arrival process specified time. expo = NULL equivalent constant intensity function. expo relevant multiplicative constant. with_params Parameters dist use. Can parameter set different values interval. dist compiled interval probability function, with_params can matrix instead. .tolerance Absolute element-wise tolerance. .max_iter Maximum number iterations. number integration intervals length(lower) * .max_iter. Therefor maximum number function evaluations per integration interval 15 * .max_iter. .try_compile Try compiling distributions probability function speed integration?","code":""},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"vector reporting probabilities, one entry per row intervals.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"reporting probability given P(x + d [tmin, tmax] | x [xmin, xmax]) = E(P(x + d [tmin, tmax] | x) | x [xmin, xmax]) / P(x [xmin, xmax]) = int_[xmin, xmax] expo(x) P(x + d [tmin, tmax]) dx = int_[xmin, xmax] expo(x) P(d [tmin - x, tmax - x]) dx / int_[xmin, xmax] expo(x) dx prob_report uses integrate_gk() compute two integrals.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/prob_report.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Determine probability of reporting under a Poisson arrival Process — prob_report","text":"","code":"dist <- dist_exponential() ints <- data.frame( xmin = 0, xmax = 1, tmin = seq_len(10) - 1.0, tmax = seq_len(10) ) params <- list(rate = rep(c(1, 0.5), each = 5)) prob_report(dist, ints, with_params = params) #> [1] 0.367879441 0.399576401 0.146995943 0.054076785 0.019893738 0.041904709 #> [7] 0.025416491 0.015415881 0.009350204 0.005671186"},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":null,"dir":"Reference","previous_headings":"","what":"Quantiles of Distributions — quantile.Distribution","title":"Quantiles of Distributions — quantile.Distribution","text":"Produces quantiles corresponding given probabilities configurable distribution parameters.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Quantiles of Distributions — quantile.Distribution","text":"","code":"# S3 method for Distribution quantile(x, probs = seq(0, 1, 0.25), with_params = list(), ..., .start = 0)"},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Quantiles of Distributions — quantile.Distribution","text":"x Distribution. probs Quantiles compute. with_params Optional list distribution parameters. Note x$has_capability(\"quantile\") false, with_params assumed contain one set parameters. ... ignored .start Starting value quantiles computed numerically. Must within support x.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Quantiles of Distributions — quantile.Distribution","text":"quantiles x corresponding probs parameters with_params.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Quantiles of Distributions — quantile.Distribution","text":"x$has_capability(\"quantile\") true, returns x$quantile(probs, with_params = with_params). case, with_params may contain separate sets parameters quantile determined. Otherwise, numerical estimation quantiles done using density probability function. method assumes with_params cantain one set parameters. strategy uses two steps: Find smallest largest quantiles probs using newton method starting .start. Find remaining quantiles bisection using stats::uniroot().","code":""},{"path":"https://ashesitr.github.io/reservr/reference/quantile.Distribution.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Quantiles of Distributions — quantile.Distribution","text":"","code":"# With quantiles available dist <- dist_normal(sd = 1) qqs <- quantile(dist, probs = rep(0.5, 3), with_params = list(mean = 1:3)) stopifnot(all.equal(qqs, 1:3)) # Without quantiles available dist <- dist_erlangmix(shapes = list(1, 2, 3), scale = 1.0) my_probs <- c(0, 0.01, 0.25, 0.5, 0.75, 1) qqs <- quantile( dist, probs = my_probs, with_params = list(probs = list(0.5, 0.3, 0.2)), .start = 2 ) all.equal(dist$probability(qqs, with_params = list(probs = list(0.5, 0.3, 0.2))), my_probs) #> [1] \"Mean relative difference: 2.890015e-06\" # Careful: Numerical estimation of extreme quantiles can result in out-of-bounds values. # The correct 0-quantile would be 0 in this case, but it was estimated < 0. qqs[1L] #> [1] -1.138089"},{"path":"https://ashesitr.github.io/reservr/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. generics fit","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":null,"dir":"Reference","previous_headings":"","what":"Soft-Max function — softmax","title":"Soft-Max function — softmax","text":"Softmax vector x defined ","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Soft-Max function — softmax","text":"","code":"softmax(x) dsoftmax(x)"},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Soft-Max function — softmax","text":"x numeric vector matrix","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Soft-Max function — softmax","text":"softmax returns softmax x; rowwise x matrix. dsoftmax returns Jacobi-matrix softmax(x) x. x must vector.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Soft-Max function — softmax","text":"\\(s_i = \\exp(x_i) / \\sum_k \\exp(x_k)\\) satisfies sum(s) == 1.0 can used smoothly enforce sum constraint.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/softmax.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Soft-Max function — softmax","text":"","code":"softmax(c(5, 5)) #> [1] 0.5 0.5 softmax(diag(nrow = 5, ncol = 6)) #> [,1] [,2] [,3] [,4] [,5] [,6] #> [1,] 0.3521874 0.1295625 0.1295625 0.1295625 0.1295625 0.1295625 #> [2,] 0.1295625 0.3521874 0.1295625 0.1295625 0.1295625 0.1295625 #> [3,] 0.1295625 0.1295625 0.3521874 0.1295625 0.1295625 0.1295625 #> [4,] 0.1295625 0.1295625 0.1295625 0.3521874 0.1295625 0.1295625 #> [5,] 0.1295625 0.1295625 0.1295625 0.1295625 0.3521874 0.1295625"},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":null,"dir":"Reference","previous_headings":"","what":"Compile a Keras model for truncated data under dist — tf_compile_model","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"Compile Keras model truncated data dist","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"","code":"tf_compile_model( inputs, intermediate_output, dist, optimizer, censoring = TRUE, truncation = TRUE, metrics = NULL, weighted_metrics = NULL )"},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"inputs List keras input layers intermediate_output Intermediate model layer used input distribution parameters dist Distribution use compiling loss parameter outputs optimizer String (name optimizer) optimizer instance. See optimizer_* family. censoring flag, whether compiled model support censored observations. Set FALSE higher efficiency. fit(...) error resulting model used fit censored observations. truncation flag, whether compiled model support truncated observations. Set FALSE higher efficiency. fit(...) warn resuting model used fit truncated observations. metrics List metrics evaluated model training testing. can : string (name built-function), function, optionally \"name\" attribute Metric() instance. See metric_* family functions. Typically use metrics = c('accuracy'). function callable signature result = fn(y_true, y_pred). specify different metrics different outputs multi-output model, also pass named list, metrics = list(= 'accuracy', b = c('accuracy', 'mse')). can also pass list specify metric list metrics output, metrics = list(c('accuracy'), c('accuracy', 'mse')) metrics = list('accuracy', c('accuracy', 'mse')). pass strings 'accuracy' 'acc', convert one metric_binary_accuracy(), metric_categorical_accuracy(), metric_sparse_categorical_accuracy() based shapes targets model output. similar conversion done strings \"crossentropy\" \"ce\" well. metrics passed evaluated without sample weighting; like sample weighting apply, can specify metrics via weighted_metrics argument instead. providing anonymous R function, can customize printed name training assigning attr(, \"name\") <- \"my_custom_metric_name\", calling custom_metric(\"my_custom_metric_name\", ) weighted_metrics List metrics evaluated weighted sample_weight class_weight training testing.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"reservr_keras_model can used train truncated censored observations dist based input data inputs.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_compile_model.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compile a Keras model for truncated data under dist — tf_compile_model","text":"","code":"dist <- dist_exponential() params <- list(rate = 1.0) N <- 100L rand_input <- runif(N) x <- dist$sample(N, with_params = params) if (interactive()) { tf_in <- keras3::layer_input(1L) mod <- tf_compile_model( inputs = list(tf_in), intermediate_output = tf_in, dist = dist, optimizer = keras3::optimizer_adam(), censoring = FALSE, truncation = FALSE ) }"},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":null,"dir":"Reference","previous_headings":"","what":"Initialise model weights to a global parameter fit — tf_initialise_model","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"Initialises compiled reservr_keras_model weights predictions equal , close , distribution parameters given params.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"","code":"tf_initialise_model( model, params, mode = c(\"scale\", \"perturb\", \"zero\", \"none\") )"},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"model reservr_compiled_model obtained tf_compile_model(). params list distribution parameters compatible model. mode initialisation mode scale Initialise biases according params kernels uniform [-0.1, 0.1] * bias scale. perturb Initialise biases according params leave kernels . zero Initialise biases according params set kernel zero. none modify weights.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"Invisibly model changed weights","code":""},{"path":"https://ashesitr.github.io/reservr/reference/tf_initialise_model.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Initialise model weights to a global parameter fit — tf_initialise_model","text":"","code":"dist <- dist_exponential() group <- sample(c(0, 1), size = 100, replace = TRUE) x <- dist$sample(100, with_params = list(rate = group + 1)) global_fit <- fit(dist, x) if (interactive()) { library(keras3) l_in <- layer_input(shape = 1L) mod <- tf_compile_model( inputs = list(l_in), intermediate_output = l_in, dist = dist, optimizer = optimizer_adam(), censoring = FALSE, truncation = FALSE ) tf_initialise_model(mod, global_fit$params) fit_history <- fit( mod, x = group, y = x, epochs = 200L ) predicted_means <- predict(mod, data = as_tensor(c(0, 1), config_floatx())) }"},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":null,"dir":"Reference","previous_headings":"","what":"Define a set of truncated observations — trunc_obs","title":"Define a set of truncated observations — trunc_obs","text":"x missing, xmin xmax must specified.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Define a set of truncated observations — trunc_obs","text":"","code":"trunc_obs(x, xmin = x, xmax = x, tmin = -Inf, tmax = Inf, w = 1) as_trunc_obs(.data) truncate_obs(.data, tmin_new = -Inf, tmax_new = Inf, .partial = FALSE) repdel_obs(.data, accident, delay, time, .truncate = FALSE)"},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Define a set of truncated observations — trunc_obs","text":"x Observations xmin, xmax Censoring bounds. xmin != xmax, x must NA. tmin, tmax Truncation bounds. May vary per observation. w Case weights .data data frame numeric vector. tmin_new New truncation minimum tmax_new New truncation maximum .partial Enable partial truncation censored observations? potentially create inconsistent data actual observation lies outside truncation bounds censoring interval overlaps. accident accident time (unquoted, evaluated .data) delay reporting delay (unquoted, evaluated .data) time evaluation time (unquoted, evaluated .data) .truncate claims reported time silently discarded? claims reported time .truncate FALSE, error raised.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Define a set of truncated observations — trunc_obs","text":"trunc_obs: trunc_obs tibble columns x, xmin, xmax, tmin tmax describing possibly interval-censored observations truncation as_trunc_obs returns trunc_obs tibble. truncate_obs returns trunc_obs tibble possibly fewer observations .data updated truncation bounds. repdel_obs returns trunc_obs tibble corresponding reporting delay observations claim. .truncate FALSE, result guaranteed number rows .data.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Define a set of truncated observations — trunc_obs","text":"Uncensored observations must satisfy tmin <= xmin = x = xmax <= tmax. Censored observations must satisfy tmin <= xmin < xmax <= tmax x = NA.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/trunc_obs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Define a set of truncated observations — trunc_obs","text":"","code":"N <- 100 x <- rexp(N, 0.5) # Random, observation dependent truncation intervals tmin <- runif(N, 0, 1) tmax <- tmin + runif(N, 1, 2) oob <- x < tmin | x > tmax x <- x[!oob] tmin <- tmin[!oob] tmax <- tmax[!oob] # Number of observations after truncation N <- length(x) # Randomly interval censor 30% of observations cens <- rbinom(N, 1, 0.3) == 1L xmin <- x xmax <- x xmin[cens] <- pmax(tmin[cens], floor(x[cens])) xmax[cens] <- pmin(tmax[cens], ceiling(x[cens])) x[cens] <- NA trunc_obs(x, xmin, xmax, tmin, tmax) #> # A tibble: 44 × 6 #> x xmin xmax tmin tmax w #> #> 1 NA 0.832 1 0.832 2.08 1 #> 2 NA 1 2 0.464 2.24 1 #> 3 1.46 1.46 1.46 0.450 2.36 1 #> 4 0.665 0.665 0.665 0.487 1.80 1 #> 5 0.979 0.979 0.979 0.0436 1.11 1 #> 6 1.03 1.03 1.03 0.560 2.19 1 #> 7 0.657 0.657 0.657 0.185 1.98 1 #> 8 NA 1 2 0.612 2.36 1 #> 9 0.526 0.526 0.526 0.240 2.03 1 #> 10 1.60 1.60 1.60 0.668 2.38 1 #> # ℹ 34 more rows as_trunc_obs(c(1, 2, 3)) #> # A tibble: 3 × 6 #> x xmin xmax tmin tmax w #> #> 1 1 1 1 -Inf Inf 1 #> 2 2 2 2 -Inf Inf 1 #> 3 3 3 3 -Inf Inf 1 as_trunc_obs(data.frame(x = 1:3, tmin = 0, tmax = 10)) #> # A tibble: 3 × 6 #> x xmin xmax tmin tmax w #> #> 1 1 1 1 0 10 1 #> 2 2 2 2 0 10 1 #> 3 3 3 3 0 10 1 as_trunc_obs(data.frame(x = c(1, NA), xmin = c(1, 2), xmax = c(1, 3))) #> # A tibble: 2 × 6 #> x xmin xmax tmin tmax w #> #> 1 1 1 1 -Inf Inf 1 #> 2 NA 2 3 -Inf Inf 1 truncate_obs(1:10, tmin_new = 2.0, tmax_new = 8.0) #> # A tibble: 7 × 6 #> x xmin xmax tmin tmax w #> #> 1 2 2 2 2 8 1 #> 2 3 3 3 2 8 1 #> 3 4 4 4 2 8 1 #> 4 5 5 5 2 8 1 #> 5 6 6 6 2 8 1 #> 6 7 7 7 2 8 1 #> 7 8 8 8 2 8 1"},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":null,"dir":"Reference","previous_headings":"","what":"Truncate claims data subject to reporting delay — truncate_claims","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"Truncate claims data subject reporting delay","code":""},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"","code":"truncate_claims(data, accident, delay, time, .report_col = \"report\")"},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"data Full claims data including IBNR accident Accident times. May unquoted column name data. delay Reporting delays. May unquoted column name data. time Observation time (scalar number one per claim). Claims accident + delay > time truncated. Set time = Inf compute reporting times perform truncation. .report_col NULL column name store reporting time report = accident + delay.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"Truncated data. reporting time stored colnumn named .report_col unless .report_col NULL. .report_col NULL time contains Infs, warning issued since data returned unchanged work done.","code":""},{"path":"https://ashesitr.github.io/reservr/reference/truncate_claims.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Truncate claims data subject to reporting delay — truncate_claims","text":"","code":"claims_full <- data.frame( acc = runif(100), repdel = rexp(100) ) tau <- 2.0 truncate_claims(claims_full, acc, repdel, tau) #> acc repdel report #> 1 1.341272e-01 0.028235584 0.16236281 #> 2 7.952195e-02 0.008358716 0.08788066 #> 3 3.443970e-02 0.140290387 0.17473009 #> 4 7.098971e-01 1.152279972 1.86217711 #> 5 2.960615e-01 1.574453000 1.87051447 #> 6 7.289446e-01 0.088894959 0.81783959 #> 7 1.101838e-01 1.216726908 1.32691067 #> 8 5.654015e-01 1.387287179 1.95268864 #> 9 7.189693e-01 0.069208830 0.78817813 #> 10 8.909014e-01 0.152164621 1.04306601 #> 11 4.515028e-01 0.206191922 0.65769476 #> 13 1.224872e-01 0.514714528 0.63720168 #> 14 1.555099e-05 0.319640385 0.31965594 #> 15 6.111351e-01 0.932906239 1.54404130 #> 17 3.713955e-02 0.471633688 0.50877323 #> 18 7.302117e-01 0.470371407 1.20058307 #> 19 4.125354e-01 0.825975930 1.23851137 #> 21 5.602826e-01 0.078439292 0.63872193 #> 23 5.899033e-01 0.356895571 0.94679888 #> 24 5.889085e-01 0.886226820 1.47513534 #> 25 1.670153e-01 0.177537690 0.34455295 #> 26 6.828304e-01 0.163108702 0.84593913 #> 27 3.082466e-01 0.319356196 0.62760279 #> 28 7.793431e-01 0.952858891 1.73220199 #> 29 3.284492e-01 1.587426414 1.91587561 #> 30 4.171246e-02 1.250061904 1.29177437 #> 31 1.383127e-01 1.177008377 1.31532110 #> 32 2.560620e-01 0.055133459 0.31119549 #> 33 4.429471e-01 0.267354952 0.71030207 #> 34 2.050347e-01 0.464885217 0.66991992 #> 35 7.792969e-01 0.157671728 0.93696860 #> 37 7.766178e-01 1.075450784 1.85206859 #> 39 1.776113e-01 1.112906751 1.29051807 #> 42 5.313195e-01 0.137196474 0.66851598 #> 43 4.677886e-01 0.664616256 1.13240482 #> 44 1.206373e-01 0.297930363 0.41856766 #> 45 6.348620e-01 1.141797280 1.77665926 #> 46 8.912517e-01 0.680814184 1.57206585 #> 47 8.781296e-01 0.540906635 1.41903623 #> 48 2.148099e-02 0.518280302 0.53976129 #> 50 5.886034e-01 0.705613201 1.29421661 #> 51 1.850858e-01 0.508072750 0.69315858 #> 52 5.010168e-01 0.352654210 0.85367102 #> 54 9.485277e-01 0.332760828 1.28128852 #> 55 1.860526e-01 0.110473518 0.29652609 #> 56 9.358294e-01 0.568551742 1.50438114 #> 57 7.175151e-01 0.091612742 0.80912781 #> 58 3.182253e-01 0.436845455 0.75507071 #> 59 5.823165e-01 0.114667189 0.69698367 #> 61 6.969247e-01 0.476378988 1.17330367 #> 62 7.630700e-01 0.010118335 0.77318837 #> 63 1.971220e-01 1.478337746 1.67545979 #> 64 1.982628e-01 1.151255731 1.34951853 #> 65 3.902595e-01 1.343615915 1.73387538 #> 66 6.074760e-01 0.774707003 1.38218298 #> 67 5.993708e-01 0.646028800 1.24539964 #> 68 7.847457e-01 0.986775468 1.77152118 #> 69 5.605707e-01 0.550733615 1.11130433 #> 70 4.787836e-01 0.947700852 1.42648449 #> 71 9.189584e-01 0.396267166 1.31522557 #> 72 1.237870e-02 0.390503512 0.40288222 #> 74 5.759545e-01 0.819434726 1.39538924 #> 75 3.667410e-01 0.043780853 0.41052181 #> 76 1.393693e-01 0.232285622 0.37165496 #> 78 8.949839e-01 0.206483914 1.10146782 #> 79 2.749953e-01 0.453207363 0.72820271 #> 80 2.195253e-01 0.777957749 0.99748306 #> 81 7.483612e-02 0.264012017 0.33884814 #> 82 2.389014e-01 0.022741144 0.26164256 #> 84 2.821164e-01 0.205027999 0.48714435 #> 86 2.685969e-01 0.517190858 0.78578778 #> 87 3.688022e-01 0.114156616 0.48295881 #> 90 1.491891e-01 1.768341100 1.91753016 #> 91 2.765223e-01 0.306067371 0.58258966 #> 92 7.019701e-01 0.056862872 0.75883296 #> 94 6.576286e-01 1.223552487 1.88118109 #> 95 4.837228e-01 0.368050174 0.85177300 #> 97 6.680541e-01 0.381928012 1.04998212 #> 98 1.240903e-01 0.434685851 0.55877612 #> 99 4.515315e-01 0.622061988 1.07359347 #> 100 3.454657e-01 0.470663017 0.81612874"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute weighted moments — weighted_moments","title":"Compute weighted moments — weighted_moments","text":"Compute weighted moments","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute weighted moments — weighted_moments","text":"","code":"weighted_moments(x, w, n = 2L, center = TRUE)"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute weighted moments — weighted_moments","text":"x Observations w Case weights (optional) n Number moments calculate center Calculate centralized moments (default) noncentralized moments, .e. E((X - E(X))^k) E(X^k).","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute weighted moments — weighted_moments","text":"vector length n kth entry kth weighted moment x weights w. center TRUE moments centralized, .e. E((X - E(X))^k). first moment never centralized. moments scaled 1 / sum(w), de-biased. e.g. second central weighted moment weighted_moment(x, w)[2L] equal var(rep(x, w)) * (sum(w) - 1) / sum(w) integer w","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/weighted_moments.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute weighted moments — weighted_moments","text":"","code":"weighted_moments(rexp(100)) #> [1] 0.9877458 1.2957378 weighted_moments(c(1, 2, 3), c(1, 2, 3)) #> [1] 2.3333333 0.5555556 c(mean(rep(1:3, 1:3)), var(rep(1:3, 1:3)) * 5 / 6) #> [1] 2.3333333 0.5555556"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute weighted quantiles — weighted_quantile","title":"Compute weighted quantiles — weighted_quantile","text":"Compute weighted quantiles","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute weighted quantiles — weighted_quantile","text":"","code":"weighted_quantile(x, w, probs) weighted_median(x, w)"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute weighted quantiles — weighted_quantile","text":"x Observations w Case weights (optional) probs Quantiles calculate","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute weighted quantiles — weighted_quantile","text":"vector length probs corresponding weighted quantiles x weight w. integer weights, equivalent quantile(rep(x, w), probs) weighted median x weights w. integer weights, equivalent median(rep(x, w))","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/weighted_quantile.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute weighted quantiles — weighted_quantile","text":"","code":"weighted_median(1:6) #> [1] 3.5 weighted_median(1:3, c(1, 4, 9)) #> [1] 3 weighted_median(1:3, c(9, 4, 1)) #> [1] 1 weighted_quantile(1:3, c(1, 4, 9), seq(0.0, 1.0, by = 0.25)) #> [1] 1 2 3 3 3 quantile(rep(1:3, c(1, 4, 9)), seq(0.0, 1.0, by = 0.25)) #> 0% 25% 50% 75% 100% #> 1 2 3 3 3"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":null,"dir":"Reference","previous_headings":"","what":"Compute weighted tabulations — weighted_tabulate","title":"Compute weighted tabulations — weighted_tabulate","text":"Computes sum w grouped bin. w missing result equivalent tabulate(bin, nbins)","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compute weighted tabulations — weighted_tabulate","text":"","code":"weighted_tabulate(bin, w, nbins = max(1L, bin, na.rm = TRUE))"},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compute weighted tabulations — weighted_tabulate","text":"bin integer vector values 1L nbins w Weights per entry bin. nbins Number bins","code":""},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compute weighted tabulations — weighted_tabulate","text":"vector length nbins ith result equal sum(w[bin == ]) sum(bin == ) w missing. integer weights, equivalent tabulate(rep(bin, w), nbins).","code":""},{"path":[]},{"path":"https://ashesitr.github.io/reservr/reference/weighted_tabulate.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compute weighted tabulations — weighted_tabulate","text":"","code":"weighted_tabulate(c(1, 1, 2)) #> [1] 2 1 weighted_tabulate(c(1, 1, 2), nbins = 3L) #> [1] 2 1 0 weighted_tabulate(c(1, 1, 2), w = c(0.5, 0.5, 1), nbins = 3L) #> [1] 1 1 0"},{"path":"https://ashesitr.github.io/reservr/news/index.html","id":"reservr-003","dir":"Changelog","previous_headings":"","what":"reservr 0.0.3","title":"reservr 0.0.3","text":"Fixed segfaults r-devel caused zero-length input C++ routines. Migrated keras3 keras support.","code":""},{"path":"https://ashesitr.github.io/reservr/news/index.html","id":"reservr-002","dir":"Changelog","previous_headings":"","what":"reservr 0.0.2","title":"reservr 0.0.2","text":"CRAN release: 2023-10-18 Fixed tensorflow log-density implementation dist_erlangmix() dist_exponential() work censored data. Multiple bug fixes related tensorflow training integration, input tensor shapes can unknown. Improved testing tensorflow integration.","code":""},{"path":"https://ashesitr.github.io/reservr/news/index.html","id":"reservr-001","dir":"Changelog","previous_headings":"","what":"reservr 0.0.1","title":"reservr 0.0.1","text":"CRAN release: 2022-12-09 Initial CRAN release","code":""}]