Belief Change Full Study Results

To-Do

# Clear environment and set working directory
rm(list = ls())
setwd("~/Downloads/beliefchange")

# Load required libraries
library(tidyverse)
Warning: package 'purrr' was built under R version 4.3.3
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.4     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(psych)

Attaching package: 'psych'

The following objects are masked from 'package:ggplot2':

    %+%, alpha
library(broom)
library(gt)
Warning: package 'gt' was built under R version 4.3.3
library(lubridate)
library(effectsize)
Warning: package 'effectsize' was built under R version 4.3.3

Attaching package: 'effectsize'

The following object is masked from 'package:psych':

    phi
library(labelled)
Warning: package 'labelled' was built under R version 4.3.3

1. Load and preprocess raw data

# Read raw file
raw <- read_csv("beliefchange_fullstudy.csv", col_names = FALSE)
Rows: 811 Columns: 102
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (102): X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15,...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Extract variable names and labels
varnames  <- raw |> slice(1) |> unlist() |> as.character()
varlabels <- raw |> slice(2) |> unlist() |> as.character()

# Apply names and labels
raw <- raw |>
  slice(-1:-3) |>
  set_names(varnames) |>
  set_variable_labels(.labels = setNames(varlabels, varnames))

df <- raw |>
  select(-socialissue) |>  # this var is only the last social issue ps received
  rename(condition = cond) |>  # Experimental condition
  mutate(
    StartDate = ymd_hms(StartDate),
    across(matches("(_believe|_honest|_genuine|_stick)$"), as.numeric),
    attn_check_8 = as.numeric(attn_check_8),
    age = as.numeric(age),
    gender = factor(gender,
                    levels = c("1","2","3","4"),
                    labels = c("Man","Woman","Nonbinary/Agender","Other")),
    political_party = factor(political_party,
                             levels = c("1","2","3","4"),
                             labels = c("Democrat","Republican",
                                        "Independent","None")),
    condition = factor(condition, 
                       levels = c("shortinfo", "longinfo", "shorttime", "longtime"),
                       labels = c("Small Amount of Info", "Large Amount of Info",
                                  "Small Reflection Time", "Large Reflection Time")),
    # Study 1 = Amount of Info ; Study 2 = Reflection Time
    study = if_else(str_detect(condition, "Info"), "Amount of Info", "Reflection Time"),
    amount = factor(if_else(str_detect(condition, "Small"), "Small", "Large"),
                    levels = c("Small", "Large")),
    # Genuineness indices for each social issue
    im_gidx = (im_believe + im_genuine + im_honest) / 3,
    ca_gidx = (ca_believe + ca_genuine + ca_honest) / 3,
    gc_gidx = (gc_believe + gc_genuine + gc_honest) / 3,
    dp_gidx = (dp_believe + dp_genuine + dp_honest) / 3,
    tr_gidx = (tr_believe + tr_genuine + tr_honest) / 3
  ) |>
  # remove test responses
  filter(DistributionChannel == "anonymous", prolific_id_1 != "test")

2. Check DV value counts

dv_counts <- df |>
  select(matches("^(im|ca|gc|tr|dp)_(believe|honest|genuine|stick)$")) |>
  pivot_longer(everything(), names_to = "variable", values_to = "value") |>
  mutate(value_label = case_when(
    is.na(value) ~ "missing",
    value %in% 1:7 ~ as.character(value),
    TRUE ~ "other"
  )) |>
  group_by(variable, value_label) |>
  summarise(count = n(), .groups = "drop") |>
  complete(
    variable,
    value_label = factor(c(as.character(1:7), "missing"), 
                         levels = c(as.character(1:7), "missing")),
    fill = list(count = 0)
  ) |>
  pivot_wider(names_from = value_label, 
              values_from = count, 
              names_sort = TRUE) |>
  mutate(total = rowSums(across(all_of(as.character(1:7))))) |>
  relocate(total, .after = variable) |>
  relocate(missing, .after = last_col())

