this is a more detailed description and run-through of the workflow combining Directed Acyclical Graphs (DAG) and Bayesian analysis for Ecological Momentary Assessment (EMA) data presented at the SAA 2025 in Leuven

(1) Estimand: how does mood affect craving

Teasing apart the effect of mood and stress on craving is difficult. We will try to isolate this relation better with the help of DAGs and Bayesian analysis.

(2) Derivation of DAG from previous research and theory

A stressor leads to 1) physiological reactions (including the endocrine and nervous system, especially the hypothalamic-pituitary-adrenal (HPA) axis (McEwen, 2007) cardiovascular system (Brotman et al., 2007); gastro-intestinal system (Bonaz, 2016), 2) the individual’s experience of how “stressful” they perceived this event to be (Roxburgh, 2011), and 3) constraints on the individual’s daily patterns (e.g. work stress limiting the time to eat; (Almeida et al., 2009; O’Connor et al., 2008)). The kind of stressor we are concerned with here is often referred to as daily hassles but also expands to chronic strains as opposed to significant life events (Roxburgh, 2011). Moreover, we only consider negative stress (distress), as opposed to positive (eustress) or neutral (neustress) kinds of stressors. Through the individual’s experience of the stressful event, the stressor affects their mood. In particular, the mood should shift more to the negative due to a stressful event, this may include elements like anger, frustration, fear (Van Eck et al., 1998). While this connection exists on the momentary level, it is moderated by an individual’s trait tendency to experience stressors in a certain way, such as their coping resources (Roxburgh, 2011) Naturally, negative mood is not only governed by experience of stressors, but also by other non-stressful events and internal states. We do not observe them in this study, which is why they are denoted as “unobserved (U)”. The physiological stressor-reaction also involves a temporary downregulation of hunger-sensation (Theilade et al., 2021). Mood also drives physiological activation. A more readily measurable correlate of endocrine activation may be the subjective energetic arousal, measurable with EMA tools. Crucially, mood has effects on eating-related variables: Positive and/or negative mood may increase craving (Aulbach et al., 2025). This momentary relationship is moderated by an individual’s trait tendency to crave more when experiencing certain moods or emotions (Meule et al., 2018). In addition, negative mood affects hunger sensation (Swami et al., 2022). Hunger itself – or what individuals report as hunger – is related to craving since the hunger-sensation and craving are difficult to discern but also because the bodily hunger-signals trigger learned responses to seek satisfying foods (Ombrato & Phillips, 2021; Stevenson et al., 2024).

the resulting DAG

DAG 1
DAG 1

back-door paths

what do we want to learn? The relation between mood and craving, independently of stress.
However, there are back-door paths connecting craving with mood. We need to close these. Following the arrows in the DAG, we can identify the following back-door paths:
1) Mood <- PeS -> Craving;
2) Mood <- PeS <- PhS -> Hunger -> Craving;
3) Mood <- PeS -> Stressor -> PhS -> Hunger -> Craving;
4) Mood <- PeS <- Stressor -> PhS -> PeS -> Craving.

Conditioning on PeS + Hunger closes the back-door paths. We choose this option since the subjective stress-experience, PeS, is reported by the subjects. PhS on the other hand was not measured and is therefore no option.

(3) Generating simulated data based on Structural Causal Model

Variables:

V = {Stressor, PeS, PhS, Mood, Craving, Hunger}

unobserved variables:

U = {USt, UPeS, UPhS,UM,UC, UH}

Functions:

F = {fSt,fPeS, fPhS, fM, fC, fH}

fStressor: Stressor = USt

fPhS: PhS = UPhS + b * Stressor + f * Mood

fPeS: PeS = UPeS + a * Stressor + c * PhS

fMood: Mood = UM + d * PeS fHunger: Hunger = UH + h * PhS

fCraving: Craving = UC + e * PeS + i * Hunger + g * Mood

with this generative model, we can simluate data in R

setting up R

#the libraries we need
library(extraDistr)
library(brms)
library(rstan)
library(ggplot2)
library(gridExtra)

# some STAN settings
options(mc.cores = parallel::detectCores())
rstan_options(auto_write = TRUE)

unobserved causes / exogenous variables

