• Aucun résultat trouvé

Thermal stability of cannabinoids in dried cannabis: a kinetic study

N/A
N/A
Protected

Academic year: 2021

Partager "Thermal stability of cannabinoids in dried cannabis: a kinetic study"

Copied!
12
0
0

Texte intégral

(1)

NFORMATION I

SUPPLEMENTARY

Thermal stability of cannabinoids in dried cannabis: a kinetic study

Juris Meija

1

, Garnet McRae

1

, Christopher O. Miles

2

, Jeremy E. Melanson

1

1. Metrology, National Research Council Canada, 1200 Montreal Road, Ottawa ON K1A 0R6, Canada 2. Metrology, National Research Council Canada, 1411 Oxford Street, Halifax NS B3H 3Z1, Canada juris.meija@nrc-cnrc.gc.ca

The Bayesian statistical models used to fit the cannabinoid data were developed in STAN and are provided below. The resulting fitted models were turned into an interactive shiny web application, currently available from metrology.shinyapps.io/cannabis-calculator/ where users can explore the kinetic models or make new predictions. The source code of this application is also deposited on GitHub at https://github.com/meijaj/cannabis-calculator.

*** Statistical (STAN) model for CBDA-CBD *** require(rstan)

require(readxl) # Molar masses

M = list(id=c('THCA','THC','CBNA','CBN','CBDA','CBD','CBG','CBGA','CBC','CBCA','THCV','THCVA','CBDV','CBDVA'), M=c(358,314,354,310,358,314,316.5,360.5,314.5,357.5,286.4,330.4,286.4,330.4))

# Load cannabinoid data

df0=read_excel('MARI-1-All-Stability-Data.xlsx') # Data preparation

df0$value <- df0$MassFraction.g.kg

df0$value.molar <- df0$value/M$M[match(df0$analyte,M$id)] # convert to molar concentration df0$temperature <- df0$temperature.C + 273 # convert Celsius to Kelvin

df0$time <- df0$time.weeks df0 = as.data.frame(df0)

# analyte time.weeks temperature.C MassFraction.g.kg # THC 0 -80 60.2 # THC 0 -80 60.6 # THC 1 -20 59.3 # STAN model code1 <- " functions {

real[] ABode(real t, real[] y, real[] k, real[] x_r, int[] x_i) { real dydt[2];

dydt[1] = -k[1]*y[1]; // A -- k1 --> N

dydt[2] = +k[1]*y[1] -k[2]*y[2]; // A -- k1 --> N -- k2 --> X return dydt;

} }

(2)

