Meta-analysis of the Interoceptive Accuracy Scale

Study 2

Code
library(tidyverse)
library(easystats)
library(patchwork)

Measures used

  • Note, GAD2 and PHQ2 were collapsed into phq4
  • PI-99 was collapsed into PI-18
  • STait-5 collapsed into STait-t
Code
library(gt)

# APA style ####
gt_apastyle <- function(gt_table, font.size=12) {
  gt_table  |> 
    gt::opt_table_lines(extent = "none") %>%
    gt::tab_options(
      heading.border.bottom.width = 2,
      heading.border.bottom.color = "black",
      heading.border.bottom.style = "solid",
      table.border.top.color = "black",
      table.border.top.style = "solid",
      table.border.top.width = 2,  
      table_body.hlines.color = "white",
      table_body.border.top.color = "black",
      table_body.border.top.style = "solid",
      table_body.border.top.width = 2,
      heading.title.font.size = font.size,
      table.font.size = font.size,
      heading.subtitle.font.size = font.size,
      table_body.border.bottom.color = "black",
      table_body.border.bottom.width = 2,
      table_body.border.bottom.style = "solid",
      column_labels.border.bottom.color = "black",
      column_labels.border.bottom.style = "solid",
      column_labels.border.bottom.width = 1,
      latex.use_longtable = FALSE
    ) |> 
      gt::opt_table_font(font = "times")
}


table <- data.frame(
  Questionnaire = c(
    # Interoception
    "Interoceptive Related", "MAIA-2", "BPQ-SF", "BPQ-VSF", "ICQ", "TAS-20", "BVAQ",
    # Mood/Anxiety
    "Mood", "BDI-II", "PHQ-4", "PHQ-9", "PHQ-15", "MFQ", "STAI-T", "GAD-7",
    # Personality
    "Personality", "NEO-FFI (neuroticism subscale)", "Mini IPIP6", "BFI-S",
    # Psychopathology
    "Psychopathology", "PID-5-SFF", "SPQ-BR", "MSI-BPD", "ASQ - Short",
    # Beliefs and Misbeliefs
    "Beliefs and Misbeliefs", "GCBS", "PI-18", "LIE scale"
  ),
  Number_of_Dimensions = c(
    "", 8, 2, 1, 3, 3, 5,
    "", 2, 2, 1, 1, 1, 1, 1,
    "", 1, 6, 5,
    "", 5, 9, 1, 5,
    "", 5, 3, 4
  ),
  Assessment = c(
    "", "Interoceptive awareness", "Body awareness and autonomic reactivity", "Body awareness", "Interoceptive confusion", "Alexithymia", "Alexithymia", 
    "", "Depressive symptoms severity", "Depression and Anxiety", "Depressive symptoms", "Somatic symptom distress", "Mood and affect", "Trait anxiety", "General anxiety disorder symptoms",
    "", "Neuroticism", "Personality traits", "Personality traits",
    "", "Maladaptive personality traits", "Schizotypy", "Borderline personality disorder", "Autistic traits",
    "", "Conspiracy beliefs", "Primal world beliefs", "Lying tendencies"
  ),
  Number_of_Items = c(
    "", 37, 46, 12, 20, 20, 40,
    "", 21, 4, 9, 15, 13, 20, 7,
    "", 12, 24, 10,
    "", 25, 32, 9, 28,
    "", 15, 18, 16
  ),
  Scoring = c(
    "", "6-point Likert scale", "5-point Likert scale", "5-point Likert scale", "5-point Likert scale", "5-point Likert scale", "5-point Likert scale",
    "", "4-point scale", "4-point Likert scale", "4-point Likert scale", "3-point scale", "3-point scale", "4-point Likert scale", "4-point Likert scale",
    "", "5-point Likert scale", "Visual analogue scales", "7-point Likert scale",
    "", "4-point Likert scale", "5-point Likert scale", "Dichotomous (yes/no)", "4-point Likert scale",
    "", "5-point Likert scale", "5-point Likert scale", "Visual analogue scales"
  ),
  Example_Items = c(
    # Interoception
    "", "I notice when I am uncomfortable in my body", "My heart often beats irregularily", "My mouth being dry", " I cannot tell when my muscles are sore or tight", "I have feelings I can't quite identify", "I like to tell others how I feel",
    #Mood
    "", "I feel sad much of the time","Little interest or pleasure in doing things", "Feeling tired or having little energy?", "Over the last week, how often have you been bothered by back pain?", "I felt miserable or unhappy", "I worry too much about something that really doesn't matter", "Not being able to stop or control worrying",
    # Personality
    "", "I often feel inferior to others", "Am the life of the party", "I see myself as someone who ...is considerate and kind to almost everyone", 
   # Psychopathology
    "", "Plenty of people are out to get me", "I am an odd, unusual person", "Have any of your closest relationships been troubled by a lot of arguments or repeated breakups?", "I find it difficult to work out people’s intentions",
   # Beliefs and Misbeliefs
    "", "Secret organizations communicate with extraterrestrials, but keep this fact from the public", "Nearly everything in the world is beautiful", "I am a good liar"
),
   stringsAsFactors = FALSE
)



