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
cat("\n")
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))

PROCESS Mediation (MC_S → FP_AVG)

# NOTE: Requires process.R sourced locally.
# Set eval=TRUE and run locally; not evaluated here for RPubs compatibility.

source("/Users/anjalisingh/Downloads/process.R")

# Pill vs. Round Gummy
process(data=df, y="FP_AVG", x="Gum_d",  m="MC_S", model=4, boot=5000, seed=42, conf=95)
# Pill vs. Bear Gummy
process(data=df, y="FP_AVG", x="Bear_d", m="MC_S", model=4, boot=5000, seed=42, conf=95)
# Pill vs. Orange Gummy
process(data=df, y="FP_AVG", x="Food_d", m="MC_S", model=4, boot=5000, seed=42, conf=95)
# Full multicategorical X
process(data=df, y="FP_AVG", x="Cond_Form", m="MC_S",
        model=4, mcx=1, boot=5000, seed=42, conf=95)

Note: PROCESS output set to eval=FALSE for RPubs. Run locally after sourcing process.R.


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

Format × PI on Risk

Regression

m_r_pi <- lm(R_AVG ~ Cond_Form * PI_c, data = df_cov)

summary(m_r_pi)$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: R_AVG ~ Format × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Moderation: R_AVG ~ Format × PI_c
Term b SE t p
(Intercept) -0.387 0.132 -2.934 0.004
Cond_FormGum -0.681 0.188 -3.620 0.000
Cond_FormBear -0.536 0.192 -2.795 0.005
Cond_FormFood -0.683 0.188 -3.640 0.000
PI_c -0.179 0.071 -2.523 0.012
Cond_FormGum:PI_c 0.104 0.106 0.981 0.327
Cond_FormBear:PI_c 0.132 0.105 1.257 0.209
Cond_FormFood:PI_c 0.042 0.106 0.393 0.694
confint(m_r_pi) %>%
  as.data.frame() %>% rownames_to_column("Term") %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "95% CIs: R_AVG ~ Format × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% CIs: R_AVG ~ Format × PI_c
Term 2.5 % 97.5 %
(Intercept) -0.646 -0.128
Cond_FormGum -1.050 -0.311
Cond_FormBear -0.912 -0.159
Cond_FormFood -1.051 -0.314
PI_c -0.319 -0.040
Cond_FormGum:PI_c -0.104 0.311
Cond_FormBear:PI_c -0.075 0.339
Cond_FormFood:PI_c -0.167 0.250

Simple Slopes

emtrends(m_r_pi, ~ Cond_Form, var = "PI_c") %>%
  summary() %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Simple Slopes of PI_c by Format: Risk") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Simple Slopes of PI_c by Format: Risk
Cond_Form PI_c.trend SE df lower.CL upper.CL
Pill -0.179 0.071 467 -0.319 -0.040
Gum -0.076 0.078 467 -0.229 0.078
Bear -0.047 0.078 467 -0.200 0.106
Food -0.138 0.079 467 -0.292 0.017
emtrends(m_r_pi, ~ Cond_Form, var = "PI_c") %>%
  pairs(adjust = "tukey") %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Pairwise Slope Differences: Risk × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Slope Differences: Risk × PI_c
contrast estimate SE df t.ratio p.value
Pill - Gum -0.104 0.106 467 -0.981 0.760
Pill - Bear -0.132 0.105 467 -1.257 0.591
Pill - Food -0.042 0.106 467 -0.393 0.979
Gum - Bear -0.029 0.110 467 -0.261 0.994
Gum - Food 0.062 0.111 467 0.558 0.944
Bear - Food 0.091 0.111 467 0.820 0.845

Plot

pi_sd <- sd(df_cov$PI_c, na.rm = TRUE)