dv_counts
# A tibble: 20 × 10
   variable   total   `1`   `2`   `3`   `4`   `5`   `6`   `7` missing
   <chr>      <dbl> <int> <int> <int> <int> <int> <int> <int>   <int>
 1 ca_believe   801    21    39    68   108   195   196   174       0
 2 ca_genuine   801    22    32    73   103   184   207   180       0
 3 ca_honest    801    20    34    63   105   186   215   178       0
 4 ca_stick     801    38    69    83   156   191   169    95       0
 5 dp_believe   801    27    35    77   102   190   187   183       0
 6 dp_genuine   801    31    31    55   113   196   184   191       0
 7 dp_honest    801    26    37    50   113   193   192   190       0
 8 dp_stick     801    46    54    85   166   178   171   101       0
 9 gc_believe   801    34    55    66   118   175   189   164       0
10 gc_genuine   801    32    47    71   109   185   187   170       0
11 gc_honest    801    32    49    69   102   179   192   178       0
12 gc_stick     801    60    79    88   165   178   121   110       0
13 im_believe   801    30    43    65   106   185   200   172       0
14 im_genuine   801    26    44    68   107   191   193   172       0
15 im_honest    801    21    44    60   117   182   205   172       0
16 im_stick     801    42    83    84   162   182   148   100       0
17 tr_believe   801    38    48    71   124   172   199   149       0
18 tr_genuine   801    41    47    75   106   178   196   158       0
19 tr_honest    801    39    43    71   109   177   200   162       0
20 tr_stick     801    62    81    86   180   162   131    99       0

Everything looks good—no missing values.

table(df$condition)

 Small Amount of Info  Large Amount of Info Small Reflection Time 
                  199                   201                   200 
Large Reflection Time 
                  201 
issue_long <- df |>
  mutate(
    Immigration          = rowSums(pick(starts_with("im_"))),
    `Gun Control`        = rowSums(pick(starts_with("gc_"))),
    `Climate Action`     = rowSums(pick(starts_with("ca_"))),
    `Death Penalty`      = rowSums(pick(starts_with("dp_"))),
    `Transgender Rights` = rowSums(pick(starts_with("tr_")))
  ) |>
  select(condition, `Immigration`:`Transgender Rights`) |>
  pivot_longer(-condition,
               names_to  = "socialissue_real")

# contingency table
table(issue_long$socialissue_real, issue_long$condition)
                    
                     Small Amount of Info Large Amount of Info
  Climate Action                      199                  201
  Death Penalty                       199                  201
  Gun Control                         199                  201
  Immigration                         199                  201
  Transgender Rights                  199                  201
                    
                     Small Reflection Time Large Reflection Time
  Climate Action                       200                   201
  Death Penalty                        200                   201
  Gun Control                          200                   201
  Immigration                          200                   201
  Transgender Rights                   200                   201

Remove people who failed the attention check

table(df$attn_check_8, useNA = "always")

   8    9   11   20   28   30   31   32   33   36   38   39   41   42   46   47 
   1    1    1    1    1    1    1    1    1    1    1    1    1    2    1    1 
  49   50   53   55   56   59   60   61   63   66   68   69   70   75   76   77 
   1    5    1    1    2    3    6    3    1    1    1    6    9    7    1    1 
  79   80   81   84   85   88   89   90   91   92   95   96   97   99  100 <NA> 
   5    6    4    1    3    3    2    9    2    1    2    2    1    9  685    0 
df <- df |>
  filter(attn_check_8 == 100)

3. Reshape for plotting/modeling