table_apa <- table |> 
  gt() |>
  cols_align(align = c("right"), columns = "Scoring") |> 
  cols_label(Number_of_Dimensions = "Number of Dimensions", Number_of_Items = "Number of Items", Example_Items = "Example Items")  |>
  # tab_footnote("* Information taken from the sample description of relevant paper rather than recomputed.") 
  tab_style( style = list(cell_text(weight = "bold")), locations = cells_body(columns = Questionnaire, rows = Questionnaire %in% c("Interoceptive Related", "Mood", "Personality", "Psychopathology", "Beliefs and Misbeliefs")))
  
gt_apastyle(table_apa, font.size=12)
gtsave(gt_apastyle(table_apa, font.size=9), "figures/table2.tex")
saveRDS(table, "figures/table2.rds")

Data Preparation

Code
load("../data/data.RData")
load("../data/scores.RData")


df1a <- cbind(data$df1a, scores$sample1a)
df1b <- cbind(data$df1b, scores$sample1b)
df2 <- cbind(data$df2, scores$sample2)
df3 <- cbind(data$df3, scores$sample3)
df4 <- cbind(data$df4, scores$sample4)
df5 <- cbind(data$df5, scores$sample5)
df6 <- cbind(data$df6, scores$sample6)
df7a <- cbind(data$df7a, scores$sample7a)
df7b <- cbind(data$df7b, scores$sample7b)
df7c <- cbind(data$df7c, scores$sample7c)
df8a <- cbind(data$df8a, scores$sample8a)
df8b <- cbind(data$df8b, scores$sample8b)
df9 <- cbind(data$df9, scores$sample9)
df10 <- cbind(data$df10, scores$sample10)
df11 <- cbind(data$df11, scores$sample11)
df12 <- cbind(data$df12, scores$sample12)
df13 <- cbind(data$df13, scores$sample13)
df14 <- cbind(data$df14, scores$sample14)
df15 <- cbind(data$df15, scores$sample15)
df16 <- cbind(data$df16, scores$sample16)

vars_intero <- names(select(scores$sample1a, -Sample))

# names(df1a)
# names(df1b)
# names(df2)  #TAS(20 items), MAIA(37 items), ICQ (20 items), BPQ(46 items), BVAQ (40 items)
# names(df3)  # TAS (20), BPQ (46)
# names(df4)  # BPQ(26), PBCS (private bodily consciousness?), MAIA (37), BAQ (18), BRS (4)
# names(df5)  
# names(df6)  # PHQ2 (2 items), GAD2 (2 items), SSS8, IATS
# names(df7a)  # STAIT (20), MAIA(37), CES (not reported in the paper), FFMQ (39), NEOFFI (12)
# names(df7b)  # BPQ (12), PHQ15 (15), PHQ9 (9), MAIA (37), STAIT(20), 
# names(df7c)  # CI01 (not reported in the paper), TAS, BPQ, MAIA, ASI, ICQ  - no individual items
# names(df8a)  # EDI (10), BPQ (12)
# names(df8b)  # PHQ9 (9), PHQ15 (15), TAS (20)
# names(df9)  # ECR (Experience in Close Relationship Scale), TEAQ (touch experiences and attitudes questionnaire), STQ, TACSEN, UCLA, BFI (15), DBIA, BO, EQ
# names(df10)  # ASQ(28), BPD(9), GCBS (15), IPIP6 (24), LIE (16), MAIA(37), PHQ4 (4), PI (32), PID (25), SPQ (32)
# names(df11)  # PHQ4 (4), STAIT5 (5), BDI (21), MAIA (37)
# names(df12) # MAIA (37), PI (99), 
# names(df13) # PI (18), MAIA (37)
# names(df14) # MAIA(37), TAS  (20), MFQ(DEP, 13), STAI(ANX, 20)
# names(df15) 
# names(df16) # MAIA (37), GAD (7), PHQ9 (9)

Demographics

Gender