plot_pi <- function(model, dv_label) {
  newdata <- expand.grid(Cond_Form = levels(df_cov$Cond_Form),
                         PI_c = c(-pi_sd, 0, pi_sd))
  newdata$pred     <- predict(model, newdata = newdata)
  newdata$PI_level <- factor(newdata$PI_c,
                              levels = c(-pi_sd, 0, pi_sd),
                              labels = c("Low (−1 SD)", "Mean", "High (+1 SD)"))
  ggplot(newdata, aes(x = PI_level, y = pred,
                      color = Cond_Form, group = Cond_Form)) +
    geom_line(linewidth = 1.1) + geom_point(size = 3.5) +
    scale_color_manual(values = cond_colors, labels = cond_labels) +
    labs(title = paste("Format × Prior Intake (PI) on", dv_label),
         x = "Prior Supplement Intake (PI_c)",
         y = paste("Predicted", dv_label), color = "Format") +
    theme_classic(base_size = 13) +
    theme(legend.position = "bottom", plot.title = element_text(hjust = 0.5))
}

plot_pi(m_r_pi, "Risk")

Format × PI on Efficacy

Regression

m_e_pi <- lm(E_AVG ~ Cond_Form * PI_c, data = df_cov)

summary(m_e_pi)$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 × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Moderation: E_AVG ~ Format × PI_c
Term b SE t p
(Intercept) 0.775 0.115 6.725 0.000
Cond_FormGum 0.205 0.164 1.246 0.213
Cond_FormBear -0.130 0.167 -0.776 0.438
Cond_FormFood -0.052 0.164 -0.316 0.752
PI_c 0.162 0.062 2.612 0.009
Cond_FormGum:PI_c -0.141 0.092 -1.527 0.127
Cond_FormBear:PI_c -0.033 0.092 -0.359 0.720
Cond_FormFood:PI_c -0.218 0.093 -2.354 0.019
confint(m_e_pi) %>%
  as.data.frame() %>% rownames_to_column("Term") %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "95% CIs: E_AVG ~ Format × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% CIs: E_AVG ~ Format × PI_c
Term 2.5 % 97.5 %
(Intercept) 0.549 1.002
Cond_FormGum -0.118 0.527
Cond_FormBear -0.459 0.199
Cond_FormFood -0.374 0.270
PI_c 0.040 0.284
Cond_FormGum:PI_c -0.322 0.040
Cond_FormBear:PI_c -0.214 0.148
Cond_FormFood:PI_c -0.400 -0.036

Simple Slopes

emtrends(m_e_pi, ~ Cond_Form, var = "PI_c") %>%
  summary() %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Simple Slopes of PI_c by Format: Efficacy") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Simple Slopes of PI_c by Format: Efficacy
Cond_Form PI_c.trend SE df lower.CL upper.CL
Pill 0.162 0.062 467 0.040 0.284
Gum 0.021 0.068 467 -0.113 0.155
Bear 0.129 0.068 467 -0.004 0.262
Food -0.056 0.069 467 -0.191 0.079
emtrends(m_e_pi, ~ Cond_Form, var = "PI_c") %>%
  pairs(adjust = "tukey") %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Pairwise Slope Differences: Efficacy × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Slope Differences: Efficacy × PI_c
contrast estimate SE df t.ratio p.value
Pill - Gum 0.141 0.092 467 1.527 0.422
Pill - Bear 0.033 0.092 467 0.359 0.984
Pill - Food 0.218 0.093 467 2.354 0.088
Gum - Bear -0.108 0.096 467 -1.121 0.677
Gum - Food 0.077 0.097 467 0.796 0.856
Bear - Food 0.185 0.097 467 1.915 0.223

Plot

plot_pi(m_e_pi, "Efficacy")

Key finding: Orange Gummy × PI_c significant (β = −0.218, p = .019). Prior intake boosts efficacy for Pill but not for Orange Gummy — the food schema overrides category knowledge.

Format × PI on Fair Price

Regression

m_fp_pi <- lm(FP_AVG ~ Cond_Form * PI_c, data = df_cov)

