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)

alldata <- list(df1a=df1a, df1b=df1b, df2=df2, df3=df3, df4=df4, 
                df5=df5, df6=df6, df7a=df7a, df7b=df7b, df7c=df7c, 
                df8a=df8a, df8b=df8b, df9=df9, df10=df10, df11=df11, 
                df12=df12, df14=df14, df15=df15, df16=df16)

Demographics

Gender

Code
pool_coef <- function(with = "Age", component = "Demographic", category = "Demographic", name = with, unequalrange=FALSE) {
  rez <- data.frame()
  for(intero in vars_intero) {
    data <- data.frame() 
    for(dataset in alldata) {
      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)"))
      f3 <- as.formula(paste0(intero, "~ Sample * ", with))
    } else {
      f <- as.formula(paste0(intero, "~", with, " + (", with, "|Sample)"))
      f2 <- as.formula(paste0(intero, "~", with, " + (1|Sample)"))
      f3 <- as.formula(paste0(intero, "~ Sample / ", with))
    }
    
    # Mixed models
    control1 <- glmmTMB::glmmTMBControl()
    control2 <- glmmTMB::glmmTMBControl(optimizer=optim, optArgs=list(method="BFGS"))
    m <- glmmTMB::glmmTMB(f, data = data, control=control1)
    type <- "Full"
    if(!insight::is_converged(m) || is.nan(insight::get_statistic(m)$Statistic[2])) {
      m <- glmmTMB::glmmTMB(f, data = data, control=control2)
      type <- "Full"
    }
    if(!insight::is_converged(m)  || is.nan(insight::get_statistic(m)$Statistic[2])) {
      m <- glmmTMB::glmmTMB(f2, data = data, control=control1)
      type <- "Reduced"
    }
    if(!insight::is_converged(m) || is.nan(insight::get_statistic(m)$Statistic[2])) {
      m <- glmmTMB::glmmTMB(f2, data = data, control=control2)
      type <- "Reduced"
    }
    
    # # Marginal
    # m <- lm(f3, data = data)
    # modelbased::estimate_slopes(m, trend = with)
    
    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$Category <- category
    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
}

check_ranges <- function(var = "Neuroticism") {
  for(d in names(alldata)) {
    dataset <- alldata[[d]]
    if(!var %in% names(dataset)) next
    print(paste0(d, ": ", paste(round(range(dataset[[var]], na.rm=TRUE), 2), collapse = "-")))
  }
}



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

Age

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

Personality

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

# check_ranges("Neuroticism")
# check_ranges("Agreeableness")
# check_ranges("Conscientiousness")
# check_ranges("HonestyHumility")