data {

int N_313; // Number of data points for each temperature environment int N_310;

int N_305; int N_293; int N_277; int N_253;

int Npred; // Number of data points for prediction profiles real Temp[6]; // Temperature of the various environments (K) real t0; // Zero time point

real y0[2]; // Initial levels of cannabinoids real uy[2]; // Initial estimate for uncertainty

real AB_313[N_313,2]; // Matrix of measured cannabinoid levels real AB_310[N_310,2];

real AB_305[N_305,2]; real AB_293[N_293,2]; real AB_277[N_277,2]; real AB_253[N_253,2];

real times_313[N_313]; // Timepoints of the measurements (weeks) real times_310[N_310];

real times_305[N_305]; real times_293[N_293]; real times_277[N_277]; real times_253[N_253];

real times_pred[Npred]; // Timepoints for prediction profiles }

transformed data {

real x_r[0]; // pass variables to ODE solver (not utilized) int x_i[0]; // pass variables to ODE solver (not utilized) }

parameters {

real<lower=0> y0_313_i[2]; // Initial values of A and N real<lower=0> y0_310_i[2];

real<lower=0> y0_305_i[2]; real<lower=0> y0_293_i[2]; real<lower=0> y0_277_i[2]; real<lower=0> y0_253_i[2];

real<lower=0> sigma[2]; // Measurement uncertainty of A and N real<lower=0> alpha[2]; // Arrhenius plot intercepts

real<upper=0> beta[2]; // Arrhenius plot slopes real T_i[6]; // Temperature (K)

}

transformed parameters{

matrix[6,2] lnk; // Matrix of ln(k): 6 temp. environments x 2 rate constants matrix[6,2] k; // Matrix of rate constants, k

real Tinv[6]; // Inverse temperature (1/K)

real y_hat_313[N_313,2]; // Output from the ODE solver real y_hat_310[N_310,2]; // Output from the ODE solver real y_hat_305[N_305,2]; // Output from the ODE solver real y_hat_293[N_293,2]; // Output from the ODE solver real y_hat_277[N_277,2]; // Output from the ODE solver real y_hat_253[N_253,2]; // Output from the ODE solver

// Inverse temperature (1/K) for(i in 1:6) Tinv[i] = 1.0/T_i[i];

(3)

// ln(k) from Arrhenius plots

for(i in 1:6) lnk[i,1] = alpha[1] + beta[1] * Tinv[i]; for(i in 1:6) lnk[i,2] = alpha[2] + beta[2] * Tinv[i];

// Rate constants for both reactions at the various temperatures k = exp(lnk);

// Solve ODEs

y_hat_313 = integrate_ode_rk45(ABode, y0_313_i, t0, times_313, to_array_1d(k[1,]), x_r, x_i); y_hat_310 = integrate_ode_rk45(ABode, y0_310_i, t0, times_310, to_array_1d(k[2,]), x_r, x_i); y_hat_305 = integrate_ode_rk45(ABode, y0_305_i, t0, times_305, to_array_1d(k[3,]), x_r, x_i); y_hat_293 = integrate_ode_rk45(ABode, y0_293_i, t0, times_293, to_array_1d(k[4,]), x_r, x_i); y_hat_277 = integrate_ode_rk45(ABode, y0_277_i, t0, times_277, to_array_1d(k[5,]), x_r, x_i); y_hat_253 = integrate_ode_rk45(ABode, y0_253_i, t0, times_253, to_array_1d(k[6,]), x_r, x_i); }

model {

// Weakly informative priors on parameters

sigma[1] ~ cauchy(0.00, uy[1]); // Measurement uncertainty sigma[2] ~ cauchy(0.00, uy[2]); // Measurement uncertainty alpha ~ normal(30.0, 1e2); // Arrhenius intercepts beta ~ normal(-15000.0, 1e4); // Arrhenius slopes

// Initial concentrations can be slightly different between the samples for(i in 1:2) {

y0_313_i[i] ~ normal(y0[i], sigma[i]); y0_310_i[i] ~ normal(y0[i], sigma[i]); y0_305_i[i] ~ normal(y0[i], sigma[i]); y0_293_i[i] ~ normal(y0[i], sigma[i]); y0_277_i[i] ~ normal(y0[i], sigma[i]); y0_253_i[i] ~ normal(y0[i], sigma[i]); }

// Model for the variations in the temperature control for(i in 1:6) { T_i[i] ~ normal(Temp[i], 0.1); }

// Model for the measurement uncertainty of all cannabinoids for(i in 1:2){

for (t in 1:N_313) { AB_313[t,i] ~ normal(y_hat_313[t,i], sigma[i]); } for (t in 1:N_310) { AB_310[t,i] ~ normal(y_hat_310[t,i], sigma[i]); } for (t in 1:N_305) { AB_305[t,i] ~ normal(y_hat_305[t,i], sigma[i]); } for (t in 1:N_293) { AB_293[t,i] ~ normal(y_hat_293[t,i], sigma[i]); } for (t in 1:N_277) { AB_277[t,i] ~ normal(y_hat_277[t,i], sigma[i]); } for (t in 1:N_253) { AB_253[t,i] ~ normal(y_hat_253[t,i], sigma[i]); } } } generated quantities { real y_313_pred[Npred, 2]; real y_310_pred[Npred, 2]; real y_305_pred[Npred, 2]; real y_293_pred[Npred, 2]; real y_277_pred[Npred, 2]; real y_253_pred[Npred, 2];

// Predictions for the concentration changes over time

y_313_pred = integrate_ode_rk45(ABode, y0_313_i, t0, times_pred, to_array_1d(k[1,]), x_r, x_i); y_310_pred = integrate_ode_rk45(ABode, y0_310_i, t0, times_pred, to_array_1d(k[2,]), x_r, x_i); y_305_pred = integrate_ode_rk45(ABode, y0_305_i, t0, times_pred, to_array_1d(k[3,]), x_r, x_i); y_293_pred = integrate_ode_rk45(ABode, y0_293_i, t0, times_pred, to_array_1d(k[4,]), x_r, x_i);

(4)

y_277_pred = integrate_ode_rk45(ABode, y0_277_i, t0, times_pred, to_array_1d(k[5,]), x_r, x_i); y_253_pred = integrate_ode_rk45(ABode, y0_253_i, t0, times_pred, to_array_1d(k[6,]), x_r, x_i); }

