knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
SciViews::R
La croissance des coraux peut être déterminée à partir de la masse squelettique (obtenue par conversion de la masse immergée [@Jokiel1978]).
Sipkema et al. [-@Sipkema2006] ont mis en évidence plusieurs modèles de croissace sur différentes espèces d'éponges. Ces modèles semblent être également valable pour les coraux dont le modèle linéaire ou encore le modèle exponentiel [@Osinga2011].
Le premier modèle est le modèle de croissance linéaire suivant l'équation :
$$X_t = X_0 + kt$$
avec $X_t$ étant la masse au temps t, $X_0$ la masse initial au temps 0, $k$ la constante de croissance linéaire et $t$ le temps. Si la masse des coraux est monitorée en gramme et le temps en jour, nous aurons une constante exprimé en $g/jour$. Le taux de croissance peut être obtenu via l'équation suivante :
$$k = \frac{X_t - X_0}{t - t_0}$$
Il s'agit simplement de la pente de la droite. En partant de ce modèle de croissance linéaire, il est également courant de trouver le taux de croissance standardisé par la masse initiale avec la formule suivante :
$$k = \frac{\frac{(X_t - X_0)}{X_0}}{t - t_0} \times 100$$
Le taux de croissance sera cette fois ci exprimé $\%/Jour$.
Un second modèle est le modèle de croissance exponentielle suivant l'équation suivante :
$$X_t = X_0 \times e^{bt}$$
avec $X_t$ étant la masse au temps t, $X_0$ la masse initial au temps 0, $b$ la constante de croissance exponentielle et $t$ le temps. Le taux de croissance $b$ peut être obtenu via l'équation suivante :
$$ln(X_t) = ln(X_0 \times e^{bt})\ ln(X_t) = ln(X_0) + bt \ ln(X_t) - ln(X_0) = bt\ \frac{ln(X_t) - ln(X_0)}{t}= b \ \frac{ ln( \frac{X_t}{X_0})}{t} = b$$
Le taux de croissance peut également être exprimé en $\%/Jour$ via l'équation suivante :
$$\frac{ ln( \frac{X_t}{X_0})}{t} \times 100$$
Les trois taux de croissance obtenus ne sont de ce fait pas du tout comparable.
Osinga et son équipe [-@Osinga2011] émettent l'hypothèse que les espèces branchues vont avoir un développement de type exponentiel alors que les espèce encroutante vont avoir une croissance linéaire.
Partons d'un exemple fictif pour illustrer ces deux situations, avec un organisme de 1 grammes avec un taux de croissance linéaire et exponentiel similaire de 0.1.
w_ini <- 1 coef <- 0.1 example <- tibble::tibble( temps = c(0:8, 0:8), mod = c(rep("lin", 9), rep("expo", 9)), masse = dplyr::case_when(mod == "lin" ~ w_ini + (coef*temps), mod == "expo" ~ w_ini*exp(coef*temps))) chart::chart(example, masse~temps %col=% mod) + ggplot2::geom_point() + ggplot2::geom_line() + ggplot2::labs( color = "Modèle")
Ce graphique démontre que les deux coefficients ne sont pas comparable.
Le calcul des différents taux de croissance peut être réalisé à l'aide de la fonction suivante :
growth_rate <- function(skw_t, skw_ini, date_t, date_ini = 0, method = c("exponential", "linear", "linear_std")) { method <- match.arg(method) switch(method, exponential = log(skw_t/skw_ini) / (date_t - date_ini) * 100, linear = (skw_t - skw_ini) / (date_t - date_ini), linear_std = (skw_t - skw_ini) / skw_ini / (date_t - date_ini) * 100 ) }
Cette fonction peut facilement être mis à jour avec de nouvelles formules du taux de croissance. Cette fonction se retrouve au sein du package coral.growth
library(coral.growth)
growth_rate(skw_t = 1.2, skw_ini = 1, date_t = 7, date_ini = 0, method = "exponential") growth_rate(skw_t = 1.2, skw_ini = 1, date_t = 7, date_ini = 0, method = "linear") growth_rate(skw_t = 1.2, skw_ini = 1, date_t = 7, date_ini = 0, method = "linear_std")
coral_growth
cg <- data.io::read("coral_growth", package = "coral.growth")
r length(levels(cg$id))
boutures de Seriatopora hystrix ont été monitoré durant une période de r round(max(cg$date, na.rm = TRUE), 1)
jours. La masse squelettique est obtenue via la masse immergée.
cg %>.% mutate(., skw = skeleton_weight(buoyant_weight = weight, S = salinity, T = temperature), skw_log = log(skw)) -> cg chart(cg, skw ~ date %col=% id) + geom_point() + geom_line() + labs(y = "Masse squelettique [g]", x = "Temps [J]")
id_select <- "5" date_select <- 40 cg %>.% filter(., id == id_select) -> cg_red cg_red %>.% filter(., date <= date_select) -> cg_train
Prennons l'individu r unique(cg_red$id)
afin d'étudier le croissance de cet organisme. Sa masse squelettique varie entre r round(min(cg_red$skw, na.rm = TRUE),2)
et r round(max(cg_red$skw, na.rm = TRUE),2)
. Un jeu de données d'apprentissage va être réalisée contenant 2/3 des premières observations de croissance. Les observations supplémentaires vont être employées afin de valider les modèles.
Si la croissance suit un modèle exponentiel il est possible de linéariser les observations avec la transformation mathématique logarithmique
chart(cg_train, skw ~ date) + geom_point() + geom_line() + labs(y = "Masse squelettique [g]", x = "Temps [J]") -> a chart(cg_train, skw_log ~ date) + geom_point() + geom_line() + labs(y = "Logarithme de la asse squelettique", x = "Temps [J]") -> b combine_charts(list(a,b))
lm1 <- lm(data = cg_train, skw ~ date) coef1 <- lm1$coefficients[2] lm2 <- lm(data = cg_train, skw_log ~ date) coef2 <- lm2$coefficients[2]
Le taux de croissance pour le modèle exponentielle est de r round(coef1, 2)
$g/J$ alors qu'il est de r round(coef2*100, 2)
$%/J$
dt <- tibble(date = seq(from = min(cg_red$date), to = max(cg_red$date) + 20)) dt$y <- min(cg_red$skw) + coef1*dt$date dt$y1 <- min(cg_red$skw) * exp(coef2*dt$date) chart(cg_red, skw ~ date) + geom_point() + geom_line(f_aes(y ~ date), data = dt) + geom_line(f_aes(y1 ~ date), data = dt, color = "red") + geom_vline(xintercept = date_select, linetype = "dashed", color = "blue") + geom_label(aes(x = date_select/2, y = max(cg$skw)*1.10, label = "Set d'apprentissage")) + geom_label(aes(x = date_select + date_select/2, y = max(cg$skw)*1.10, label = "Set de test")) + labs(y = "Masse squelettique [g]", x = "Temps [J]")
Il semble que la croissance pour des boutures de masses comprises entre r round(min(cg_red$skw, na.rm = TRUE),2)
et r round(max(cg_red$skw, na.rm = TRUE),2)
tend à être exponentielle et non linéaire.
La croissance exponentielle ne respecte pas parfaitement la croissance de la bouture sélectionnée (bouture : r unique(cg_red$id)
)
Le point initial servant de référence pour déterminer le taux de croissance doit il etre le point initiale des mesures ou bien la mesure précédente. Deux possibilités sont envisagées et exprimées via les deux équations ci-dessous.
$$\frac{ ln( \frac{X_t}{X_0})}{t - t_0} \times 100$$
$$\frac{ ln( \frac{X_t}{X_{t-1}})}{t - t_{t-1}} \times 100$$
cg_red %>.% mutate(., skw_ini = first(skw), skw_ini1 = lag(skw), date_ini1 = lag(date), gr = growth_rate(skw_t = skw, skw_ini = skw_ini, date_t = date,date_ini = 0, method = "exponential"), gr1 = growth_rate(skw_t = skw, skw_ini = skw_ini1, date_t = date,date_ini = date_ini1, method = "exponential")) -> cg_red
Le grapihque ci-dessous nous montre que les variations du taux de croissance via la seconde équation (ligne rouge sur le graphique) sont plus forte que sur la première équation.
chart(cg_red, gr ~ date) + geom_point() + geom_line() + geom_point( f_aes(gr1 ~ date), color = "red") + geom_line( f_aes(gr1 ~ date), color = "red") + labs(y = "Taux de croissance exponentiel [%/J]", x = "Temps [J]")
growth_rate()
La première fonction implémentée pour
dt <- data_frame(date = 1:100000000, skw = 1*exp(date*0.01))
Un jeu de données exemple est proposé pour tester la vitesse d'exécution des fonctions d'une longueur r nrow(dt)
.
growth_rate1 <- function(skw_t, skw_ini, date_t, date_ini = 0, method = "exponential") { # implemented method met <- c("exponential", "linear", "linear_std") # check method if(!any(met %in% method)) stop("the method is not implemented. see the help page") # method if (method == "exponential") { gr <- (log(skw_t/skw_ini)/(date_t - date_ini))*100 } else if (method == "linear") { gr <- (skw_t-skw_ini)/(date_t - date_ini) } else if (method == "linear_std") { gr <- (((skw_t-skw_ini)/skw_ini)/(date_t - date_ini))*100 } gr } (t1 <- system.time(growth_rate1(skw_t = dt$skw, skw_ini = 1, date_t = dt$date, date_ini = 0, method = "exponential")))
Le temps nécessaire pour réaliser l'opération avec la fonction growth_rate1 r t1["elapsed"]
$ms$.
growth_rate2 <- function(skw_t, skw_ini, date_t, date_ini = 0, method = c("exponential", "linear", "linear_std")) { method <- match.arg(method) switch(method, exponential = log(skw_t/skw_ini) / (date_t - date_ini) * 100, linear = (skw_t - skw_ini) / (date_t - date_ini), linear_std = (skw_t - skw_ini) / skw_ini / (date_t - date_ini) * 100 ) } (t2 <- system.time(growth_rate2(skw_t = dt$skw, skw_ini = 1, date_t = dt$date, date_ini = 0, method = "exponential")))
Le temps nécessaire pour réaliser l'opération avec la fonction growth_rate2 r t2["elapsed"]
$ms$.
La seconde fonction est r round((t1["elapsed"] / t2["elapsed"]), digits = 3)
fois plus rapide que la première fonction.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.