wip(growth): calculate key metrics for growth
Some checks failed
continuous-integration/drone/pr Build is failing
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:
40
lib/growth/calc/age.ex
Normal file
40
lib/growth/calc/age.ex
Normal 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
|
Reference in New Issue
Block a user