"

# Aggregate data frame neutral = 'CBD' acid=paste0(neutral,'A')

df=aggregate(value.molar ~ analyte + temperature + time, data = subset(df0, analyte %in% c(neutral, acid)), FUN = mean)

a = function(temp,an) subset(df, analyte==an&(temperature==temp|time==0))[,'value.molar'][o(temp,an)] t = function(temp,an) {q=subset(df, analyte==an&(temperature==temp|time==0))[,'time']; q[order(q)]} o = function(temp,an) order(t(temp,an))

y0 = c(mean(a(313,acid)[t(313,acid)==0]), mean(a(313,neutral)[t(313,neutral)==0])) t0 = 0 - 1e-6

data <- list(t0 = t0, y0 = y0, uy = 0.05*y0,

AB_313 = cbind(a(313,acid), a(313,neutral)), AB_310 = cbind(a(310,acid), a(310,neutral)), AB_305 = cbind(a(305,acid), a(305,neutral)), AB_293 = cbind(a(293,acid), a(293,neutral)), AB_277 = cbind(a(277,acid), a(277,neutral)), AB_253 = cbind(a(253,acid), a(253,neutral)),

N_313 = length(a(313,acid)), N_310 = length(a(310,acid)), N_305 = length(a(305,acid)), N_293 = length(a(293,acid)), N_277 = length(a(277,acid)), N_253 = length(a(253,acid)), Npred=600,

Temp = c(313, 310, 305, 293, 277, 253),

times_313 = t(313,acid), times_310 = t(310,acid), times_305 = t(305,acid), times_293 = t(293,acid), times_277 = t(277,acid), times_253 = t(253,acid), times_pred = seq(0, 4*52, length.out = 600) )

initf1 <- function() {

list(alpha = c(50, 50), beta = c(-17000, -17000), sigma = 0.05*y0, T_i = data$Temp,

y0_313_i = y0, y0_310_i = y0, y0_305_i = y0, y0_293_i = y0, y0_277_i = y0, y0_253_i = y0) }

fit <- stan(model_code = code1, data = data, init=initf1,

cores = 7, chains = 7, control = list(adapt_delta = 0.99, max_treedepth = 16)) check_hmc_diagnostics(fit)

# save the STAN fit

saveRDS(fit, "fit-CBD-20Oct2020.rds")

#################################################################### ####################################################################

(5)

*** The CBN:THC ratio ***

The above plot shows the changes of the total CBN to total THC ratios in cannabis sample stored at 20 oC (white points). The black line is the best fit of the kinetic model and the surrounding gray segment represents the 95 % credible interval.

The red line is the classical ‘UN formula’ whose slope is defined as ‘1/30 year’ and whose intercept is set to match the observed CBN:THC ratio in our sample.

*** Results for all other cannabinoids ***

The following pages show the experimental data of all cannabinoids investigated in this work and the corresponding fitted kinetic models at all temperature environments.

(6)

0

2

4

6

8

10

0.5

1.5

2.5

Storage time at 40 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

0.5

1.5

2.5

Storage time at 37 °C (weeks)

Mass fr

action (mg/g)

0

2

4

6

8

10

1.0

2.0

3.0

Storage time at 32 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

1.5

2.5

Storage time at 20 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

1.0

2.0

3.0

Storage time at 4 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

1.0

2.0

3.0

Storage time at −20 °C (weeks)

Mass fr

action (mg/g)

CBCA CBC Total CBC equivalent – Kinetic model 95 % credible interval

(7)

0

2

4

6

8

10

5

15

25

Storage time at 40 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

5

15

25

Storage time at 37 °C (weeks)

Mass fr

action (mg/g)

0

2

4

6

8

10

10

20

30

Storage time at 32 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

10

20

30

Storage time at 20 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

10

20

30

Storage time at 4 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

10

20

30

Storage time at −20 °C (weeks)

