Rationale

The Elaboration Likelihood Model (ELM) says that when people carefully read strong arguments, they are more likely to form lasting attitudes. Eye-tracking gives us a way to measure how much attention participants actually give to high-quality arguments on the website. If the model is correct, more time looking at strong arguments should predict more support for legalization one month later.

Hypothesis

The more time participants spend looking at high-quality information, the more likely they are to support legalization after one month.

Variables and Methods

Independent Variable: Minutes — time spent looking at high-quality arguments.

Dependent Variable: Favor_1 — support for legalization after one month (1 = favor, 0 = oppose/undecided).

200 participants browsed a website with both high-quality arguments and peripheral cues.

Eye-tracking recorded minutes spent on high-quality content. One month later, participants reported whether they favored or opposed legalization.

Data are analyzed with logistic regression to see if more minutes predict higher odds of support.

Results

Logistic Regression Results
Odds Ratios with 95% Confidence Intervals
term Odds_Ratio CI_Lower CI_Upper P_Value
(Intercept) 0.099 0.044 0.205 0.0000
IV 1.167 1.116 1.227 0.0000
Linearity of the Logit Test (Box-Tidwell)
Interaction term indicates violation if significant
term Estimate Std_Error P_Value
(Intercept) −2.566 1.100 0.0196
IV 0.262 0.290 0.3657
IV_log −0.032 0.078 0.6869
Inflection Point of Logistic Curve
Value of IV where predicted probability = 0.50
Probability Inflection_Point
0.5 14.965

Code

# ------------------------------
# Read the data
# ------------------------------
mydata <- read.csv("ELM.csv") # <-- EDIT filename

# ################################################
# # (Optional) Remove specific case(es)s by row number
# ################################################
# # Example: remove rows 10 and 25
# rows_to_remove <- c(10, 25) # Edit and uncomment this line
# mydata <- mydata[-rows_to_remove, ] # Uncomment this line

# Specify dependent (DV) and independent (IV) variables
mydata$DV <- mydata$Favor_1   # <-- EDIT DV column
mydata$IV <- mydata$Minutes   # <-- EDIT IV column

# Ensure DV is binary numeric (0/1)
mydata$DV <- as.numeric(as.character(mydata$DV))


# ------------------------------
# Logistic regression plot 
# ------------------------------
logit_plot <- ggplot(mydata, aes(x = IV, y = DV)) +
  geom_point(alpha = 0.5) +   # scatterplot of observed data
  geom_smooth(method = "glm",
              method.args = list(family = "binomial"),
              se = FALSE,
              color = "#1f78b4") +
  labs(title = "Logistic Regression Curve",
       x = "Independent Variable (IV)",
       y = "Dependent Variable (DV)")

logit_plotly <- ggplotly(logit_plot)


# ------------------------------
# Run logistic regression
# ------------------------------
options(scipen = 999)
log.ed <- glm(DV ~ IV, data = mydata, family = "binomial")

# Extract coefficients and odds ratios
results <- broom::tidy(log.ed, conf.int = TRUE, exponentiate = TRUE) %>%
  select(term, estimate, conf.low, conf.high, p.value) %>%
  rename(Odds_Ratio = estimate,
         CI_Lower = conf.low,
         CI_Upper = conf.high,
         P_Value = p.value)

# Display results as a nice gt table
results_table <- results %>%
  gt() %>%
  fmt_number(columns = c(Odds_Ratio, CI_Lower, CI_Upper), decimals = 3) %>%
  fmt_number(columns = P_Value, decimals = 4) %>%
  tab_header(
    title = "Logistic Regression Results",
    subtitle = "Odds Ratios with 95% Confidence Intervals"
  )


# ------------------------------
# Check linearity of the logit (Box-Tidwell test)
# ------------------------------
# (Assumes IV > 0; shift IV if needed)
mydata$IV_log <- mydata$IV * log(mydata$IV)
linearity_test <- glm(DV ~ IV + IV_log, data = mydata, family = "binomial")

linearity_results <- broom::tidy(linearity_test) %>%
  select(term, estimate, std.error, p.value) %>%
  rename(Estimate = estimate,
         Std_Error = std.error,
         P_Value = p.value)

linearity_table <- linearity_results %>%
  gt() %>%
  fmt_number(columns = c(Estimate, Std_Error), decimals = 3) %>%
  fmt_number(columns = P_Value, decimals = 4) %>%
  tab_header(
    title = "Linearity of the Logit Test (Box-Tidwell)",
    subtitle = "Interaction term indicates violation if significant"
  )


# ------------------------------
# Calculate the inflection point (p = .50)
# ------------------------------
p <- 0.50
Inflection_point <- (log(p/(1-p)) - coef(log.ed)[1]) / coef(log.ed)[2]

inflection_table <- tibble(
  Probability = 0.5,
  Inflection_Point = Inflection_point
) %>%
  gt() %>%
  fmt_number(columns = Inflection_Point, decimals = 3) %>%
  tab_header(
    title = "Inflection Point of Logistic Curve",
    subtitle = "Value of IV where predicted probability = 0.50"
  )


# ------------------------------
# Outputs
# ------------------------------
# Interactive plot
logit_plotly

# Tables
results_table
linearity_table
inflection_table