summary(m_fp_pi)$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 × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Moderation: FP_AVG ~ Format × PI_c
Term b SE t p
(Intercept) -0.361 0.157 -2.300 0.022
Cond_FormGum 0.261 0.224 1.168 0.243
Cond_FormBear -0.025 0.228 -0.109 0.913
Cond_FormFood -0.023 0.223 -0.103 0.918
PI_c 0.070 0.085 0.826 0.409
Cond_FormGum:PI_c -0.315 0.126 -2.505 0.013
Cond_FormBear:PI_c -0.184 0.125 -1.467 0.143
Cond_FormFood:PI_c -0.184 0.126 -1.454 0.147
confint(m_fp_pi) %>%
  as.data.frame() %>% rownames_to_column("Term") %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "95% CIs: FP_AVG ~ Format × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% CIs: FP_AVG ~ Format × PI_c
Term 2.5 % 97.5 %
(Intercept) -0.670 -0.053
Cond_FormGum -0.178 0.701
Cond_FormBear -0.473 0.424
Cond_FormFood -0.462 0.416
PI_c -0.096 0.236
Cond_FormGum:PI_c -0.562 -0.068
Cond_FormBear:PI_c -0.430 0.062
Cond_FormFood:PI_c -0.432 0.065

Simple Slopes

emtrends(m_fp_pi, ~ Cond_Form, var = "PI_c") %>%
  summary() %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Simple Slopes of PI_c by Format: Fair Price") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Simple Slopes of PI_c by Format: Fair Price
Cond_Form PI_c.trend SE df lower.CL upper.CL
Pill 0.070 0.085 467 -0.096 0.236
Gum -0.245 0.093 467 -0.428 -0.062
Bear -0.114 0.092 467 -0.296 0.068
Food -0.114 0.094 467 -0.298 0.070
emtrends(m_fp_pi, ~ Cond_Form, var = "PI_c") %>%
  pairs(adjust = "tukey") %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Pairwise Slope Differences: Fair Price × PI_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Slope Differences: Fair Price × PI_c
contrast estimate SE df t.ratio p.value
Pill - Gum 0.315 0.126 467 2.505 0.060
Pill - Bear 0.184 0.125 467 1.467 0.458
Pill - Food 0.184 0.126 467 1.454 0.466
Gum - Bear -0.131 0.131 467 -1.000 0.750
Gum - Food -0.131 0.132 467 -0.996 0.752
Bear - Food 0.000 0.132 467 -0.003 1.000

Plot

plot_pi(m_fp_pi, "Fair Price")

Key finding: Round Gummy × PI_c significant (β = −0.315, p = .013). Familiar consumers penalize the Round Gummy’s price — prior knowledge reduces willingness to pay a premium for a gummy format.


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

Format × PS on Risk

Regression

m_r_ps <- lm(R_AVG ~ Cond_Form * PS_c, data = df_cov)

summary(m_r_ps)$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: R_AVG ~ Format × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Moderation: R_AVG ~ Format × PS_c
Term b SE t p
(Intercept) -0.410 0.129 -3.175 0.002
Cond_FormGum -0.655 0.184 -3.559 0.000
Cond_FormBear -0.510 0.188 -2.708 0.007
Cond_FormFood -0.629 0.184 -3.421 0.001
PS_c -0.281 0.060 -4.655 0.000
Cond_FormGum:PS_c 0.130 0.090 1.439 0.151
Cond_FormBear:PS_c 0.262 0.091 2.894 0.004
Cond_FormFood:PS_c 0.189 0.088 2.153 0.032
confint(m_r_ps) %>%
  as.data.frame() %>% rownames_to_column("Term") %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "95% CIs: R_AVG ~ Format × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% CIs: R_AVG ~ Format × PS_c
Term 2.5 % 97.5 %
(Intercept) -0.664 -0.156
Cond_FormGum -1.017 -0.293
Cond_FormBear -0.880 -0.140
Cond_FormFood -0.989 -0.268
PS_c -0.400 -0.162
Cond_FormGum:PS_c -0.047 0.307
Cond_FormBear:PS_c 0.084 0.440
Cond_FormFood:PS_c 0.017 0.362

Simple Slopes

emtrends(m_r_ps, ~ Cond_Form, var = "PS_c") %>%
  summary() %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Simple Slopes of PS_c by Format: Risk") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Simple Slopes of PS_c by Format: Risk
