knitr::opts_chunk$set(echo = TRUE)
require(ggplot2)
require(bw)
knitr::opts_chunk$set(fig.width = 6, fig.height = 4)

Hall's model is a biomathematical model to predict changes in body weight. There are two models, one for adults [@T7, @T8, @T9, @T10] and one for children [@hall2013dynamics, @katan2016impact]. In this vignette we discuss the main advantages of both models over pre-existing ones.

Advantages of weight model

\noindent

The main advantage of the model is that weight change is nonlinear and is based on the corresponding physiological processes. Therefore, it does not follow rules such as 0.45 kg for every 3500 kcals [@hall2008required]. These rules do not represent the physiological process correctly and may lead to a series of problems, such as:

Weight change is not immediate

Take for example that weight change is modelled by a loss of 0.45 kg for every 3500 kcals [@hall2008required] and a certain individual reduces its total energy intake by 7000 kcal. Under this model, weight change is immediate and it can be represented by the following graph:

data1 <- data.frame(Day = c(-5:0,0:5), Weight = c(rep(80, 6), rep(NA, 6)))
data2 <- data.frame(Day = c(-5:0,0:5), Weight = c(rep(NA, 6), rep(78, 6)))

ggplot(data1, aes(x = Day, y = Weight)) + 
  geom_line(color = "deepskyblue3") + 
  geom_line(data = data2, color = "tomato3") +
  annotate("text", x = -2, y = 80.2, label = "Before reducing caloric intake") +
  annotate("text", x = 2, y = 78.2, label = "After 500 kcal reduction") +
  theme_classic()  + 
  ggtitle("Immediate change in body weight  according to\n a loss of 0.45 kg for every 3500 kcals")

As we empirically know, weight change is not immediate; thus the blue and red lines should be connected: mass cannot simply disappear like this!

Weight change is dependent on age, sex, and initial body mass index (BMI).

Under the same change in caloric intake, a young woman with obesity weighing $100$ kg will have a different change in body weight than an underweight grown man weighing $40$ kg. Linear rules do not consider physiological differences between individuals and thus are inaccurate for evaluating individual-level weight change:

ggplot(data.frame(x = c("Man with underweight","Woman with obesity"), y = c(0.45, 0.45)), aes(x = x)) + 
  geom_bar(aes(fill = x), stat="count")  +
  theme_classic()  + ylab("Weight reduction") +
  ggtitle("Weight change in man with underweight and woman with obesity.") +
  scale_fill_manual("Individual", values = c("tomato3","deepskyblue3"))

Some linear models could lead to zero weight.

Some linear models are dependent on time. Oftentimes the previous 0.45 kg per 3500 kcals includes a timeframe such as 0.45 kg/week per 3500 kcals [@thomas2013can]. If the model is meant to predict weight in the long term some individuals might end weighing zero weight (or even negative weight!).

data1 <- data.frame(Week = 0:266, Weight = seq(60,-60, by = -0.45))

ggplot(data1, aes(x = Week, y = Weight)) + 
  theme_classic() +
  geom_hline(aes(yintercept = 0), linetype = "dashed") +
  geom_line(color = "deepskyblue3") +
  geom_point(aes(x = 134, y = 0), color = "red") +
  annotate("text", x = 35, y = 60, label = "Individual begins weight loss") +
  annotate("text", x = 140, y = 5, label = "Individual dies") +
  annotate("text", x = 230, y = -40, label = "Individual's ghost continues\n losing weight") +
  ggtitle("Weight trajectory for an individual that reduced 3500 kcal \n under the 0.45 kg/week for every 3500 kcals rule.")

Weight change is dependent on the previous weight change trajectory

Take for example a person was consuming 500 kcals more than those needed to maintain current weight (thus the individual is en route to excess weight). This individual would gain weight even if a reduction of 250 kcals on their current diet was going to take place (they would still consume 250 kcals more!). If we only consider the model given by a loss of 0.45 kg for every 3500 kcals, this individual would lose $\frac{250 \times 0.45}{3500} = 0.032\overline{142857}$, even in the case that the caloric intake to maintain weight was exceeded by 250 kcals. This makes no sense!

myadult250 <- adult_weight(80,1.8, 40, "male",  EIchange = matrix(250, ncol = 365, nrow = 1))$Body_Weight
myadult500 <- adult_weight(80,1.8, 40, "male",  EIchange = matrix(500, ncol = 365, nrow = 1))$Body_Weight