Code
pool_coef <- function(with = "Age", component = "Demographic", name = with, unequalrange=FALSE) {
  rez <- data.frame()
  for(intero in vars_intero) {
    data <- data.frame() 
    for(dataset in list(df1a, df1b, df2, df3, df4, 
                     df5, df6, df7a, df7b, df7c, 
                     df8a, df8b, df9, df10, df11, 
                     df12, df14, df15, df16)) {
      if (with %in% names(dataset)) {
        d <- dataset[c(with, intero, "Sample")]
        data <- rbind(data, d)
      }
    }
    
    
    # Make sure that min-max of "with" is the equal across all samples
    check <- summarize(data, 
                       min = min(!!sym(with), na.rm = TRUE),  
                       max = max(!!sym(with), na.rm = TRUE), .by = "Sample")
    if (with != "Gender" && (any(check$min != min(check$min)) || any(check$max != max(check$max)))) {
      if(unequalrange == FALSE) {
        print(check)
        stop(paste0("The range of '", with, "' is not equal across samples."))
      }
    }
    
    
    data <- standardize(data[complete.cases(data), ])

    if (with == "Gender") {
      data <- data[data$Gender != "Other",]
      data$Gender <- factor(data$Gender, levels = c("Male", "Female"))
      f <- as.formula(paste0(intero, "~", with, " + (", with, "|Sample)"))
      f2 <- as.formula(paste0(intero, "~", with, " + (1|Sample)"))
    } else {
      f <- as.formula(paste0(intero, "~", with, " + (", with, "|Sample)"))
      f2 <- as.formula(paste0(intero, "~", with, " + (1|Sample)"))
    }
    
    # if(length(unique(data$Sample)) == 1)
    m <- glmmTMB::glmmTMB(f, data = data)
    type <- "Full"
    if(!insight::is_converged(m)) {
      m <- glmmTMB::glmmTMB(f2, data = data)
      type <- "Reduced"
    }
    out <- parameters::parameters(m)[2, ] |> 
      select(r = Coefficient, CI_low, CI_high, p) |> 
      as.data.frame()
    out$var_Interoception <- intero
    out$var_Correlate <- with
    out$Component <- component
    out$Type <- type
    out$Converged <- insight::is_converged(m)
    out$N <- nrow(data)
    rez <- rbind(rez, out)
    
  }
  rez$var_Correlate <- name
  rez
}

data <- pool_coef(with = "Gender", component = "Demographic", name = "Gender (Female - Male)")

Age

Code
data <- rbind(data, pool_coef(with = "Age", component = "Demographic", unequalrange=TRUE))

Body

MAIA

Code
# names(df2)[str_detect(names(df2), "MAIA")]  
# names(df4)[str_detect(names(df4), "MAIA")]  # individual items
# names(df7a)[str_detect(names(df7a), "MAIA")]  
# names(df7b)[str_detect(names(df7b), "maia")] 
# names(df7c)[str_detect(names(df7c), "MAIA")]
# names(df10)[str_detect(names(df10), "MAIA")]
# names(df11)[str_detect(names(df11), "MAIA2")] # all columns with NA values 
# names(df12)[str_detect(names(df12), "MAIA")]
# names(df14)[str_detect(names(df15), "MAIA")]

data <- rbind(
  data,
  pool_coef(with = "MAIA_AttentionReg", component = "MAIA", name = "Attention Regulation", unequalrange=TRUE),
  pool_coef(with = "MAIA_BodyListening", component = "MAIA", name = "Listening", unequalrange=TRUE),
  pool_coef(with = "MAIA_Trusting", component = "MAIA", name = "Trusting", unequalrange=TRUE),
  pool_coef(with = "MAIA_EmoAwareness", component = "MAIA", name = "Emotional Awareness", unequalrange=TRUE),
  pool_coef(with = "MAIA_NotDistracting", component = "MAIA", name = "Not Distracting", unequalrange=TRUE),
  pool_coef(with = "MAIA_Noticing", component = "MAIA", name = "Noticing", unequalrange=TRUE),
  pool_coef(with = "MAIA_NotWorrying", component = "MAIA", name = "Not Worrying", unequalrange=TRUE),
  pool_coef(with = "MAIA_SelfReg", component = "MAIA", name = "Self Regulation", unequalrange=TRUE)
)

ICQ

Code
# names(df2)[str_detect(names(df2), "ICQ")] 
# names(df7c)[str_detect(names(df7c), "ICQ")] 

data <- rbind(data, pool_coef(with = "ICQ", component="Alexithymia", name = "ICQ", unequalrange=TRUE))

BPQ

Code
# df3$BPQ_BodyAwareness <- -1*normalize(df3$BPQ_BodyAwareness)
# df3$BPQ_AutonomicReactivity <- -1*normalize(df3$BPQ_AutonomicReactivity)
# names(df2)[str_detect(names(df2), "BPQ")]  # BPQ_R_Supra and _Sub?
# names(df3)[str_detect(names(df3), "BPQ")]  
# names(df4)[str_detect(names(df4), "BPQ")]   # individual items 1-26
# names(df7b)[str_detect(names(df7b), "BPQ")]  # BPQ sum
# names(df8a)[str_detect(names(df8a), "BPQ")]  # individual items


data <- rbind(
  data,
  pool_coef(with = "BPQ_BodyAwareness", component="BPQ", name = "Body Awareness (BPQ)",unequalrange=TRUE),
  pool_coef(with = "BPQ_AutonomicReactivity", component="BPQ", name = "Autonomic Reactivity (BPQ)",unequalrange=TRUE)
  )

Alexithymia