n_draws = 100
UStressor = rbern(n_draws,prob=0.3)
UPeS = rnorm(n_draws,mean=0,sd=1)
UPhS = rnorm(n_draws,mean=0,sd=1)
UMood = rnorm(n_draws,mean=0,sd=1)
UHunger = rnorm(n_draws,mean=0,sd=1)
UCraving = rnorm(n_draws,mean=0,sd=1)

weights / paths

sings and therefore direction of effect set here (see the DAG)

a = 2
b = 1.5
c = 2.5
d = -2
e = -1.5
f = 1
g = 1.5
h = -2
i = 3

endogenous variables

calculated based on the functions above

#fStressor: 
Stressor = UStressor
#fPeS: 
PeS = UPeS + a * Stressor # + c * PhS
#fMood: 
Mood = UMood + d * PeS
#fPhS: 
PhS = UPhS + b * Stressor + f * Mood
#PeS - adding PhS after calculating it (needed to first calculate mood)
PeS = PeS + c* PhS
#fHunger: 
Hunger = UHunger + h * PhS
#fCraving: 
Craving = UCraving + e * PeS + i * Hunger + g * Mood

checking whether the values are in an expected range

mean(Stressor)
## [1] 0.33
sd(Stressor)
## [1] 0.4725816
mean(PeS)
## [1] -2.668895
sd(PeS)
## [1] 6.372154
mean(PhS)
## [1] -1.34623
sd(PhS)
## [1] 3.093578
mean(Mood)
## [1] -1.598449
sd(Mood)
## [1] 3.220808
mean(Craving)
## [1] 9.168833
sd(Craving)
## [1] 23.79071

rescaling variables to be between 0 and 100, in line with our collected EMA data

smallest = min(c(Stressor,PeS, PhS, Hunger, Craving, Mood))
largest = max(c(Stressor,PeS, PhS, Hunger, Craving, Mood))
Stressor_r = (Stressor - smallest) / (largest - smallest) * 100
PeS_r = (PeS - smallest) / (largest - smallest) * 100
PhS_r = (PhS - smallest) / (largest - smallest) * 100
Mood_r = (Mood - smallest) / (largest - smallest) * 100
Craving_r = (Craving - smallest) / (largest - smallest) * 100
Hunger_r = (Hunger - smallest) / (largest - smallest) * 100

putting together the variables in a dataframe

DFs = data.frame(Stressor=Stressor,PeS=PeS,PhS=PhS,Mood=Mood,Craving=Craving,Hunger=Hunger,
                UStressor=UStressor, UPeS=UPeS, UPhS=UPhS, UMood=UMood, UCraving=UCraving,
                Stressor_r=Stressor_r,PeS_r=PeS_r,PhS_r=PhS_r,Mood_r=Mood_r,Craving_r=Craving_r,Hunger_r=Hunger_r,
                UStressor=UStressor, UPeS=UPeS, UPhS=UPhS, UMood=UMood, UCraving=UCraving,
                a=a,b=b,c=c,d=d,e=e,f=f,g=g,h=h,i=i)

(4) Creating statistical model and testing it on simulated data

finding sensible priors

first, plotting the simulated data, to get a feeling for the range of to-be-expected values

#simple plot:
#ggplot(DFs,aes(x=Craving_r))+geom_density()+theme_light()
#plot with quantiles:
dens <- density(DFs$Craving_r)
temp <- data.frame(x=dens$x, y=dens$y)
probs <- c(0, 0.25, 0.5, 0.75, 1)
quantiles <- quantile(DFs$Craving_r, prob=probs)
temp$quant <- factor(findInterval(temp$x,quantiles))
ggplot(temp, aes(x,y)) + geom_line() + geom_ribbon(aes(ymin=0, ymax=y, fill=quant)) +  scale_fill_brewer()+labs(title="Density of craving, with quantiles shaded in")+theme_light()

-> prior of Normal(mean = 50, SD = 25) would describe that well

formulating priors according to brms synatx