ggplot(data.frame(Day = 1:365, ad1 = as.vector(myadult250), ad2 = as.vector(myadult500)), aes(x = Day)) + 
  theme_classic() +
  geom_line(aes(y = ad1, color = "Realistic 250 kcal reduction (= 250 extra kcal)", linetype = "Realistic 250 kcal reduction (= 250 extra kcal)")) +
  geom_line(aes(y = ad2, color = "Current weight trajectory consuming 500 extra kcal", linetype = "Current weight trajectory consuming 500 extra kcal")) +
  geom_line(aes(y = c(80,rep(80 - 0.032, 364)), color = "250 kcal reduction under wrong model", linetype = "250 kcal reduction under wrong model")) +
  ggtitle("Weight trajectory for an individual that reduced 3500 kcal \n under the 0.45 kg/week for every 3500 kcals rule.") +
  scale_color_manual("Weight change", values = c("tomato3","deepskyblue3","forestgreen"))+
  scale_linetype_manual("Weight change", values = c("dashed","dotted","dashed"))

Children naturally change weight with their growth process

During their growth process children change weight in a nonlinear way stabilizing when reaching adulthood. Any linear model such as the ALPS: $\text{Weight} = 2\cdot \big(\text{Age} + 4\big)$ [@ali2012apls] is bound to make incorrect predictions of future weight and end up with obese individuals every time.

ggplot(data.frame(Age = 5:60, EI = 2*(5:60) + 8)) +
  geom_line(aes(x  = Age, y = EI), color = "deepskyblue3") +
  ylab("Energy Intake") +
  theme_classic() +
  ggtitle(paste("ALPS model for predicting children weight"))

In reality, energy intake fluctuates with time

Energy intake changes with time. This is particularly obvious in the case of children:

ei <- child_reference_EI(6, "male",FM = 2.9, FFM = 17.5, days = 3650)
ggplot(data.frame(Age = seq(6,16, by = 1/365), EI = ei)) +
  geom_line(aes(x  = Age, y = EI), color = "deepskyblue3") +
  ylab("Energy Intake") +
  theme_classic() +
  ggtitle(paste("Energy intake for a male child changes with time\n",
                "as the child grows."))

Any model needs to account for the individual's natural energy consumption changes; in the case of children, these are associated to their growth process as explained in the previous section.

The dynamic weight change model

The dynamic weight change model can be used to avoid problems as the ones stated before. This model considers weight change depends on physiological processes and individual characteristics such as weight, sex, age, and height. Weight change obtained from the dynamic is not immediate, and if no further changes in caloric intake take place, body weight will stabilize over time. Both the dynamic children and adult models have been previously validated [@T7, @T8, @T9, @T10, @hall2013dynamics, @katan2016impact]; the latter, against more than 50 different studies. Its predictive ability exceeds current models (including Comparative Risk Assesment).

An example of a weight change trajectory for an adult under the model is shown in the following graph:

trajectory <- adult_weight(80, 1.8, 43, "male", c(0, rep(-250, 3649)), days = 3650)$Body_Weight

ggplot(data.frame(Day = 1:3650, Weight = as.vector(trajectory)), 
       aes(x = Day, y = Weight)) + 
  geom_line(color = "deepskyblue3") +
  theme_classic() + 
  ggtitle(paste("Weight trajectory for a 43 year old male with",
                "height of 1.8m, initial body weight of 80kg,\n",
                "who reduced 250 kcals from his TEI"))

The weight trajectory for a child also depends on their growth:

trajectory <- child_weight(6,"male", FM = 2.9, FFM = 17.5, days = 3650)$Body_Weight

ggplot(data.frame(Day = 1:3650, Weight = as.vector(trajectory)), 
       aes(x = Day, y = Weight)) + 
  geom_line(color = "deepskyblue3") +
  theme_classic() + 
  ggtitle(paste("Weight trajectory for a 6 year old male with",
                "2.9 kg of fat mass and 17.5 kg of free fat mass"))

For more information on the model and how to run it, you can read the package vignettes:

browseVignettes("bw")

References



INSP-RH/bw-Mexican-children-population documentation built on Jan. 19, 2020, 12:58 p.m.