df_long <- df |>
  select(study, condition, amount, age, gender, political_party,
         matches("^(im|ca|gc|tr|dp)_(believe|honest|genuine|gidx|stick)$")) |>
  pivot_longer(
    cols = -c(study, condition, amount, age, gender, political_party),
    names_to = c("social_issue", "dv"),
    names_sep = "_",
    values_to = "response"
  ) |>
  mutate(
    dv = factor(recode(dv,
                       believe = "Believability", genuine = "Genuineness",
                       honest = "Honesty", gidx = "Genuineness Index",
                       stick = "Stick to New View"),
                levels = c("Believability", "Genuineness", "Honesty", 
                           "Genuineness Index", "Stick to New View")),
    social_issue = recode(social_issue,
                          im = "Immigration", gc = "Gun Control",
                          ca = "Climate Action", dp = "Death Penalty",
                          tr = "Transgender Rights"))

4. Histograms

4a. Individual items

means_df <- df_long |>
  group_by(study, dv, amount) |>
  summarise(mean_value =  mean(response), .groups = "drop")

ggplot(df_long |> filter(dv != "Genuineness Index") |> droplevels(), 
       aes(x = response, fill = amount, color = amount)) +
  geom_bar(position = "identity", alpha = 0.5, linewidth = 0.5, stat = "count") +
  geom_vline(
    data = means_df |> filter(dv != "Genuineness Index") |> droplevels(),
    aes(xintercept = mean_value, color = amount),
    linetype = "dashed",
    linewidth = 0.8,
    show.legend = FALSE
  ) +
  facet_grid(study ~ dv, drop = FALSE) +
  labs(
    x = "Response (1–7 Scale)",
    y = "Count",
    title = "Perceived Genuineness and Stability of Belief Change by Condition",
    subtitle = "Dashed vertical lines indicate mean response",
    fill = "Condition",
    color = "Condition"
  ) +
  theme_minimal(base_size = 12) +
  scale_x_continuous(breaks = 1:7)

6b. Cronbach’s Alpha

# ---- Genuineness index -------------------------------------------------
gidx_items <- df |>
  select(matches("_(genuine|honest|believe)$"))

gidx_alpha <- alpha(gidx_items)

gidx_alpha$total[["raw_alpha"]]  # quick numeric output
[1] 0.9647206
# Full printed report (includes item-total correlations, α if item dropped):
print(gidx_alpha)

Reliability analysis   
Call: alpha(x = gidx_items)

  raw_alpha std.alpha G6(smc) average_r S/N    ase mean  sd median_r
      0.96      0.96    0.99      0.65  27 0.0021  5.1 1.3     0.61

    95% confidence boundaries 
         lower alpha upper
Feldt     0.96  0.96  0.97
Duhachek  0.96  0.96  0.97

 Reliability if an item is dropped:
           raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
im_believe      0.96      0.96    0.99      0.65  25   0.0022 0.012  0.60
im_honest       0.96      0.96    0.99      0.65  25   0.0022 0.012  0.61
im_genuine      0.96      0.96    0.99      0.64  25   0.0022 0.012  0.60
gc_believe      0.96      0.96    0.99      0.65  26   0.0022 0.012  0.61
gc_honest       0.96      0.96    0.99      0.65  26   0.0022 0.012  0.61
gc_genuine      0.96      0.96    0.99      0.65  26   0.0022 0.012  0.61
ca_believe      0.96      0.96    0.99      0.65  26   0.0022 0.012  0.61
ca_honest       0.96      0.96    0.99      0.65  26   0.0022 0.012  0.61
ca_genuine      0.96      0.96    0.99      0.65  26   0.0022 0.011  0.61
dp_believe      0.96      0.96    0.99      0.65  26   0.0022 0.012  0.61
dp_honest       0.96      0.96    0.99      0.65  25   0.0022 0.012  0.61
dp_genuine      0.96      0.96    0.99      0.65  26   0.0022 0.011  0.61
tr_believe      0.96      0.96    0.99      0.65  26   0.0022 0.012  0.61
tr_honest       0.96      0.96    0.99      0.65  26   0.0022 0.012  0.61
tr_genuine      0.96      0.96    0.99      0.65  25   0.0022 0.012  0.61

 Item statistics 
             n raw.r std.r r.cor r.drop mean  sd
