2025-03-28

Author

Filippo Gambarota

Face processing

@Shimizu2024-xl analyzed the impact of the type and intensity of the facial expression on the detection accuracy.

This study examined the relationship between the intensity of emotional expressions in facial stimuli and receivers’ decoding accuracy for six basic emotions: anger, disgust, fear, happiness, sadness, and surprise. A laboratory experiment was conducted using the forced‐choice method, in which the intensity of each stimulus was manipulated at every 10% interval using the morphing technique. To explore whether a linear relationship would be observed when the intensity was finely manipulated at 10% intervals, a hierarchical multiple regression analysis was performed. The mean percentage of correct responses for each stimulus was the dependent variable, and the linear, quadratic, and cubic terms of the stimulus intensity were the independent variables. The results showed that the linear model was not adopted as the final model for all facial expressions; that is, the effect of the squared term of intensity was significant for anger, disgust, fear, and sadness, while the effect of the cubic term of intensity was significant for happiness and surprise. Our findings indicate that a higher intensity of emotional expression does not yield higher decoding accuracy.

Data are available on OSF

Script di pre-processing:

library(tidyverse)
library(lme4)
library(here)

# https://osf.io/zhtbj/?view_only=
# download.file("https://osf.io/download/tph5f/", "data-raw/emoint.csv")

dat <- read.csv(here("data-raw/emoint.csv"))

# conversion for responses
# 1 = neutral
# 2 = anger
# 3 = disgust
# 4 = fear
# 5 = happiness
# 6 = sadness
# 7 = surprise

resp_code <- c(
  "1" = "neutral",
  "2" = "anger",
  "3" = "disgust",
  "4" = "fear",
  "5" = "happiness",
  "6" = "sadness",
  "7" = "suprise"
)

emotion_code <- c(
  "fear" = "fear",
  "disop" = "disgust",
  "discl" = "disgust",
  "hap" = "happiness",
  "sad" = "sadness",
  "sur" = "suprise",
  "angcl" = "anger",
  "neutral" = "neutral"
)

dat_clean <- dat |> 
  pivot_longer(4:ncol(dat), values_to = "response") |> 
  separate(name, into = c("face", "emotion", "intensity"), sep = "_")  |>
  # intensity as number
  mutate(intensity = as.numeric(intensity)) |> 
  # neutral as maximal intensity, avoid NA
  mutate(intensity = ifelse(emotion == "neutral", 100, intensity))

names(dat_clean)[1:3] <- c("id", "gender", "age")

# recoding response with labels
# see https://adv-r.hadley.nz/subsetting.html?q=look#lookup-tables

dat_clean$response_lbl <- resp_code[dat_clean$response]

# recoding the displayed emotion as the response

dat_clean$emotion_lbl <- emotion_code[dat_clean$emotion]

# binary accuracy if emotion_lbl == response_lbl

dat_clean$acc <- as.integer(dat_clean$response_lbl == dat_clean$emotion_lbl)

head(dat_clean)
# A tibble: 6 × 10
     id gender age   face  emotion intensity response response_lbl emotion_lbl
  <int> <chr>  <chr> <chr> <chr>       <dbl>    <int> <chr>        <chr>      
1     1 f      32    f1    fear           60        4 fear         fear       
2     1 f      32    m3    disop          60        3 disgust      disgust    
3     1 f      32    m3    hap            70        5 happiness    happiness  
4     1 f      32    m1    hap           100        5 happiness    happiness  
5     1 f      32    m4    disop          60        6 sadness      disgust    
6     1 f      32    m1    fear           20        1 neutral      fear       
# ℹ 1 more variable: acc <int>
saveRDS(dat_clean, here("data/emoint.rds"))