wip(growth): calculate key metrics for growth
Some checks failed
continuous-integration/drone/pr Build is failing

1. calculate age in days, weeks, and months
2. calculate body mass index for metric and english unities
3. calculate z-score for a given measurement and box-cox parameters (l,
   m, s)
4. calculate centile score for a given measurement and box-cox
   parameters
This commit is contained in:
2024-06-06 01:33:06 +00:00
parent 8be9fa38bb
commit 500d0e89bb
4 changed files with 141 additions and 0 deletions

40
lib/growth/calc/age.ex Normal file
View File

@@ -0,0 +1,40 @@
defmodule Growth.Calc.Age do
@moduledoc """
Calculate the age in months.
"""
# NOTE: (jpd): based on [WHO instructions][0]
# [0]: https://cdn.who.int/media/docs/default-source/child-growth/child-growth-standards/indicators/instructions-en.pdf
@day_in_month 30.4375
@day_in_week 7.0
@doc """
Calculate the age with the precision of day, or week, or month. For age in weeks or months, considers completed ones, removing decimal value.
If only date of birth is available, assumes that measurement date is today.
"""
@spec calculate(:day | :week | :month, Date.t(), Date.t()) :: pos_integer()
def calculate(precision, date_of_birth) do
calculate(precision, date_of_birth, Date.utc_today())
end
def calculate(:month, date_of_birth, date_of_measurement) do
:day
|> calculate(date_of_birth, date_of_measurement)
|> Kernel./(@day_in_month)
|> floor()
end
def calculate(:week, date_of_birth, date_of_measurement) do
:day
|> calculate(date_of_birth, date_of_measurement)
|> Kernel./(@day_in_week)
|> floor()
end
def calculate(:day, date_of_birth, date_of_measurement) do
Date.diff(date_of_measurement, date_of_birth)
end
end