2 Main analyses
2.1 Within-person analyses
To assess whether drinking levels varied on active weeks versus inactive weeks, we specified two separate multilevel hurdle models: one for Study 1 and another for Study 2, comprising individuals assigned to the mindfulness and perspective-taking conditions, who underwent both active and inactive intervention weeks.
The main predictor of interest was active week (intervention reminders) versus inactive week (control reminders), collapsing across psychological distance strategies.
The two main outcomes include frequency of drinking occasions and numbers of drinks per drinking occasion. Consistent with prior work, we modeled these two drinking outcomes separately.
- To further explore if the effectiveness of the reminders varied by specific psychological distancing strategy (mindfulness vs. perspective-taking), we also included an interaction term: condition type x active week (vs. inactive week).
Variables :
- active week = week type: intervention/active week vs. control/inactive week (ref.)
- condition == psychological distancing strategy condition: perspective-taking vs. mindfulness (ref.)
- signal count == time in study: count of intervention prompts throughout study period [1-56]
- alc reponses = response rate: count of participant responses to alcohol surveys [1-56]
- social weekend == weekend (Thursday-Sat) vs. week (ref. Sun-Wed)
- activeXcondition(perspective) == active intervention week (ref. inactive week) vs.perspective-taking condition (ref. mindfulness condition)
2.1.1 Study 1
Drinking frequency: Consistent with the second hypothesis, active compared to inactive weeks were associated with a higher probability of not drinking: active week OR = 1.34, 95% CI [1.01 - 1.77], p = .041.
Drinking amount: In contrast to our hypotheses, we found no difference in the number of drinks consumed on alcohol use occasions following active intervention reminders, relative to following control reminders: (active week vs. inactive week; OR = 0.92, 95% CI [0.69 - 1.23], p = .575
Model note:
Hurdle models include a logistic regression to model the zeroes in the data as well as a count regression (in this case negative binomial) to model the counts. All the zeroes (not alcohol use occasions) were modeled with the logistic regression and nonzero-counts (alcohol use occasions) were modeled by a truncated negative binomial (i.e., truncated as it does not contain zero).
These models allowed us to independently model whether a person drinks or not (logistic regression) at a given occasion and number of drinks when an individual drinks (count regression).
The first 5 coefficients correspond to the conditional sub-model (count regression; drinks consumed per occasion)]
The last 5 coefficients correspond to the zero-inflated sub-model (probability of non-alcohol use; drinking occasion frequency). Positive odds ratio indicates more occasions with no alcohol use.
m_main_s1 <- glmmTMB(drinks_number ~ 1 + active_week + condition
+ signal_count + alc_responses + social_weekend + active_week*condition + (1 | group/id),
zi = ~1 + active_week + condition
+ signal_count + alc_responses + social_weekend + active_week*condition + (1 | group/id),
data = interventions_s1,
family = truncated_nbinom2)
tbl_regression(m_main_s1,
exponentiate = TRUE, conf.level = 0.95,
pvalue_fun = ~style_pvalue(.x, digits = 3)) %>%
modify_table_body(filter, !(variable == "active_week" & label == "control")) %>%
bold_p() %>%
remove_row_type(., variables = everything(),type = c("header"))| Characteristic | exp(Beta) | 95% CI1 | p-value |
|---|---|---|---|
| active | 0.92 | 0.69, 1.23 | 0.575 |
| conditionperspective | 1.02 | 0.69, 1.51 | 0.919 |
| signal_count | 1.00 | 0.99, 1.00 | 0.158 |
| alc_responses | 0.99 | 0.96, 1.01 | 0.284 |
| social_weekendWeekend | 1.56 | 1.26, 1.93 | <0.001 |
| active * conditionperspective | 1.09 | 0.72, 1.65 | 0.687 |
| active | 1.34 | 1.01, 1.77 | 0.041 |
| conditionperspective | 1.21 | 0.71, 2.05 | 0.489 |
| signal_count | 1.01 | 1.01, 1.02 | <0.001 |
| alc_responses | 1.03 | 0.99, 1.07 | 0.149 |
| social_weekendWeekend | 0.50 | 0.40, 0.61 | <0.001 |
| active * conditionperspective | 0.93 | 0.62, 1.41 | 0.741 |
| 1 CI = Confidence Interval | |||
2.1.2 Study 2
Study2 replicated Study1.
Drinking frequency: Consistent with the second hypothesis, active compared to inactive weeks were associated with a higher probability of not drinking: OR = 1.39, 95% CI [1.08 - 1.80], p = .011.
Drinking amount: We found no difference in the number of drinks consumed on alcohol use occasions following active intervention reminders, relative to following control reminders across both studies (Study 1 active week vs. inactive week: OR = 0.97, 95% CI [0.77 - 1.23], p = .816.)
Model note:
Hurdle models include a logistic regression to model the zeroes in the data as well as a count regression (in this case negative binomial) to model the counts. All the zeroes (not alcohol use occasions) were modeled with the logistic regression and nonzero-counts (alcohol use occasions) were modeled by a truncated negative binomial (i.e., truncated as it does not contain zero).
These models allowed us to independently model whether a person drinks or not (logistic regression) at a given occasion and number of drinks when an individual drinks (count regression).
The first 5 coefficients correspond to the conditional sub-model (count regression; drinks consumed per occasion)]
The last 5 coefficients correspond to the zero-inflated sub-model (probability of non-alcohol use; drinking occasion frequency). Positive odds ratio indicates more occasions with no alcohol use.
m_main_s2 <- glmmTMB(drinks_number ~ 1 + active_week + condition
+ signal_count + alc_responses + social_weekend + active_week*condition + (1 | group/id),
zi = ~1 + active_week + condition
+ signal_count + alc_responses + social_weekend + active_week*condition + (1 | group/id),
data = interventions_s2,
family = truncated_nbinom2)
tbl_regression(m_main_s2,
exponentiate = TRUE, conf.level = 0.95,
pvalue_fun = ~style_pvalue(.x, digits = 3)) %>%
modify_table_body(filter, !(variable == "active_week" & label == "control")) %>%
bold_p() %>%
remove_row_type(., variables = everything(),type = c("header")) | Characteristic | exp(Beta) | 95% CI1 | p-value |
|---|---|---|---|
| active | 0.97 | 0.77, 1.23 | 0.816 |
| conditionperspective | 0.54 | 0.38, 0.76 | <0.001 |
| signal_count | 1.01 | 1.00, 1.01 | 0.041 |
| alc_responses | 0.99 | 0.98, 1.01 | 0.353 |
| social_weekendWeekend | 1.27 | 1.06, 1.53 | 0.009 |
| active * conditionperspective | 1.27 | 0.89, 1.80 | 0.186 |
| active | 1.39 | 1.08, 1.80 | 0.011 |
| conditionperspective | 1.06 | 0.60, 1.87 | 0.845 |
| signal_count | 1.00 | 0.99, 1.00 | 0.458 |
| alc_responses | 1.02 | 1.00, 1.04 | 0.109 |
| social_weekendWeekend | 0.54 | 0.45, 0.65 | <0.001 |
| active * conditionperspective | 0.95 | 0.66, 1.38 | 0.796 |
| 1 CI = Confidence Interval | |||
2.1.3 Plot
Fig 2.| Psychological distance reminders reduce drinking frequency but do not influence amount.
plot1 = read.csv("data/EMA_plot1_osf.csv", stringsAsFactors = FALSE)
plot2 = read.csv("data/EMA_plot2_osf.csv", stringsAsFactors = FALSE)
par(mfrow = c(2,2))
layout.matrix <- matrix(c(0, 2, 1, 3), nrow = 2, ncol = 2)
names=c("control \n inactive weeks", "mindful \n active (left) \ninactive (right)", "perspective \n active (left) \ninactive (right)")
#plotting drinking frequency Study 1
m1=lm(prop_occasions_on ~ 0 + condition, data = plot1)
m2=lm(prop_occasions_off ~ 0 + condition, data = plot1)
m1coefs=c(NA,coeftab(m1)$Estimate)
m1ses=c(NA,coeftab(m1)$Std)
m2coefs=coeftab(m2)$Estimate
m2ses=coeftab(m2)$Std
coefplot2(m1coefs,m1ses,CI=.2, names, pch= 21,cex.pts= 2,vertical=F,
main = "Study 1", var.las =1, ylim=c(.05,.25), cex.axis=3,
ylab="proportion of drinking occasions", xlab="conditions", col.pts=palette)
coefplot2(m2coefs,m2ses,names, CI=.2, pch= 16,cex.pts= 2,vertical=F, offset = .15, ylim=c(.05,.25), main = "Study 1",
var.las =1, cex.axis=3, ylab="proportion of drinking occasions", add=T, col.pts=palette)
#plotting drinking frequency Study 2
m1_s2=lm(prop_occasions_on ~ 0 + condition, plot2)
m2_s2=lm(prop_occasions_off ~ 0 + condition, plot2)
m1_s2coefs=c(NA,coeftab(m1_s2)$Estimate)
m1_s2ses=c(NA,coeftab(m1_s2)$Std)
m2_s2coefs=coeftab(m2_s2)$Estimate
m2_s2ses=coeftab(m2_s2)$Std
coefplot2(m1_s2coefs,m1_s2ses,names, CI=.95, pch= 21,cex.pts= 2,vertical=F,
main = "Study 2", var.las =1, ylim=c(.05,.25), cex.axis=3,
ylab="proportion of drinking occasions", xlab="conditions", col.pts=palette)
coefplot2(m2_s2coefs,m2_s2ses,names, CI=.95, pch= 16,cex.pts= 2,vertical=F, offset = .15, ylim=c(.05,.25),
main = "Study 2",
var.las =1, cex.axis=3, ylab="proportion of drinking occasions", add=T, col.pts=palette)
##plotting drinking amount Study 1
m1on_1=lm(drinks_per_occ_on ~ 0 + condition, plot1)
m2off_1=lm(drinks_per_occ_off ~ 0 + condition, plot1)
m1d_oncoefs_1=c(NA,coeftab(m1on_1)$Estimate)
m1d_onses_1=c(NA,coeftab(m1on_1)$Std)
m1d_off_coefs_1=coeftab(m2off_1)$Estimate
m1d_offses_1=coeftab(m2off_1)$Std
coefplot2(m1d_oncoefs_1,m1d_onses_1,names,pch= 21, plot =TRUE, CI = .95, cex.pts= 2, vertical=F, ylim=c(0,5),
xlab="conditions",main="Study 1", ylab="average drinks per occasion",var.las =1, col.pts=palette)
coefplot2(m1d_off_coefs_1,m1d_offses_1,names, pch= 16, plot = TRUE, CI =.95, cex.pts= 1.5,vertical=F, ylim=c(0,5),
xlab="conditions",offset = .2,ylab="average drinks per occasion", var.las =1, add=T,col.pts=palette)
##plotting drinking amount Study 2
m1_on_d2=lm(drinks_per_occ_on ~ 0 + condition, plot2)
m2_off_d2=lm(drinks_per_occ_off ~ 0 + condition, plot2)
s2_m1dcoefs=c(NA,coeftab(m1_on_d2)$Estimate)
s2_m1dses=c(NA,coeftab(m1_on_d2)$Std)
m2dcoefs2=coeftab(m2_off_d2)$Estimate
m2dses2=coeftab(m2_off_d2)$Std
coefplot2(s2_m1dcoefs,s2_m1dses,names,pch= 21, plot =TRUE, CI = .95, cex.pts= 1.5, vertical=F, ylim=c(0,5),
xlab="conditions", main = "Study 2", ylab="average drinks per occasion",var.las =1, col.pts=palette)
coefplot2(m2dcoefs2,m2dses2,names, pch= 16, plot = TRUE, CI =.95, cex.pts= 1.5,vertical=F, ylim=c(0,5),
xlab= "conditions", offset = .2, main="Study 2", ylab="average drinks per occasion", add=T,var.las =1, col.pts=palette)2.2 Between-person analyses
We conducted follow-up analyses to explore whether the observed effects of psychological distance intervention reminders on drinking frequency differed from non-intervention related changes we might expect in the absence of intervention reminders.
- To do this, we compared the average pseudo-inactive-to-active-week change scores in drinking frequency for the control group to inactive-to-active-week change scores for the intervention groups using an upaired two-samples wilcoxon test.
#load change scores
change_scores_1 = read.csv("data/prop_diff_plot1.csv", stringsAsFactors = FALSE) %>%
mutate(intervention = case_when(condition == 'mindful' | condition == 'perspective' ~ 'intervention', TRUE ~ 'control'))
change_scores_2 = read.csv("data/prop_diff_plot2.csv", stringsAsFactors = FALSE) %>%
mutate(intervention = case_when(condition == 'mindful' | condition == 'perspective' ~ 'intervention', TRUE ~ 'control'))2.2.1 Study 1
Individuals randomly assigned to the psychological distance interventions showed a greater decrease in drinking frequency from inactive weeks to active weeks relative to those in the control group in Study 1 (W = 1002, Z = -2.013, p = .044, r = .194).
#run wilcox test
change_scores_1 %>% rstatix::wilcox_test(prop_diff ~ intervention) %>%
data.frame() %>%
mutate(W = statistic,
Z = qnorm(p/2), # z-score
r = abs(Z/(sqrt(108)))) %>%
select(group1, group2, W, Z, p,r) %>%
kable(format = "pandoc", digits=3)| group1 | group2 | W | Z | p | r |
|---|---|---|---|---|---|
| control | intervention | 1002 | -2.013 | 0.044 | 0.194 |
2.2.2 Study 2
Study2 replicated Study1.
Individuals randomly assigned to the psychological distance interventions showed a greater decrease in drinking frequency from inactive weeks to active weeks relative to those in the control group in Study 2 (W = 3733, Z = -3.487, p = <.001, r = .236).
change_scores_2 %>% rstatix::wilcox_test(prop_diff ~ intervention) %>%
data.frame() %>%
mutate(W= statistic,
Z = qnorm(p/2), # z-score
r = abs(Z/(sqrt(218)))) %>%
select(group1, group2, W, Z, p, r) %>%
kable(format = "pandoc", digits=3)| group1 | group2 | W | Z | p | r |
|---|---|---|---|---|---|
| control | intervention | 3733 | -3.487 | 0 | 0.236 |
2.2.3 Plot
Fig 3. | Reminders change drinking frequency among participants in the intervention conditions vs. control (Study 1 r =.194; Study 2 r = .236).
#graphing EMA FREQUENCY within-person
change_scores_1$prop_diff_1 = change_scores_1$prop_diff*-1 #flipped change scores as negative for ease of interpretation: negative change scores indicate greater intervention-consistent reductions in drinking frequency from inactive to active weeks.
change_scores_2$prop_diff_1 = change_scores_2$prop_diff*-1 #flipped change scores as negative for ease of interpretation
m1=lm(prop_diff_1~ 0 + condition, change_scores_1)
m2=lm(prop_diff_1~ 0 + condition, change_scores_2)
names=c("control", "mindful", "perspective")
par(mfrow = c(2,2))
#Study 1 plot
coefplot2(m1, intercept = TRUE,
pch= 18,cex.pts= 2,CI=.95,
names,
lwd.1 = 0,
main = "Study 1", ylab="% change scores in drinking frequency",
ylim=c(-.08,.05), xlab="conditions", var.las =1,
vertical=F,
col.pts=c("darkgray", "#0C7BDC","#D55E00"))
#Study 2 plot
coefplot2(m2, intercept = TRUE,
pch= 18,cex.pts= 2,CI=.95,
names,
main = "Study 2",
ylim=c(-.08,.05), xlab="conditions",
offset = .2, ylab="% change scores in drinking frequency", var.las =1,
lwd.1 = 0,
vertical=F,
col.pts=c("darkgray", "#0C7BDC","#D55E00"))