im_believe 685  0.83  0.83  0.82   0.80  5.1 1.6
im_honest  685  0.82  0.82  0.82   0.79  5.1 1.6
im_genuine 685  0.84  0.84  0.84   0.82  5.1 1.6
gc_believe 685  0.83  0.82  0.82   0.80  5.0 1.7
gc_honest  685  0.82  0.81  0.81   0.79  5.0 1.7
gc_genuine 685  0.82  0.82  0.81   0.79  5.0 1.7
ca_believe 685  0.81  0.81  0.81   0.78  5.2 1.6
ca_honest  685  0.81  0.81  0.81   0.78  5.2 1.5
ca_genuine 685  0.80  0.80  0.80   0.77  5.2 1.6
dp_believe 685  0.81  0.82  0.81   0.78  5.1 1.6
dp_honest  685  0.83  0.83  0.82   0.80  5.2 1.6
dp_genuine 685  0.80  0.80  0.79   0.77  5.2 1.6
tr_believe 685  0.82  0.82  0.81   0.79  4.9 1.7
tr_honest  685  0.82  0.81  0.81   0.78  5.0 1.7
tr_genuine 685  0.83  0.83  0.82   0.80  5.0 1.7

Non missing response frequency for each item
              1    2    3    4    5    6    7 miss
im_believe 0.04 0.05 0.08 0.14 0.22 0.25 0.22    0
im_honest  0.03 0.06 0.08 0.15 0.21 0.26 0.22    0
im_genuine 0.03 0.06 0.09 0.14 0.23 0.24 0.22    0
gc_believe 0.05 0.07 0.08 0.15 0.20 0.24 0.21    0
gc_honest  0.04 0.06 0.09 0.12 0.22 0.24 0.23    0
gc_genuine 0.04 0.06 0.08 0.14 0.21 0.23 0.22    0
ca_believe 0.03 0.05 0.08 0.13 0.24 0.24 0.23    0
ca_honest  0.03 0.04 0.08 0.13 0.23 0.27 0.24    0
ca_genuine 0.03 0.04 0.09 0.12 0.23 0.25 0.24    0
dp_believe 0.03 0.04 0.10 0.13 0.23 0.23 0.24    0
dp_honest  0.03 0.05 0.06 0.14 0.24 0.23 0.25    0
dp_genuine 0.04 0.04 0.07 0.14 0.24 0.23 0.25    0
tr_believe 0.05 0.06 0.09 0.15 0.21 0.25 0.19    0
tr_honest  0.05 0.06 0.09 0.13 0.22 0.24 0.21    0
tr_genuine 0.05 0.06 0.10 0.12 0.22 0.24 0.21    0

4b. Genuineness index

ggplot(df_long|> filter(dv == "Genuineness Index") |> droplevels(),
       aes(x = response, fill = amount, color = amount)) +
  geom_density(alpha = 0.5, linewidth = 1) +
  geom_vline(
    data = means_df |> filter(dv == "Genuineness Index") |> droplevels(),
    aes(xintercept = mean_value, color = amount),
    linetype = "dashed",
    linewidth = 0.8,
    show.legend = FALSE
  ) +
  facet_grid(study ~ dv, drop = FALSE) +
  labs(
    x = "Response (1–7 Scale)",
    y = "Density",
    title = "Perceived Genuineness (Index) of Belief Change by Condition",
    subtitle = "Smoothed densities with dashed vertical lines for mean response",
    fill = "Condition",
    color = "Condition"
  ) +
  theme_minimal(base_size = 12) +
  scale_x_continuous(breaks = 1:7) +
  theme(strip.text.x = element_blank())

5. Regressions and tables

# ───────────────────────────────────────────────────────────────
# 5.  Regression tables (items & index) --------------------------
# ───────────────────────────────────────────────────────────────