Cond_Form PS_c.trend SE df lower.CL upper.CL
Pill -0.281 0.060 467 -0.400 -0.162
Gum -0.151 0.067 467 -0.283 -0.020
Bear -0.019 0.067 467 -0.152 0.114
Food -0.092 0.064 467 -0.217 0.034
emtrends(m_r_ps, ~ Cond_Form, var = "PS_c") %>%
  pairs(adjust = "tukey") %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Pairwise Slope Differences: Risk × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Slope Differences: Risk × PS_c
contrast estimate SE df t.ratio p.value
Pill - Gum -0.130 0.090 467 -1.439 0.476
Pill - Bear -0.262 0.091 467 -2.894 0.021
Pill - Food -0.189 0.088 467 -2.153 0.138
Gum - Bear -0.132 0.095 467 -1.392 0.505
Gum - Food -0.060 0.093 467 -0.644 0.918
Bear - Food 0.073 0.093 467 0.782 0.863

Plot

ps_sd <- sd(df_cov$PS_c, na.rm = TRUE)

plot_ps <- function(model, dv_label) {
  newdata <- expand.grid(Cond_Form = levels(df_cov$Cond_Form),
                         PS_c = c(-ps_sd, 0, ps_sd))
  newdata$pred     <- predict(model, newdata = newdata)
  newdata$PS_level <- factor(newdata$PS_c,
                              levels = c(-ps_sd, 0, ps_sd),
                              labels = c("Low (−1 SD)", "Mean", "High (+1 SD)"))
  ggplot(newdata, aes(x = PS_level, y = pred,
                      color = Cond_Form, group = Cond_Form)) +
    geom_line(linewidth = 1.1) + geom_point(size = 3.5) +
    scale_color_manual(values = cond_colors, labels = cond_labels) +
    labs(title = paste("Format × Prior Sleep Issues (PS) on", dv_label),
         x = "Prior Sleep Issues (PS_c)",
         y = paste("Predicted", dv_label), color = "Format") +
    theme_classic(base_size = 13) +
    theme(legend.position = "bottom", plot.title = element_text(hjust = 0.5))
}

plot_ps(m_r_ps, "Risk")

Key findings: PS_c main effect significant (β = −0.281, p < .001). Bear × PS_c (β = +0.262, p = .004) and Food × PS_c (β = +0.189, p = .032) significant — the risk-reducing effect of sleep history is attenuated for Bear and Orange Gummy formats.

Format × PS on Efficacy

Regression

m_e_ps <- lm(E_AVG ~ Cond_Form * PS_c, data = df_cov)

summary(m_e_ps)$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 × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Moderation: E_AVG ~ Format × PS_c
Term b SE t p
(Intercept) 0.795 0.114 6.979 0.000
Cond_FormGum 0.179 0.162 1.104 0.270
Cond_FormBear -0.147 0.166 -0.889 0.374
Cond_FormFood -0.082 0.162 -0.504 0.615
PS_c 0.155 0.053 2.908 0.004
Cond_FormGum:PS_c -0.060 0.079 -0.752 0.452
Cond_FormBear:PS_c -0.059 0.080 -0.739 0.460
Cond_FormFood:PS_c 0.000 0.077 0.002 0.998
confint(m_e_ps) %>%
  as.data.frame() %>% rownames_to_column("Term") %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "95% CIs: E_AVG ~ Format × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% CIs: E_AVG ~ Format × PS_c
Term 2.5 % 97.5 %
(Intercept) 0.571 1.019
Cond_FormGum -0.140 0.498
Cond_FormBear -0.473 0.178
Cond_FormFood -0.400 0.237
PS_c 0.050 0.259
Cond_FormGum:PS_c -0.216 0.096
Cond_FormBear:PS_c -0.216 0.098
Cond_FormFood:PS_c -0.152 0.152

Simple Slopes

emtrends(m_e_ps, ~ Cond_Form, var = "PS_c") %>%
  summary() %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Simple Slopes of PS_c by Format: Efficacy") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Simple Slopes of PS_c by Format: Efficacy