Code
#  only one study assess alexithymia with BVAQ (df2)
# names(df2)[str_detect(names(df2), "TAS", "BVAQ)]
# names(df3)[str_starts(names(df3), "TAS")]
# names(df7c)[str_starts(names(df7c), "TAS")]
# names(df8b)[str_starts(names(df8b), "TAS")]
# names(df14)[str_starts(names(df14), "TAS")] 


data <- rbind(
  data,
  pool_coef(with = "TAS_DIF", component="Alexithymia", name = "Difficulties Identifying Feelings (TAS)", unequalrange=TRUE),
  pool_coef(with = "TAS_DDF", component="Alexithymia", name = "Difficulties Describing Feelings (TAS)", unequalrange=TRUE),
  pool_coef(with = "TAS_EOT", component="Alexithymia", name = "External Thinking (TAS)",unequalrange=TRUE),
  pool_coef(with = "BVAQ_Affective", component="Alexithymia", name = "Affective (BVAQ)"), 
  pool_coef(with = "BVAQ_Cognitive", component="Alexithymia", name = "Cognitive (BVAQ)")
)

Mood

Depression

Code
# names(df6)[str_detect(names(df6), "PHQ")] 
# names(df7b)[str_detect(names(df7b), "PHQ")]
# names(df7c)[str_detect(names(df7c), "BDI")]
# names(df8b)[str_detect(names(df8b), "PHQ")]
# names(df9)
# names(df14)

data <- rbind(
  data,
  pool_coef(with = "PHQ15_Sum", component="Mood", name = "Somatic Concerns (PHQ-15)",unequalrange=TRUE), 
  pool_coef(with = "PHQ9_Sum", component="Mood", name = "Depression (PHQ-9)",unequalrange=TRUE), 
  pool_coef(with = "BDI_Sum", component="Mood", name = "Depression (BDI)"), 
  pool_coef(with = "PHQ4_Depression", component="Mood", name = "Depression (PHQ-4)"),
  pool_coef(with = "DEP", component = "Mood", name = "Depression (MFQ)")
)

Anxiety

Code
# names(df6)[str_detect(names(df6), "GAD")] 
# names(df7a)[str_detect(names(df7a), "STAI")] 
# names(df7b)[str_detect(names(df7b), "STAI")] 
# names(df7c)[str_detect(names(df7c), "STAI")]
# names(df10)[]
# names(df11)[str_detect(names(df11), "STAI")] 
# names(df14)[str_detect(names(df14), "ANX")] # anx = stai-t


data <- rbind(
  data,
  pool_coef(with = "STAIT_Mean", component="Mood", name = "Anxiety (STAI-T)",unequalrange=TRUE), 
  pool_coef(with = "PHQ4_Anxiety", component="Mood", name = "Anxiety (PHQ-4)"),
  pool_coef(with = "GAD7_Sum", component="Mood", name = "Anxiety (GAD-7)")
)

Psychopathology

Code
data <- rbind(
  data,
  pool_coef(with = "BPD", component="Mood", name = "Boderline Personality")
)
Code
data <- rbind(
  data,
  pool_coef(with = "PID5_Antagonism", component="Maladaptive", name = "Antagonism"),
  pool_coef(with = "PID5_Detachment", component="Maladaptive", name = "Detachment"), 
  pool_coef(with = "PID5_Disinhibition", component="Maladaptive", name = "Disinhibition"),
  pool_coef(with = "PID5_NegativeAffect", component="Maladaptive", name = "Negative Affect"),
  pool_coef(with = "PID5_Psychoticism", component="Maladaptive", name = "Psychoticism")
)
Code
data <- rbind(
  data,
  pool_coef(with = "SPQ_ConstrictedAffect", component="Schizotypic", name = "Constricted Affect"),
  pool_coef(with = "SPQ_Eccentric", component="Schizotypic", name = "Eccentric"),
  pool_coef(with = "SPQ_MagicalThinking", component="Schizotypic", name = "Magical Thinking"),
  pool_coef(with = "SPQ_NoCloseFriends", component="Schizotypic", name = "No Close Friends"),
  pool_coef(with = "SPQ_OddSpeech", component="Schizotypic", name = "Odd Speech"),
  pool_coef(with = "SPQ_Reference", component="Schizotypic", name = "Reference"),
  pool_coef(with = "SPQ_SocialAnxiety", component="Schizotypic", name = "Social Anxiety"),
  pool_coef(with = "SPQ_Suspiciousness", component="Schizotypic", name = "Suspiciousness"),
  pool_coef(with = "SPQ_UnusualPerceptions", component="Schizotypic", name = "Unusual Perceptions")
)
Code
#  names(select(df10, starts_with("ASQ")))

data <- rbind(
  data,
  pool_coef(with = "ASQ_Imagination", component="Autistic", name = "Imagination"),
  pool_coef(with = "ASQ_LackSocialSkills", component="Autistic", name = "Lack of Social Skills"), 
  pool_coef(with = "ASQ_LowAttentionalSwitching", component="Autistic", name = "Low Attentional Switching"),
  pool_coef(with = "ASQ_Patterns", component="Autistic", name = "Patterns and Numbers"),
  pool_coef(with = "ASQ_Routine", component="Autistic", name = "Routines")
)