## helper · format gt table -------------------------------------
make_gt_table <- function(df, title_txt) {
  df |>
    gt() |>
    tab_header(
      title    = title_txt,
      subtitle = "Linear regression estimates with 95% confidence intervals"
    ) |>
    cols_label(
      Outcome                   = "Outcome",
      `Intercept (Control Avg)` = "Intercept (Control Avg)",
      Estimate                  = "Estimate",
      `95% CI`                  = "95% CI",
      `Std. Error`              = "Std. Error",
      `p-value`                 = "p-value",
      `Cohen's d`               = "Cohen's d"
    ) |>
    tab_source_note(md("\\*p < .05, \\*\\*p < .01, \\*\\*\\*p < .001")) |>
    tab_options(table.font.size = "small")
}

## helper · slope row + Cohen-d ---------------------------------
get_row <- function(dat, outcome_lbl, with_cov = FALSE) {
  fml <- if (with_cov)
    response ~ amount + age + gender + political_party
  else
    response ~ amount
  
  md  <- lm(fml, data = dat)
  td  <- tidy(md, conf.int = TRUE)
  slp <- td |> filter(grepl("^amount", term))
  int <- td |> filter(term == "(Intercept)")
  d   <- effectsize::cohens_d(response ~ relevel(amount, "Large"), data = dat)$Cohens_d
  
  tibble(
    Outcome                   = outcome_lbl,
    `Intercept (Control Avg)` = round(int$estimate, 2),
    estimate   = slp$estimate,
    conf.low   = slp$conf.low,
    conf.high  = slp$conf.high,
    std.error  = slp$std.error,
    p.value    = slp$p.value,
    `Cohen's d`= round(d, 2)
  )
}

## helper · build one study-specific table ----------------------
make_table <- function(study_lbl, outcomes, with_cov = FALSE) {
  df_long |>
    filter(study == study_lbl, dv %in% outcomes) |>
    group_by(dv) |>
    group_modify(~ get_row(.x, .y$dv, with_cov)) |>
    ungroup() |>
    mutate(
      Stars    = case_when(
                   p.value < .001 ~ "***",
                   p.value < .01  ~ "**",
                   p.value < .05  ~ "*",
                   TRUE           ~ ""),
      Estimate = paste0(round(estimate, 2), " ", Stars),
      `95% CI` = paste0("[", round(conf.low, 2), ", ", round(conf.high, 2), "]"),
      `Std. Error` = round(std.error, 2),
      `p-value`    = round(p.value, 3)
    ) |>
    select(Outcome, `Intercept (Control Avg)`, Estimate,
           `95% CI`, `Std. Error`, `p-value`, `Cohen's d`)
}

## outcome sets -------------------------------------------------
items_outcomes <- c("Believability", "Genuineness", 
                    "Honesty", "Stick to New View")

idx_outcomes   <- c("Genuineness Index", "Stick to New View")