Cond_Form PS_c.trend SE df lower.CL upper.CL
Pill 0.155 0.053 467 0.050 0.259
Gum 0.095 0.059 467 -0.021 0.211
Bear 0.096 0.059 467 -0.021 0.213
Food 0.155 0.056 467 0.044 0.266
emtrends(m_e_ps, ~ Cond_Form, var = "PS_c") %>%
  pairs(adjust = "tukey") %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Pairwise Slope Differences: Efficacy × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Slope Differences: Efficacy × PS_c
contrast estimate SE df t.ratio p.value
Pill - Gum 0.060 0.079 467 0.752 0.876
Pill - Bear 0.059 0.080 467 0.739 0.881
Pill - Food 0.000 0.077 467 -0.002 1.000
Gum - Bear -0.001 0.084 467 -0.009 1.000
Gum - Food -0.060 0.082 467 -0.735 0.883
Bear - Food -0.059 0.082 467 -0.722 0.888

Plot

plot_ps(m_e_ps, "Efficacy")

Format × PS on Fair Price

Regression

m_fp_ps <- lm(FP_AVG ~ Cond_Form * PS_c, data = df_cov)

summary(m_fp_ps)$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 × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Moderation: FP_AVG ~ Format × PS_c
Term b SE t p
(Intercept) -0.352 0.158 -2.234 0.026
Cond_FormGum 0.213 0.225 0.946 0.344
Cond_FormBear -0.038 0.230 -0.163 0.870
Cond_FormFood -0.028 0.224 -0.123 0.902
PS_c 0.099 0.074 1.339 0.181
Cond_FormGum:PS_c -0.117 0.110 -1.067 0.287
Cond_FormBear:PS_c -0.191 0.110 -1.729 0.085
Cond_FormFood:PS_c 0.006 0.107 0.051 0.959
confint(m_fp_ps) %>%
  as.data.frame() %>% rownames_to_column("Term") %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "95% CIs: FP_AVG ~ Format × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
95% CIs: FP_AVG ~ Format × PS_c
Term 2.5 % 97.5 %
(Intercept) -0.662 -0.042
Cond_FormGum -0.229 0.654
Cond_FormBear -0.489 0.414
Cond_FormFood -0.468 0.413
PS_c -0.046 0.243
Cond_FormGum:PS_c -0.333 0.099
Cond_FormBear:PS_c -0.408 0.026
Cond_FormFood:PS_c -0.205 0.216

Simple Slopes

emtrends(m_fp_ps, ~ Cond_Form, var = "PS_c") %>%
  summary() %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Simple Slopes of PS_c by Format: Fair Price") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Simple Slopes of PS_c by Format: Fair Price
Cond_Form PS_c.trend SE df lower.CL upper.CL
Pill 0.099 0.074 467 -0.046 0.243
Gum -0.019 0.082 467 -0.179 0.142
Bear -0.092 0.082 467 -0.254 0.069
Food 0.104 0.078 467 -0.049 0.257
emtrends(m_fp_ps, ~ Cond_Form, var = "PS_c") %>%
  pairs(adjust = "tukey") %>%
  as.data.frame() %>%
  mutate(across(where(is.numeric), ~round(., 3))) %>%
  kable(caption = "Pairwise Slope Differences: Fair Price × PS_c") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Pairwise Slope Differences: Fair Price × PS_c
contrast estimate SE df t.ratio p.value
Pill - Gum 0.117 0.110 467 1.067 0.710
Pill - Bear 0.191 0.110 467 1.729 0.310
Pill - Food -0.006 0.107 467 -0.051 1.000
Gum - Bear 0.074 0.116 467 0.636 0.920
Gum - Food -0.123 0.113 467 -1.087 0.697
Bear - Food -0.196 0.113 467 -1.732 0.308

Plot

plot_ps(m_fp_ps, "Fair Price")

Takeaway: Overall model ns (p = .503). Bear × PS_c marginal (β = −0.191, p = .085). No significant moderation of fair price by sleep history.


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

sessionInfo()
## 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