get_prior(formula=Craving_r~Mood+PeS,data=DFs)
##                     prior     class coef group resp dpar nlpar lb ub
##                    (flat)         b                                 
##                    (flat)         b Mood                            
##                    (flat)         b  PeS                            
##  student_t(3, 42.6, 22.4) Intercept                                 
##     student_t(3, 0, 22.4)     sigma                             0   
##        source
##       default
##  (vectorized)
##  (vectorized)
##       default
##       default
priors = c(prior(normal(50,25),class=Intercept),
           prior(normal(0,10),class=b),
           prior(cauchy(0,10), class = sigma))

Bayesian model

  1. for unconditioned model, just M –> C
bm1s = brm(Craving_r ~ Mood_r, prior = priors, data=DFs, iter=2000,file_refit="on_change",file = "bm1s_ESENa")
summary(bm1s,prob=0.9)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: Craving_r ~ Mood_r 
##    Data: DFs (Number of observations: 100) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Population-Level Effects: 
##           Estimate Est.Error l-90% CI u-90% CI Rhat Bulk_ESS Tail_ESS
## Intercept   265.79     12.74   245.21   287.12 1.00     3957     2907
## Mood_r       -6.47      0.37    -7.09    -5.87 1.00     3962     2990
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-90% CI u-90% CI Rhat Bulk_ESS Tail_ESS
## sigma    10.87      0.81     9.66    12.30 1.00     3650     2743
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).
  1. conditioning on PeS and Hunger, as planned by analysing the DAG
bm2s = brm(Craving_r ~ Mood_r + PeS_r + Hunger_r,  prior = priors, data=DFs, iter=2000,file_refit="on_change",file = "bm2s_ESENa")
summary(bm2s,prob=0.9)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: Craving_r ~ Mood_r + PeS_r + Hunger_r 
##    Data: DFs (Number of observations: 100) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Population-Level Effects: 
##           Estimate Est.Error l-90% CI u-90% CI Rhat Bulk_ESS Tail_ESS
## Intercept   -57.61      5.91   -67.33   -47.80 1.00     2525     2322
## Mood_r        1.43      0.08     1.30     1.56 1.00     2915     2271
## PeS_r        -1.64      0.07    -1.75    -1.52 1.00     2579     2207
## Hunger_r      2.81      0.07     2.69     2.93 1.00     2479     2239
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-90% CI u-90% CI Rhat Bulk_ESS Tail_ESS
## sigma     0.92      0.07     0.82     1.03 1.00     3045     2323
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).
#posterior predictive plot
pp_check(bm2s)

-> the simulated value of Mood is recovered well -> the priors work well

Fitting model to collected data

Loading empirical data

The data is already preprocessed. Since it is still unpublished, I can not share it yet - apologies for that!

DF = read.csv("data_SAA2025.csv",sep=",")
head(DF)
##   X       ID signal                date PeS Stressor     mood craving hunger
## 1 1 BURI1006      1 2025-02-26 08:33:31  14        1 65.00000      20     20
## 2 2 BURI1006      2 2025-02-26 11:00:21  30        1 77.16667      27     16
## 3 3 BURI1006      3 2025-02-26 13:35:12  79        1 67.00000      31     15
## 4 4 BURI1006      4 2025-02-26 16:00:17  80        1 62.66667      63     19
## 5 5 BURI1006      5 2025-02-26 18:41:15  58        1 66.83333      25     12
## 6 6 BURI1006      6 2025-02-26 21:35:32  63        1 64.66667      16     13

brief descriptives

#number of signals per individual
table(DF$ID)
## 
## AEMR0604 AGDM0608 AGUR0711 AKMC1108 ANFB0306 ANMN1211 ATMR0905 AYOR0906 
##      168      168      168      168      185      168      168      168 
## BRJR1202 BRMR0506 BURI1006 CAMC0209 CRAD0809 CRBR1102 CRDE1205 CRJS0211 
##      168      168      168      168      168      168      168      168 
## CRMC0706 DRGR0605 DRPT0203 EABÖ0805 EgEg0609 EKAD0104 FTMH0710 GBJR1007 
##      168      168      168      168      168      168      168      168 
## GRKR0901 GSMC0205 HIHI1107 HISE1109 HITB0705 HTHL0209 JDJC0807 JSEW0806 
##      168      168      168      168      168      168      168      168 
## KRBR0104 KRTO0601 KTMR0603 LRVT0204   MAJO27 MCMN0212 MNDE0606 MNHR0409 
##      168      168      168      168      168      168      168      168 
## MNKR0506 MNWL0907 MRAO0309 MRDM0209 MRKR0212 MRNK1011 MRPT0412 NNJR1108 
##      168      168      162      168      168      168      168      168 
## PLHL1109 PTRL0202 RNGR0808 SAMA0601 SBPT0509 SLEW0810 SLHR1002 SLMR0201 
##      168      160      168      168      168      146      130      168 
## SLRB0105 SLSE0710 SSCR0206 SSFA0902 SSJR0206 SSPT0405 SSTO0508 TNAD0712 
##      168      168      168      168      168      168      160      168 
## TUHN0307 UERL0203 URSE0104   VRMC08 
##      168      168      168      148
#number of individuals
length(unique(DF$ID))
## [1] 68

