library(tidyverse)
library(psych)
library(emmeans)
library(knitr)
library(kableExtra)
library(broom)
setwd("/Users/anjalisingh/Downloads/")
raw <- read_csv(
"#295647_+4+(form_+bear+vs.+gummy+vs.+pill+vs.+food)_June+9,+2026_10.53.csv",
skip = 0
)
df <- raw %>%
filter(!is.na(participantId) & participantId != "") %>%
filter(Deb == 1, E_AC == -3, R_AC == 3) %>%
mutate(across(c(E2, E3, R1, R2, R3, FP1, FP2, MC_D, MC_F, MC_S), as.numeric)) %>%
mutate(
PI = as.numeric(PI),
PS = as.numeric(PS)
)
df <- df %>%
mutate(Cond_Form = factor(Cond_Form, levels = c("Pill", "Gum", "Bear", "Food")))
contrasts(df$Cond_Form) <- contr.treatment(levels(df$Cond_Form))
colnames(contrasts(df$Cond_Form)) <- levels(df$Cond_Form)[-1]
df <- df %>%
mutate(
E_AVG = (E2 + E3) / 2,
R_AVG = (R1 + R2 + R3) / 3,
FP_AVG = (FP1 + FP2) / 2,
MC_S_c = MC_S - mean(MC_S, na.rm = TRUE),
Pill_vs_Gummies = ifelse(Cond_Form == "Pill", 1, -1/3),
Gum_d = ifelse(Cond_Form == "Gum", 1, 0),
Bear_d = ifelse(Cond_Form == "Bear", 1, 0),
Food_d = ifelse(Cond_Form == "Food", 1, 0)
)
# Covariate subset with mean-centered PI and PS
df_cov <- df %>%
filter(!is.na(PI) & !is.na(PS)) %>%
mutate(
PI_c = PI - mean(PI, na.rm = TRUE),
PS_c = PS - mean(PS, na.rm = TRUE)
)
# Shared plot aesthetics
cond_colors <- c("Pill" = "#0072B2", "Gum" = "#E69F00",
"Bear" = "#CC79A7", "Food" = "#009E73")
cond_labels <- c("Pill" = "Pill", "Gum" = "Round Gummy",
"Bear" = "Bear Gummy", "Food" = "Orange Gummy")
Overview
This report summarizes Study 4, a 4-condition
between-subjects experiment examining how supplement format
affects consumer perceptions. Participants were randomly assigned to one
of four format conditions:
- Pill (reference category)
- Round Gummy (Gum)
- Bear Gummy (Bear)
- Orange Gummy (Food)
Dependent variables: Perceived Risk (R_AVG),
Perceived Efficacy (E_AVG), Fair Price (FP_AVG)
Manipulation checks: Drug-like (MC_D), Food-like
(MC_F), Perceived Severity (MC_S)
Covariates / moderators: Prior Supplement Intake
(PI), Prior Sleep Issues / Supplement Use (PS) — both continuous, −3 to
+3, mean-centered
Sample
df %>%
count(Cond_Form) %>%
rename(Condition = Cond_Form, N = n) %>%
mutate(Condition = recode(Condition,
"Pill" = "Pill", "Gum" = "Round Gummy",
"Bear" = "Bear Gummy", "Food" = "Orange Gummy")) %>%
kable(caption = "Participants by Condition (after exclusions)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Participants by Condition (after exclusions)
|
Condition
|
N
|
|
Pill
|
123
|
|
Round Gummy
|
120
|
|
Bear Gummy
|
112
|
|
Orange Gummy
|
121
|
Total N after exclusions: 476 | N in
covariate analyses: 475
Scale Reliability
alpha_R <- psych::alpha(df[, c("R1", "R2", "R3")])
r_E <- round(cor(df$E2, df$E3, use = "complete.obs"), 3)
r_FP <- round(cor(df$FP1, df$FP2, use = "complete.obs"), 3)
tibble(
Scale = c("Risk (R1–R3)", "Efficacy (E2, E3)", "Fair Price (FP1, FP2)"),
Metric = c("Cronbach's alpha", "Inter-item r", "Inter-item r"),
Value = c(round(alpha_R$total$raw_alpha, 3), r_E, r_FP)
) %>%
kable(caption = "Scale Reliability") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Scale Reliability
|
Scale
|
Metric
|
Value
|
|
Risk (R1–R3)
|
Cronbach’s alpha
|
0.939
|
|
Efficacy (E2, E3)
|
Inter-item r
|
0.921
|
|
Fair Price (FP1, FP2)
|
Inter-item r
|
0.948
|
Manipulation Checks
Descriptives
df %>%
group_by(Cond_Form) %>%
summarise(
`MC_D M` = round(mean(MC_D, na.rm = TRUE), 2),
`MC_D SD` = round(sd(MC_D, na.rm = TRUE), 2),
`MC_F M` = round(mean(MC_F, na.rm = TRUE), 2),
`MC_F SD` = round(sd(MC_F, na.rm = TRUE), 2),
`MC_S M` = round(mean(MC_S, na.rm = TRUE), 2),
`MC_S SD` = round(sd(MC_S, na.rm = TRUE), 2),
N = n(),
.groups = "drop"
) %>%
rename(Condition = Cond_Form) %>%
mutate(Condition = recode(Condition,
"Pill" = "Pill", "Gum" = "Round Gummy",
"Bear" = "Bear Gummy", "Food" = "Orange Gummy")) %>%
kable(caption = "Manipulation Check Means & SDs by Condition") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Manipulation Check Means & SDs by Condition
|
Condition
|
MC_D M
|
MC_D SD
|
MC_F M
|
MC_F SD
|
MC_S M
|
MC_S SD
|
N
|
|
Pill
|
1.76
|
1.41
|
-2.55
|
0.82
|
-1.14
|
1.52
|
123
|
|
Round Gummy
|
-0.38
|
1.73
|
0.29
|
1.88
|
-1.34
|
1.44
|
120
|
|
Bear Gummy
|
-0.96
|
1.82
|
1.08
|
1.83
|
-1.70
|
1.22
|
112
|
|
Orange Gummy
|
-0.95
|
1.74
|
1.38
|
1.40
|
-1.43
|
1.37
|
121
|
Omnibus ANOVAs
aov_mc_d <- aov(MC_D ~ Cond_Form, data = df)
aov_mc_f <- aov(MC_F ~ Cond_Form, data = df)
aov_mc_s <- aov(MC_S ~ Cond_Form, data = df)
bind_rows(
tidy(aov_mc_d) %>% mutate(DV = "MC_D (Drug-like)"),
tidy(aov_mc_f) %>% mutate(DV = "MC_F (Food-like)"),
tidy(aov_mc_s) %>% mutate(DV = "MC_S (Severity)")
) %>%
filter(term == "Cond_Form") %>%
select(DV, df, statistic, p.value) %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(F = statistic, p = p.value) %>%
kable(caption = "One-Way ANOVAs: Manipulation Checks") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
One-Way ANOVAs: Manipulation Checks
|
DV
|
df
|
F
|
p
|
|
MC_D (Drug-like)
|
3
|
71.751
|
0.000
|
|
MC_F (Food-like)
|
3
|
166.243
|
0.000
|
|
MC_S (Severity)
|
3
|
3.214
|
0.023
|
Tukey HSD: Drug-like (MC_D)
TukeyHSD(aov_mc_d)$Cond_Form %>%
as.data.frame() %>%
rownames_to_column("Contrast") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(`p (adj)` = `p adj`) %>%
kable(caption = "Tukey HSD: MC_D") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Tukey HSD: MC_D
|
Contrast
|
diff
|
lwr
|
upr
|
p (adj)
|
|
Gum-Pill
|
-2.139
|
-2.694
|
-1.584
|
0.000
|
|
Bear-Pill
|
-2.720
|
-3.285
|
-2.155
|
0.000
|
|
Food-Pill
|
-2.715
|
-3.269
|
-2.161
|
0.000
|
|
Bear-Gum
|
-0.580
|
-1.149
|
-0.012
|
0.043
|
|
Food-Gum
|
-0.575
|
-1.133
|
-0.018
|
0.040
|
|
Food-Bear
|
0.005
|
-0.562
|
0.572
|
1.000
|
Tukey HSD: Food-like (MC_F)
TukeyHSD(aov_mc_f)$Cond_Form %>%
as.data.frame() %>%
rownames_to_column("Contrast") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(`p (adj)` = `p adj`) %>%
kable(caption = "Tukey HSD: MC_F") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Tukey HSD: MC_F
|
Contrast
|
diff
|
lwr
|
upr
|
p (adj)
|
|
Gum-Pill
|
2.845
|
2.337
|
3.352
|
0.000
|
|
Bear-Pill
|
3.633
|
3.117
|
4.150
|
0.000
|
|
Food-Pill
|
3.933
|
3.427
|
4.439
|
0.000
|
|
Bear-Gum
|
0.789
|
0.269
|
1.308
|
0.001
|
|
Food-Gum
|
1.088
|
0.579
|
1.598
|
0.000
|
|
Food-Bear
|
0.300
|
-0.219
|
0.818
|
0.444
|
Tukey HSD: Severity (MC_S)
TukeyHSD(aov_mc_s)$Cond_Form %>%
as.data.frame() %>%
rownames_to_column("Contrast") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(`p (adj)` = `p adj`) %>%
kable(caption = "Tukey HSD: MC_S") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Tukey HSD: MC_S
|
Contrast
|
diff
|
lwr
|
upr
|
p (adj)
|
|
Gum-Pill
|
-0.203
|
-0.665
|
0.258
|
0.667
|
|
Bear-Pill
|
-0.558
|
-1.028
|
-0.088
|
0.012
|
|
Food-Pill
|
-0.292
|
-0.752
|
0.169
|
0.362
|
|
Bear-Gum
|
-0.355
|
-0.827
|
0.118
|
0.215
|
|
Food-Gum
|
-0.088
|
-0.552
|
0.375
|
0.961
|
|
Food-Bear
|
0.267
|
-0.205
|
0.738
|
0.464
|
Planned Contrast: Pill vs. All Gummies
mc_d_c <- summary(lm(MC_D ~ Pill_vs_Gummies, data = df))
mc_f_c <- summary(lm(MC_F ~ Pill_vs_Gummies, data = df))
mc_s_c <- summary(lm(MC_S ~ Pill_vs_Gummies, data = df))
tibble(
DV = c("MC_D (Drug-like)", "MC_F (Food-like)", "MC_S (Severity)"),
b = c(mc_d_c$coefficients[2,1], mc_f_c$coefficients[2,1], mc_s_c$coefficients[2,1]),
SE = c(mc_d_c$coefficients[2,2], mc_f_c$coefficients[2,2], mc_s_c$coefficients[2,2]),
t = c(mc_d_c$coefficients[2,3], mc_f_c$coefficients[2,3], mc_s_c$coefficients[2,3]),
p = c(mc_d_c$coefficients[2,4], mc_f_c$coefficients[2,4], mc_s_c$coefficients[2,4])
) %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Planned Contrast: Pill vs. All Gummies Combined") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Planned Contrast: Pill vs. All Gummies Combined
|
DV
|
b
|
SE
|
t
|
p
|
|
MC_D (Drug-like)
|
1.890
|
0.133
|
14.237
|
0.000
|
|
MC_F (Food-like)
|
-2.601
|
0.124
|
-20.940
|
0.000
|
|
MC_S (Severity)
|
0.260
|
0.110
|
2.365
|
0.018
|
Plots
mc_barplot <- function(var, title, ylab) {
df %>%
group_by(Cond_Form) %>%
summarise(M = mean(.data[[var]], na.rm = TRUE),
SE = sd(.data[[var]], na.rm = TRUE) / sqrt(n()),
.groups = "drop") %>%
ggplot(aes(x = Cond_Form, y = M, fill = Cond_Form)) +
geom_bar(stat = "identity", width = 0.55) +
geom_errorbar(aes(ymin = M - SE, ymax = M + SE), width = 0.18) +
scale_fill_manual(values = cond_colors) +
scale_x_discrete(labels = cond_labels) +
labs(title = title, x = "Format Condition", y = ylab) +
theme_classic(base_size = 13) +
theme(legend.position = "none")
}
mc_barplot("MC_D", "Drug-like Perception by Format", "Mean Drug-like Rating (MC_D)")
mc_barplot("MC_F", "Food-like Perception by Format", "Mean Food-like Rating (MC_F)")
mc_barplot("MC_S", "Severity Perception by Format", "Mean Severity Rating (MC_S)")



Takeaway: The manipulation worked cleanly. Pill is
perceived as significantly more drug-like and less food-like than all
gummy formats. The three gummy types do not differ significantly from
each other on drug-likeness.
DV Descriptives
df %>%
group_by(Cond_Form) %>%
summarise(
`Risk M` = round(mean(R_AVG, na.rm = TRUE), 2),
`Risk SD` = round(sd(R_AVG, na.rm = TRUE), 2),
`Efficacy M` = round(mean(E_AVG, na.rm = TRUE), 2),
`Efficacy SD` = round(sd(E_AVG, na.rm = TRUE), 2),
`FP M` = round(mean(FP_AVG, na.rm = TRUE), 2),
`FP SD` = round(sd(FP_AVG, na.rm = TRUE), 2),
N = n(),
.groups = "drop"
) %>%
rename(Condition = Cond_Form) %>%
mutate(Condition = recode(Condition,
"Pill" = "Pill", "Gum" = "Round Gummy",
"Bear" = "Bear Gummy", "Food" = "Orange Gummy")) %>%
kable(caption = "DV Means and SDs by Condition") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
DV Means and SDs by Condition
|
Condition
|
Risk M
|
Risk SD
|
Efficacy M
|
Efficacy SD
|
FP M
|
FP SD
|
N
|
|
Pill
|
-0.41
|
1.61
|
0.79
|
1.20
|
-0.35
|
1.77
|
123
|
|
Round Gummy
|
-1.08
|
1.38
|
0.98
|
1.23
|
-0.14
|
1.70
|
120
|
|
Bear Gummy
|
-0.91
|
1.41
|
0.60
|
1.48
|
-0.39
|
1.85
|
112
|
|
Orange Gummy
|
-1.05
|
1.47
|
0.73
|
1.25
|
-0.37
|
1.70
|
121
|
Perceived Risk
Plot
mc_barplot("R_AVG", "Risk Perception by Format", "Mean Risk (R_AVG)")

Regression
m_r <- lm(R_AVG ~ Cond_Form, data = df)
summary(m_r)$coefficients %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(b = Estimate, SE = `Std. Error`, t = `t value`, p = `Pr(>|t|)`) %>%
kable(caption = "Regression: Risk ~ Format (Reference = Pill)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Regression: Risk ~ Format (Reference = Pill)
|
Term
|
b
|
SE
|
t
|
p
|
|
(Intercept)
|
-0.407
|
0.132
|
-3.068
|
0.002
|
|
Cond_FormGum
|
-0.674
|
0.189
|
-3.575
|
0.000
|
|
Cond_FormBear
|
-0.507
|
0.192
|
-2.643
|
0.008
|
|
Cond_FormFood
|
-0.643
|
0.188
|
-3.418
|
0.001
|
confint(m_r) %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "95% Confidence Intervals: Risk") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% Confidence Intervals: Risk
|
Term
|
2.5 %
|
97.5 %
|
|
(Intercept)
|
-0.667
|
-0.146
|
|
Cond_FormGum
|
-1.045
|
-0.304
|
|
Cond_FormBear
|
-0.884
|
-0.130
|
|
Cond_FormFood
|
-1.013
|
-0.273
|
Pairwise Comparisons
emm_r <- emmeans(m_r, ~ Cond_Form)
pairs(emm_r, adjust = "tukey") %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Pairwise Comparisons: Risk (Tukey-adjusted)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Comparisons: Risk (Tukey-adjusted)
|
contrast
|
estimate
|
SE
|
df
|
t.ratio
|
p.value
|
|
Pill - Gum
|
0.674
|
0.189
|
472
|
3.575
|
0.002
|
|
Pill - Bear
|
0.507
|
0.192
|
472
|
2.643
|
0.042
|
|
Pill - Food
|
0.643
|
0.188
|
472
|
3.418
|
0.004
|
|
Gum - Bear
|
-0.167
|
0.193
|
472
|
-0.864
|
0.823
|
|
Gum - Food
|
-0.031
|
0.189
|
472
|
-0.164
|
0.998
|
|
Bear - Food
|
0.136
|
0.193
|
472
|
0.705
|
0.895
|
summary(emm_r) %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Estimated Marginal Means: Risk") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Estimated Marginal Means: Risk
|
Cond_Form
|
emmean
|
SE
|
df
|
lower.CL
|
upper.CL
|
|
Pill
|
-0.407
|
0.132
|
472
|
-0.667
|
-0.146
|
|
Gum
|
-1.081
|
0.134
|
472
|
-1.344
|
-0.817
|
|
Bear
|
-0.914
|
0.139
|
472
|
-1.187
|
-0.641
|
|
Food
|
-1.050
|
0.134
|
472
|
-1.312
|
-0.787
|
Takeaway: All three gummy formats significantly
lower perceived risk relative to Pill. The three gummy types do not
differ from each other.
Perceived Efficacy
Plot
mc_barplot("E_AVG", "Efficacy Perception by Format", "Mean Efficacy (E_AVG)")

Regression
m_e <- lm(E_AVG ~ Cond_Form, data = df)
summary(m_e)$coefficients %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(b = Estimate, SE = `Std. Error`, t = `t value`, p = `Pr(>|t|)`) %>%
kable(caption = "Regression: Efficacy ~ Format (Reference = Pill)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Regression: Efficacy ~ Format (Reference = Pill)
|
Term
|
b
|
SE
|
t
|
p
|
|
(Intercept)
|
0.793
|
0.116
|
6.815
|
0.000
|
|
Cond_FormGum
|
0.191
|
0.166
|
1.152
|
0.250
|
|
Cond_FormBear
|
-0.190
|
0.168
|
-1.128
|
0.260
|
|
Cond_FormFood
|
-0.061
|
0.165
|
-0.371
|
0.711
|
confint(m_e) %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "95% Confidence Intervals: Efficacy") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% Confidence Intervals: Efficacy
|
Term
|
2.5 %
|
97.5 %
|
|
(Intercept)
|
0.564
|
1.021
|
|
Cond_FormGum
|
-0.135
|
0.516
|
|
Cond_FormBear
|
-0.521
|
0.141
|
|
Cond_FormFood
|
-0.386
|
0.263
|
Pairwise Comparisons
emm_e <- emmeans(m_e, ~ Cond_Form)
pairs(emm_e, adjust = "tukey") %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Pairwise Comparisons: Efficacy (Tukey-adjusted)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Comparisons: Efficacy (Tukey-adjusted)
|
contrast
|
estimate
|
SE
|
df
|
t.ratio
|
p.value
|
|
Pill - Gum
|
-0.191
|
0.166
|
472
|
-1.152
|
0.658
|
|
Pill - Bear
|
0.190
|
0.168
|
472
|
1.128
|
0.673
|
|
Pill - Food
|
0.061
|
0.165
|
472
|
0.371
|
0.983
|
|
Gum - Bear
|
0.381
|
0.169
|
472
|
2.246
|
0.113
|
|
Gum - Food
|
0.252
|
0.166
|
472
|
1.516
|
0.429
|
|
Bear - Food
|
-0.129
|
0.169
|
472
|
-0.761
|
0.872
|
summary(emm_e) %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Estimated Marginal Means: Efficacy") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Estimated Marginal Means: Efficacy
|
Cond_Form
|
emmean
|
SE
|
df
|
lower.CL
|
upper.CL
|
|
Pill
|
0.793
|
0.116
|
472
|
0.564
|
1.021
|
|
Gum
|
0.983
|
0.118
|
472
|
0.752
|
1.215
|
|
Bear
|
0.603
|
0.122
|
472
|
0.363
|
0.842
|
|
Food
|
0.731
|
0.117
|
472
|
0.501
|
0.962
|
With Covariates (PI, PS)
m_e_cov <- lm(E_AVG ~ Cond_Form + PI_c + PS_c, data = df_cov)
summary(m_e_cov)$coefficients %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(b = Estimate, SE = `Std. Error`, t = `t value`, p = `Pr(>|t|)`) %>%
kable(caption = "Regression: Efficacy ~ Format + PI_c + PS_c") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Regression: Efficacy ~ Format + PI_c + PS_c
|
Term
|
b
|
SE
|
t
|
p
|
|
(Intercept)
|
0.796
|
0.114
|
6.997
|
0.000
|
|
Cond_FormGum
|
0.176
|
0.162
|
1.088
|
0.277
|
|
Cond_FormBear
|
-0.143
|
0.165
|
-0.864
|
0.388
|
|
Cond_FormFood
|
-0.083
|
0.162
|
-0.515
|
0.607
|
|
PI_c
|
-0.018
|
0.040
|
-0.444
|
0.657
|
|
PS_c
|
0.136
|
0.034
|
3.984
|
0.000
|
emmeans(m_e_cov, ~ Cond_Form) %>%
pairs(adjust = "tukey") %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Pairwise Comparisons: Efficacy with Covariates") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Comparisons: Efficacy with Covariates
|
contrast
|
estimate
|
SE
|
df
|
t.ratio
|
p.value
|
|
Pill - Gum
|
-0.176
|
0.162
|
469
|
-1.088
|
0.697
|
|
Pill - Bear
|
0.143
|
0.165
|
469
|
0.864
|
0.824
|
|
Pill - Food
|
0.083
|
0.162
|
469
|
0.515
|
0.955
|
|
Gum - Bear
|
0.319
|
0.166
|
469
|
1.916
|
0.223
|
|
Gum - Food
|
0.260
|
0.163
|
469
|
1.593
|
0.384
|
|
Bear - Food
|
-0.059
|
0.166
|
469
|
-0.357
|
0.984
|
Takeaway: Format had no significant main effect on
efficacy. PS_c was significant (β = 0.136, p < .001) — more prior
supplement use → higher efficacy ratings overall.
Fair Price
Plot
mc_barplot("FP_AVG", "Fair Price by Format", "Mean Fair Price (FP_AVG)")

Regression
m_fp <- lm(FP_AVG ~ Cond_Form, data = df)
summary(m_fp)$coefficients %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(b = Estimate, SE = `Std. Error`, t = `t value`, p = `Pr(>|t|)`) %>%
kable(caption = "Regression: Fair Price ~ Format (Reference = Pill)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Regression: Fair Price ~ Format (Reference = Pill)
|
Term
|
b
|
SE
|
t
|
p
|
|
(Intercept)
|
-0.354
|
0.158
|
-2.237
|
0.026
|
|
Cond_FormGum
|
0.212
|
0.225
|
0.942
|
0.346
|
|
Cond_FormBear
|
-0.039
|
0.229
|
-0.171
|
0.864
|
|
Cond_FormFood
|
-0.014
|
0.224
|
-0.063
|
0.950
|
confint(m_fp) %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "95% Confidence Intervals: Fair Price") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% Confidence Intervals: Fair Price
|
Term
|
2.5 %
|
97.5 %
|
|
(Intercept)
|
-0.664
|
-0.043
|
|
Cond_FormGum
|
-0.230
|
0.654
|
|
Cond_FormBear
|
-0.489
|
0.411
|
|
Cond_FormFood
|
-0.455
|
0.427
|
Pairwise Comparisons
emm_fp <- emmeans(m_fp, ~ Cond_Form)
pairs(emm_fp, adjust = "tukey") %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Pairwise Comparisons: Fair Price (Tukey-adjusted)") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Comparisons: Fair Price (Tukey-adjusted)
|
contrast
|
estimate
|
SE
|
df
|
t.ratio
|
p.value
|
|
Pill - Gum
|
-0.212
|
0.225
|
472
|
-0.942
|
0.782
|
|
Pill - Bear
|
0.039
|
0.229
|
472
|
0.171
|
0.998
|
|
Pill - Food
|
0.014
|
0.224
|
472
|
0.063
|
1.000
|
|
Gum - Bear
|
0.251
|
0.230
|
472
|
1.091
|
0.695
|
|
Gum - Food
|
0.226
|
0.226
|
472
|
1.001
|
0.749
|
|
Bear - Food
|
-0.025
|
0.230
|
472
|
-0.109
|
1.000
|
summary(emm_fp) %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Estimated Marginal Means: Fair Price") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Estimated Marginal Means: Fair Price
|
Cond_Form
|
emmean
|
SE
|
df
|
lower.CL
|
upper.CL
|
|
Pill
|
-0.354
|
0.158
|
472
|
-0.664
|
-0.043
|
|
Gum
|
-0.142
|
0.160
|
472
|
-0.456
|
0.173
|
|
Bear
|
-0.393
|
0.166
|
472
|
-0.718
|
-0.067
|
|
Food
|
-0.368
|
0.159
|
472
|
-0.681
|
-0.055
|
With Covariates (PI, PS)
m_fp_cov <- lm(FP_AVG ~ Cond_Form + PI_c + PS_c, data = df_cov)
summary(m_fp_cov)$coefficients %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(b = Estimate, SE = `Std. Error`, t = `t value`, p = `Pr(>|t|)`) %>%
kable(caption = "Regression: Fair Price ~ Format + PI_c + PS_c") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Regression: Fair Price ~ Format + PI_c + PS_c
|
Term
|
b
|
SE
|
t
|
p
|
|
(Intercept)
|
-0.335
|
0.157
|
-2.135
|
0.033
|
|
Cond_FormGum
|
0.210
|
0.223
|
0.941
|
0.347
|
|
Cond_FormBear
|
-0.035
|
0.228
|
-0.152
|
0.879
|
|
Cond_FormFood
|
-0.069
|
0.223
|
-0.307
|
0.759
|
|
PI_c
|
-0.160
|
0.054
|
-2.940
|
0.003
|
|
PS_c
|
0.106
|
0.047
|
2.249
|
0.025
|
emmeans(m_fp_cov, ~ Cond_Form) %>%
pairs(adjust = "tukey") %>%
as.data.frame() %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
kable(caption = "Pairwise Comparisons: Fair Price with Covariates") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Comparisons: Fair Price with Covariates
|
contrast
|
estimate
|
SE
|
df
|
t.ratio
|
p.value
|
|
Pill - Gum
|
-0.210
|
0.223
|
469
|
-0.941
|
0.783
|
|
Pill - Bear
|
0.035
|
0.228
|
469
|
0.152
|
0.999
|
|
Pill - Food
|
0.069
|
0.223
|
469
|
0.307
|
0.990
|
|
Gum - Bear
|
0.244
|
0.229
|
469
|
1.066
|
0.711
|
|
Gum - Food
|
0.278
|
0.225
|
469
|
1.240
|
0.602
|
|
Bear - Food
|
0.034
|
0.229
|
469
|
0.148
|
0.999
|
Takeaway: Format had no significant main effect on
fair price. This held after controlling for PI and PS.
Perceived Severity as Moderator
MC_S × Fair Price
m_mod_fp <- lm(FP_AVG ~ Cond_Form * MC_S, data = df)
summary(m_mod_fp)$coefficients %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(b = Estimate, SE = `Std. Error`, t = `t value`, p = `Pr(>|t|)`) %>%
kable(caption = "Moderation: FP_AVG ~ Format × MC_S") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Moderation: FP_AVG ~ Format × MC_S
|
Term
|
b
|
SE
|
t
|
p
|
|
(Intercept)
|
0.042
|
0.191
|
0.219
|
0.827
|
|
Cond_FormGum
|
0.198
|
0.285
|
0.695
|
0.487
|
|
Cond_FormBear
|
0.281
|
0.334
|
0.841
|
0.401
|
|
Cond_FormFood
|
0.122
|
0.293
|
0.416
|
0.677
|
|
MC_S
|
0.347
|
0.101
|
3.444
|
0.001
|
|
Cond_FormGum:MC_S
|
-0.063
|
0.147
|
-0.429
|
0.668
|
|
Cond_FormBear:MC_S
|
0.074
|
0.166
|
0.449
|
0.654
|
|
Cond_FormFood:MC_S
|
0.024
|
0.151
|
0.161
|
0.872
|
MC_S × Efficacy
m_mod_e <- lm(E_AVG ~ Cond_Form * MC_S, data = df)
summary(m_mod_e)$coefficients %>%
as.data.frame() %>% rownames_to_column("Term") %>%
mutate(across(where(is.numeric), ~round(., 3))) %>%
rename(b = Estimate, SE = `Std. Error`, t = `t value`, p = `Pr(>|t|)`) %>%
kable(caption = "Moderation: E_AVG ~ Format × MC_S") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Moderation: E_AVG ~ Format × MC_S
|
Term
|
b
|
SE
|
t
|
p
|
|
(Intercept)
|
1.020
|
0.140
|
7.304
|
0.000
|
|
Cond_FormGum
|
0.343
|
0.208
|
1.646
|
0.100
|
|
Cond_FormBear
|
0.192
|
0.244
|
0.787
|
0.432
|
|
Cond_FormFood
|
0.111
|
0.214
|
0.518
|
0.605
|
|
MC_S
|
0.199
|
0.074
|
2.702
|
0.007
|
|
Cond_FormGum:MC_S
|
0.083
|
0.108
|
0.771
|
0.441
|
|
Cond_FormBear:MC_S
|
0.160
|
0.121
|
1.318
|
0.188
|
|
Cond_FormFood:MC_S
|
0.080
|
0.111
|
0.723
|
0.470
|
Severity × Fair Price Plot (Pill vs. Bear)
df %>%
filter(Cond_Form %in% c("Pill", "Bear")) %>%
ggplot(aes(x = MC_S, y = FP_AVG, color = Cond_Form)) +
geom_smooth(method = "lm", se = TRUE, linewidth = 1.2) +
scale_color_manual(
values = c("Pill" = "#0072B2", "Bear" = "#CC79A7"),
labels = c("Pill" = "Pill", "Bear" = "Bear Gummy")
) +
labs(
title = "Effect of Perceived Severity on Fair Price\n(Pill vs. Bear Gummy)",
x = "Perceived Severity (MC_S)",
y = "Fair Price (FP_AVG)",
color = "Format"
) +
theme_classic(base_size = 13) +
theme(legend.position = "bottom", plot.title = element_text(hjust = 0.5))

Domain Knowledge as Moderator (Format × PI)
Rationale: Prior supplement intake (PI) is used as a
proxy for category familiarity. We test whether prior intake moderates
the effect of format on each DV. PI is mean-centered (range −3 to
+3).
cat("PI_c mean:", round(mean(df_cov$PI_c), 6),
"| SD:", round(sd(df_cov$PI_c), 3),
"| Range:", paste(round(range(df_cov$PI_c), 2), collapse = " to "), "\n")
## PI_c mean: 0 | SD: 1.767 | Range: -3.03 to 2.97
Domain Knowledge as Moderator (Format × PS)
Rationale: Prior sleep issues (PS) is used as a
second proxy for category familiarity/involvement. PS is mean-centered
(range −3 to +3).
cat("PS_c mean:", round(mean(df_cov$PS_c), 6),
"| SD:", round(sd(df_cov$PS_c), 3),
"| Range:", paste(round(range(df_cov$PS_c), 2), collapse = " to "), "\n")
## PS_c mean: 0 | SD: 2.047 | Range: -1.92 to 4.08
Summary of Key Findings
tibble(
DV = c("Risk", "Risk", "Efficacy", "Efficacy", "Fair Price", "Fair Price"),
Moderator = c("PI_c", "PS_c", "PI_c", "PS_c", "PI_c", "PS_c"),
`Main effect of format` = c("Yes***", "Yes***", "No", "No", "No", "No"),
`Main effect of moderator` = c("Yes*", "Yes***", "Yes**", "Yes**", "ns", "ns"),
`Significant interaction` = c(
"None",
"Bear × PS (p=.004), Food × PS (p=.032)",
"Food × PI (p=.019)",
"Run m_e_ps to confirm",
"Gum × PI (p=.013)",
"None (Bear marginal, p=.085)"
)
) %>%
kable(caption = "Summary: Format × Domain Knowledge Interactions Across DVs") %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Summary: Format × Domain Knowledge Interactions Across DVs
|
DV
|
Moderator
|
Main effect of format
|
Main effect of moderator
|
Significant interaction
|
|
Risk
|
PI_c
|
Yes***
|
Yes*
|
None
|
|
Risk
|
PS_c
|
Yes***
|
Yes***
|
Bear × PS (p=.004), Food × PS (p=.032)
|
|
Efficacy
|
PI_c
|
No
|
Yes**
|
Food × PI (p=.019)
|
|
Efficacy
|
PS_c
|
No
|
Yes**
|
Run m_e_ps to confirm
|
|
Fair Price
|
PI_c
|
No
|
ns
|
Gum × PI (p=.013)
|
|
Fair Price
|
PS_c
|
No
|
ns
|
None (Bear marginal, p=.085)
|
Bottom line: Prior category knowledge (PI, PS)
consistently amplifies the Pill format’s advantage — familiar consumers
find pills less risky, more efficacious, and worth paying more for.
Gummy formats neutralize or reverse this familiarity benefit, suggesting
format cues actively interfere with schema-based processing even in
experienced consumers.
Session Info
## R version 4.5.0 (2025-04-11)
## Platform: aarch64-apple-darwin20
## Running under: macOS Sonoma 14.5
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## time zone: America/Chicago
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] broom_1.0.12 kableExtra_1.4.0 knitr_1.50 emmeans_1.11.2
## [5] psych_2.5.6 lubridate_1.9.4 forcats_1.0.0 stringr_1.5.1
## [9] dplyr_1.1.4 purrr_1.0.4 readr_2.1.5 tidyr_1.3.1
## [13] tibble_3.2.1 ggplot2_3.5.2 tidyverse_2.0.0
##
## loaded via a namespace (and not attached):
## [1] gtable_0.3.6 xfun_0.52 bslib_0.9.0 lattice_0.22-6
## [5] tzdb_0.5.0 vctrs_0.6.5 tools_4.5.0 generics_0.1.3
## [9] parallel_4.5.0 sandwich_3.1-1 pkgconfig_2.0.3 Matrix_1.7-3
## [13] RColorBrewer_1.1-3 lifecycle_1.0.4 compiler_4.5.0 farver_2.1.2
## [17] textshaping_1.0.0 mnormt_2.1.1 codetools_0.2-20 htmltools_0.5.8.1
## [21] sass_0.4.10 yaml_2.3.10 crayon_1.5.3 pillar_1.10.2
## [25] jquerylib_0.1.4 MASS_7.3-65 cachem_1.1.0 multcomp_1.4-30
## [29] nlme_3.1-168 tidyselect_1.2.1 digest_0.6.37 mvtnorm_1.3-3
## [33] stringi_1.8.7 labeling_0.4.3 splines_4.5.0 fastmap_1.2.0
## [37] grid_4.5.0 cli_3.6.5 magrittr_2.0.3 survival_3.8-3
## [41] TH.data_1.1-5 withr_3.0.2 scales_1.4.0 backports_1.5.0
## [45] bit64_4.6.0-1 estimability_1.5.1 timechange_0.3.0 rmarkdown_2.29
## [49] bit_4.6.0 zoo_1.8-14 hms_1.1.3 coda_0.19-4.1
## [53] evaluate_1.0.3 viridisLite_0.4.2 mgcv_1.9-1 rlang_1.2.0
## [57] xtable_1.8-4 glue_1.8.0 xml2_1.3.8 svglite_2.2.1
## [61] rstudioapi_0.18.0 vroom_1.6.5 jsonlite_2.0.0 R6_2.6.1
## [65] systemfonts_1.2.3