Mass fr

action (mg/g)

CBDA CBD Total CBD equivalent – Kinetic model 95 % credible interval

(8)

0

2

4

6

8

10

0.05

0.15

Storage time at 40 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

0.04

0.10

0.16

Storage time at 37 °C (weeks)

Mass fr

action (mg/g)

0

2

4

6

8

10

0.04

0.10

0.16

Storage time at 32 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

0.04

0.10

0.16

Storage time at 20 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

0.04

0.10

0.16

Storage time at 4 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

0.04

0.10

0.16

Storage time at −20 °C (weeks)

Mass fr

action (mg/g)

CBDVA CBDV Total CBDV equivalent – Kinetic model 95 % credible interval

(9)

0

2

4

6

8

10

1

2

3

4

5

6

Storage time at 40 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

2

3

4

5

6

Storage time at 37 °C (weeks)

Mass fr

action (mg/g)

0

2

4

6

8

10

2

3

4

5

6

Storage time at 32 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

2

3

4

5

6

Storage time at 20 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

2

3

4

5

6

Storage time at 4 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

2

3

4

5

6

Storage time at −20 °C (weeks)

Mass fr

action (mg/g)

CBGA CBG Total CBG equivalent – Kinetic model 95 % credible interval

(10)

0

2

4

6

8

10

0

5

10

15

Storage time at 40 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

0

5

10

15

Storage time at 37 °C (weeks)

Mass fr

action (mg/g)

0

2

4

6

8

10

2

4

6

8

Storage time at 32 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

2.0

3.0

4.0

5.0

Storage time at 20 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

2.0

3.0

4.0

5.0

Storage time at 4 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

2.0

2.4

2.8

Storage time at −20 °C (weeks)

Mass fr

action (mg/g)

CBNA CBN – Kinetic model 95 % credible interval

(11)

0

2

4

6

8

10

50

100

Storage time at 40 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

50

100

Storage time at 37 °C (weeks)

Mass fr

action (mg/g)

0

2

4

6

8

10

60

100

160

Storage time at 32 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

60

100

140

180

Storage time at 20 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

60

100

160

Storage time at 4 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

60

100

140

180

Storage time at −20 °C (weeks)

Mass fr

action (mg/g)

THCA THC Total THC equivalent – Kinetic model 95 % credible interval

(12)

0

2

4

6

8

10

0.1

0.3

0.5

0.7

Storage time at 40 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

0.2

0.4

0.6

0.8

Storage time at 37 °C (weeks)

Mass fr

action (mg/g)

0

2

4

6

8

10

0.3

0.5

0.7

Storage time at 32 °C (weeks)

Mass fr

action (mg/g)

0

5

10

15

0.3

0.5

0.7

Storage time at 20 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

0.3

0.5

0.7

Storage time at 4 °C (weeks)

Mass fr

action (mg/g)

0

20

40

60

80

0.3

0.5

0.7

Storage time at −20 °C (weeks)

Mass fr

action (mg/g)

THCVA THCV Total THCV equivalent – Kinetic model 95 % credible interval

Références

Documents relatifs

Même si le Canada ne permet pas la publicité directe du cannabis, l’industrie et les cliniques sont en mesure de commercia- liser leurs produits grâce à des reportages dans

Ainsi, nous étudions dans ce mémoire de quelle façon le discours critique de Letondal, éclairé par le contexte dans lequel il s'est énoncé, oscille entre

Given the observation that some Xanthomonas strains across distinct taxa do not contain hrpG and hrpX, we speculate a stepwise evolution of pathogenicity (Figure 6), which involves

Ces professionnels se doivent d’être informés des conséquences de la consommation des drogues durant la grossesse, de pouvoir aider la maman et de lui proposer des

Microstate configuration Separately for each of the four microstate classes, the configurations of their mean to- pographies over subjects and timepoints for each drug were

Division Avec Les Chiffres Romains (A) Réponses.. Répondez à chaque question en

Byatt, contemporary British novelist, short story writer, essayist, “cultural commentator and [...] public intellectual of an Arnoldian, Eliotesque or Leavisite kind” (15), has a

sensation de bien être ébrieux, euphorie, fous rire, exaltation imaginative, altération du jugement, lassitude voire torpeur.. C hangements dans la perception sensorielle