From ce98ba0026a1a3cc3f54ce0edf4d38b9accab3ee Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Wed, 13 Apr 2022 11:16:02 +0200 Subject: [PATCH 1/4] Added beta distribution for interpersonal distances. #254 --- cara/monte_carlo/data.py | 6 +++--- cara/monte_carlo/sampleable.py | 17 +++++++++++++++++ cara/tests/models/test_short_range_model.py | 6 +++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/cara/monte_carlo/data.py b/cara/monte_carlo/data.py index 2c6268e6..b5e15884 100644 --- a/cara/monte_carlo/data.py +++ b/cara/monte_carlo/data.py @@ -5,7 +5,7 @@ import numpy as np from scipy import special as sp import cara.monte_carlo as mc -from cara.monte_carlo.sampleable import LogNormal,LogCustomKernel,CustomKernel,Uniform +from cara.monte_carlo.sampleable import LogNormal,LogCustomKernel,CustomKernel,Uniform, Beta sqrt2pi = np.sqrt(2.*np.pi) @@ -202,5 +202,5 @@ short_range_expiration_distributions = { } -# Fit from Fig 8 a) "stand-stand" in https://www.mdpi.com/1660-4601/17/4/1445/htm -short_range_distances = LogNormal(-0.269359136417347, 0.4728300188814934) +# Derived from Fig 8 a) "stand-stand" in https://www.mdpi.com/1660-4601/17/4/1445/htm +short_range_distances = Beta(alpha=1.4342766632654418, beta=27.49916410927064) \ No newline at end of file diff --git a/cara/monte_carlo/sampleable.py b/cara/monte_carlo/sampleable.py index 27907e49..5a29de81 100644 --- a/cara/monte_carlo/sampleable.py +++ b/cara/monte_carlo/sampleable.py @@ -2,6 +2,7 @@ import typing import numpy as np from sklearn.neighbors import KernelDensity # type: ignore +from scipy.stats import beta import cara.models @@ -130,6 +131,22 @@ class LogCustomKernel(SampleableDistribution): return 10 ** kde_model.sample(n_samples=size)[:, 0] +class Beta(SampleableDistribution): + """ + Defines a Beta distribution parameterized by two positive shape parameters, + denoted by alpha (α) and beta (β), that appear as exponents of the random + variable and control the shape of the distribution. + """ + + def __init__(self, alpha: float, beta: float): + # these are resp. the alpha and beta of the underlying distribution + self.alpha = alpha + self.beta = beta + + def generate_samples(self, size: int) -> float_array_size_n: + return beta.rvs(a = self.alpha, b = self.beta, loc=0.5, scale=7, size=size) + + _VectorisedFloatOrSampleable = typing.Union[ SampleableDistribution, cara.models._VectorisedFloat, ] diff --git a/cara/tests/models/test_short_range_model.py b/cara/tests/models/test_short_range_model.py index a07a656b..4a191334 100644 --- a/cara/tests/models/test_short_range_model.py +++ b/cara/tests/models/test_short_range_model.py @@ -72,9 +72,9 @@ def test_dilution_factor(activity, expected_dilution): @pytest.mark.parametrize( "time, expected_short_range_concentration", [ [8.5, 0.], - [10.5, 15.24806213], - [10.6, 15.24806213], - [11.0, 15.24806213], + [10.5, 7.491771], + [10.6, 7.491771], + [11.0, 7.491771], [12.0, 0.], ] ) From 1d9d4930631dca547f1405b838a07b1dd34de019 Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Wed, 20 Apr 2022 12:12:47 +0200 Subject: [PATCH 2/4] Changed alpha and beta descriptors --- cara/monte_carlo/data.py | 2 +- cara/monte_carlo/sampleable.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cara/monte_carlo/data.py b/cara/monte_carlo/data.py index b5e15884..9a6753b8 100644 --- a/cara/monte_carlo/data.py +++ b/cara/monte_carlo/data.py @@ -203,4 +203,4 @@ short_range_expiration_distributions = { # Derived from Fig 8 a) "stand-stand" in https://www.mdpi.com/1660-4601/17/4/1445/htm -short_range_distances = Beta(alpha=1.4342766632654418, beta=27.49916410927064) \ No newline at end of file +short_range_distances = Beta(alpha=0.588715, beta=1.50214) \ No newline at end of file diff --git a/cara/monte_carlo/sampleable.py b/cara/monte_carlo/sampleable.py index 5a29de81..2aeaf441 100644 --- a/cara/monte_carlo/sampleable.py +++ b/cara/monte_carlo/sampleable.py @@ -144,7 +144,7 @@ class Beta(SampleableDistribution): self.beta = beta def generate_samples(self, size: int) -> float_array_size_n: - return beta.rvs(a = self.alpha, b = self.beta, loc=0.5, scale=7, size=size) + return beta.rvs(a = self.alpha, b = self.beta, loc=0.5, scale=(2 - 0.5), size=size) _VectorisedFloatOrSampleable = typing.Union[ From de5552c236753d9c8e50154e7a3c958b5f5a597a Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Thu, 21 Apr 2022 10:00:59 +0200 Subject: [PATCH 3/4] Updated test values dor beta distribution --- cara/monte_carlo/data.py | 2 +- cara/monte_carlo/sampleable.py | 6 ++++-- cara/tests/models/test_short_range_model.py | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cara/monte_carlo/data.py b/cara/monte_carlo/data.py index 9a6753b8..a725b8fa 100644 --- a/cara/monte_carlo/data.py +++ b/cara/monte_carlo/data.py @@ -203,4 +203,4 @@ short_range_expiration_distributions = { # Derived from Fig 8 a) "stand-stand" in https://www.mdpi.com/1660-4601/17/4/1445/htm -short_range_distances = Beta(alpha=0.588715, beta=1.50214) \ No newline at end of file +short_range_distances = Beta(alpha=0.588715, beta=1.50214, loc=0.5, scale=1.5) \ No newline at end of file diff --git a/cara/monte_carlo/sampleable.py b/cara/monte_carlo/sampleable.py index 2aeaf441..d9d4afc7 100644 --- a/cara/monte_carlo/sampleable.py +++ b/cara/monte_carlo/sampleable.py @@ -138,13 +138,15 @@ class Beta(SampleableDistribution): variable and control the shape of the distribution. """ - def __init__(self, alpha: float, beta: float): + def __init__(self, alpha: float, beta: float, loc: float, scale: float): # these are resp. the alpha and beta of the underlying distribution self.alpha = alpha self.beta = beta + self.loc = loc + self.scale = scale def generate_samples(self, size: int) -> float_array_size_n: - return beta.rvs(a = self.alpha, b = self.beta, loc=0.5, scale=(2 - 0.5), size=size) + return beta.rvs(a = self.alpha, b = self.beta, loc=self.loc, scale=self.scale, size=size) _VectorisedFloatOrSampleable = typing.Union[ diff --git a/cara/tests/models/test_short_range_model.py b/cara/tests/models/test_short_range_model.py index 4a191334..481860a8 100644 --- a/cara/tests/models/test_short_range_model.py +++ b/cara/tests/models/test_short_range_model.py @@ -72,9 +72,9 @@ def test_dilution_factor(activity, expected_dilution): @pytest.mark.parametrize( "time, expected_short_range_concentration", [ [8.5, 0.], - [10.5, 7.491771], - [10.6, 7.491771], - [11.0, 7.491771], + [10.5, 8.037883241318065], + [10.6, 8.037883241318065], + [11.0, 8.037883241318065], [12.0, 0.], ] ) From a7bcc3ec2cb33d183bd427aa9053b94a64d79814 Mon Sep 17 00:00:00 2001 From: Luis Aleixo Date: Mon, 2 May 2022 11:18:49 +0200 Subject: [PATCH 4/4] Removed beta distribution and added custom distribution for the interpersonal distances distribution --- cara/monte_carlo/data.py | 8 ++++++-- cara/monte_carlo/sampleable.py | 19 ------------------- cara/tests/models/test_short_range_model.py | 6 +++--- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/cara/monte_carlo/data.py b/cara/monte_carlo/data.py index a725b8fa..bf9c148c 100644 --- a/cara/monte_carlo/data.py +++ b/cara/monte_carlo/data.py @@ -5,7 +5,7 @@ import numpy as np from scipy import special as sp import cara.monte_carlo as mc -from cara.monte_carlo.sampleable import LogNormal,LogCustomKernel,CustomKernel,Uniform, Beta +from cara.monte_carlo.sampleable import LogNormal,LogCustomKernel,CustomKernel,Uniform, Custom sqrt2pi = np.sqrt(2.*np.pi) @@ -203,4 +203,8 @@ short_range_expiration_distributions = { # Derived from Fig 8 a) "stand-stand" in https://www.mdpi.com/1660-4601/17/4/1445/htm -short_range_distances = Beta(alpha=0.588715, beta=1.50214, loc=0.5, scale=1.5) \ No newline at end of file +distances = np.array((0.5,0.6,0.7,0.8,0.9,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2)) +frequencies = np.array((0.0598036,0.0946154,0.1299152,0.1064905,0.1099066,0.0998209, 0.0845298,0.0479286,0.0406084,0.039795,0.0205997,0.0152316,0.0118155,0.0118155,0.018485,0.0205997)) +short_range_distances = Custom(bounds=(0.5,2.), + function=lambda x: np.interp(x,distances,frequencies,left=0.,right=0.), + max_function=0.13) \ No newline at end of file diff --git a/cara/monte_carlo/sampleable.py b/cara/monte_carlo/sampleable.py index d9d4afc7..27907e49 100644 --- a/cara/monte_carlo/sampleable.py +++ b/cara/monte_carlo/sampleable.py @@ -2,7 +2,6 @@ import typing import numpy as np from sklearn.neighbors import KernelDensity # type: ignore -from scipy.stats import beta import cara.models @@ -131,24 +130,6 @@ class LogCustomKernel(SampleableDistribution): return 10 ** kde_model.sample(n_samples=size)[:, 0] -class Beta(SampleableDistribution): - """ - Defines a Beta distribution parameterized by two positive shape parameters, - denoted by alpha (α) and beta (β), that appear as exponents of the random - variable and control the shape of the distribution. - """ - - def __init__(self, alpha: float, beta: float, loc: float, scale: float): - # these are resp. the alpha and beta of the underlying distribution - self.alpha = alpha - self.beta = beta - self.loc = loc - self.scale = scale - - def generate_samples(self, size: int) -> float_array_size_n: - return beta.rvs(a = self.alpha, b = self.beta, loc=self.loc, scale=self.scale, size=size) - - _VectorisedFloatOrSampleable = typing.Union[ SampleableDistribution, cara.models._VectorisedFloat, ] diff --git a/cara/tests/models/test_short_range_model.py b/cara/tests/models/test_short_range_model.py index 481860a8..6f4de3d2 100644 --- a/cara/tests/models/test_short_range_model.py +++ b/cara/tests/models/test_short_range_model.py @@ -72,9 +72,9 @@ def test_dilution_factor(activity, expected_dilution): @pytest.mark.parametrize( "time, expected_short_range_concentration", [ [8.5, 0.], - [10.5, 8.037883241318065], - [10.6, 8.037883241318065], - [11.0, 8.037883241318065], + [10.5, 5.401601371244907], + [10.6, 5.401601371244907], + [11.0, 5.401601371244907], [12.0, 0.], ] )