Personality

Code
# names(df7a)[str_detect(names(df7a), "NEO")]
# names(df9)[str_detect(names(df9), "BFI_")]
# names(df10)[str_detect(names(df10), "IPIP6_")]


data <- rbind(
  data,
  pool_coef(with = "Neuroticism", component = "Personality", name = "Neuroticism",unequalrange=TRUE),
  pool_coef(with = "Agreeableness", component="Personality", name = "Agreeableness",unequalrange=TRUE),
  pool_coef(with = "Conscientiousness", component="Personality", name = "Conscientiousness",unequalrange=TRUE), 
  pool_coef(with = "Openness", component="Personality", name = "Openness",unequalrange=TRUE),
  pool_coef(with = "Extraversion", component="Personality", name = "Extraversion", unequalrange=TRUE),
  pool_coef(with = "HonestyHumility", component="Personality", name = "Honesty-Humility",unequalrange=TRUE)
)

Others

Code
# names(df10)[str_detect(names(df10), "PI_Alive")]
# names(df12)[str_detect(names(df12), "PI_Alive")]
# names(df13)[str_detect(names(df13), "PI_Alive")]

# data <- rbind(
#   data, 
#   pool_coef(with = "PI_Alive", component="World Beliefs", name = "Alive", unequalrange=TRUE))

data <- rbind(
  data,
  pool_coef(with = "PI_Alive", component="World Beliefs", name = "Alive", unequalrange=TRUE),
  pool_coef(with = "PI_Changing", component="World Beliefs", name = "Changing", unequalrange=TRUE),
  pool_coef(with = "PI_Enticing", component="World Beliefs", name = "Enticing", unequalrange=TRUE),
  pool_coef(with = "PI_Good", component="World Beliefs", name = "Good", unequalrange=TRUE),
  pool_coef(with = "PI_Hierarchical", component="World Beliefs", name = "Hierarchical", unequalrange=TRUE),
  pool_coef(with = "PI_Safe", component="World Beliefs", name = "Safe",unequalrange=TRUE),
  pool_coef(with = "PI_Understandable", component="World Beliefs", name = "Understandable",unequalrange=TRUE)
)
Code
data <- rbind(
  data,
  pool_coef(with = "GCBS_Extraterrestrial", component="Conspiracy Beliefs", name = "Extraterrestrial"),
  pool_coef(with = "GCBS_GlobalConspiracies", component="Conspiracy Beliefs", name = "Global Conspiracies"),
  pool_coef(with = "GCBS_GovernmentMalfeasance", component="Conspiracy Beliefs", name  = "Government Malfeasance"),
  pool_coef(with = "GCBS_InformationControl", component="Conspiracy Beliefs", name = "Information Control"),
  pool_coef(with = "GCBS_PersonalWellbeing", component="Conspiracy Beliefs", name = "Personal Wellbeing")
)
Code
data <- rbind(
  data,
  pool_coef(with = "LIE_Ability", component="Lying Profile", name = "Ability"),
  pool_coef(with = "LIE_Frequency", component="Lying Profile", name = "Frequency"),
  pool_coef(with = "LIE_Contextuality", component="Lying Profile", name = "Contextuality"),
  pool_coef(with = "LIE_Negativity", component="Lying Profile", name = "Negativity")
)

Average Correlations

  • BPQ - sf - Body perception questionnaire short form
  • BPQ - vsf - Body perception questionnaire very short form
  • BVAQ - Bermond–Vorst Alexithymia Questionnaire
  • MAIA-2 - Multidimensional Assessment of Interoceptive Awareness , Version-2
  • ICQ - Interocpetive Confusion Questionnaire
  • TAS - Toronto Alexithymia Scale
  • BAQ - Body awareness questionnaire
  • PHQ-2 - Patient Health Questionnaire 2 items on major depressive episodes
  • PHQ-4 - atient Health Questionnaire 4 items assessing anxiety and depression
  • PHQ-9 - Patient Health Questionnaire 9-Item Version assesses depressive symptoms
  • PHQ-15 - Patient Health Questionnaire 15-Item Version assesses Somatic symptom distress
  • GAD-2 - Generalized Anxiety Disorder Scale 2 items on anxiety disorder
  • STAIT - State-Trait-Anxiety Inventory Trait subscale
  • FFMQ - Observation and Description subscales of the Five Facet Mindfulness Questionnaire
  • NEOFFI - Neuroticism Neo Five-Factor Inventory Neuroticism subscale
  • BDI - The Beck Depression Inventory
  • BFI - Big Five inventory-10
  • ASQ - Autism-Spectrum Quotient
  • GCB - Generic Conspiracist Beliefs scale
  • IPIP6 - Mini International Personality Item Pool
  • PI - Primal Inventory 18 items and 99 items
  • PID5-sf - Personality Inventory for DSM-5 Short Form
  • SPQ-BRU - Schizotypal Personality Questionnaire, brief revised updated
  • LIE - Lying Profile Questionnaire