fitting model

simple fixed effects model

bm1 = brm(craving ~ mood, prior = priors, data=DF, 
          iter=2000,file_refit="on_change",file = "bm1_ESENa")
## Warning: Rows containing NAs were excluded from the model.
summary(bm1,prob=0.9)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: craving ~ mood 
##    Data: DF (Number of observations: 9787) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Population-Level Effects: 
##           Estimate Est.Error l-90% CI u-90% CI Rhat Bulk_ESS Tail_ESS
## Intercept    38.52      1.11    36.68    40.33 1.00     3836     3116
## mood         -0.15      0.02    -0.18    -0.12 1.00     3921     3077
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-90% CI u-90% CI Rhat Bulk_ESS Tail_ESS
## sigma    28.95      0.21    28.60    29.29 1.00     4187     2547
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).
bm2 = brm(craving ~ mood + PeS + hunger, prior = priors,  data=DF, 
          iter=2000,file_refit="on_change",file = "bm2_ESENa")
## Warning: Rows containing NAs were excluded from the model.
print(summary(bm2,prob=0.9),3)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: craving ~ mood + PeS + hunger 
##    Data: DF (Number of observations: 9787) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Population-Level Effects: 
##           Estimate Est.Error l-90% CI u-90% CI  Rhat Bulk_ESS Tail_ESS
## Intercept    8.260     1.326    6.039   10.411 1.001     3623     2519
## mood        -0.004     0.017   -0.031    0.024 1.001     3703     3071
## PeS          0.101     0.011    0.083    0.120 1.000     3610     3073
## hunger       0.593     0.009    0.578    0.607 1.001     5030     2452
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-90% CI u-90% CI  Rhat Bulk_ESS Tail_ESS
## sigma   23.340     0.167   23.066   23.612 1.001     4447     3159
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

plot model

conditional effects for fixed effects model

cond_effs_bm1=conditional_effects(bm1,
                    effects="mood",int_conditions=seq(0,100,1),
                    #spaghetti = T, 
                    ndraws = 60,
                    prob=0.9,
                    re_formula = NA)

CE_DF_bm1 = cond_effs_bm1[["mood"]]


p1 = ggplot(CE_DF_bm1, aes(x = mood, y = estimate__)) +
  geom_ribbon(aes(ymin = lower__, ymax = upper__),alpha = 0.15,fill  = "steelblue") +
  
  geom_line(linewidth = 3,colour="firebrick") +
  
  labs(x = "Mood",y = "Craving") + # title = "Conditional effect of mood on craving"
  ylim(c(20,40))+
  theme_light()


cond_effs_bm2=conditional_effects(bm2,
                    effects="mood",int_conditions=seq(0,100,1),
                    #spaghetti = T, 
                    ndraws = 60,
                    prob=0.9,
                    re_formula = NA)

CE_DF_bm2 = cond_effs_bm2[["mood"]]

p2 = ggplot(CE_DF_bm2, aes(x = mood, y = estimate__)) +
  geom_ribbon(aes(ymin = lower__, ymax = upper__),alpha = 0.15,fill  = "steelblue"    ) +
  
  geom_line(linewidth = 3,colour="firebrick") +
  
  labs(x = "Mood",y = "Craving") + #title = "Conditional effect of mood on craving"
  ylim(c(20,40))+
  theme_light()