## build eight gt tables ---------------------------------------
gt_info_items <- make_table("Amount of Info", items_outcomes) |> 
  make_gt_table("Large vs. Small Amount of Info: Genuineness (3 ITEMS) & Stability 
                (no controls)")

gt_info_items_ctl <- make_table("Amount of Info", items_outcomes, TRUE) |> 
  make_gt_table("Large vs. Small Amount of Info: Genuineness (3 ITEMS) & Stability 
                (w/ age, gender, & party controls)")

gt_info_idx <- make_table("Amount of Info", idx_outcomes) |> 
  make_gt_table("Large vs. Small Amount of Info: Genuineness (INDEX) & Stability 
                (no controls)")

gt_info_idx_ctl <- make_table("Amount of Info", idx_outcomes, TRUE) |> 
  make_gt_table("Large vs. Small Amount of Info: Genuineness (INDEX) & Stability 
                (w/ age, gender, & party controls)")

gt_time_items <- make_table("Reflection Time", items_outcomes) |>
  make_gt_table("Long vs. Brief Reflection Time: Genuineness (3 ITEMS) & Stability 
                (no controls)")

gt_time_items_ctl <- make_table("Reflection Time", items_outcomes, TRUE) |>
  make_gt_table("Long vs. Brief Reflection Time: Genuineness (3 ITEMS) & Stability 
                (w/ age, gender, & party controls)")

gt_time_idx <- make_table("Reflection Time", idx_outcomes) |> 
  make_gt_table("Long vs. Brief Reflection Time: Genuineness (INDEX) & Stability 
                (no controls)")

gt_time_idx_ctl <- make_table("Reflection Time", idx_outcomes, TRUE) |> 
  make_gt_table("Long vs. Brief Reflection Time: Genuineness (INDEX) & Stability 
                (w/ age, gender, & political controls)")

# ── display in Quarto ------------------------------------------
gt_info_items
Large vs. Small Amount of Info: Genuineness (3 ITEMS) & Stability (no controls)
Linear regression estimates with 95% confidence intervals
Outcome Intercept (Control Avg) Estimate 95% CI Std. Error p-value Cohen's d
Believability 4.86 0.5 *** [0.34, 0.65] 0.08 0 0.31
Genuineness 4.88 0.49 *** [0.34, 0.65] 0.08 0 0.31
Honesty 4.93 0.44 *** [0.29, 0.59] 0.08 0 0.28
Stick to New View 4.30 0.4 *** [0.24, 0.56] 0.08 0 0.24

*p < .05, **p < .01, ***p < .001

gt_info_items_ctl
Large vs. Small Amount of Info: Genuineness (3 ITEMS) & Stability (w/ age, gender, & party controls)
Linear regression estimates with 95% confidence intervals
Outcome Intercept (Control Avg) Estimate 95% CI Std. Error p-value Cohen's d
Believability 4.55 0.48 *** [0.33, 0.64] 0.08 0 0.31
Genuineness 4.63 0.49 *** [0.34, 0.64] 0.08 0 0.31
Honesty 4.50 0.44 *** [0.28, 0.59] 0.08 0 0.28
Stick to New View 3.99 0.39 *** [0.23, 0.55] 0.08 0 0.24

*p < .05, **p < .01, ***p < .001

gt_info_idx
Large vs. Small Amount of Info: Genuineness (INDEX) & Stability (no controls)
Linear regression estimates with 95% confidence intervals
Outcome Intercept (Control Avg) Estimate 95% CI Std. Error p-value Cohen's d
Genuineness Index 4.89 0.48 *** [0.33, 0.63] 0.08 0 0.31
Stick to New View 4.30 0.4 *** [0.24, 0.56] 0.08 0 0.24

*p < .05, **p < .01, ***p < .001

gt_info_idx_ctl
Large vs. Small Amount of Info: Genuineness (INDEX) & Stability (w/ age, gender, & party controls)
Linear regression estimates with 95% confidence intervals
Outcome Intercept (Control Avg) Estimate 95% CI Std. Error p-value Cohen's d
Genuineness Index 4.56 0.47 *** [0.32, 0.62] 0.08 0 0.31
Stick to New View 3.99 0.39 *** [0.23, 0.55] 0.08 0 0.24

*p < .05, **p < .01, ***p < .001

gt_time_items
Long vs. Brief Reflection Time: Genuineness (3 ITEMS) & Stability (no controls)
Linear regression estimates with 95% confidence intervals
Outcome Intercept (Control Avg) Estimate 95% CI Std. Error p-value Cohen's d
Believability 4.85 0.24 ** [0.09, 0.4] 0.08 0.002 0.15
Genuineness 4.90 0.23 ** [0.07, 0.39] 0.08 0.004 0.14
Honesty 4.96 0.19 * [0.04, 0.35] 0.08 0.015 0.12
Stick to New View 4.30 0.22 ** [0.05, 0.38] 0.08 0.009 0.13

*p < .05, **p < .01, ***p < .001

gt_time_items_ctl
Long vs. Brief Reflection Time: Genuineness (3 ITEMS) & Stability (w/ age, gender, & party controls)
Linear regression estimates with 95% confidence intervals
Outcome Intercept (Control Avg) Estimate 95% CI Std. Error p-value Cohen's d
Believability 4.36 0.22 ** [0.06, 0.38] 0.08 0.007 0.15
Genuineness 4.42 0.22 ** [0.06, 0.37] 0.08 0.008 0.14
Honesty 4.58 0.19 * [0.03, 0.34] 0.08 0.018 0.12
Stick to New View 3.95 0.17 * [0, 0.33] 0.08 0.047 0.13

*p < .05, **p < .01, ***p < .001

gt_time_idx
Long vs. Brief Reflection Time: Genuineness (INDEX) & Stability (no controls)
Linear regression estimates with 95% confidence intervals
Outcome Intercept (Control Avg) Estimate 95% CI Std. Error p-value Cohen's d
Genuineness Index 4.91 0.22 ** [0.07, 0.37] 0.08 0.004 0.14
Stick to New View 4.30 0.22 ** [0.05, 0.38] 0.08 0.009 0.13

*p < .05, **p < .01, ***p < .001

gt_time_idx_ctl
Long vs. Brief Reflection Time: Genuineness (INDEX) & Stability (w/ age, gender, & political controls)
Linear regression estimates with 95% confidence intervals
Outcome Intercept (Control Avg) Estimate 95% CI Std. Error p-value Cohen's d
Genuineness Index 4.45 0.21 ** [0.06, 0.36] 0.08 0.008 0.14
Stick to New View 3.95 0.17 * [0, 0.33] 0.08 0.047 0.13

*p < .05, **p < .01, ***p < .001

6. Appendix

6a. Seperating by social issue

Though less precision given smaller sample sizes.

means_df_socialissue <- df_long |>
  group_by(study, dv, amount, social_issue) |>
  summarise(mean_value =  mean(response), .groups = "drop")

ggplot(df_long |> filter(dv != "Genuineness Index") |> droplevels(), 
       aes(x = response, fill = amount, color = amount)) +
  geom_bar(position = "identity", alpha = 0.5, linewidth = 0.5, stat = "count") +
  geom_vline(
    data = means_df_socialissue |> filter(dv != "Genuineness Index") |> droplevels(),
    aes(xintercept = mean_value, color = amount),
    linetype = "dashed",
    linewidth = 0.8,
    show.legend = FALSE
  ) +
  facet_grid(social_issue ~ study + dv, drop = FALSE) +
  labs(
    x = "Response (1–7 Scale)",
    y = "Count",
    title = "Perceived Genuineness and Stability of Belief Change by Condition & Social Issue",
    subtitle = "Dashed vertical lines indicate mean response",
    fill = "Condition",
    color = "Condition"
  ) +
  theme_minimal(base_size = 12) +
  scale_x_continuous(breaks = 1:7)

ggplot(df_long|> filter(dv == "Genuineness Index") |> droplevels(),
       aes(x = response, fill = amount, color = amount)) +
  geom_density(alpha = 0.5, linewidth = 1) +
  geom_vline(
    data = means_df_socialissue |> filter(dv == "Genuineness Index") |> droplevels(),
    aes(xintercept = mean_value, color = amount),
    linetype = "dashed",
    linewidth = 0.8,
    show.legend = FALSE
  ) +
  facet_grid(social_issue ~ study + dv, 
             drop = FALSE, 
             labeller = labeller(dv = function(x) "")) +
  labs(
    x = "Response (1–7 Scale)",
    y = "Density",
    title = "Perceived Genuineness (Index) of Belief Change by Condition & Social Issue",
    subtitle = "Smoothed densities with dashed vertical lines for mean response",
    fill = "Condition",
    color = "Condition"
  ) +
  theme_minimal(base_size = 12) +
  scale_x_continuous(breaks = 1:7)