Overview

The Elaboration Likelihood Model (ELM) holds that people can be persuaded along two routes. On the central route, people think carefully about the substance of a message, weighing evidence and arguments. On the peripheral route, people respond to surface cues, such as celebrity endorsements or attractive images, without much thought. The ELM predicts that attitude change produced through the central route tends to last longer than attitude change produced through the peripheral route.

This analysis asks whether digital eye-tracking data can support that prediction. Two hundred participants with no strong opinions about legalizing recreational marijuana in Tennessee spent 30 minutes browsing a realistic website for a made-up advocacy group while an eye tracker recorded where they looked. The tracker measured how many minutes each person spent viewing “high quality” persuasive information (summaries of medical studies, expert commentary, incarceration statistics, and tax revenue projections) rather than peripheral cues. One month later, participants were asked whether they favored or opposed legalization.

If the ELM is right, people who spent more time on the high-quality information should have been more likely to favor legalization a month later.

Hypothesis: The more time participants spent viewing high-quality persuasive information, the more likely they were to favor legalizing recreational marijuana one month later.

Methods

The dependent variable, Favor_1, records whether each participant favored legalization one month after the session (coded 1) or opposed it, was undecided, or declined to answer (coded 0). The independent variable, Minutes, is the number of minutes, out of 30, that the eye tracker recorded the participant looking at high-quality persuasive information.

Because the dependent variable has only two possible values and the independent variable is continuous, the hypothesis was tested with a binary logistic regression in R, using the logistic regression code from the R Data Analysis Guide. The Box-Tidwell procedure was used to check the assumption that the independent variable relates linearly to the log odds of the dependent variable. Because the logarithm of zero is undefined, the 10 participants who spent zero minutes on the high-quality information were excluded from that check, leaving 190 cases; all 200 participants were included in the main regression.

All data are fictional and were created for this exercise.

Results

Of the 200 participants, 98 (49%) favored legalization one month later, and 102 (51%) opposed it or were undecided. Participants spent an average of 14.7 minutes (SD = 8.45) viewing high-quality persuasive information. Those who later favored legalization averaged 19.1 minutes on the high-quality information, while those who did not averaged 10.5 minutes.

The figure below shows each participant’s viewing time and later opinion, along with the fitted logistic curve. The curve rises steadily from left to right: the more time participants spent on high-quality information, the higher their predicted probability of favoring legalization.

Logistic Regression Coefficients
Estimates, Standard Errors, and z Tests
term Estimate Std_Error Z_Value P_Value
(Intercept) −2.313 0.390 −5.935 0.0000
IV 0.155 0.024 6.411 0.0000

Time spent viewing high-quality persuasive information significantly predicted favoring legalization one month later (z = 6.41, p < .001). The odds ratio of 1.167 means that each additional minute spent on high-quality information was associated with about a 17% increase in the odds of favoring legalization.

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

The inflection point, where the predicted probability of favoring legalization reaches 50%, came at about 15 minutes, or half the session. Participants who spent more than about 15 minutes on high-quality information were more likely than not to favor legalization a month later, and those who spent less were more likely than not to oppose it or remain undecided.

Inflection Point of Logistic Curve
Value of IV where predicted probability = 0.50
Probability Inflection_Point
0.5 14.965

The Box-Tidwell interaction term was not statistically significant (p = .687), indicating that the linearity-of-the-logit assumption was met.

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

Discussion

The results support the hypothesis. Participants who spent more time with the website’s substantive content (medical research, expert opinion, incarceration figures, and revenue projections) were significantly more likely to favor legalization a full month after their visit. Those who spent more of their time on celebrity endorsements and images were less likely to report a favorable attitude.

This pattern fits the ELM’s claim that attitude change produced through the central route tends to persist. The eye tracker offers a more direct measure of central-route processing than self-reports, since it records what people actually looked at rather than what they remember or say they paid attention to.

Two limitations are worth noting. First, looking at information is not the same as thinking carefully about it. The analysis assumes, as the study design does, that viewing time reflects reading and processing, but a participant could have stared at a paragraph without absorbing it. Second, attitudes were measured only once, a month after the session. Without a measure taken immediately afterward, the analysis cannot show whether peripheral-route participants changed their minds briefly and then reverted, which is the contrast the ELM most directly predicts. A follow-up study measuring attitudes both right after exposure and a month later could test that contrast.

Code

The R code used to produce this analysis is shown below.

# Read the data from the web
FetchedData <- read.csv("https://github.com/drkblake/Data/raw/refs/heads/main/ELM.csv")
# Save the data on your computer
write.csv(FetchedData, "ELM.csv", row.names=FALSE)
# remove the data from the environment
rm (FetchedData)
# ------------------------------
# Install and load required packages
# ------------------------------
if (!require("tidyverse")) install.packages("tidyverse")
if (!require("gt")) install.packages("gt")
if (!require("gtExtras")) install.packages("gtExtras")
if (!require("plotly")) install.packages("plotly")

library(ggplot2)
library(dplyr)
library(gt)
library(gtExtras)
library(plotly)

# ------------------------------
# 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"
  )
# Coefficient table with z values, formatted like the template's other tables
z_results <- broom::tidy(log.ed) %>%
  select(term, estimate, std.error, statistic, p.value) %>%
  rename(Estimate = estimate,
         Std_Error = std.error,
         Z_Value = statistic,
         P_Value = p.value)

z_table <- z_results %>%
  gt() %>%
  fmt_number(columns = c(Estimate, Std_Error, Z_Value), decimals = 3) %>%
  fmt_number(columns = P_Value, decimals = 4) %>%
  tab_header(
    title = "Logistic Regression Coefficients",
    subtitle = "Estimates, Standard Errors, and z Tests"
  )

z_table