p = grid.arrange(p1,p2,
             nrow=1,ncol=2)

with grouped effects

first adding to the priors

get_prior(craving ~ mood + (1|ID), data=DF)
## Warning: Rows containing NAs were excluded from the model.
##                   prior     class      coef group resp dpar nlpar lb ub
##                  (flat)         b                                      
##                  (flat)         b      mood                            
##  student_t(3, 20, 29.7) Intercept                                      
##   student_t(3, 0, 29.7)        sd                                  0   
##   student_t(3, 0, 29.7)        sd              ID                  0   
##   student_t(3, 0, 29.7)        sd Intercept    ID                  0   
##   student_t(3, 0, 29.7)     sigma                                  0   
##        source
##       default
##  (vectorized)
##       default
##       default
##  (vectorized)
##  (vectorized)
##       default
priors_var_interc = priors + prior(cauchy(0,10), class = sd)
priors_var_interc
##           prior     class coef group resp dpar nlpar   lb   ub source
##  normal(50, 25) Intercept                            <NA> <NA>   user
##   normal(0, 10)         b                            <NA> <NA>   user
##   cauchy(0, 10)     sigma                            <NA> <NA>   user
##   cauchy(0, 10)        sd                            <NA> <NA>   user

then fitting the model using the additional prior for the variance between the intercepts.

bm3 = brm(craving ~ mood + (1|ID), prior = priors_var_interc,
          data=DF, iter=2000,file_refit="on_change",file = "bm3_ESENa")
## Warning: Rows containing NAs were excluded from the model.
print(summary(bm3,prob=0.9),3)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: craving ~ mood + (1 | ID) 
##    Data: DF (Number of observations: 9787) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Group-Level Effects: 
## ~ID (Number of levels: 68) 
##               Estimate Est.Error l-90% CI u-90% CI  Rhat Bulk_ESS Tail_ESS
## sd(Intercept)   15.563     1.321   13.565   17.869 1.020      322      576
## 
## Population-Level Effects: 
##           Estimate Est.Error l-90% CI u-90% CI  Rhat Bulk_ESS Tail_ESS
## Intercept   30.347     2.129   26.817   33.848 1.008      250      617
## mood        -0.016     0.018   -0.046    0.013 1.000     3639     2982
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-90% CI u-90% CI  Rhat Bulk_ESS Tail_ESS
## sigma   24.433     0.181   24.135   24.734 1.002     4589     2471
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).
bm4 = brm(craving ~ mood + PeS + hunger + (1|ID), prior = priors_var_interc,
          data=DF, iter=2000,file_refit="on_change",file = "bm4_ESENa")
## Warning: Rows containing NAs were excluded from the model.
print(summary(bm4,prob=0.9),3)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: craving ~ mood + PeS + hunger + (1 | ID) 
##    Data: DF (Number of observations: 9787) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Group-Level Effects: 
## ~ID (Number of levels: 68) 
##               Estimate Est.Error l-90% CI u-90% CI  Rhat Bulk_ESS Tail_ESS
## sd(Intercept)   12.111     1.045   10.501   13.952 1.014      242      470
## 
## Population-Level Effects: 
##           Estimate Est.Error l-90% CI u-90% CI  Rhat Bulk_ESS Tail_ESS
## Intercept   11.637     1.929    8.386   14.801 1.010      248      923
## mood         0.002     0.017   -0.026    0.031 1.002     3408     3011
## PeS          0.031     0.011    0.013    0.049 1.000     3320     2679
## hunger       0.546     0.008    0.532    0.559 1.000     4211     3113
## 
## Family Specific Parameters: 
##       Estimate Est.Error l-90% CI u-90% CI  Rhat Bulk_ESS Tail_ESS
## sigma   20.242     0.147   20.007   20.490 1.001     5772     2507
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).

-> same direction as with fixed effect only smaller magnitude

plotting conditional effects for both

cond_effs_bm3=conditional_effects(bm3,
                    effects="mood",int_conditions=seq(0,100,1),
                    #spaghetti = T, 
                    ndraws = 60,
                    #prob=0.9,
                    re_formula = NULL)

CE_DF = cond_effs_bm3[["mood"]]