data <- rbind(
  data,
  pool_coef(with = "Neuroticism", component = "Personality", category = "General", name = "Neuroticism", unequalrange=TRUE),
  pool_coef(with = "Agreeableness", component="Personality", category = "General", name = "Agreeableness",unequalrange=TRUE),
  pool_coef(with = "Conscientiousness", component="Personality", category = "General", name = "Conscientiousness",unequalrange=TRUE), 
  pool_coef(with = "Openness", component="Personality", category = "General", name = "Openness",unequalrange=TRUE),
  pool_coef(with = "Extraversion", component="Personality", category = "General", name = "Extraversion", unequalrange=TRUE),
  pool_coef(with = "HonestyHumility", component="Personality", category = "General", name = "Honesty-Humility", 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", category = "Interoception", name = "Attention Regulation - MAIA", unequalrange=TRUE),
  pool_coef(with = "MAIA_BodyListening", component = "MAIA", category = "Interoception", name = "Listening - MAIA", unequalrange=TRUE),
  pool_coef(with = "MAIA_Trusting", component = "MAIA", category = "Interoception", name = "Trusting - MAIA", unequalrange=TRUE),
  pool_coef(with = "MAIA_EmoAwareness", component = "MAIA", category = "Interoception", name = "Emotional Awareness - MAIA", unequalrange=TRUE),
  pool_coef(with = "MAIA_NotDistracting", component = "MAIA", category = "Interoception", name = "Not Distracting - MAIA", unequalrange=TRUE),
  pool_coef(with = "MAIA_Noticing", component = "MAIA", category = "Interoception", name = "Noticing - MAIA", unequalrange=TRUE),
  pool_coef(with = "MAIA_NotWorrying", component = "MAIA", category = "Interoception", name = "Not Worrying - MAIA", unequalrange=TRUE),
  pool_coef(with = "MAIA_SelfReg", component = "MAIA", category = "Interoception", name = "Self Regulation - MAIA", 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="Interoception", category = "Interoception", name = "Body Awareness - BPQ",unequalrange=TRUE),
  pool_coef(with = "BPQ_AutonomicReactivity", component="Interoception", category = "Interoception", name = "Autonomic Reactivity - BPQ",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="Interoception", category = "Interoception", name = "Interoceptive Confusion - ICQ", 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="Interoception", category = "Interoception", name = "Difficulties Identifying Feelings - TAS", unequalrange=TRUE),
  pool_coef(with = "TAS_DDF", component="Interoception", category = "Interoception", name = "Difficulties Describing Feelings - TAS", unequalrange=TRUE),
  pool_coef(with = "TAS_EOT", component="Interoception", category = "Interoception", name = "External Thinking - TAS",unequalrange=TRUE),
  pool_coef(with = "BVAQ_Affective", component="Interoception", category = "Interoception", name = "Affective - BVAQ"), 
  pool_coef(with = "BVAQ_Cognitive", component="Interoception", category = "Interoception", 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)

check_ranges("PHQ15_Sum")
[1] "df7b: 0-2"
[1] "df8b: 0-1.33"
Code
check_ranges("PHQ9_Sum")
[1] "df7b: 0-2.78"
[1] "df8b: 0-2.67"
[1] "df16: 0-3"
Code
check_ranges("BDI_Sum")
[1] "df11: 0-59"
Code
check_ranges("PHQ4_Depression")
[1] "df6: 2-8"
[1] "df10: 2-8"
[1] "df11: 2-8"
Code
check_ranges("DEP")
[1] "df14: 13-38"
Code
data <- rbind(
  data,
  pool_coef(with = "PHQ15_Sum", component="Depression", category = "Mood", name = "Somatic Concerns - PHQ-15",unequalrange=TRUE), 
  pool_coef(with = "PHQ9_Sum", component="Depression", category = "Mood", name = "Depression - PHQ-9", unequalrange=TRUE), 
  pool_coef(with = "BDI_Sum", component="Depression", category = "Mood", name = "Depression - BDI"), 
  pool_coef(with = "PHQ4_Depression", component="Depression", category = "Mood", name = "Depression - PHQ-4"),
  pool_coef(with = "DEP", component = "Depression", category = "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

# check_ranges("STAIT_Mean")
# check_ranges("PHQ4_Anxiety")
# check_ranges("GAD7_Sum")

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

Psychopathology

Code
# check_ranges("BPD")

data <- rbind(
  data,
  pool_coef(with = "BPD", component="Maladaptive", category = "Psychopathology", name = "Boderline Personality")
)
Code
# check_ranges("PID5_Antagonism")

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

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

Beliefs

Code
data <- rbind(
  data,
  pool_coef(with = "GCBS_Extraterrestrial", component="Conspiracy Beliefs", category = "Beliefs", name = "Extraterrestrial - GCBS"),
  pool_coef(with = "GCBS_GlobalConspiracies", component="Conspiracy Beliefs", category = "Beliefs", name = "Global Conspiracies - GCBS"),
  pool_coef(with = "GCBS_GovernmentMalfeasance", component="Conspiracy Beliefs", category = "Beliefs", name  = "Government Malfeasance - GCBS"),
  pool_coef(with = "GCBS_InformationControl", component="Conspiracy Beliefs", category = "Beliefs", name = "Information Control - GCBS"),
  pool_coef(with = "GCBS_PersonalWellbeing", component="Conspiracy Beliefs", category = "Beliefs", name = "Personal Wellbeing - GCBS")
)
Code
data <- rbind(
  data,
  pool_coef(with = "LIE_Ability", component="Lying Profile", category = "Beliefs", name = "Lying Ability"),
  pool_coef(with = "LIE_Frequency", component="Lying Profile", category = "Beliefs", name = "Lying Frequency"),
  pool_coef(with = "LIE_Contextuality", component="Lying Profile", category = "Beliefs", name = "Lying Contextuality"),
  pool_coef(with = "LIE_Negativity", component="Lying Profile", category = "Beliefs", name = "Lying Negativity")
)
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", category = "Beliefs", name = "Alive - Primal Belief", unequalrange=TRUE),
  pool_coef(with = "PI_Changing", component="World Beliefs", category = "Beliefs", name = "Changing - Primal Belief", unequalrange=TRUE),
  pool_coef(with = "PI_Enticing", component="World Beliefs", category = "Beliefs", name = "Enticing - Primal Belief", unequalrange=TRUE),
  pool_coef(with = "PI_Good", component="World Beliefs", category = "Beliefs", name = "Good - Primal Belief", unequalrange=TRUE),
  pool_coef(with = "PI_Hierarchical", component="World Beliefs", category = "Beliefs", name = "Hierarchical - Primal Belief", unequalrange=TRUE),
  pool_coef(with = "PI_Safe", component="World Beliefs", category = "Beliefs", name = "Safe - Primal Belief",unequalrange=TRUE),
  pool_coef(with = "PI_Understandable", component="World Beliefs", category = "Beliefs", name = "Understandable - Primal Belief",unequalrange=TRUE)
  
  # pool_coef(with = "PI_AboutMe", component="World Beliefs", name = "About me",unequalrange=TRUE),
  # pool_coef(with = "PI_Abundant", component="World Beliefs", name = "Abundant",unequalrange=TRUE),
  # pool_coef(with = "PI_Acceptable", component="World Beliefs", name = "Acceptable",unequalrange=TRUE),
  # pool_coef(with = "PI_Beautiful", component="World Beliefs", name = "Beautiful",unequalrange=TRUE),
  # pool_coef(with = "PI_Cooperative", component="World Beliefs", name = "Cooperative",unequalrange=TRUE),
  # pool_coef(with = "PI_Funny", component="World Beliefs", name = "Funny",unequalrange=TRUE),
  # pool_coef(with = "PI_Harmless", component="World Beliefs", name = "Harmless",unequalrange=TRUE),
  # pool_coef(with = "PI_Improvable", component="World Beliefs", name = "Improvable",unequalrange=TRUE),
  # pool_coef(with = "PI_Interconnected", component="World Beliefs", name = "Interconnected",unequalrange=TRUE),
  # pool_coef(with = "PI_Interesting", component="World Beliefs", name = "Interesting",unequalrange=TRUE),
  # pool_coef(with = "PI_Just", component="World Beliefs", name = "Just",unequalrange=TRUE),
  # pool_coef(with = "PI_Meaningful", component="World Beliefs", name = "Meaningful",unequalrange=TRUE),
  # pool_coef(with = "PI_NeedsMe", component="World Beliefs", name = "Needs Me",unequalrange=TRUE),
  # pool_coef(with = "PI_Pleasurable", component="World Beliefs", name = "Pleasurable",unequalrange=TRUE),
  # pool_coef(with = "PI_Progressing", component="World Beliefs", name = "Progressing",unequalrange=TRUE),
  # pool_coef(with = "PI_Regenerative", component="World Beliefs", name = "Regenerative",unequalrange=TRUE),
  # pool_coef(with = "PI_Stable", component="World Beliefs", name = "Stable",unequalrange=TRUE),
  # pool_coef(with = "PI_WorthExploring", component="World Beliefs", name = "Worth Exploring",unequalrange=TRUE),
  # pool_coef(with = "PI_Intentional", component="World Beliefs", name = "Intentional", unequalrange=TRUE)
  )

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")) 
#   
# 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     CoughSneeze 
             29              17              10               6               2 
       WindBurp  BreathingHeart UrinateDefecate 
              2               1               1 
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()
Component var_Correlate min_r mean_r max_r Max
Demographic Gender (Female - Male) −0.218 −0.058 0.049 HungryThirsty
Demographic Age  0.06   0.125 0.182 Original
Personality Neuroticism −0.227 −0.096 −0.038 HungryThirsty
Personality Agreeableness  0.045  0.08  0.131 Original
Personality Conscientiousness  0.045  0.109 0.165 Original
Personality Openness  0.068  0.103 0.17 Original
Personality Extraversion  0.059  0.097 0.165 BruiseBlood
Personality Honesty-Humility −0.217 −0.101 −0.014 HungryThirsty
MAIA Attention Regulation - MAIA  0.153  0.249 0.369 Original
MAIA Listening - MAIA  0.089  0.177 0.268 BruiseBlood
MAIA Trusting - MAIA  0.153  0.237 0.357 Original
MAIA Emotional Awareness - MAIA  0.132  0.197 0.296 Original
MAIA Not Distracting - MAIA  0.019  0.061 0.127 HungryThirsty
MAIA Noticing - MAIA  0.161  0.262 0.389 Original
MAIA Not Worrying - MAIA −0.009  0.041 0.108 UrinateDefecate
MAIA Self Regulation - MAIA  0.087  0.189 0.274 Original
Interoception Body Awareness - BPQ  0.07   0.121 0.175 Original
Interoception Autonomic Reactivity - BPQ −0.261 −0.184 −0.026 Original
Interoception Interoceptive Confusion - ICQ −0.492 −0.324 −0.204 Original
Interoception Difficulties Identifying Feelings - TAS −0.321 −0.211 −0.133 Original
Interoception Difficulties Describing Feelings - TAS −0.244 −0.154 −0.111 Original
Interoception External Thinking - TAS −0.128 −0.081 −0.023 Original
Interoception Affective - BVAQ −0.036  0.042 0.159 BruiseBlood
Interoception Cognitive - BVAQ −0.303 −0.2   −0.105 Original
Depression Somatic Concerns - PHQ-15 −0.282 −0.177 −0.04 Original
Depression Depression - PHQ-9 −0.265 −0.172 −0.069 HungryThirsty
Depression Depression - BDI −0.342 −0.204 −0.134 HungryThirsty
Depression Depression - PHQ-4 −0.187 −0.091 −0.032 HungryThirsty
Depression Depression - MFQ −0.345 −0.139 −0.007 BreathingHeart
Anxiety Anxiety - STAI-T −0.322 −0.201 −0.098 HungryThirsty
Anxiety Anxiety - PHQ-4 −0.2   −0.099 −0.008 HungryThirsty
Anxiety Anxiety - GAD-7 −0.374 −0.187 −0.098 HungryThirsty
Maladaptive Boderline Personality −0.14  −0.061 0.022 HungryThirsty
Maladaptive Antagonism - PID-5 −0.082 −0.024 0.141 BruiseBlood
Maladaptive Detachment - PID-5 −0.167 −0.081 0.004 HungryThirsty
Maladaptive Disinhibition - PID-5 −0.065 −0.016 0.069 BruiseBlood
Maladaptive Negative Affect - PID-5 −0.153 −0.111 −0.024 Original
Maladaptive Psychoticism - PID-5 −0.173 −0.091 0.002 MusclesPain
Schizotypic Constricted Affect - SPQ −0.146 −0.085 −0.009 Original
Schizotypic Eccentric - SPQ −0.138 −0.081 −0.034 HungryThirsty
Schizotypic Magical Thinking - SPQ −0.05   0.02  0.078 BruiseBlood
Schizotypic No Close Friends - SPQ −0.172 −0.122 −0.062 Original
Schizotypic Odd Speech - SPQ −0.15  −0.089 −4.804 × 10−4 HungryThirsty
Schizotypic Reference - SPQ −0.111 −0.041 0.023 MusclesPain
Schizotypic Social Anxiety - SPQ −0.192 −0.111 −0.023 BruiseBlood
Schizotypic Suspiciousness - SPQ −0.081 −0.038 0.017 WindBurp
Schizotypic Unusual Perceptions - SPQ −0.141 −0.068 0.053 MusclesPain
Autistic Imagination - ASQ −0.28  −0.184 −0.114 Original
Autistic Lack of Social Skills - ASQ −0.189 −0.119 −0.04 Original
Autistic Low Attentional Switching - ASQ −0.225 −0.143 −0.026 Original
Autistic Patterns and Numbers - ASQ −0.064  0.005 0.083 BruiseBlood
Autistic Routines - ASQ −0.225 −0.133 −0.019 BruiseBlood
Conspiracy Beliefs Extraterrestrial - GCBS −0.017  0.026 0.057 MusclesPain
Conspiracy Beliefs Global Conspiracies - GCBS  0.006  0.103 0.154 Original
Conspiracy Beliefs Government Malfeasance - GCBS −0.021  0.053 0.096 CoughSneeze
Conspiracy Beliefs Information Control - GCBS −0.059  0.06  0.124 CoughSneeze
Conspiracy Beliefs Personal Wellbeing - GCBS  0.036  0.086 0.133 HungryThirsty
Lying Profile Lying Ability  0.033  0.057 0.082 WindBurp
Lying Profile Lying Frequency −0.088 −0.041 0.034 MusclesPain
Lying Profile Lying Contextuality −0.123 −0.007 0.045 BruiseBlood
Lying Profile Lying Negativity  0.011  0.064 0.106 Original
World Beliefs Alive - Primal Belief −0.012  0.078 0.145 Original
World Beliefs Changing - Primal Belief −0.083  0.01  0.058 HungryThirsty
World Beliefs Enticing - Primal Belief −0.003  0.066 0.123 Original
World Beliefs Good - Primal Belief −0.014  0.09  0.222 Original
World Beliefs Hierarchical - Primal Belief  0.028  0.102 0.183 HungryThirsty
World Beliefs Safe - Primal Belief −0.012  0.024 0.054 MusclesPain
World Beliefs Understandable - Primal Belief  0.024  0.113 0.17 Original

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"),
         Category = fct_relevel(
           Category, "General", "Interoception", "Mood", "Psychopathology", "Beliefs"),
         Component = fct_relevel(Component, "Personality", "Demographic", "Interoception", "MAIA", "Anxiety", "Depression", "Schizotypic", "Autistic", "Maladaptive", "World Beliefs", "Conspiracy Beliefs", "Lying Profile")) |> 
  group_by(Component) |> 
  mutate(var_Correlate = fct_reorder(var_Correlate, r, .fun=mean)) |>
  ungroup() |>
  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(Category ~ 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.47, 0.47)) +
  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.55, height=29.7*0.4, 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.).

Neuroticism: effect unclear

Openness (driven by Wind/burp): effect of response bias