Code
# names(df1a)
# names(df1b)
# names(df2)  #TAS, MAIA, ICQ, BPQ, BVAQ
# names(df3)  # TAS, BPQ
# names(df4)  # BPQ, PBCS (private bodily consciousness?), MAIA, BAQ, BRS
# names(df5)  
# names(df6)  # PHQ2, GAD2, SSS8, IATS
# names(df7a)  # STAIT, MAIA, CES (not reported in the paper), FFMQ, NEOFFI
# names(df7b)  # BPQ, PHQ15, PHQ9, MAIA, STAIT, 
# names(df7c)  # CI01 (not reported in the paper), TAS, BPQ, MAIA, ASI, ICQ 
# names(df8a)  # EDI, BPQ
# names(df8b)  # PHQ9, PHQ15, TAS
# names(df9)  # ECR (Experience in Close Relationship Scale), TEAQ (touch experiences and attitudes questionnaire), STQ, TACSEN, UCLA, BFI, DBIA, BO, EQ
# names(df10)  # ASQ, BPD, GCBS, IPIP6, LIE, MAIA, PHQ4, PI, PID, SPQ
# names(df11)  # PHQ4, STAIT5, BDI, MAIA
# names(df12) # MAIA, PI, 
# names(df14) # MAIA, TAS, MFQ(DEP), STAI(ANX)
# names(df15) #
# names(df16) # 

average_corr <- data |>
  summarise(min_r = min(r, na.rm = TRUE), 
            mean_r = mean(r, na.rm = TRUE),
            max_r = max(r, na.rm = TRUE), 
            Max = var_Interoception[which.max(abs(r))],
            .by=c("Component", "var_Correlate")) 
  
sort(table(average_corr$Max), decreasing = TRUE)

       Original   HungryThirsty     BruiseBlood     MusclesPain UrinateDefecate 
             25              16              11               7               3 
 BreathingHeart     CoughSneeze        WindBurp 
              2               2               2 
Code
average_corr <- data |>
  summarise(
    min_r = min(r, na.rm = TRUE), 
    mean_r = mean(r, na.rm = TRUE),
    max_r = max(r, na.rm = TRUE), 
    Max = var_Interoception[which.max(abs(r))],
    n_sig_001 = sum(p < .001, na.rm = TRUE),
    n_sig_01  = sum(p < .01 & p >= .001, na.rm = TRUE),
    n_ns      = sum(p >= .01 | is.na(p)),
    total     = dplyr::n(),
    .by=c("Component", "var_Correlate")
  ) |>
  mutate(
    perc_sig = (n_sig_001 + n_sig_01) / total
  )
sort(table(average_corr$Max), decreasing = TRUE)

       Original   HungryThirsty     BruiseBlood     MusclesPain UrinateDefecate 
             25              16              11               7               3 
 BreathingHeart     CoughSneeze        WindBurp 
              2               2               2 
Code
average_corr |> 
  gt::gt() |> 
  gt::data_color(
    columns = c(mean_r, min_r, max_r),
    palette = c("#2196F3", "white", "#FF5722"),
    domain = c(-0.7, 0, 0.7)
  ) |>
  gt::data_color(
    columns = c(Component, Max)
  ) |> 
  gt::fmt_auto()