ggplot(CE_DF, aes(x = mood, y = estimate__)) +
  geom_ribbon(aes(ymin = lower__, ymax = upper__),alpha = 0.15,fill  = "steelblue"    ) +
  
  geom_line(linewidth = 3,colour="firebrick") +
  
  labs(x = "Mood",y = "Craving",
    title = "Conditional effect of mood on craving") +
  theme_light()

cond_effs_bm4=conditional_effects(bm4,
                    effects="mood",int_conditions=seq(0,100,1),
                    #spaghetti = T, 
                    ndraws = 60,
                    prob=0.9,
                    re_formula = NULL)

CE_DF = cond_effs_bm4[["mood"]]

ggplot(CE_DF, aes(x = mood, y = estimate__)) +
  geom_ribbon(aes(ymin = lower__, ymax = upper__),alpha = 0.15,fill  = "steelblue"    ) +
  
  geom_line(linewidth = 3,colour="firebrick") +
  
  labs(x = "Mood",y = "Craving",
    title = "Conditional effect of mood on craving") +
  theme_light()

So much for the Bayesian analysis with brms in R.

(6) Revise DAG and reuse

Given the small coefficient of mood when accounting for other causes, it is worth considering whether there should be a path from mood to craving. It is possible that the effect we see when not conditioning on other causes is actually due to other variables (e.g. PeS). This could be a starting point for further analyses and future experiments.

The updated DAG can be used for further analyses: e.g. What is the effect of hunger on craving, controlling for other causes?

Furthermore, future analyses can use more informed priors. For instance, the prior for fixed effects was relatively broad. Based on the small coefficients, this expectation can be updated by reducing the standard deviation of the Normal prior for the fixed effects coefficients.

Wrap up

Feel free to contact me with any questions, comments and corrections.

sessionInfo()
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=German_Austria.utf8  LC_CTYPE=German_Austria.utf8   
## [3] LC_MONETARY=German_Austria.utf8 LC_NUMERIC=C                   
## [5] LC_TIME=German_Austria.utf8    
## 
## time zone: Europe/Vienna
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] gridExtra_2.3      ggplot2_3.5.0      rstan_2.32.5       StanHeaders_2.32.5
## [5] brms_2.20.4        Rcpp_1.0.12        extraDistr_1.10.0 
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.1     farver_2.1.1         dplyr_1.1.4         
##  [4] loo_2.7.0            fastmap_1.1.1        tensorA_0.36.2.1    
##  [7] shinystan_2.6.0      promises_1.2.1       shinyjs_2.1.0       
## [10] digest_0.6.34        estimability_1.5.1   mime_0.12           
## [13] lifecycle_1.0.4      ellipsis_0.3.2       magrittr_2.0.3      
## [16] posterior_1.5.0      compiler_4.3.1       rlang_1.1.3         
## [19] sass_0.4.9           tools_4.3.1          igraph_2.0.3        
## [22] utf8_1.2.4           yaml_2.3.8           knitr_1.45          
## [25] labeling_0.4.3       bridgesampling_1.1-2 htmlwidgets_1.6.4   
## [28] pkgbuild_1.4.4       RColorBrewer_1.1-3   plyr_1.8.9          
## [31] dygraphs_1.1.1.6     abind_1.4-5          miniUI_0.1.1.1      
## [34] withr_3.0.0          grid_4.3.1           stats4_4.3.1        
## [37] fansi_1.0.6          xts_0.13.2           xtable_1.8-4        
## [40] colorspace_2.1-0     inline_0.3.19        emmeans_1.10.3      
## [43] scales_1.3.0         gtools_3.9.5         cli_3.6.2           
## [46] mvtnorm_1.2-4        rmarkdown_2.26       generics_0.1.3      
## [49] RcppParallel_5.1.7   rstudioapi_0.15.0    reshape2_1.4.4      
## [52] cachem_1.0.8         stringr_1.5.1        shinythemes_1.2.0   
## [55] bayesplot_1.11.1     parallel_4.3.1       matrixStats_1.2.0   
## [58] base64enc_0.1-3      vctrs_0.6.5          Matrix_1.6-5        
## [61] jsonlite_1.8.8       crosstalk_1.2.1      jquerylib_0.1.4     
## [64] glue_1.7.0           codetools_0.2-19     DT_0.32             
## [67] distributional_0.4.0 stringi_1.8.3        gtable_0.3.4        
## [70] later_1.3.2          QuickJSR_1.1.3       munsell_0.5.1       
## [73] tibble_3.2.1         colourpicker_1.3.0   pillar_1.9.0        
## [76] htmltools_0.5.7      Brobdingnag_1.2-9    R6_2.5.1            
## [79] evaluate_0.23        shiny_1.8.0          lattice_0.21-8      
## [82] highr_0.10           markdown_1.12        backports_1.4.1     
## [85] threejs_0.3.3        httpuv_1.6.14        bslib_0.6.1         
## [88] rstantools_2.4.0     coda_0.19-4.1        nlme_3.1-162        
## [91] checkmate_2.3.1      xfun_0.42            zoo_1.8-12          
## [94] prettydoc_0.4.1      pkgconfig_2.0.3

