# Setup
if (!require("dplyr")) install.packages("dplyr")
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
if (!require("ggplot2")) install.packages("ggplot2")
## Loading required package: ggplot2
if (!require("gt")) install.packages("gt")
## Loading required package: gt
if (!require("gtExtras")) install.packages("gtExtras")
## Loading required package: gtExtras
library(dplyr)
library(ggplot2)
library(gt)
library(gtExtras)

options(scipen = 999)
# Load Data
mydata <- read.csv("SandwichAd.csv") #Edit: TYPE YOUR DATA FILE'S NAME

mydata <- mydata %>%
  mutate(
    DV = Calories, #Edit: TYPE YOUR DEPENDENT VARIABLE'S NAME
    IV = Actor  #Edit: TYPE YOUR INDEPENDENT VARIABLE'S NAME
  )
# Histograms of DV per IV group with group means
# Calculate group means
group_means <- mydata %>%
  group_by(IV) %>%
  summarise(
    mean_DV = mean(DV, na.rm = TRUE),
    .groups = "drop"
  )

Graphic <- ggplot(mydata, aes(x = DV)) +
  geom_histogram(
    binwidth = diff(range(mydata$DV, na.rm = TRUE)) / 30,
    color = "black",
    fill = "#1f78b4",
    alpha = 0.7
  ) +
  geom_vline(
    data = group_means,
    aes(xintercept = mean_DV),
    color = "red",
    linetype = "dashed",
    linewidth = 1
  ) +
  facet_grid(IV ~ .) +
  labs(
    title = "DV Distributions by IV Group",
    x = "Dependent Variable",
    y = "Count"
  ) +
  theme_minimal()

# Show graphic
Graphic

# Descriptive Statistics
Descriptives <- mydata %>%
  group_by(IV) %>%
  summarise(
    count = n(),
    mean = mean(DV, na.rm = TRUE),
    sd = sd(DV, na.rm = TRUE),
    min = min(DV, na.rm = TRUE),
    max = max(DV, na.rm = TRUE),
    .groups = "drop"
  )

DescriptivesTable <- Descriptives %>%
  gt() %>%
  fmt_number(
    columns = c(mean, sd, min, max),
    decimals = 2
  ) %>%
  tab_header(
    title = "Descriptive Statistics",
    subtitle = "Summary statistics by group"
  ) %>%
  cols_label(
    IV = "Group",
    count = "N",
    mean = "Mean",
    sd = "Standard Deviation",
    min = "Minimum",
    max = "Maximum"
  )
# Normality Check (Shapiro-Wilk)
shapiro_summary <- mydata %>%
  group_by(IV) %>%
  summarise(
    W_statistic = shapiro.test(DV)$statistic,
    p_value = shapiro.test(DV)$p.value,
    .groups = "drop"
  )

ShapiroTable <- shapiro_summary %>%
  gt() %>%
  fmt_number(
    columns = c(W_statistic, p_value),
    decimals = 3
  ) %>%
  tab_header(
    title = "Shapiro-Wilk Normality Test Results",
    subtitle = "Tests of normality within each group"
  ) %>%
  cols_label(
    IV = "Group",
    W_statistic = "W Statistic",
    p_value = "p-value"
  ) %>%
  tab_source_note(
    source_note = md(
      "NOTE: If one or both of the p-values are less than .05 and if the groups are smaller than 40, the t-test's normality assumption may be violated, and you should use the Wilcoxon rank-sum test results instead of the t-test results."
    )
  )
# Inferential Tests
# Run Welch's t-test (default for two groups)
t_res <- t.test(
  DV ~ IV,
  data = mydata,
  var.equal = FALSE
)

# Run Wilcoxon rank-sum test
wilcox_res <- wilcox.test(
  DV ~ IV,
  data = mydata
)

# Create a tidy summary of t-test results
t_summary <- tibble(
  Group1 = levels(as.factor(mydata$IV))[1],
  Group2 = levels(as.factor(mydata$IV))[2],
  Mean1 = t_res$estimate[1],
  Mean2 = t_res$estimate[2],
  t = t_res$statistic,
  df = t_res$parameter,
  p = t_res$p.value,
  CI_low = t_res$conf.int[1],
  CI_high = t_res$conf.int[2]
)

# Create a tidy summary of Wilcoxon results
wilcox_summary <- tibble(
  Group1 = levels(as.factor(mydata$IV))[1],
  Group2 = levels(as.factor(mydata$IV))[2],
  W = wilcox_res$statistic,
  p = wilcox_res$p.value
)
# Present t-Test Results as gt Table
Table <- t_summary %>%
  gt() %>%
  fmt_number(
    columns = c(Mean1, Mean2, CI_low, CI_high),
    decimals = 2
  ) %>%
  fmt_number(
    columns = c(t, df, p),
    decimals = 3
  ) %>%
  tab_header(
    title = "Independent Samples t-Test Results",
    subtitle = "Welch's t-test (unequal variances assumed)"
  ) %>%
  cols_label(
    Group1 = "Group 1",
    Group2 = "Group 2",
    Mean1 = "Mean (Group 1)",
    Mean2 = "Mean (Group 2)",
    t = "t Statistic",
    df = "Degrees of Freedom",
    p = "p-value",
    CI_low = "95% CI (Lower)",
    CI_high = "95% CI (Upper)"
  )
# Present Wilcoxon Results as gt Table
WilcoxonTable <- wilcox_summary %>%
  gt() %>%
  fmt_number(
    columns = c(W, p),
    decimals = 3
  ) %>%
  tab_header(
    title = "Wilcoxon Rank-Sum Test Results",
    subtitle = "Nonparametric comparison of group distributions"
  ) %>%
  cols_label(
    Group1 = "Group 1",
    Group2 = "Group 2",
    W = "W Statistic",
    p = "p-value"
  )
# Visual Output
# Histogram
Graphic

# Descriptive statistics table
DescriptivesTable
Descriptive Statistics
Summary statistics by group
Group N Mean Standard Deviation Minimum Maximum
Buff 50 584.26 128.03 316.00 827.00
Dad bod 50 656.28 141.25 358.00 946.00
# Shapiro-Wilk table
ShapiroTable
Shapiro-Wilk Normality Test Results
Tests of normality within each group
Group W Statistic p-value
Buff 0.976 0.385
Dad bod 0.985 0.790
NOTE: If one or both of the p-values are less than .05 and if the groups are smaller than 40, the t-test’s normality assumption may be violated, and you should use the Wilcoxon rank-sum test results instead of the t-test results.
# Wilcoxon rank-sum table
WilcoxonTable
Wilcoxon Rank-Sum Test Results
Nonparametric comparison of group distributions
Group 1 Group 2 W Statistic p-value
Buff Dad bod 882.000 0.011
# Welch's t-test table
Table
Independent Samples t-Test Results
Welch's t-test (unequal variances assumed)
Group 1 Group 2 Mean (Group 1) Mean (Group 2) t Statistic Degrees of Freedom p-value 95% CI (Lower) 95% CI (Upper)
Buff Dad bod 584.26 656.28 −2.671 97.069 0.009 −125.53 −18.51