Warning: Some values were outside the color scale and will be treated as NA
Component var_Correlate min_r mean_r max_r Max n_sig_001 n_sig_01 n_ns total perc_sig
Demographic Gender (Female - Male) −0.138 −0.011 0.066 HungryThirsty 0.625
Demographic Age 0.028  0.123 0.182 Original 1    
MAIA Attention Regulation 0.153  0.249 0.369 Original 1    
MAIA Listening 0.086  0.176 0.268 BruiseBlood 1    
MAIA Trusting 0.147  0.236 0.357 Original 1    
MAIA Emotional Awareness 0.132  0.197 0.296 Original 1    
MAIA Not Distracting 0.019  0.06  0.126 HungryThirsty 0.5  
MAIA Noticing 0.157  0.259 0.389 Original 1    
MAIA Not Worrying −0.009  0.039 0.102 UrinateDefecate 0.375
MAIA Self Regulation 0.087  0.189 0.274 Original 1    
Alexithymia ICQ −0.479 −0.316 −0.202 Original 1    
BPQ Body Awareness (BPQ) 0.071  0.122 0.175 Original 0.25 
BPQ Autonomic Reactivity (BPQ) −0.251 −0.173 −0.011 UrinateDefecate 0.875
Alexithymia Difficulties Identifying Feelings (TAS) −0.318 −0.211 −0.141 Original 1    
Alexithymia Difficulties Describing Feelings (TAS) −0.244 −0.15  −0.111 Original 1    
Alexithymia External Thinking (TAS) −0.128 −0.081 −0.023 Original 0.75 
Alexithymia Affective (BVAQ) −0.036  0.042 0.159 BruiseBlood 0.125
Alexithymia Cognitive (BVAQ) −0.303 −0.2   −0.105 Original 1    
Mood Somatic Concerns (PHQ-15) −0.269 −0.128 −0.024 HungryThirsty 0.75 
Mood Depression (PHQ-9) −1.548 −0.619 −0.067 Original 0.25 
Mood Depression (BDI) −0.342 −0.204 −0.134 HungryThirsty 1    
Mood Depression (PHQ-4) −0.196 −0.094 −0.038 HungryThirsty 0.75 
Mood Depression (MFQ) −0.345 −0.139 −0.007 BreathingHeart 0.125
Mood Anxiety (STAI-T) −0.322 −0.189 −0.09 HungryThirsty 1    
Mood Anxiety (PHQ-4) −0.208 −0.103 −0.017 HungryThirsty 0.875
Mood Anxiety (GAD-7) −0.374 −0.187 −0.098 HungryThirsty 0.625
Mood Boderline Personality −0.14 −0.061 0.022 HungryThirsty 0.125
Maladaptive Antagonism −0.082 −0.024 0.141 BruiseBlood 0.125
Maladaptive Detachment −0.167 −0.081 0.004 HungryThirsty 0.5  
Maladaptive Disinhibition −0.065 −0.016 0.069 BruiseBlood 0    
Maladaptive Negative Affect −0.153 −0.111 −0.024 Original 0.625
Maladaptive Psychoticism −0.173 −0.091 0.002 MusclesPain 0.375
Schizotypic Constricted Affect −0.146 −0.085 −0.009 Original 0.375
Schizotypic Eccentric −0.138 −0.081 −0.034 HungryThirsty 0.25 
Schizotypic Magical Thinking −0.05  0.02  0.078 BruiseBlood 0    
Schizotypic No Close Friends −0.172 −0.122 −0.062 Original 0.5  
Schizotypic Odd Speech −0.15 −0.089 −4.804 × 10−4 HungryThirsty 0.25 
Schizotypic Reference −0.111 −0.041 0.023 MusclesPain 0    
Schizotypic Social Anxiety −0.192 −0.111 −0.023 BruiseBlood 0.375
Schizotypic Suspiciousness −0.081 −0.038 0.017 WindBurp 0    
Schizotypic Unusual Perceptions −0.141 −0.068 0.053 MusclesPain 0.25 
Autistic Imagination −0.28 −0.184 −0.114 Original 0.875
Autistic Lack of Social Skills −0.189 −0.119 −0.04 Original 0.625
Autistic Low Attentional Switching −0.225 −0.143 −0.026 Original 0.625
Autistic Patterns and Numbers −0.064  0.005 0.083 BruiseBlood 0    
Autistic Routines −0.225 −0.133 −0.019 BruiseBlood 0.5  
Personality Neuroticism 3.578 × 10−4  0.067 0.132 BruiseBlood 0.5  
Personality Agreeableness 0.025  0.053 0.086 Original 1    
Personality Conscientiousness −0.021  0.028 0.063 BreathingHeart 0.875
Personality Openness 0.115  0.143 0.223 Original 1    
Personality Extraversion −0.015  0.037 0.086 BruiseBlood 0.625
Personality Honesty-Humility −0.217 −0.101 −0.014 HungryThirsty 0.375
World Beliefs Alive −0.012  0.087 0.166 HungryThirsty 0.625
World Beliefs Changing −0.015  0.038 0.074 Original 0    
World Beliefs Enticing −0.003  0.067 0.125 MusclesPain 0.25 
World Beliefs Good −0.014  0.067 0.132 MusclesPain 0.25 
World Beliefs Hierarchical 0.028  0.104 0.192 HungryThirsty 0.25 
World Beliefs Safe −0.066  0.007 0.054 UrinateDefecate 0    
World Beliefs Understandable 0.027  0.113 0.17 Original 0.75 
Conspiracy Beliefs Extraterrestrial −0.017  0.026 0.057 MusclesPain 0    
Conspiracy Beliefs Global Conspiracies 0.006  0.103 0.154 Original 0.5  
Conspiracy Beliefs Government Malfeasance −0.021  0.053 0.096 CoughSneeze 0    
Conspiracy Beliefs Information Control −0.059  0.06  0.124 CoughSneeze 0.125
Conspiracy Beliefs Personal Wellbeing 0.036  0.086 0.133 HungryThirsty 0.25 
Lying Profile Ability 0.033  0.057 0.082 WindBurp 0    
Lying Profile Frequency −0.088 −0.041 0.034 MusclesPain 0    
Lying Profile Contextuality −0.123 −0.007 0.045 BruiseBlood 0.125
Lying Profile Negativity 0.011  0.064 0.106 Original 0    