References:

Almeida, D. M., McGonagle, K., & King, H. (2009). Assessing Daily Stress Processes in Social Surveys by Combining Stressor Exposure and Salivary Cortisol. Biodemography and Social Biology, 55(2), 219–237. https://doi.org/10.1080/19485560903382338

Aulbach, M. B., Bamberg, C., Reichenberger, J., Arend, A.-K., & Blechert, J. (2025). Bidirectional associations between affect and food craving within and between individuals: A mega-analysis. Appetite, 209, 107936. https://doi.org/10.1016/j.appet.2025.107936

Bonaz, B. (2016). Stress and the Gastrointestinal System. In C. Constantinescu, R. Arsenescu, & V. Arsenescu (Eds.), Neuro-Immuno-Gastroenterology (pp. 123–156). Springer International Publishing. https://doi.org/10.1007/978-3-319-28609-9_7

Brotman, D. J., Golden, S. H., & Wittstein, I. S. (2007). The cardiovascular toll of stress. The Lancet, 370(9592), 1089–1100. https://doi.org/10.1016/S0140-6736(07)61305-1

McEwen, B. S. (2007). Physiology and Neurobiology of Stress and Adaptation: Central Role of the Brain. Physiological Reviews, 87(3), 873–904. https://doi.org/10.1152/physrev.00041.2006

Meule, A., Reichenberger, J., & Blechert, J. (2018). Development and Preliminary Validation of the Salzburg Emotional Eating Scale. Frontiers in Psychology, 9, 88. https://doi.org/10.3389/fpsyg.2018.00088

O’Connor, D. B., Jones, F., Conner, M., McMillan, B., & Ferguson, E. (2008). Effects of daily hassles and eating style on eating behavior. Health Psychology, 27(1, Suppl), S20–S31. https://doi.org/10.1037/0278-6133.27.1.S20

Ombrato, M. D., & Phillips, E. (2021). The Mind of the Hungry Agent: Hunger, Affect and Appetite. Topoi, 40(3), 517–526. https://doi.org/10.1007/s11245-020-09733-y

Roxburgh, S. (2011). Stressors and experienced stress. The Sage Handbook of Mental Health and Illness, 147–178.

Stevenson, R. J., Yeomans, M. R., & Francis, H. M. (2024). Human hunger as a memory process. Psychological Review, 131(1), 174–193. https://doi.org/10.1037/rev0000413

Swami, V., Hochstöger, S., Kargl, E., & Stieger, S. (2022). Hangry in the field: An experience sampling study on the impact of hunger on anger, irritability, and affect. PLOS ONE, 17(7), e0269629. https://doi.org/10.1371/journal.pone.0269629

Theilade, S., Christensen, M. B., Vilsbøll, T., & Knop, F. K. (2021). An overview of obesity mechanisms in humans: Endocrine regulation of food intake, eating behaviour and common determinants of body weight. Diabetes, Obesity and Metabolism, 23(S1), 17–35. https://doi.org/10.1111/dom.14270

Van Eck, M., Nicolson, N. A., & Berkhof, J. (1998). Effects of stressful daily events on mood states: Relationship to global perceived stress. Journal of Personality and Social Psychology, 75(6), 1572–1585. https://doi.org/10.1037/0022-3514.75.6.1572