Summary

Code
p <- data |>
  mutate(sig = ifelse(p < .01, "p < .01", ifelse(p < .001, "p < .001", "N.S.")),
         dir = sign(r),
         var_Interoception = str_replace(var_Interoception, "CoughSneeze", "Cough/Sneeze"),
         var_Interoception = str_replace(var_Interoception, "HungryThirsty", "Hungry/Thirsty"),
         var_Interoception = str_replace(var_Interoception, "BruiseBlood", "Bruise/Blood sugar"),
         var_Interoception = str_replace(var_Interoception, "MusclesPain", "Muscles/Pain"),
         var_Interoception = str_replace(var_Interoception, "BreathingHeart", "Breathing/Heart"),
         var_Interoception = str_replace(var_Interoception, "UrinateDefecate", "Urinate/Defecate"),
         var_Interoception = str_replace(var_Interoception, "WindBurp", "Wind/Burp"),
         var_Interoception = fct_relevel(var_Interoception, "Original", "Hungry/Thirsty", "Bruise/Blood sugar", "Muscles/Pain", "Cough/Sneeze", "Wind/Burp", "Breathing/Heart", "Urinate/Defecate")) |>
         # Component = fct_relevel(
         #   Component, "Demographic", "MAIA", "Body", "Mood", "Maladaptive",
         #   "Schizotypic", "Autistic", "Personality", "Conspiracy Beliefs", "World Beliefs", "Lying Profile")) |>
  ggplot(aes(y = var_Correlate)) +
  annotate(geom = "rect", xmin = -0.1, xmax = 0.1, ymin = -Inf, ymax=Inf, fill = "#FFF8E1") +
  annotate(geom = "rect", xmin = c(-0.3, 0.1), xmax = c(-0.1, 0.3), ymin = -Inf, ymax=Inf, fill = "#F1F8E9") +
  annotate(geom = "rect", xmin = c(-0.6, 0.3), xmax = c(-0.3, 0.6), ymin = -Inf, ymax=Inf, fill = "#E8F5E9") +
  geom_vline(xintercept = 0, linetype = "dashed") +
  # geom_point2(aes(y=r, color = dir, alpha = sig), size = 3) +
  geom_linerange(aes(color=dir, alpha=sig, xmax=r, xmin=0), linewidth = 1) +
  geom_linerange(aes(color = dir, alpha = sig, xmin = CI_low, xmax = CI_high, linewidth = log(N))) +
  # geom_linerange(aes(color=dir, alpha=sig, ymin=0, ymax=r, group=Sample), position = position_dodge2(width = 0.7), linewidth=2.5) +
  # geom_linerange(aes(ymin = CI_low, ymax = CI_high, color = dir, alpha=sig, group=Sample), position = position_dodge2(width = 0.7),
  #                linewidth = 1) +
  facet_grid(Component ~ var_Interoception, scales = "free", space ="free", switch = "y") +
  scale_fill_gradient(low = "#2196F3", high = "#FF5722", guide = "none") +
  scale_color_gradient(low = "#2196F3", high = "#FF5722", guide = "none") +
  scale_alpha_discrete(range = c(0.2, 0.9), guide = "none") +
  scale_x_continuous(expand = c(0, 0), breaks = c(-0.3, 0, 0.3)) +
  scale_linewidth_continuous(range = c(3, 7), guide = "none") +
  coord_cartesian(xlim = c(-0.45, 0.45)) +
  theme_modern(axis.title.space = 5) +
  labs(x = "Strength of Association (std. Beta)") +
  theme(panel.grid.major.y = element_line(),
        axis.title.y = element_blank(),
        axis.line.x = element_blank(),
        axis.text.y = element_text(size = rel(0.5)),
        axis.text.x = element_text(size = rel(0.8)),
        plot.title = element_text(face = "bold", hjust = 0),
        strip.placement = "outside",
        strip.background.y = element_rect(fill = "#E0E0E0", color = "white"),
        strip.background.x = element_rect(fill = "#F8BBD0", color = "white"))
p

Code
ggsave("figures/Figure3.png", p, width=21*0.5, height=29.7*0.5, dpi=300, bg="white")

Discussion

Benefits of the IAS: - Straightforward and sensation-centered items

Recommendations: - Remove Itch (redundant + issue in Chinese) - Use analog scales

Limitations: - Not much clear theorethical or empirical structure (small grouping of items) - Limited variability (clear mode at 4/5), very low prevalence of 5/5 responses. - Ambiguous items which grouping depends on the context (and its awareness) - E.g., heart beating fast, vomit when nauseaous - Few items for some modalities (e.g., 1 for heart) - Positive phrasing: benefits but also might exacerbate positivity bias (and thus unidimensionality)

Need for context-specific items (cross-modal when possible, i.E., cardioception, respiroception, etc.).

New Scale: Multimodal Interoceptive Sensitivity Scale (MISS)