Aberrant insula activity to negative and reduced learning from positive feedback underlie maladaptive self-beliefs in depression.
The 13 matches
- [1] § Methods › Learning Of Own Performance (LOOP) task ↔ Data_Analysis_Script/QuartoReport.qmd, lines 745–830 · score 0.88 · Automatic Thought Questionnaire, Social Interaction Anxiety, SDQ III, Description Questionnaire III, depression inventory, subscale scores
- [2] § Methods › Statistical analysis › Behavioral data analysis and modeling › Statistical analyses of learning parameters ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1217–1229 · score 0.81 · linear mixed model, major violations, random slopes, Random intercepts, Model assumptions, residuals
- [3] § Results › Imbalanced prediction error signaling in depression during feedback processing ↔ Data_Analysis_Script/QuartoReport.qmd, lines 2141–2171 · score 0.78 · participants receive recurrent, positive PE trials, negative PE trials, insula activation, learning behavior, negative prediction error
- [4] § Methods › Statistical analysis › Behavioral data analysis and modeling › Model-agnostic analysis ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1217–1229 · score 0.76 · linear mixed model, random slopes, Random intercepts, model agnostic, continuous predictor, Agent
- [5] § Results › Disregard of positive feedback with higher symptom burden ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1334–1346 · score 0.75 · higher symptom burden, negative feedback remains, symptom scores, detailed correlations, integrate positive feedback, positive prediction errors
- [6] § Results ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1038–1077 · score 0.71 · participants formed beliefs, Agent interaction, post hoc, PE Valence, winning model, negativity bias
- [7] § Results › No learning differences between individuals with depression and healthy controls ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1148–1175 · score 0.63 · people diagnosed, forming novel beliefs, model agnostic, healthy controls, expectation ratings, negativity bias
- [8] § Methods › Statistical analysis › Behavioral data analysis and modeling › FMRI data analysis ↔ Data_Analysis_Script/QuartoReport.qmd, lines 2021–2048 · score 0.60 · Psychopathology score, brain activity, Spearman correlation, PE trials, categorical PE, ROIs
- [9] § Methods › Statistical analysis › Behavioral data analysis and modeling › Computational modeling ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1095–1146 · score 0.57 · PSIS LOO, Valence Model
- [10] § Results › Imbalanced prediction error signaling in depression during feedback processing ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1659–1686 · score 0.57 · right insula, MDD compared, major depressive disorder, depicts, uncorrected, prediction errors
- [11] § Results › Imbalanced prediction error signaling in depression during feedback processing ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1602–1631 · score 0.53 · right anterior, prediction error signaling, negative prediction errors, peak, imbalance, insula
- [12] § Methods › Statistical analysis › Behavioral data analysis and modeling › Capturing symptom burden ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1425–1466 · score 0.51 · SDQ III, rotation, ATQ, SIAS, BDI, symptoms
- [13] § Methods › Learning Of Own Performance (LOOP) task ↔ Data_Analysis_Script/QuartoReport.qmd, lines 1713–1795 · score 0.50 · arousal, tiredness, related feedback, embarrassment, happiness, pride
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Quarto · 2,541 lines · 104 KB · no license · 13 matches
- ---
- title: "Aberrant insula activity to negative and reduced learning from positive feedback underlie maladaptive self-beliefs in depression"
- author: "Nora Czekalla, Annalina V. Mayer & Laura Müller-Pinzler"
- format:
- html:
- page-layout: article
- self-contained: true
- grid:
- sidebar-width: 300px
- body-width: 900px
- margin-width: 300px
- gutter-width: 1.5rem
- toc: true
- toc-location: left
- df-print: paged
- code-fold: true
- code-summary: "show the code"
- editor: visual
- fig_caption: true
- tbl-cap-location: bottom
- execute:
- #echo: false
- warning: false
- ---
- ```{css}
- /*| echo: false */
- p {
- text-align: justify
- }
- ```
- ## Preamble to this document
- This report contains the code and data required to reproduce most of the results, plots and tables of the manuscript. Estimation of computational models using RStan and fMRI analyses using SPM are not included. If you are interested in these analyses, please contact the corresponding author.
- ## Data import and used packages
- ### Package library
- ```{r}
- library(here)
- library(tidyverse)
- library(psych)
- library(Hmisc)
- library(reshape2)
- library(nlme)
- library(ggpattern)
- library(corrplot)
- library(cocor)
- library(gt)
- library(rstatix)
- ```
- ### Data import
- ```{r}
- load(here("data_OSF.RDATA"))
- ```
- ### Custom functions
- ```{r}
- # layout for gt tables
- gt_layout <- function(x) {
- tab_options(
- x,
- table.font.names = "Times New Roman",
- table.font.size =16,
- heading.title.font.size = 16,
- table.border.top.style = "hidden",
- table.border.bottom.style = "hidden"
- ) %>%
- tab_style(
- style = cell_borders(
- sides = c("top", "bottom"),
- color = "white"
- ),
- locations = cells_body()
- )%>%
- tab_style(
- style = list(cell_borders(
- sides = c("top", "bottom"),
- color = "white"),
- cell_text(weight = "bold")),
- locations = cells_row_groups()
- )%>%
- tab_style(
- style = cell_borders(
- sides = c("bottom"),
- weight=px(2),
- color = "black"),
- locations = cells_title()
- )%>%
- tab_style(
- style = cell_borders(
- sides = c("top"),
- weight=px(2),
- color = "black"),
- locations = cells_footnotes()
- )%>%
- sub_missing(
- missing_text = ""
- )
- }
- # theme for plots
- snl_theme <- function() {
- theme(
- # add border 1)
- panel.border = element_rect(colour = "#004B5A", fill = NA, linetype = 1),
- # color background 2)
- panel.background = element_rect(fill = "#FFFFFF"),
- # modify grid 3)
- panel.grid.major.x = element_line(colour = "#CDDBD8", linetype = 3, linewidth = 0.5),
- panel.grid.minor.x = element_blank(),
- panel.grid.major.y = element_line(colour = "#CDDBD8", linetype = 3, linewidth = 0.5),
- panel.grid.minor.y = element_blank(),
- # modify text, axis and colour 4) and 5)
- axis.title.x = element_text(size = 20, face="bold", margin = margin(t = 10, r = 0, b = 0, l = 0)),
- axis.title.y = element_text(size = 20, face="bold", margin = margin(t = 0, r = 10, b = 0, l = 0)),
- axis.text.y = element_text(size = 20, color="black", margin = margin(t = 0, r = 5, b = 0, l = 0)),
- axis.text.x = element_text(size = 20, color="black", angle = 0, vjust = 0.5, margin = margin(t = 5, r = 0, b = 0, l = 0)),
- axis.ticks = element_line(colour = "#004B5A"),
- # legend at the bottom 6)
- legend.position = "bottom",
- legend.title=element_blank(),
- legend.text=element_text(size=18),
- legend.key.size = unit(2,"line")
- )
- }
- # round, format and mark p-values
- # x: input vector
- p <- function(x) {
- p_round(x, digits = 3) %>%
- p_format(digits = 3, accuracy = 0.001, leading.zero = FALSE)
- }
- p_txt <- function(x) {
- p_round(x, digits = 3) %>%
- p_format(digits = 3, accuracy = 0.001, leading.zero = FALSE)
- }
- col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
- ####### Adaptation of corrplot function from corrplot package #######
- ## adapt corrplot function to display significance (*) in the upper corner of each cell
- # +0.35 added at place_points = function(sig.locs, point) {
- # text(pos.pNew[, 1][sig.locs] + 0.35, pos.pNew[,
- # 2][sig.locs] + 0.35, ...
- draw_method_square = function(coords, values, asp_rescale_factor, fg, bg) {
- symbols(coords, add = TRUE, inches = FALSE,
- squares = asp_rescale_factor * abs(values) ^ 0.5,
- bg = bg, fg = fg)
- }
- draw_method_color = function(coords, fg, bg) {
- symbols(coords, squares = rep(1, nrow(coords)), fg = fg, bg = bg,
- add = TRUE, inches = FALSE)
- }
- draw_grid = function(coords, fg) {
- symbols(coords, add = TRUE, inches = FALSE, fg = fg, bg = NA,
- rectangles = matrix(1, nrow = nrow(coords), ncol = 2))
- }
- corrplot<- function (corr, method = c("circle", "square", "ellipse", "number",
- "shade", "color", "pie"), type = c("full", "lower", "upper"),
- col = NULL, col.lim = NULL, bg = "white", title = "", is.corr = TRUE,
- add = FALSE, diag = TRUE, outline = FALSE, mar = c(0, 0,
- 0, 0), addgrid.col = NULL, addCoef.col = NULL, addCoefasPercent = FALSE,
- order = c("original", "AOE", "FPC", "hclust", "alphabet"),
- hclust.method = c("complete", "ward", "ward.D", "ward.D2",
- "single", "average", "mcquitty", "median", "centroid"),
- addrect = NULL, rect.col = "black", rect.lwd = 2, tl.pos = NULL,
- tl.cex = 1, tl.col = "red", tl.offset = 0.4, tl.srt = 90,
- cl.pos = NULL, cl.length = NULL, cl.cex = 0.8, cl.ratio = 0.15,
- cl.align.text = "c", cl.offset = 0.5, number.cex = 1, number.font = 2,
- number.digits = NULL, addshade = c("negative", "positive",
- "all"), shade.lwd = 1, shade.col = "white", p.mat = NULL,
- sig.level = 0.05, insig = c("pch", "p-value", "blank", "n",
- "label_sig"), pch = 4, pch.col = "black", pch.cex = 3,
- plotCI = c("n", "square", "circle", "rect"), lowCI.mat = NULL,
- uppCI.mat = NULL, na.label = "?", na.label.col = "black",
- win.asp = 1, ...)
- {
- method = match.arg(method)
- type = match.arg(type)
- order = match.arg(order)
- hclust.method = match.arg(hclust.method)
- addshade = match.arg(addshade)
- insig = match.arg(insig)
- plotCI = match.arg(plotCI)
- if (win.asp != 1 && !(method %in% c("circle", "square"))) {
- stop("Parameter 'win.asp' is supported only for circle and square methods.")
- }
- asp_rescale_factor = min(1, win.asp)/max(1, win.asp)
- stopifnot(asp_rescale_factor >= 0 && asp_rescale_factor <=
- 1)
- if (!is.matrix(corr) && !is.data.frame(corr)) {
- stop("Need a matrix or data frame!")
- }
- if (is.null(addgrid.col)) {
- addgrid.col = switch(method, color = NA, shade = NA,
- "grey")
- }
- if (any(corr[!is.na(corr)] < col.lim[1]) || any(corr[!is.na(corr)] >
- col.lim[2])) {
- stop("color limits should cover matrix")
- }
- if (is.null(col.lim)) {
- if (is.corr) {
- col.lim = c(-1, 1)
- }
- else {
- if (!diag) {
- diag(corr) = NA
- }
- col.lim = c(min(corr, na.rm = TRUE), max(corr, na.rm = TRUE))
- }
- }
- SpecialCorr = 0
- if (is.corr) {
- if (min(corr, na.rm = TRUE) < -1 - .Machine$double.eps^0.75 ||
- max(corr, na.rm = TRUE) > 1 + .Machine$double.eps^0.75) {
- stop("The matrix is not in [-1, 1]!")
- }
- SpecialCorr = 1
- if (col.lim[1] < -1 | col.lim[2] > 1) {
- stop("col.lim should be within the interval [-1, 1]")
- }
- }
- intercept = 0
- zoom = 1
- if (!is.corr) {
- c_max = max(corr, na.rm = TRUE)
- c_min = min(corr, na.rm = TRUE)
- if ((col.lim[1] > c_min) | (col.lim[2] < c_max)) {
- stop("Wrong color: matrix should be in col.lim interval!")
- }
- if (diff(col.lim)/(c_max - c_min) > 2) {
- warning("col.lim interval too wide, please set a suitable value")
- }
- if (c_max <= 0 | c_min >= 0) {
- intercept = -col.lim[1]
- zoom = 1/(diff(col.lim))
- if (col.lim[1] * col.lim[2] < 0) {
- warning("col.lim interval not suitable to the matrix")
- }
- }
- else {
- stopifnot(c_max * c_min < 0)
- stopifnot(c_min < 0 && c_max > 0)
- intercept = 0
- zoom = 1/max(abs(col.lim))
- SpecialCorr = 1
- }
- corr = (intercept + corr) * zoom
- }
- col.lim2 = (intercept + col.lim) * zoom
- int = intercept * zoom
- if (is.null(col) & is.corr) {
- col = COL2("RdBu", 200)
- }
- if (is.null(col) & !is.corr) {
- if (col.lim[1] * col.lim[2] < 0) {
- col = COL2("RdBu", 200)
- }
- else {
- col = COL1("YlOrBr", 200)
- }
- }
- n = nrow(corr)
- m = ncol(corr)
- min.nm = min(n, m)
- ord = 1:min.nm
- if (order != "original") {
- ord = corrMatOrder(corr, order = order, hclust.method = hclust.method)
- corr = corr[ord, ord]
- }
- if (is.null(rownames(corr))) {
- rownames(corr) = 1:n
- }
- if (is.null(colnames(corr))) {
- colnames(corr) = 1:m
- }
- apply_mat_filter = function(mat) {
- x = matrix(1:n * m, nrow = n, ncol = m)
- switch(type, upper = mat[row(x) > col(x)] <- Inf, lower = mat[row(x) <
- col(x)] <- Inf)
- if (!diag) {
- diag(mat) = Inf
- }
- return(mat)
- }
- getPos.Dat = function(mat) {
- tmp = apply_mat_filter(mat)
- Dat = tmp[is.finite(tmp)]
- ind = which(is.finite(tmp), arr.ind = TRUE)
- Pos = ind
- Pos[, 1] = ind[, 2]
- Pos[, 2] = -ind[, 1] + 1 + n
- PosName = ind
- PosName[, 1] = colnames(mat)[ind[, 2]]
- PosName[, 2] = rownames(mat)[ind[, 1]]
- return(list(Pos, Dat, PosName))
- }
- getPos.NAs = function(mat) {
- tmp = apply_mat_filter(mat)
- ind = which(is.na(tmp), arr.ind = TRUE)
- Pos = ind
- Pos[, 1] = ind[, 2]
- Pos[, 2] = -ind[, 1] + 1 + n
- return(Pos)
- }
- testTemp = getPos.Dat(corr)
- Pos = getPos.Dat(corr)[[1]]
- PosName = getPos.Dat(corr)[[3]]
- if (any(is.na(corr)) && is.character(na.label)) {
- PosNA = getPos.NAs(corr)
- }
- else {
- PosNA = NULL
- }
- AllCoords = rbind(Pos, PosNA)
- n2 = max(AllCoords[, 2])
- n1 = min(AllCoords[, 2])
- nn = n2 - n1
- m2 = max(AllCoords[, 1])
- m1 = min(AllCoords[, 1])
- mm = max(1, m2 - m1)
- expand_expression = function(s) {
- ifelse(grepl("^[:=$]", s), parse(text = substring(s,
- 2)), s)
- }
- newrownames = sapply(rownames(corr)[(n + 1 - n2):(n + 1 -
- n1)], expand_expression)
- newcolnames = sapply(colnames(corr)[m1:m2], expand_expression)
- DAT = getPos.Dat(corr)[[2]]
- len.DAT = length(DAT)
- rm(expand_expression)
- assign.color = function(dat = DAT, color = col, isSpecialCorr = SpecialCorr) {
- if (isSpecialCorr) {
- newcorr = (dat + 1)/2
- }
- else {
- newcorr = dat
- }
- newcorr[newcorr <= 0] = 0
- newcorr[newcorr >= 1] = 1 - 1e-16
- color[floor(newcorr * length(color)) + 1]
- }
- col.fill = assign.color()
- isFALSE = function(x) identical(x, FALSE)
- isTRUE = function(x) identical(x, TRUE)
- if (isFALSE(tl.pos)) {
- tl.pos = "n"
- }
- if (is.null(tl.pos) || isTRUE(tl.pos)) {
- tl.pos = switch(type, full = "lt", lower = "ld", upper = "td")
- }
- if (isFALSE(cl.pos)) {
- cl.pos = "n"
- }
- if (is.null(cl.pos) || isTRUE(cl.pos)) {
- cl.pos = switch(type, full = "r", lower = "b", upper = "r")
- }
- if (isFALSE(outline)) {
- col.border = col.fill
- }
- else if (isTRUE(outline)) {
- col.border = "black"
- }
- else if (is.character(outline)) {
- col.border = outline
- }
- else {
- stop("Unsupported value type for parameter outline")
- }
- oldpar = par(mar = mar, bg = par()$bg)
- on.exit(par(oldpar), add = TRUE)
- if (!add) {
- plot.new()
- xlabwidth = max(strwidth(newrownames, cex = tl.cex))
- ylabwidth = max(strwidth(newcolnames, cex = tl.cex))
- laboffset = strwidth("W", cex = tl.cex) * tl.offset
- for (i in 1:50) {
- xlim = c(m1 - 0.5 - laboffset - xlabwidth * (grepl("l",
- tl.pos) | grepl("d", tl.pos)), m2 + 0.5 + mm *
- cl.ratio * (cl.pos == "r") + xlabwidth * abs(cos(tl.srt *
- pi/180)) * grepl("d", tl.pos))
- ylim = c(n1 - 0.5 - nn * cl.ratio * (cl.pos == "b") -
- laboffset, n2 + 0.5 + laboffset + ylabwidth *
- abs(sin(tl.srt * pi/180)) * grepl("t", tl.pos) +
- ylabwidth * abs(sin(tl.srt * pi/180)) * (type ==
- "lower") * grepl("d", tl.pos))
- plot.window(xlim, ylim, asp = 1, xaxs = "i", yaxs = "i")
- x.tmp = max(strwidth(newrownames, cex = tl.cex))
- y.tmp = max(strwidth(newcolnames, cex = tl.cex))
- laboffset.tmp = strwidth("W", cex = tl.cex) * tl.offset
- if (max(x.tmp - xlabwidth, y.tmp - ylabwidth, laboffset.tmp -
- laboffset) < 0.001) {
- break
- }
- xlabwidth = x.tmp
- ylabwidth = y.tmp
- laboffset = laboffset.tmp
- if (i == 50) {
- warning(c("Not been able to calculate text margin, ",
- "please try again with a clean new empty window using ",
- "{plot.new(); dev.off()} or reduce tl.cex"))
- }
- }
- if (.Platform$OS.type == "windows") {
- grDevices::windows.options(width = 7, height = 7 *
- diff(ylim)/diff(xlim))
- }
- xlim = xlim + diff(xlim) * 0.01 * c(-1, 1)
- ylim = ylim + diff(ylim) * 0.01 * c(-1, 1)
- plot.window(xlim = xlim, ylim = ylim, asp = win.asp,
- xlab = "", ylab = "", xaxs = "i", yaxs = "i")
- }
- laboffset = strwidth("W", cex = tl.cex) * tl.offset
- symbols(Pos, add = TRUE, inches = FALSE, rectangles = matrix(1,
- len.DAT, 2), bg = bg, fg = bg)
- if (method == "circle" && plotCI == "n") {
- symbols(Pos, add = TRUE, inches = FALSE, circles = asp_rescale_factor *
- 0.9 * abs(DAT)^0.5/2, fg = col.border, bg = col.fill)
- }
- if (method == "ellipse" && plotCI == "n") {
- ell.dat = function(rho, length = 99) {
- k = seq(0, 2 * pi, length = length)
- x = cos(k + acos(rho)/2)/2
- y = cos(k - acos(rho)/2)/2
- cbind(rbind(x, y), c(NA, NA))
- }
- ELL.dat = lapply(DAT, ell.dat)
- ELL.dat2 = 0.85 * matrix(unlist(ELL.dat), ncol = 2,
- byrow = TRUE)
- ELL.dat2 = ELL.dat2 + Pos[rep(1:length(DAT), each = 100),
- ]
- polygon(ELL.dat2, border = col.border, col = col.fill)
- }
- if (is.null(number.digits)) {
- number.digits = switch(addCoefasPercent + 1, 2, 0)
- }
- stopifnot(number.digits%%1 == 0)
- stopifnot(number.digits >= 0)
- if (method == "number" && plotCI == "n") {
- x = (DAT - int) * ifelse(addCoefasPercent, 100, 1)/zoom
- text(Pos[, 1], Pos[, 2], font = number.font, col = col.fill,
- labels = format(round(x, number.digits), nsmall = number.digits),
- cex = number.cex)
- }
- NA_LABEL_MAX_CHARS = 2
- if (is.matrix(PosNA) && nrow(PosNA) > 0) {
- stopifnot(is.matrix(PosNA))
- if (na.label == "square") {
- symbols(PosNA, add = TRUE, inches = FALSE, squares = rep(1,
- nrow(PosNA)), bg = na.label.col, fg = na.label.col)
- }
- else if (nchar(na.label) %in% 1:NA_LABEL_MAX_CHARS) {
- symbols(PosNA, add = TRUE, inches = FALSE, squares = rep(1,
- nrow(PosNA)), fg = bg, bg = bg)
- text(PosNA[, 1], PosNA[, 2], font = number.font,
- col = na.label.col, labels = na.label, cex = number.cex,
- ...)
- }
- else {
- stop(paste("Maximum number of characters for NA label is:",
- NA_LABEL_MAX_CHARS))
- }
- }
- if (method == "pie" && plotCI == "n") {
- symbols(Pos, add = TRUE, inches = FALSE, circles = rep(0.5,
- len.DAT) * 0.85, fg = col.border)
- pie.dat = function(theta, length = 100) {
- k = seq(pi/2, pi/2 - theta, length = 0.5 * length *
- abs(theta)/pi)
- x = c(0, cos(k)/2, 0)
- y = c(0, sin(k)/2, 0)
- cbind(rbind(x, y), c(NA, NA))
- }
- PIE.dat = lapply(DAT * 2 * pi, pie.dat)
- len.pie = unlist(lapply(PIE.dat, length))/2
- PIE.dat2 = 0.85 * matrix(unlist(PIE.dat), ncol = 2,
- byrow = TRUE)
- PIE.dat2 = PIE.dat2 + Pos[rep(1:length(DAT), len.pie),
- ]
- polygon(PIE.dat2, border = "black", col = col.fill)
- }
- if (method == "shade" && plotCI == "n") {
- symbols(Pos, add = TRUE, inches = FALSE, squares = rep(1,
- len.DAT), bg = col.fill, fg = addgrid.col)
- shade.dat = function(w) {
- x = w[1]
- y = w[2]
- rho = w[3]
- x1 = x - 0.5
- x2 = x + 0.5
- y1 = y - 0.5
- y2 = y + 0.5
- dat = NA
- if ((addshade == "positive" || addshade == "all") &&
- rho > 0) {
- dat = cbind(c(x1, x1, x), c(y, y1, y1), c(x,
- x2, x2), c(y2, y2, y))
- }
- if ((addshade == "negative" || addshade == "all") &&
- rho < 0) {
- dat = cbind(c(x1, x1, x), c(y, y2, y2), c(x,
- x2, x2), c(y1, y1, y))
- }
- return(t(dat))
- }
- pos_corr = rbind(cbind(Pos, DAT))
- pos_corr2 = split(pos_corr, 1:nrow(pos_corr))
- SHADE.dat = matrix(na.omit(unlist(lapply(pos_corr2,
- shade.dat))), byrow = TRUE, ncol = 4)
- segments(SHADE.dat[, 1], SHADE.dat[, 2], SHADE.dat[,
- 3], SHADE.dat[, 4], col = shade.col, lwd = shade.lwd)
- }
- if (method == "square" && plotCI == "n") {
- draw_method_square(Pos, DAT, asp_rescale_factor, col.border,
- col.fill)
- }
- if (method == "color" && plotCI == "n") {
- draw_method_color(Pos, col.border, col.fill)
- }
- draw_grid(AllCoords, addgrid.col)
- if (plotCI != "n") {
- if (is.null(lowCI.mat) || is.null(uppCI.mat)) {
- stop("Need lowCI.mat and uppCI.mat!")
- }
- if (order != "original") {
- lowCI.mat = lowCI.mat[ord, ord]
- uppCI.mat = uppCI.mat[ord, ord]
- }
- pos.lowNew = getPos.Dat(lowCI.mat)[[1]]
- lowNew = getPos.Dat(lowCI.mat)[[2]]
- pos.uppNew = getPos.Dat(uppCI.mat)[[1]]
- uppNew = getPos.Dat(uppCI.mat)[[2]]
- k1 = (abs(uppNew) > abs(lowNew))
- bigabs = uppNew
- bigabs[which(!k1)] = lowNew[!k1]
- smallabs = lowNew
- smallabs[which(!k1)] = uppNew[!k1]
- sig = sign(uppNew * lowNew)
- color_bigabs = col[ceiling((bigabs + 1) * length(col)/2)]
- color_smallabs = col[ceiling((smallabs + 1) * length(col)/2)]
- if (plotCI == "circle") {
- symbols(pos.uppNew[, 1], pos.uppNew[, 2], add = TRUE,
- inches = FALSE, circles = 0.95 * abs(bigabs)^0.5/2,
- bg = ifelse(sig > 0, col.fill, color_bigabs),
- fg = ifelse(sig > 0, col.fill, color_bigabs))
- symbols(pos.lowNew[, 1], pos.lowNew[, 2], add = TRUE,
- inches = FALSE, circles = 0.95 * abs(smallabs)^0.5/2,
- bg = ifelse(sig > 0, bg, color_smallabs), fg = ifelse(sig >
- 0, col.fill, color_smallabs))
- }
- if (plotCI == "square") {
- symbols(pos.uppNew[, 1], pos.uppNew[, 2], add = TRUE,
- inches = FALSE, squares = abs(bigabs)^0.5, bg = ifelse(sig >
- 0, col.fill, color_bigabs), fg = ifelse(sig >
- 0, col.fill, color_bigabs))
- symbols(pos.lowNew[, 1], pos.lowNew[, 2], add = TRUE,
- inches = FALSE, squares = abs(smallabs)^0.5,
- bg = ifelse(sig > 0, bg, color_smallabs), fg = ifelse(sig >
- 0, col.fill, color_smallabs))
- }
- if (plotCI == "rect") {
- rect.width = 0.25
- rect(pos.uppNew[, 1] - rect.width, pos.uppNew[,
- 2] + smallabs/2, pos.uppNew[, 1] + rect.width,
- pos.uppNew[, 2] + bigabs/2, col = col.fill,
- border = col.fill)
- segments(pos.lowNew[, 1] - rect.width, pos.lowNew[,
- 2] + DAT/2, pos.lowNew[, 1] + rect.width, pos.lowNew[,
- 2] + DAT/2, col = "black", lwd = 1)
- segments(pos.uppNew[, 1] - rect.width, pos.uppNew[,
- 2] + uppNew/2, pos.uppNew[, 1] + rect.width,
- pos.uppNew[, 2] + uppNew/2, col = "black", lwd = 1)
- segments(pos.lowNew[, 1] - rect.width, pos.lowNew[,
- 2] + lowNew/2, pos.lowNew[, 1] + rect.width,
- pos.lowNew[, 2] + lowNew/2, col = "black", lwd = 1)
- segments(pos.lowNew[, 1] - 0.5, pos.lowNew[, 2],
- pos.lowNew[, 1] + 0.5, pos.lowNew[, 2], col = "grey70",
- lty = 3)
- }
- }
- if (!is.null(addCoef.col) && method != "number") {
- text(Pos[, 1], Pos[, 2], col = addCoef.col, labels = round((DAT -
- int) * ifelse(addCoefasPercent, 100, 1)/zoom, number.digits),
- cex = number.cex, font = number.font)
- }
- if (!is.null(p.mat) && insig != "n") {
- if (order != "original") {
- p.mat = p.mat[ord, ord]
- }
- if (!is.null(rownames(p.mat)) | !is.null(rownames(p.mat))) {
- if (!all(colnames(p.mat) == colnames(corr)) | !all(rownames(p.mat) ==
- rownames(corr))) {
- warning("p.mat and corr may be not paired, their rownames and colnames are not totally same!")
- }
- }
- pos.pNew = getPos.Dat(p.mat)[[1]]
- pNew = getPos.Dat(p.mat)[[2]]
- if (insig == "label_sig") {
- if (!is.character(pch))
- pch = "*"
- place_points = function(sig.locs, point) {
- text(pos.pNew[, 1][sig.locs]+0.35, pos.pNew[, 2][sig.locs]+0.35,
- labels = point, col = pch.col, cex = pch.cex,
- lwd = 2)
- }
- if (length(sig.level) == 1) {
- place_points(sig.locs = which(pNew < sig.level),
- point = pch)
- }
- else {
- l = length(sig.level)
- for (i in seq_along(sig.level)) {
- iter = l + 1 - i
- pchTmp = paste(rep(pch, i), collapse = "")
- if (i == length(sig.level)) {
- locs = which(pNew < sig.level[iter])
- if (length(locs)) {
- place_points(sig.locs = locs, point = pchTmp)
- }
- }
- else {
- locs = which(pNew < sig.level[iter] & pNew >
- sig.level[iter - 1])
- if (length(locs)) {
- place_points(sig.locs = locs, point = pchTmp)
- }
- }
- }
- }
- }
- else {
- ind.p = which(pNew > sig.level)
- p_inSig = length(ind.p) > 0
- if (insig == "pch" && p_inSig) {
- points(pos.pNew[, 1][ind.p], pos.pNew[, 2][ind.p],
- pch = pch, col = pch.col, cex = pch.cex, lwd = 2)
- }
- if (insig == "p-value" && p_inSig) {
- text(pos.pNew[, 1][ind.p], pos.pNew[, 2][ind.p],
- round(pNew[ind.p], number.digits), col = pch.col)
- }
- if (insig == "blank" && p_inSig) {
- symbols(pos.pNew[, 1][ind.p], pos.pNew[, 2][ind.p],
- inches = FALSE, squares = rep(1, length(pos.pNew[,
- 1][ind.p])), fg = addgrid.col, bg = bg,
- add = TRUE)
- }
- }
- }
- if (cl.pos != "n") {
- colRange = assign.color(dat = col.lim2)
- ind1 = which(col == colRange[1])
- ind2 = which(col == colRange[2])
- colbar = col[ind1:ind2]
- if (is.null(cl.length)) {
- cl.length = ifelse(length(colbar) > 20, 11, length(colbar) +
- 1)
- }
- labels = seq(col.lim[1], col.lim[2], length = cl.length)
- if (cl.pos == "r") {
- vertical = TRUE
- xlim = c(m2 + 0.5 + mm * 0.02, m2 + 0.5 + mm * cl.ratio)
- ylim = c(n1 - 0.5, n2 + 0.5)
- }
- if (cl.pos == "b") {
- vertical = FALSE
- xlim = c(m1 - 0.5, m2 + 0.5)
- ylim = c(n1 - 0.5 - nn * cl.ratio, n1 - 0.5 - nn *
- 0.02)
- }
- colorlegend(colbar = colbar, labels = round(labels,
- 2), offset = cl.offset, ratio.colbar = 0.3, cex = cl.cex,
- xlim = xlim, ylim = ylim, vertical = vertical, align = cl.align.text)
- }
- if (tl.pos != "n") {
- pos.xlabel = cbind(m1:m2, n2 + 0.5 + laboffset)
- pos.ylabel = cbind(m1 - 0.5, n2:n1)
- if (tl.pos == "td") {
- if (type != "upper") {
- stop("type should be 'upper' if tl.pos is 'dt'.")
- }
- pos.ylabel = cbind(m1:(m1 + nn) - 0.5, n2:n1)
- }
- if (tl.pos == "ld") {
- if (type != "lower") {
- stop("type should be 'lower' if tl.pos is 'ld'.")
- }
- pos.xlabel = cbind(m1:m2, n2:(n2 - mm) + 0.5 + laboffset)
- }
- if (tl.pos == "d") {
- pos.ylabel = cbind(m1:(m1 + nn) - 0.5, n2:n1)
- pos.ylabel = pos.ylabel[1:min(n, m), ]
- symbols(pos.ylabel[, 1] + 0.5, pos.ylabel[, 2],
- add = TRUE, bg = bg, fg = addgrid.col, inches = FALSE,
- squares = rep(1, length(pos.ylabel[, 1])))
- text(pos.ylabel[, 1] + 0.5, pos.ylabel[, 2], newcolnames[1:min(n,
- m)], col = tl.col, cex = tl.cex, ...)
- }
- else {
- if (tl.pos != "l") {
- text(pos.xlabel[, 1], pos.xlabel[, 2], newcolnames,
- srt = tl.srt, adj = ifelse(tl.srt == 0, c(0.5,
- 0), c(0, 0)), col = tl.col, cex = tl.cex,
- offset = tl.offset, ...)
- }
- text(pos.ylabel[, 1], pos.ylabel[, 2], newrownames,
- col = tl.col, cex = tl.cex, pos = 2, offset = tl.offset,
- ...)
- }
- }
- title(title, ...)
- if (type == "full" && plotCI == "n" && !is.null(addgrid.col)) {
- rect(m1 - 0.5, n1 - 0.5, m2 + 0.5, n2 + 0.5, border = addgrid.col)
- }
- if (!is.null(addrect) && order == "hclust" && type == "full") {
- corrRect.hclust(corr, k = addrect, method = hclust.method,
- col = rect.col, lwd = rect.lwd)
- }
- corrPos = data.frame(PosName, Pos, DAT)
- colnames(corrPos) = c("xName", "yName", "x", "y", "corr")
- if (!is.null(p.mat)) {
- corrPos = cbind(corrPos, pNew)
- colnames(corrPos)[6] = c("p.value")
- }
- corrPos = corrPos[order(corrPos[, 3], -corrPos[, 4]), ]
- rownames(corrPos) = NULL
- res = list(corr = corr, corrPos = corrPos, arg = list(type = type))
- invisible(res)
- }
- ```
- ## Results
- ### Sample characteristics
- Participants diagnosed with major depressive disorder (MDD; *n* = `r nrow(clinicLOOP[clinicLOOP$Group=="MDD",])`) and healthy control (CON) participants (*n* = `r nrow(clinicLOOP[clinicLOOP$Group=="CON",])`) completed the LOOP task in the MRI.
- **Supplementary Table 1a**
- ```{r, warning=FALSE, message=FALSE}
- summary_stats <- group_by(clinicLOOP, Group) %>%
- summarise(
- age_mean = mean(age, na.rm = TRUE),
- BDI_mean = mean(BDI_sum, na.rm = TRUE),
- ATQ_mean = mean(ATQ, na.rm = TRUE),
- SIAS_mean = mean(SIAS, na.rm = TRUE),
- SDQ_mean = mean(selfconcept, na.rm = TRUE),
- age_sd = sd(age, na.rm = TRUE),
- BDI_sd = sd(BDI_sum, na.rm = TRUE),
- ATQ_sd = sd(ATQ, na.rm = TRUE),
- SIAS_sd = sd(SIAS, na.rm = TRUE),
- SDQ_sd = sd(selfconcept, na.rm = TRUE)
- )
- # t-tests
- # age_tt<-t.test(age ~ Group, data = clinicLOOP)
- BDI_tt<-t.test(BDI_sum ~ Group, data = clinicLOOP)
- ATQ_tt<-t.test(ATQ ~ Group, data = clinicLOOP)
- SIAS_tt<-t.test(SIAS ~ Group, data = clinicLOOP)
- SDQ_tt<-t.test(selfconcept ~ Group, data = clinicLOOP)
- # effect size
- # age_d<-cohens_d(age ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- BDI_d<-cohens_d(BDI_sum ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- ATQ_d<-cohens_d(ATQ ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- SIAS_d<-cohens_d(SIAS ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- SDQ_d<-cohens_d(selfconcept ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- # Create the table
- num=5 # define number of variables
- table <- cbind(summary_stats[,1], round(summary_stats[,2:11],2)) %>%
- pivot_longer(cols = -Group)
- table<- cbind(table[1:num,2:3],table[(num+1):(2*num),3],table[(2*num+1):(3*num),3],table[(3*num+1):(4*num),3])
- colnames(table)<-c("n","M1","SD1","M","SD")
- table$"n"<-c("Age", "BDI sum", "SIAS mean", "ATQ mean", "SDQ-III mean")
- table$t<-c(NA,round(BDI_tt$statistic[[1]],2),round(ATQ_tt$statistic[[1]],2),round(SIAS_tt$statistic[[1]],2),round(SDQ_tt$statistic[[1]],2))
- # table$t<-c(round(age_tt$statistic[[1]],2),round(BDI_tt$statistic[[1]],2),round(ATQ_tt$statistic[[1]],2),round(SIAS_tt$statistic[[1]],2),round(SDQ_tt$statistic[[1]],2))
- table$p<-c(NA, p(BDI_tt$p.value), p(ATQ_tt$p.value), p(SIAS_tt$p.value), p(SDQ_tt$p.value))
- # table$p<-c(p(age_tt$p.value), p(BDI_tt$p.value), p(ATQ_tt$p.value), p(SIAS_tt$p.value), p(SDQ_tt$p.value))
- table$d<-c(NA,round(BDI_d$effsize[[1]],2),round(ATQ_d$effsize[[1]],2),round(SIAS_d$effsize[[1]],2),round(SDQ_d$effsize[[1]],2))
- # table$d<-c(round(age_d$effsize[[1]],2),round(BDI_d$effsize[[1]],2),round(ATQ_d$effsize[[1]],2),round(SIAS_d$effsize[[1]],2),round(SDQ_d$effsize[[1]],2))
- gt(table)|>
- tab_header(
- title = html("<i> Supplementary Table 1a.</i> Sample characteristics - Group comparison of age and psychometric tests")
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "CON",
- columns = c(M1,SD1)
- ) |>
- tab_spanner(
- label = "MDD",
- columns = c(M, SD)
- ) |>
- tab_spanner(
- label = "t-test",
- columns = c(t, p, d)
- ) |>
- cols_label(
- n = html(" "),
- M1 = html("<i> M"),
- SD1 = html("<i> SD"),
- M = html("<i> M"),
- SD = html("<i> SD"),
- t = html("<i>t</i>"),
- p = html("<i>p"),
- d = html("Cohen's <i>d")
- )|>
- cols_align(
- align = "center"
- )|>
- tab_footnote(
- footnote= html("<i> Note.</i> Group comparison of sample characteristics using two-sample <i>t</i>-test. Beck's depression inventory (BDI-V, items on a 6-point likert scale from zero to five), Automatic Thought Questionnaire (ATQ, items on a 5-point likert scale from one to five), Social Interaction Anxiety scale (SIAS, items on a 5-point likert scale from zero to four), Self-esteem measured with the Self-Description Questionnaire-III (SDQ-III, subscale score). <i>M</i> = mean, <i>SD</i> = standard deviation, <i>t</i> = <i>t</i>-value with Welch correction, <i>d</i> = Cohen's <i>d</i> with Hedges correction. MDD = Major depressive disorder (<i>n</i> = 35), CON = control group (<i>n</i> = 32).")
- )|>
- gt_layout()
- ```
- **Supplementary Table 1b**
- ```{r, warning=FALSE, message=FALSE, results='asis'}
- ## define new variable
- clinicLOOP$prior_Self<-rowMeans(select(clinicLOOP,posAbilitySelfprior,negAbilitySelfprior)) #Category-specific estimation ability - self
- clinicLOOP$prior_Other<-rowMeans(select(clinicLOOP,posAbilityOtherprior,negAbilityOtherprior)) #Category-specific estimation ability - other
- clinicLOOP$prior_CertSelf<-rowMeans(select(clinicLOOP,posCertaintySelfprior,negCertaintySelfprior)) #Confidence of specific estimation ability - self
- clinicLOOP$prior_CertOther<-rowMeans(select(clinicLOOP,posCertaintyOtherprior,negCertaintyOtherprior)) #Confidence of specific estimation ability - other
- clinicLOOP$prior_EXPSelf<-rowMeans(select(clinicLOOP,EXPselfPos1,EXPselfNeg1)) #Performance expectation rating 1. trial - self
- clinicLOOP$prior_EXPOther<-rowMeans(select(clinicLOOP, EXPotherPos1, EXPotherNeg1)) #Performance expectation rating 1. trial - other
- clinicLOOP$ExpSelf <- rowMeans(select(clinicLOOP, posExpSelfprior, negExpSelfprior)) #Category-specific estimation experience
- clinicLOOP$ImportanceSelf<- rowMeans(select(clinicLOOP, posImportanceSelfprior, negImportanceSelfprior)) #Importance of estimation ability
- ## Supplementary Table 1b. Prior beliefs - group comparison
- summary_stats <- group_by(clinicLOOP, Group) %>%
- summarise(
- Sc_estim_mean = mean(selfconcept_estim, na.rm = TRUE),
- Sc_estCat_Self = mean(prior_Self, na.rm = TRUE),
- cert_estCat_Self = mean(prior_CertSelf, na.rm = TRUE),
- Sc_estCat_Other = mean(prior_Other, na.rm = TRUE),
- cert_estCat_Other = mean(prior_CertOther, na.rm = TRUE),
- Sc_estim_sd = sd(selfconcept_estim, na.rm = TRUE),
- Sc_estCat_Self_sd = sd(prior_Self, na.rm = TRUE),
- cert_estCat_Self_sd = sd(prior_CertSelf, na.rm = TRUE),
- Sc_estCat_Other_sd = sd(prior_Other, na.rm = TRUE),
- cert_estCat_Other_sd = sd(prior_CertOther, na.rm = TRUE)
- )
- # t-tests
- prior_estim<-t.test(selfconcept_estim~Group, data=clinicLOOP)
- prior_estCat_Self<-t.test(prior_Self~Group, data=clinicLOOP)
- cert_estCat_Self<-t.test(prior_CertSelf~Group, data=clinicLOOP)
- prior_estCat_Other<-t.test(prior_Other~Group, data=clinicLOOP)
- cert_estCat_Other<-t.test(prior_CertOther~Group, data=clinicLOOP)
- prior_sc<-t.test(selfconcept~Group, data=clinicLOOP)
- prior_t1Self<-t.test(prior_EXPSelf~Group, data=clinicLOOP)
- prior_t1Other<-t.test(prior_EXPOther~Group, data=clinicLOOP)
- # effect size
- prior_estim_d<-cohens_d(selfconcept_estim ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- prior_estCat_Self_d<-cohens_d(prior_Self ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- cert_estCat_Self_d<-cohens_d(prior_CertSelf ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- prior_estCat_Other_d<-cohens_d(prior_Other ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- cert_estCat_Other_d<-cohens_d(prior_CertOther ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- # Create the table
- num=5 # define number of variables
- table <- cbind(summary_stats[,1], round(summary_stats[,2:(2*num+1)],2)) %>%
- pivot_longer(cols = -Group)
- table<- cbind(table[1:num,2:3],table[(num+1):(2*num),3], table[(2*num+1):(3*num),3],table[(3*num+1):(4*num),3])
- colnames(table)<-c("n","M1","SD1","M","SD")
- table$"n"<-c("Global estimation ability", "Specific estimation ability - self", "Confidence of sp. estimation ability - self", "Specific estimation ability - other", "Confidence of sp. estimation ability - other")
- table$t<-c(round(prior_estim$statistic[[1]],2), round(prior_estCat_Self$statistic[[1]],2), round(cert_estCat_Self$statistic[[1]],2), round(prior_estCat_Other$statistic[[1]],2), round(cert_estCat_Other$statistic[[1]],2))
- table$p<-c(p(prior_estim$p.value), p(prior_estCat_Self$p.value), p(cert_estCat_Self$p.value), p(prior_estCat_Other$p.value), p(cert_estCat_Other$p.value))
- table$d<-c(round(prior_estim_d$effsize[[1]],2),round(prior_estCat_Self_d$effsize[[1]],2),round(cert_estCat_Self_d$effsize[[1]],2),round(prior_estCat_Other_d$effsize[[1]],2),round(cert_estCat_Other_d$effsize[[1]],2))
- gt(table) |>
- tab_header(
- title = html("<i> Supplementary Table 1b.</i> Sample characteristics - Group comparison of prior beliefs about global and specific estimation abilities")
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "CON",
- columns = c(M1,SD1)
- ) |>
- tab_spanner(
- label = "MDD",
- columns = c(M, SD)
- ) |>
- tab_spanner(
- label = "t-test",
- columns = c(t, p, d)
- ) |>
- cols_label(
- n = html(" "),
- M1 = html("<i> M"),
- SD1 = html("<i> SD"),
- M = html("<i> M"),
- SD = html("<i> SD"),
- t = html("<i>t</i>"),
- p = html("<i>p"),
- d = html("Cohen's <i>d")
- )|>
- cols_align(
- align = "center"
- )|>
- tab_footnote(
- footnote= html("<i> Note.</i> Group comparison of self-beliefs and beliefs about the other person rated in a pre-survey prior to the main task. Prior rating of global estimation ability (one item): 'I'm good at estimating,' (8-point Likert scale); mean of specific estimation ability ratings for the two self-related estimation categories (one item per category): 'How good are you at estimating [e.g., the weight of animals]?'; mean of two corresponding confidence ratings: 'How sure are you that your assessment of your ability is correct?'; mean of specific estimation ability ratings for the two other-related estimation categories: 'How good is the other person at estimating [e.g., the height of buildings]?'; mean of two corresponding other-related confidence ratings: 'How sure are you that your assessment of the other person's ability is correct?'. Specific estimation ability ratings on a scale from zero to 100% in comparison to a reference group; confidence ratings on a confidence interval scale from '+/- 50% (very unconfident)' to '+/- 0% (very confident)'. <i>M</i> = mean, <i>SD</i> = standard deviation, <i>t</i> = <i>t</i>-value with Welch correction, <i>d</i> = Cohen's <i>d</i> with Hedges correction. MDD = Major depressive disorder (<i>n</i> = 35), CON = control group (<i>n</i> = 32).")
- )|>
- gt_layout()
- ```
- **Supplementary Note 3: Group differences in global but not in specific prior beliefs**\
- Before comparing the process of belief formation between the two groups, we checked if there were already group differences in participants' prior beliefs regarding their estimation abilities. While individuals with depression showed a lower evaluation of the own abilities in general (*SDQ-III*, *t*(`r round(prior_sc$parameter[[1]],0)`) = `r round(prior_sc$statistic[[1]],2)`, *p* `r p_txt(prior_sc$p.value)`) as well as their general estimation abilities before the task (*t*(`r round(prior_estim$parameter[[1]],0)`) = `r round(prior_estim$statistic[[1]],2)`, *p* = `r p_txt(prior_estim$p.value)`). However, when asking more specifically for the performance in a certain estimation category or even more specific for the performance expectation in the upcoming first trail there were no group difference, neither for self (category-specific estimation ability: *t*(`r round(prior_estCat_Self$parameter[[1]],0)`) = `r round(prior_estCat_Self$statistic[[1]],2)`, *p* = `r p_txt(prior_estCat_Self$p.value)`; 1. performance expectation rating: *t*(`r round(prior_t1Self$parameter[[1]],0)`) = `r round(prior_t1Self$statistic[[1]],2)`, *p* = `r p_txt(prior_t1Self$p.value)`) nor for other-related prior beliefs (category-specific estimation ability: *t*(`r round(prior_estCat_Other$parameter[[1]],0)`) = `r round(prior_estCat_Other$statistic[[1]],2)`, *p* = `r p_txt(prior_estCat_Other$p.value)`; 1. performance expectation rating: *t*(`r round(prior_t1Other$parameter[[1]],0)`) = `r round(prior_t1Other$statistic[[1]],2)`, *p* = `r p_txt(prior_t1Other$p.value)`). This allows for a comparison of the learning process between groups independently of the prior beliefs.
- **Supplementary Table 1c**
- ```{r, warning=FALSE, message=FALSE}
- summary_stats <- group_by(clinicLOOP, Group) %>%
- summarise(
- ExpSelf_mean = mean(ExpSelf, na.rm = TRUE),
- ImportanceSelf_mean = mean(ImportanceSelf, na.rm = TRUE),
- knowOther_mean= mean(knowOther, na.rm = TRUE),
- likeOther1pre_mean= mean(likeOther1pre, na.rm = TRUE),
- likeOther2pre_mean= mean(likeOther2pre, na.rm = TRUE),
- ExpSelf_sd = sd(ExpSelf, na.rm = TRUE),
- ImportanceSelf_sd = sd(ImportanceSelf, na.rm = TRUE),
- knowOther_sd= sd(knowOther, na.rm = TRUE),
- likeOther1pre_sd= sd(likeOther1pre, na.rm = TRUE),
- likeOther2pre_sd= sd(likeOther2pre, na.rm = TRUE)
- )
- # t-tests
- ExpSelf <-t.test(ExpSelf ~ Group, data=clinicLOOP)
- ImportanceSelf <-t.test(ImportanceSelf ~ Group, data=clinicLOOP)
- knowOther <-t.test(knowOther~Group, data=clinicLOOP)
- likeOther1pre<-t.test(likeOther1pre~Group, data=clinicLOOP)
- likeOther2pre<-t.test(likeOther2pre~Group, data=clinicLOOP)
- # effect size
- ExpSelf_d<-cohens_d(ExpSelf ~ Group, data = clinicLOOP, var.equal = TRUE, hedges.correction = TRUE)
- ImportanceSelf_d<-cohens_d(ImportanceSelf ~ Group, data = clinicLOOP, var.equal = TRUE, hedges.correction = TRUE)
- knowOther_d<-cohens_d(knowOther ~ Group, data = clinicLOOP, var.equal = TRUE, hedges.correction = TRUE)
- likeOther1pre_d<-cohens_d(likeOther1pre ~ Group, data = clinicLOOP, var.equal = TRUE, hedges.correction = TRUE)
- likeOther2pre_d<-cohens_d(likeOther2pre ~ Group, data = clinicLOOP, var.equal = TRUE, hedges.correction = TRUE)
- # Create the table
- num=5 # define number of variables
- table <- cbind(summary_stats[,1], round(summary_stats[,2:(2*num+1)],2)) %>%
- pivot_longer(cols = -Group)
- table<- cbind(table[1:num,2:3],table[(num+1):(2*num),3],table[(2*num+1):(3*num),3],table[(3*num+1):(4*num),3])
- colnames(table)<-c("n","M1","SD1","M","SD")
- table$"n"<-c("Category-specific estimation experience", "Importance of estimation ability", "Familiarity of the other person", "Likeability of other person", "Estimated own likeability rated by other")
- table$t<-c(round(ExpSelf$statistic[[1]],2), round(ImportanceSelf$statistic[[1]],2), round(knowOther$statistic[[1]],2), round(likeOther1pre$statistic[[1]],2), round(likeOther2pre$statistic[[1]],2))
- table$p<-c(p(ExpSelf$p.value), p(ImportanceSelf$p.value), p(knowOther$p.value), p(likeOther1pre$p.value), p(likeOther2pre$p.value))
- table$d<-c(round(ExpSelf_d$effsize[[1]],2),round(ImportanceSelf_d$effsize[[1]],2),round(knowOther_d$effsize[[1]],2),round(likeOther1pre_d$effsize[[1]],2),round(likeOther2pre_d$effsize[[1]],2))
- gt(table) |>
- tab_header(
- title = html("<i> Supplementary Table 1c.</i> Sample characteristics - Group comparison of setting characteristics regarding the estimation tasks and the other person prior to the task")
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "CON",
- columns = c(M1,SD1)
- ) |>
- tab_spanner(
- label = "MDD",
- columns = c(M, SD)
- ) |>
- tab_spanner(
- label = "t-test",
- columns = c(t, p, d)
- ) |>
- cols_label(
- n = html(" "),
- M1 = html("<i> M"),
- SD1 = html("<i> SD"),
- M = html("<i> M"),
- SD = html("<i> SD"),
- t = html("<i>t</i>"),
- p = html("<i>p"),
- d = html("Cohen's <i>d")
- )|>
- cols_align(
- align = "center"
- )|>
- tab_footnote(
- footnote= html("<i> Note.</i> Group differences in previous experience, importance of estimating, and attitude towards the other person. All characteristics were rated on one item each on a 7-point likert scale in a pre-survey prior to the main task. Item wordings: 1. 'How much experience do you have with estimating [e.g. the weight of animals]?', 2. 'How important is it to you to be good at estimating [e.g., the weight of animals]?', 3. 'How well do you know the other person?', 4. 'I like the other person.', 5. 'I think the other person finds me likable.'. <i>M</i> = mean, <i>SD</i> = standard deviation, <i>t</i> = <i>t</i>-value with Welch correction, <i>d</i> = Cohen's <i>d</i> with Hedges correction. MDD = Major depressive disorder (<i>n</i> = 35), CON = control group (<i>n</i> = 32).")
- )|>
- gt_layout()
- ```
- ### Negativity bias in self-belief formation
- ```{r, warning=FALSE, message=FALSE}
- lr<-data.frame(select(clinicLOOP, a_posSelf, b_negSelf, c_posOther, d_negOther, subj, Group))
- lrLong<-reshape2::melt(lr, id.vars=c("subj", "Group"), variable.name="PEcondition", value.name = "learningRates")
- lrLong$Valence<-factor(c(rep(1, nrow(lr)), rep(-1,nrow(lr)),rep(1, nrow(lr)), rep(-1,nrow(lr))), labels=c("neg","pos"))
- lrLong$Agent<-factor(c(rep(1, 2*nrow(lr)), rep(-1,2*nrow(lr))), labels=c("other", "self"))
- # Model-based analysis of learning rates - group comparison
- lrGLM <- lme(
- learningRates ~ Valence * Agent * Group,
- random = list(subj = pdDiag(~ Valence + Agent)),
- data = lrLong,
- method = "ML"
- )
- lrGLM_ci <- intervals(lrGLM, level = 0.95,which = c("fixed"))
- #post-hoc t-test LR self
- lrSelf <- lrLong[lrLong$Agent == "self",]
- lrSelf_pos <- lrSelf[lrSelf$Valence == "pos", "learningRates"]
- lrSelf_neg <- lrSelf[lrSelf$Valence == "neg", "learningRates"]
- lr_tt<-t.test(lrSelf_neg, lrSelf_pos, paired=T)
- ```
- Consistent with our previous studies, the winning model for both the depression and healthy control groups showed higher learning rates for negative compared to positive prediction errors in forming novel self-beliefs. This negativity bias was not present when participants formed beliefs about the other person's ability (PE-Valence x Agent interaction: *t*(`r summary(lrGLM)$tTable[5,3]`) = `r round(summary(lrGLM)$tTable[5,4],2)`, *p* = `r p_txt(summary(lrGLM)$tTable[5,5])`); Supplementary Table 5; negativity bias: post-hoc a~Self/PE-~ vs a~Self/PE+~; *t*(`r lr_tt$parameter[["df"]]`) = `r round(lr_tt$statistic[["t"]],2)`, *p* `r p_txt(lr_tt[["p.value"]])`).
- **Supplementary Table 5**
- ```{r, warning=FALSE, message=FALSE}
- ## Supplementary Table 2. Model-based analysis of belief updating behavior (learning rates)
- tbl<-data.frame(pred=c("(Intercept)", "PE-Valence [PE+]", "Agent [Self]", "Group", "PE-Valence x Agent", "PE-Valence x Group", "Agent x Group", "PE-Valence x Agent x Group"), summary(lrGLM)$tTable)
- tbl$Value<-round(tbl$Value,2)
- tbl$Std.Error<-round(tbl$Std.Error,2)
- tbl$lower<-round(lrGLM_ci$fixed[,1],2)
- tbl$upper<-round(lrGLM_ci$fixed[,3],2)
- tbl$t.value<-round(tbl$t.value,2)
- tbl$p.value<-p(tbl$p.value)
- tbl <- relocate(tbl,lower:upper, .before = `DF`)
- gt(tbl)|>
- tab_header(
- title = html("<i>Supplementary Table 5.</i> Model-based analysis of belief updating behavior (learning rates) in individuals with and without depression")
- )|>
- opt_align_table_header(align = "left")|>
- cols_label(
- pred = html(" "),
- Value = html("<i> Estimate"),
- Std.Error = html("<i> SE"),
- DF = html("<i> df"),
- t.value = html("<i> t"),
- p.value = html("<i> p")
- )|>
- tab_spanner(
- label = html("95% CI"),
- columns = c(lower:upper)
- )|>
- cols_align(
- align = "center"
- )|>
- tab_footnote(
- footnote= html("<i> Note.</i> Prediction Error Valence (PE-Valence, [PE+, PE-]) x Agent [Self, Other] x Group [MDD, CON] linear mixed-effects model fit by maximum likelihood. Dependent variable: learning parameters of the winning model. Beta-estimate, <i>SE</i> = standard error, <i>CI</i> = confidence interval, <i>df</i> = degrees of freedom, <i>t</i> = t-value, MDD = Major depressive disorder (n = 35), CON = control group (n = 32).")
- )|>
- gt_layout()
- ```
- **Supplementary Figure 3A: Residuals vs. fitted values for the mixed-effects model on learning rates**
- ```{r, warning=FALSE, message=FALSE}
- plot(fitted(lrGLM), resid(lrGLM),
- xlab = "Fitted values",
- ylab = "Residuals")
- abline(h = 0, col = "blue")
- ```
- **Supplementary Figure 3B: Q-Q plot of residuals for the mixed-effects model on learning rates**
- ```{r, warning=FALSE, message=FALSE}
- qqnorm(resid(lrGLM))
- qqline(resid(lrGLM), col = "blue")
- ```
- **Supplementary Table 4.**
- ```{r, warning=FALSE, message=FALSE}
- LOOsAll<-select(clinicLOOP,Group,contains("LOO_"))
- KsAll<-select(clinicLOOP,Group,contains("k_"))
- LOOs<-c(colSums(LOOsAll[,2:9]), colSums(LOOsAll[LOOsAll$Group=="MDD",2:9]),
- colSums(LOOsAll[LOOsAll$Group=="CON",2:9]))
- LOOsSD<-c(sapply(LOOsAll[,2:9],var), sapply(LOOsAll[LOOsAll$Group=="MDD",2:9],var), sapply(LOOsAll[LOOsAll$Group=="CON",2:9],var))
- LOOsSD<-c(sapply(X=LOOsSD[1:8], FUN = function(X) sqrt(X*nrow(LOOsAll))),sapply(X=LOOsSD[9:16], FUN = function(X) sqrt(X*nrow(LOOsAll[LOOsAll$Group=="MDD",]))),sapply(X=LOOsSD[17:24], FUN = function(X) sqrt(X*nrow(LOOsAll[LOOsAll$Group=="CON",]))))
- LOOsDiff<-c(sapply(X=LOOs[1:8], FUN = function(X) X-LOOs[8]),sapply(X=LOOs[9:16], FUN = function(X) X-LOOs[16]),sapply(X=LOOs[17:24], FUN = function(X) X-LOOs[24]))
- Ks<-c(colSums(KsAll[,2:9]), colSums(KsAll[KsAll$Group=="MDD",2:9]),
- colSums(KsAll[KsAll$Group=="CON",2:9]))*100/(nrow(clinicLOOP)*80)
- LOOTable<-data.frame(
- modelCat<-c(" ","S = O"," "," ","S ≠ O"," "," "," ", " ","S = O"," "," ","S ≠ O"," "," "," ", " ","S = O"," "," ","S ≠ O"," "," "," "),
- model<-c("Mean Model (M0)","Unity Model (M1)","Ability Mode (M3)","Valence Model (M2)","Unity Model (M4)","Ability Model (M7)","Valence Model (M5)","Wighted Valence Model (M6)", "Mean Model (M0)","Unity Model (M1)","Ability Model (M3)","Valence Model (M2)","Unity Model (M4)","Ability Model (M7)","Valence Model (M5)","Wighted Valence Model (M6)", "Mean Model (M0)","Unity Model (M1)","Ability Model (M3)","Valence Model (M2)","Unity Model (M4)","Ability Model (M7)","Valence Model (M5)","Wighted Valence Model (M6)"),
- LOO<-round(LOOs,1),
- SD<-round(LOOsSD,2),
- LOOsDiff<-round(LOOsDiff,1),
- Ks<-round(Ks,2),paraNum<-c(4,5,6,6,6,8,8,9),
- group<-c(rep("Whole sample",8),rep("MDD",8),rep("CON",8))
- )
- colnames(LOOTable)<-c("modelCat", "Model", "LOO","SD","Diff", "k","paraNum","group")
- # sort rows
- LOOTable$order<-c(1,2,4,3,5,8,6,7,9,10,12,11,13,16,14,15,17,18,20,19,21,24,22,23)
- LOOTable<-LOOTable[order(LOOTable$order,decreasing = F),]
- LOOTable<- subset(LOOTable, select = -order)
- gt(LOOTable,groupname_col = "group")|>
- tab_header(
- title = html("<i> Supplementary Table 4. Model comparison")
- )|>
- fmt_markdown(
- columns = modelCat
- )|>
- opt_align_table_header(align = "left")|>
- cols_label(
- modelCat = html("<i> Model"),
- Model = html(" "),
- LOO = html("<i> PSIS-LOO"),
- SD = html("<i> LOO-SD"),
- Diff = html("<i> LOO-Diff"),
- k = html("<i> % of k > 0.7"),
- paraNum = html("<i> No. Est. Parameters")
- )|>
- tab_footnote(
- footnote= html("<i> Note.</i> LOO = sum PSIS-LOO, approximate leave-one-out cross-validation (LOO) using Pareto-smoothed importance sampling (PSIS); LOO-SE = Standard error of PSIS-LOO; LOO-Diff (SE-Diff) = Difference in expected predictive accuracy (PSIS-LOO) for all models from the model with the highest PSIS-LOO (wighted Valence Model) and standard errors of differences; percentage of <i>k</i>-estimated shape parameters of the generalized Pareto distribution - exceeding 0.7 (all according to Vehtari et al.1); No. Est. Parameters = number of estimated parameters in the model; S = O: same learning rates for Self and Other, S ≠ O: separate learning rates for Self and Other, MDD = Major depressive disorder (n = 35), CON = control group (n = 32).")
- )|>
- gt_layout()
- ```
- ### No learning differences between individuals with depression and healthy controls
- When comparing learning rates between the two groups, there was no difference in the overall extent of learning (main effect Group: *t*(`r summary(lrGLM)$tTable[4,3]`) = `r round(summary(lrGLM)$tTable[4,4],2)`, *p* = `r p_txt(summary(lrGLM)$tTable[4,5])`) and no difference in the extent of the negativity bias (PE-Valence x Agent x Group interaction: *t*(`r summary(lrGLM)$tTable[8,3]`) = `r round(summary(lrGLM)$tTable[8,4],2)`, *p* = `r p_txt(summary(lrGLM)$tTable[8,5])`; Fig. 1B and C, Supplementary Table 5). This is in line with the analysis of the expectation ratings in a model-agnostic approach (Supplementary Note 4, Supplementary Table 2). It suggests that people diagnosed with depression do not differ from healthy controls when forming novel beliefs in response to self-related performance feedback.
- **Predicted and actual ratings of expected performance for both groups over time (Figure 1B)**
- ```{r, warning=FALSE, message=FALSE}
- EXP<-data.frame(select(clinicLOOP,subj, Group,contains("EXPselfPos"),contains("EXPselfNeg"), contains("EXPotherPos"), contains("EXPotherNeg"),starts_with("X")))
- # prepare data for EXP ratings plot
- expMean<-data.frame(expRating=c(colMeans(EXP[EXP$Group=="MDD",3:ncol(EXP)]),colMeans(EXP[EXP$Group=="CON",3:ncol(EXP)])))
- expMean$model<-factor(c(rep(c(rep(1,80),rep(2,80)),2)),labels=c("data","model"))
- expMean$groupCond<-factor(c(rep(c(rep(1,20),rep(2,20)),4),rep(c(rep(3,20),rep(4,20)),4)),labels=c("MDD-High","MDD-Low","CON-High","CON-Low"))
- expMean$trial<-rep(1:20,16)
- expMean$condition<-sort(rep(1:16,20),decreasing = T)
- # plot ratings of expected performance over time
- ggplot(expMean, aes(x=trial,y=expRating, group=condition)) +
- geom_line(aes(color=groupCond, linetype=model), linewidth=1.5)+
- labs(y="Performance expectation", x="Trial") +
- labs(linetype = "model") +
- labs(colour = "groupCond") +
- scale_linetype_discrete(labels = c('Data', 'Winning Model'))+
- scale_color_manual(values=c("#23538d","#c00000","#558ed5","#e69999"),
- labels = c("MDD-High","MDD-Low","CON-High","CON-Low"))+
- theme_bw()+
- snl_theme()+
- theme(legend.position="right", legend.text=element_text(size=12))
- ```
- **Learning rates of the winning model for both groups (Figure 1C)**
- ```{r, warning=FALSE, message=FALSE}
- lrLong$Val_Group<-factor(c(rep(3,35), rep(1,32),rep(4,35), rep(2,32),rep(7,35), rep(5,32),rep(8,35), rep(6,32)), labels=c("CON_PE+(Self)","CON_PE-(Self)","MDD_PE+(Self)", "MDD_PE-(Self)","CON_PE+(Other)","CON_PE-(Other)","MDD_PE+(Other)", "MDD_PE-(Other)"))
- set.seed((1))
- ggplot(data = lrLong, aes(y = learningRates, x = Group, fill = Val_Group)) +
- geom_point(aes(color=Val_Group), position = position_jitterdodge (dodge.width = 0.75, jitter.width = 0.5), size=2, alpha = 0.8) +
- geom_boxplot(lwd=1, outlier.shape = NA, alpha = 0.5, position = position_dodge(width = 0.75), width = .6,
- color = "black") +
- labs(y="Learning rate") +
- guides(fill= "none")+
- scale_color_manual(values=c("#558ed5","#e69999","#23538d","#c00000","#558ed5","#e69999","#23538d","#c00000","#558ed5","#e69999","#23538d","#c00000","#558ed5","#e69999","#23538d","#c00000"))+
- scale_fill_manual(values=c("#558ed5","#e69999","#23538d","#c00000","#558ed5","#e69999","#23538d","#c00000","#558ed5","#e69999","#23538d","#c00000","#558ed5","#e69999","#23538d","#c00000"))+
- theme_bw()+
- snl_theme()+
- theme(axis.title.x = element_blank(),axis.text.x = element_text(face="bold",size = 18, color="black"),legend.text=element_text(size=12),legend.key.size = unit(2,"point"))
- ```
- **Supplementary Note 4: Model-agnostic behavioral analyses**
- ```{r, warning=FALSE, message=FALSE}
- # prepare data set for model-agnostic analysis
- EXP<-data.frame(select(clinicLOOP,subj, Group,contains("EXPselfPos"),contains("EXPselfNeg"), contains("EXPotherPos"), contains("EXPotherNeg")))
- EXPLong<-reshape2::melt(EXP,id.vars=c("subj", "Group"),value.name=("expRating"))
- EXPLong$agent<-factor(c(rep(1,40*nrow(EXP)),rep(-1,40*nrow(EXP))),labels=c("other","self"))
- EXPLong$ability<-factor(c(rep(1,20*nrow(EXP)),rep(-1,20*nrow(EXP)),rep(1,20*nrow(EXP)),rep(-1,20*nrow(EXP))),labels=c("low","high"))
- EXPLong$trial<-sort(rep(1:20,nrow(EXP)))
- # Model-free analysis of performance expectation ratings - group comparison (mixed-effect model)
- EXPmodel <- lme(
- expRating ~ ability * agent * trial * Group,
- random = ~ 1 + ability + agent + trial | subj,
- data = EXPLong,
- method = "ML"
- )
- # confidence intervals
- EXPmodel_ci <- intervals(EXPmodel, level = 0.95,which = c("fixed"))
- ```
- We performed a model-agnostic analysis on our performance expectation ratings over time to capture the basic effects of belief updating in our observed data and compare them between the two groups. The model included the factors Ability (High/Low) x Agent (Self/Other) x Group (MDD/CON) and Trial (20 trials) as a continuous predictor. Intercept, Ability, Agent, Trial, and Group were modeled as fixed effects. Random intercepts and random slopes for all within-subject factors (Ability, Agent, and Trial) were included for each participant. Model assumptions,
- including normality of residuals and homoscedasticity, were visually inspected,
- and no major violations were observed (see Supplementary Fig. 1). The linear
- mixed model showed a significant main effect of Ability condition (*t*(`r summary(EXPmodel)$tTable[2,3]`) = `r round(summary(EXPmodel)$tTable[2,4],2)`, *p* `r p_txt(summary(EXPmodel)$tTable[2,5])`) and interaction of Trial x Ability condition (*t*(`r summary(EXPmodel)$tTable[7,3]`) = `r round(summary(EXPmodel)$tTable[7,4],2)`, *p* `r p_txt(summary(EXPmodel)$tTable[7,5])`), indicating that participants adapted their performance expectation ratings according to the presented feedback in each Ability condition (see Fig. 1B). Moreover, there was a trend-wise effect for Agent (*t*(`r summary(EXPmodel)$tTable[3,3]`) = `r round(summary(EXPmodel)$tTable[3,4],2)`, *p* = `r p_txt(summary(EXPmodel)$tTable[3,5])`) and a significant interaction of Trial x Agent (*t*(`r summary(EXPmodel)$tTable[8,3]`) = `r round(summary(EXPmodel)$tTable[8,4],2)`, *p* = `r p_txt(summary(EXPmodel)$tTable[8,5])`), indicating that participants evaluated their own performance increasingly more negatively over time than the other's performance. The main effect Group and all interactions including Group were not significant (for a full results table, see Supplementary Table 2).
- **Supplementary Figure 1A: Residuals vs. fitted values for the behavioral mixed-effects model**
- ```{r, warning=FALSE, message=FALSE}
- plot(fitted(EXPmodel), resid(EXPmodel),
- xlab = "Fitted values",
- ylab = "Residuals")
- abline(h = 0, col = "blue")
- ```
- **Supplementary Figure 1B: Q-Q plot of residuals for the behavioral mixed-effects model**
- ```{r, warning=FALSE, message=FALSE}
- qqnorm(resid(EXPmodel))
- qqline(resid(EXPmodel), col = "blue")
- ```
- **Supplementary Table 2**
- ```{r, warning=FALSE, message=FALSE}
- tbl<-data.frame(pred=c("(Intercept)", "Ability [High]", "Agent [Self]", "Trial", "Group [MDD]", "Ability x Agent", "Ability x Trial", "Agent x Trial", "Ability x Group", "Agent x Group", "Trial x Group", "Ability x Agent x Trial", "Ability x Agent x Group", "Ability x Trial x Group", "Agent x Trial x Group", "Ability x Agent x Trial x Group"), summary(EXPmodel)$tTable)
- tbl$Value<-round(tbl$Value,2)
- tbl$Std.Error<-round(tbl$Std.Error,2)
- tbl$lower <- round(EXPmodel_ci$fixed[,1],2)
- tbl$upper <- round(EXPmodel_ci$fixed[,3],2)
- tbl$t.value<-round(tbl$t.value,2)
- tbl$p.value<-p(tbl$p.value)
- tbl <- relocate(tbl,lower:upper, .before = `DF`)
- gt(tbl)|>
- tab_header(
- title = html("<i> Supplementary Table 2. Model-agnostic analysis of belief updating behavior in individuals with and without depression")
- )|>
- opt_align_table_header(align = "left"
- )|>
- cols_label(
- pred = html(" "),
- Value = html("<i> Estimate"),
- Std.Error = html("<i> SE"),
- DF = html("<i> df"),
- t.value = html("<i> t"),
- p.value = html("<i> p")
- )|>
- tab_spanner(
- label = html("95% CI"),
- columns = c(lower:upper)
- )|>
- cols_align(
- align = "center"
- )|>
- tab_footnote(
- footnote= html("<i> Note.</i> Trial (continuous, 1-20) x Agent [Self, Other] x Ability condition [High, Low] x Group [MDD, CON] linear mixed-effects model fit by maximum likelihood. Dependent variable: trial-by-trial ratings of expected performance. Beta-estimate, <i>SE</i> = standard error, <i>CI</i> = confidence interval, <i>df</i> = degrees of freedom, <i>t</i> = t-value, MDD = Major depressive disorder (<i>n</i> = 35), CON = control group (<i>n</i> = 32).")
- )|>
- gt_layout(
- )
- ```
- ### Disregard of positive feedback with higher symptom burden
- **Dimension reduction to obtain a summary measure of psychopathology**
- ```{r}
- ## PCA to create an overall psychopathology score
- PCA<-principal(select(clinicLOOP, selfconcept, BDI_sum, ATQ, SIAS),
- residuals = FALSE,rotate="varimax", covar=FALSE,oblique.scores=TRUE)
- # add score to data set
- clinicLOOP$psychPath<-PCA$scores
- ```
- **Factor loadings of the psychopathology score (Figure 1D)**
- ```{r}
- # create plot with factor loadings
- l=data.frame(loadings=loadings(PCA)[],var=c("SDQ-III", "BDI","ATQ","SIAS"))
- ggplot(l, aes(x=var, y=PC1)) +
- ylab("Factor loadings") +
- geom_bar(color="black", lwd=2, fill="grey", position = "dodge", width=0.75, stat = "identity")+
- geom_hline(yintercept=0, lwd=2)+
- scale_y_continuous(breaks = seq(-1, 1, .25), limits = c(-1, 1)) +
- theme_bw()+
- snl_theme()+
- theme(axis.title.x = element_blank())
- ```
- **Output PCA**
- ```{r, echo=F}
- PCA
- ```
- **Disregard of positive information in association with psychopathology**
- ```{r, warning=FALSE, message=FALSE}
- ## create correlation matrix (Learning rates [aPE+, aPE-], Psychopathology score for MDD group
- corMat<-as.matrix(select(clinicLOOP[clinicLOOP$Group=="MDD",], a_posSelf, b_negSelf, psychPath, BDI_sum)) # add any 4. variable for a 4. column (will be overwritten)
- colnames(corMat)<- c("aPE+", "aPE-","MDD", "CON")
- corPat<-rcorr(corMat,type = "spearman")
- # CON group
- corMat<-as.matrix(select(clinicLOOP[clinicLOOP$Group=="CON",], a_posSelf, b_negSelf, psychPath, BDI_sum))
- colnames(corMat)<- c("aPE+", "aPE-","Psychopathology", " ")
- corCon<-rcorr(corMat,type = "spearman")
- # combine values from LR/ Psychopathology correlation in one matrix
- corPat$r[,4]<-corCon$r[,3]
- corPat$P[,4]<-corCon$P[,3]
- corPat$n[,4]<-corCon$n[,3]
- ## compare correlation coefficients
- # Learning rates PE+ vs PE- - Self
- compCorSelf=cocor.indep.groups(r1.jk=abs(corPat$r[1,3]), r2.hm=abs(corPat$r[2,3]), n1=nrow(clinicLOOP[clinicLOOP$Group=="MDD",]), n2=nrow(clinicLOOP[clinicLOOP$Group=="CON",]), alternative="two.sided", alpha=0.05, conf.level=0.95, null.value=0)
- ```
- Within the clinical sample, symptom burden was associated with reduced self-belief updating following positive prediction errors (MDD: positive learning rate *r*a~Self/PE+~= `r round(corPat$r[1,3],2)`, *p*= `r p_txt(corPat$P[1,3])`*;* for comparison, negative learning rate *r*a~Self/PE-~= `r round(corPat$r[2,3],2)`, *p*= `r p_txt(corPat$P[2,3])`; difference of absolute values: *z* = `r round(compCorSelf@fisher1925[["statistic"]],2)`, *p* = `r p_txt(compCorSelf@fisher1925[["p.value"]])` ; Fig. 1E, Supplementary Fig. 5. For more detailed correlations with symptom scores, see Supplementary Fig. 6). This indicates that individuals with higher symptom burden integrate positive feedback less, while learning from negative feedback remains unaffected.
- **Figure 1E**
- ```{r, warning=FALSE, message=FALSE}
- ggplot(clinicLOOP[clinicLOOP$Group=="MDD",],aes(x=psychPath, y=a_posSelf)) +
- geom_smooth(method=lm, color="#23538d", fill="#23538d", se=T, lwd=1.5) +
- geom_point(color="#23538d", size=3) +
- ggtitle("MDD sample") +
- labs(x="Psychopathology score",y="Positive learning rate - Self") +
- theme_bw()+
- snl_theme()
- ```
- ```{r, echo=FALSE, warning=FALSE, message=FALSE}
- cor<-corr.test(clinicLOOP[clinicLOOP$Group=="MDD",]$psychPath, clinicLOOP[clinicLOOP$Group=="MDD",]$a_posSelf,method="spearman",
- alpha=.05,ci=TRUE)
- ```
- *r~SP~*= `r round(cor[["r"]],2)` \[`r round(cor[["ci"]]$lower,2)`,`r round(cor[["ci"]]$upper,2)`\], *p* = `r p_txt(cor[["p"]])`
- **Supplementary Figure 5: Association of self-related learning rates and psychopathology scores separately for both groups**
- ```{r, warning=FALSE, message=FALSE}
- corrplot(corPat$r[1:2,3:4], method="color", col=col(200),
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.7, number.cex=2, #Text label color and rotation
- # Combine with significance
- p.mat = corPat$P[1:2,3:4], sig.level = 0.05, insig = "label_sig",
- pch.cex = 3,
- # hide correlation coefficient on the principal diagonal
- diag=T,
- cl.pos="n", main="Within-group psychopathology score",
- mar=c(0,0,2,0))
- ```
- ```{r, warning=FALSE, message=FALSE}
- pvals <- corPat$P[1:2, 3:4]
- colnames(pvals) <- c("MDDgr","CONgr")
- pvals_fdr_pepos <- p.adjust(pvals[1,], method = "fdr")
- pvals_fdr_peneg <- p.adjust(pvals[2,], method = "fdr")
- pvals_fdr <- rbind(pvals_fdr_pepos, pvals_fdr_peneg)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- p_table <- relocate(p_table,MDDgr_FDR, .before = `CONgr`)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values supplementary figure 1")
- ) |>
- cols_label(
- Variable = html(" "),
- MDDgr = html("<i> p"),
- MDDgr_FDR = html("<i>p</i> (FDR)"),
- CONgr = html("<i> p"),
- CONgr_FDR = html("<i>p</i> (FDR)")
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "MDD",
- columns = c(MDDgr,MDDgr_FDR)
- ) |>
- tab_spanner(
- label = "CON",
- columns = c(CONgr, CONgr_FDR)
- )|>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- ```
- *Supplementary Figure 5.* Spearman correlations between self-related learning rates for positive (aPE+) and negative prediction errors (aPE-) and Psychopathology score for MDD and CON group. MDD = Major depressive disorder, CON = Control, \* *p* \< .05.
- **Supplementary Figure 6: Association between learning rates and symptom scores separately for both groups**
- ```{r, warning=FALSE, message=FALSE}
- ## create correlation matrix with symptom scores separately
- # MDD group
- corMat<-as.matrix(select(clinicLOOP[clinicLOOP$Group=="MDD",], a_posSelf, b_negSelf, BDI_sum, ATQ, SIAS, selfconcept))
- colnames(corMat)<- c("aPE+", "aPE-", "BDI", "ATQ", "SIAS", "SDQ-III")
- corPat<-rcorr(corMat,type = "spearman")
- # CON group
- corMat<-as.matrix(select(clinicLOOP[clinicLOOP$Group=="CON",], a_posSelf, b_negSelf, BDI_sum, ATQ, SIAS, selfconcept))
- colnames(corMat)<- c("aPE+", "aPE-", "BDI", "ATQ", "SIAS", "SDQ-III")
- corCon<-rcorr(corMat,type = "spearman")
- ## create plots
- # MDD group
- corrplot(corPat$r[1:2,3:6], method="color", col=col(200),
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.6, number.cex=2, #Text label color and rotation
- # Combine with significance
- p.mat = corPat$P[1:2,3:6], sig.level = 0.05, insig = "label_sig",
- pch.cex = 3,
- # hide correlation coefficient on the principal diagonal
- diag=T,
- cl.pos="n", main="MDD",
- mar=c(0,0,2,0))
- # CON group
- corrplot(corCon$r[1:2,3:6], method="color", col=col(200),
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.6, number.cex=2, #Text label color and rotation
- # Combine with significance
- #p.mat = corCon$P[1:2,3:6], sig.level = 0.05, insig = "label_sig",
- #pch.cex = 1.6,
- # hide correlation coefficient on the principal diagonal
- diag=T,
- cl.pos="n", main="CON",
- mar=c(0,0,2,0))
- ```
- ```{r, warning=FALSE, message=FALSE}
- pvals <- corPat$P[1:2,3:6]
- colnames(pvals) <- c("BD","AT", "SI","SD")
- pvals_fdr_pepos <- p.adjust(pvals[1,], method = "fdr")
- pvals_fdr_peneg <- p.adjust(pvals[2,], method = "fdr")
- pvals_fdr <- rbind(pvals_fdr_pepos, pvals_fdr_peneg)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- #relocate
- p_table <- p_table %>%
- select(Variable, BD, BD_FDR, AT, AT_FDR, SI, SI_FDR, SD, SD_FDR)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values supplementary figure 2 (MDD group)")
- ) |>
- cols_label(
- Variable = html(" "),
- BD = html("<i> p"),
- BD_FDR = html("<i>p</i> (FDR)"),
- AT = html("<i> p"),
- AT_FDR = html("<i>p</i> (FDR)"),
- SI = html("<i> p"),
- SI_FDR = html("<i>p</i> (FDR)"),
- SD = html("<i> p"),
- SD_FDR = html("<i>p</i> (FDR)")
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "BDI",
- columns = c(BD,BD_FDR)
- ) |>
- tab_spanner(
- label = "ATQ",
- columns = c(AT, AT_FDR)
- )|>
- tab_spanner(
- label = "SIAS",
- columns = c(SI,SI_FDR)
- ) |>
- tab_spanner(
- label = "SDQ",
- columns = c(SD, SD_FDR)
- )|>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- ```
- ```{r, echo=FALSE, warning=FALSE, message=FALSE}
- pvals <- corCon$P[1:2,3:6]
- colnames(pvals) <- c("BD","AT", "SI","SD")
- pvals_fdr_pepos <- p.adjust(pvals[1,], method = "fdr")
- pvals_fdr_peneg <- p.adjust(pvals[2,], method = "fdr")
- pvals_fdr <- rbind(pvals_fdr_pepos, pvals_fdr_peneg)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- #relocate
- p_table <- p_table %>%
- select(Variable, BD, BD_FDR, AT, AT_FDR, SI, SI_FDR, SD, SD_FDR)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values supplementary figure 2 (CON group)")
- ) |>
- cols_label(
- Variable = html(" "),
- BD = html("<i> p"),
- BD_FDR = html("<i>p</i> (FDR)"),
- AT = html("<i> p"),
- AT_FDR = html("<i>p</i> (FDR)"),
- SI = html("<i> p"),
- SI_FDR = html("<i>p</i> (FDR)"),
- SD = html("<i> p"),
- SD_FDR = html("<i>p</i> (FDR)")
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "BDI",
- columns = c(BD,BD_FDR)
- ) |>
- tab_spanner(
- label = "ATQ",
- columns = c(AT, AT_FDR)
- )|>
- tab_spanner(
- label = "SIAS",
- columns = c(SI,SI_FDR)
- ) |>
- tab_spanner(
- label = "SDQ",
- columns = c(SD, SD_FDR)
- )|>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
- ```
- *Supplementary Figure 6.* Spearman correlation between the self-related learning rates for positive (aPE+) and negative prediction errors (aPE-) with the separate elements of the Psychopathology score: Beck's depression inventory (BDI-V), Automatic Thought Questionnaire (ATQ), Social Interaction Anxiety scale (SIAS), Self-Description Questionnaire-III (SDQ-III subscale scores). MDD = Major depressive disorder, CON = Control, \* *p* \< .05.
- ### Imbalanced prediction error signaling in depression during feedback processing
- **Figure 2**
- *Right anterior insula ROI*
- ```{r, warning=FALSE, message=FALSE}
- ## Fig. 2 Group x PE interaction in anterior insula ROI
- PExGr<-data.frame(select(clinicLOOP, pos_rDVins, neg_rDVins, subj, Group)) # parameter estimates at peak level extracted from matlab, SPM
- PExGr_Long<-reshape2::melt(PExGr, id.vars=c("subj", "Group"), variable.name="PEcondition", value.name = "paramEst")
- PExGr_Long$PEcondition<-factor(c(rep(1, nrow(PExGr)), rep(2,nrow(PExGr))), labels=c("pos","neg"))
- PExGr_Long$Group<-factor(PExGr_Long$Group)
- set.seed(1)
- ggplot(data = PExGr_Long, aes(y = paramEst, x = Group, color=PEcondition, fill=PEcondition)) +
- geom_hline(yintercept=0, lwd=1.5, linetype=2, color="#CDDBD8")+
- geom_point(position = position_jitterdodge (dodge.width = 0.6, jitter.width = 0.45), size=3, alpha = 0.8) +
- geom_boxplot(aes(x=Group,fill=PEcondition), lwd=1.5, outlier.shape = NA, alpha = 0.5, position = position_dodge(width = 0.6), width = .5,
- color = "black") +
- labs(x="none") +
- labs(y="Parameter estimate (38,-12,2)") +
- guides(fill="none")+
- scale_x_discrete(labels=c("CON","MDD")) +
- scale_color_manual(values=c("#23538d","#c00000"))+
- scale_fill_manual(values=c("#23538d","#c00000"))+
- theme_bw()+
- snl_theme()+
- theme(axis.title.x = element_blank(),axis.text.x = element_text(face="bold",size = 16, color="black"),legend.key.size = unit(2,"point"))
- ```
- *Right posterior insula ROI*
- ```{r, warning=FALSE, message=FALSE}
- ## Fig. 2 Group x PE interaction posterior insula ROI
- PExGr<-data.frame(select(clinicLOOP, pos_rPins, neg_rPins, subj, Group)) # parameter estimates at peak level extracted from matlab, SPM
- PExGr_Long<-reshape2::melt(PExGr, id.vars=c("subj", "Group"), variable.name="PEcondition", value.name = "paramEst")
- PExGr_Long$PEcondition<-factor(c(rep(1, nrow(PExGr)), rep(2,nrow(PExGr))), labels=c("pos","neg"))
- PExGr_Long$Group<-factor(PExGr_Long$Group)
- # create plot
- set.seed(2)
- ggplot(data = PExGr_Long, aes(y = paramEst, x = Group, color=PEcondition, fill=PEcondition)) +
- geom_hline(yintercept=0, lwd=1.5, linetype=2, color="#CDDBD8")+
- geom_point(position = position_jitterdodge (dodge.width = 0.6, jitter.width = 0.45), size=3, alpha = 0.8) +
- geom_boxplot(aes(x=Group,fill=PEcondition), lwd=1.5, outlier.shape = NA, alpha = 0.5, position = position_dodge(width = 0.6), width = .5,
- color = "black") +
- labs(x="none") +
- labs(y="Parameter estimate (38,-12,2)") +
- guides(fill="none")+
- scale_x_discrete(labels=c("CON","MDD")) +
- scale_color_manual(values=c("#23538d","#c00000"))+
- scale_fill_manual(values=c("#23538d","#c00000"))+
- theme_bw()+
- snl_theme()+
- theme(axis.title.x = element_blank(),axis.text.x = element_text(face="bold",size = 16, color="black"),legend.key.size = unit(2,"point"))
- ```
- *Figure 2.* Differential insula tracking of prediction error valence in depression. The interaction (MDD\[PE \] \> MDD \[PE+\]) **\>** (CON \[PE-\] \> CON \[PE-\]) shows a greater difference between PE- vs. PE+ in the MDD compared to the CON group. CON = control group (n = 32), MDD = Major Depressive Disorder (n = 35). The plot depicts the parameter estimates of the Group \[CON, MDD\] x Prediction error valence \[PE+, PE-\] interaction at peak level for the three regions of interest in the right insula. Brain plot: uncorrected p \< 0.05 within ROI for display purposes.
- **Supplementary Figure 7: Neural activation associated with negative compared to positive prediction error processing -- whole brain analysis**
- *Right insula*
- ```{r, warning=FALSE, message=FALSE}
- PExGr<-data.frame(select(clinicLOOP, Pos_nPEgrpPE_rIns, Neg_nPEgrpPE_rIns, subj, Group))
- PExGr_Long<-reshape2::melt(PExGr, id.vars=c("subj", "Group"), variable.name="PEcondition", value.name = "paramEst")
- PExGr_Long$PEcondition<-factor(c(rep(1, nrow(PExGr)), rep(2,nrow(PExGr))), labels=c("pos","neg"))
- PExGr_Long$Group<-factor(PExGr_Long$Group)
- # create plot
- set.seed(1)
- ggplot(data = PExGr_Long, aes(y = paramEst, x = Group, pattern=PEcondition)) +
- geom_hline(yintercept=0, lwd=2, color="#FFFFFF")+
- geom_hline(yintercept=0, lwd=2, linetype=2, color="#CDDBD8")+
- geom_point(aes(shape=PEcondition), position = position_jitterdodge (dodge.width = 0.6, jitter.width = 0.45), size=5, alpha = 0.8,color= "#C00000") +
- scale_shape_manual(values=c(20,18), labels = c("Positive PE", "Negative PE"))+
- geom_boxplot_pattern(aes(x=Group,pattern=PEcondition), fill = "#C00000", lwd=2, outlier.shape = NA, alpha = 0.5, position = position_dodge(width = 0.6), width = .5,
- color = "black", pattern_color = "white", pattern_angle = 45, pattern_density = 0.1, pattern_spacing = 0.025, pattern_key_scale_factor = 0.6) +
- labs(x="none") +
- labs(y="Parameter estimates (42,16,2)") +
- scale_x_discrete(labels=c("CON","MDD")) +
- scale_pattern_discrete(choices =c("none","stripe"))+
- theme_bw()+
- snl_theme()+
- theme(axis.title.x = element_blank(),axis.text.x = element_text(face="bold",size = 18, color="black"),legend.key.size = unit(2,"point"))
- ```
- *Left insula*
- ```{r, warning=FALSE, message=FALSE}
- PExGr<-data.frame(select(clinicLOOP, Pos_nPEgrpPE_lIns, Neg_nPEgrpPE_lIns, subj, Group))
- PExGr_Long<-reshape2::melt(PExGr, id.vars=c("subj", "Group"), variable.name="PEcondition", value.name = "paramEst")
- PExGr_Long$PEcondition<-factor(c(rep(1, nrow(PExGr)), rep(2,nrow(PExGr))), labels=c("pos","neg"))
- PExGr_Long$Group<-factor(PExGr_Long$Group)
- # create plot
- set.seed(1)
- ggplot(data = PExGr_Long, aes(y = paramEst, x = Group, pattern=PEcondition)) +
- geom_hline(yintercept=0, lwd=2, color="#FFFFFF")+
- geom_hline(yintercept=0, lwd=2, linetype=2, color="#CDDBD8")+
- geom_point(aes(shape=PEcondition), position = position_jitterdodge (dodge.width = 0.6, jitter.width = 0.45), size=5, alpha = 0.8,color= "#C00000") +
- scale_shape_manual(values=c(20,18), labels = c("Positive PE", "Negative PE"))+
- geom_boxplot_pattern(aes(x=Group,pattern=PEcondition), fill = "#C00000", lwd=2, outlier.shape = NA, alpha = 0.5, position = position_dodge(width = 0.6), width = .5,
- color = "black", pattern_color = "white", pattern_angle = 45, pattern_density = 0.1, pattern_spacing = 0.025, pattern_key_scale_factor = 0.6) +
- labs(x="none") +
- labs(y="Parameter estimates (-40,12,2)") +
- scale_x_discrete(labels=c("CON","MDD")) +
- scale_pattern_discrete(choices =c("none","stripe"))+
- theme_bw()+
- snl_theme()+
- theme(axis.title.x = element_blank(),axis.text.x = element_text(face="bold",size = 18, color="black"),legend.key.size = unit(2,"point"))
- ```
- *Supplementary Figure 7.* Neural activation associated with negative compared to positive prediction error processing (continuous PE-Valence effect). Parameter estimates for positive and negative prediction error processing at peak level within the insula cluster.
- ### Exploratory analysis within the clinical sample
- ```{r, warning=FALSE, message=FALSE}
- ## Supplementary Table 8. Emotions
- summary_stats <- group_by(clinicLOOP, Group) %>%
- summarise(
- happy = mean(happinessSelf, na.rm = TRUE),
- arousal = mean(arousalSelf, na.rm = TRUE),
- pride = mean(prideSelf, na.rm = TRUE),
- emba = mean(embarrassmentSelf, na.rm = TRUE),
- tired = mean(tirednessSelf, na.rm = TRUE),
- happy_sd = sd(happinessSelf, na.rm = TRUE),
- arousal_sd = sd(arousalSelf, na.rm = TRUE),
- pride_sd = sd(prideSelf, na.rm = TRUE),
- emba_sd = sd(embarrassmentSelf, na.rm = TRUE),
- tired_sd = sd(tirednessSelf, na.rm = TRUE),
- )
- # t-tests
- happy<-t.test(happinessSelf~Group, data=clinicLOOP)
- arousal<-t.test(arousalSelf~Group, data=clinicLOOP)
- pride<-t.test(prideSelf~Group, data=clinicLOOP)
- emba <- t.test(embarrassmentSelf~Group, data=clinicLOOP)
- tired<-t.test(tirednessSelf~Group, data=clinicLOOP)
- # effect size
- happy_d<-cohens_d(happinessSelf ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- arousal_d<-cohens_d(arousalSelf ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- pride_d<-cohens_d(prideSelf ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- emba_d<-cohens_d(embarrassmentSelf ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- tired_d<-cohens_d(tirednessSelf ~ Group, data = clinicLOOP, hedges.correction = TRUE)
- # Create the table
- num=5 # define number of variables
- table <- cbind(summary_stats[,1], round(summary_stats[,2:(2*num+1)],2)) %>%
- pivot_longer(cols = -Group)
- table<- cbind(table[1:num,2:3],table[(num+1):(2*num),3], table[(2*num+1):(3*num),3],table[(3*num+1):(4*num),3])
- colnames(table)<-c("n","M1","SD1","M","SD")
- table$"n"<-c("Happiness", "Arousal", "Pride", "Embarrassment", "Tiredness")
- table$t<-c(round(happy$statistic[[1]],2), round(arousal$statistic[[1]],2), round(pride$statistic[[1]],2), round(emba$statistic[[1]],2), round(tired$statistic[[1]],2))
- table$p<-c(p(happy$p.value), p(arousal$p.value), p(pride$p.value), p(emba$p.value), p(tired$p.value))
- table$d<-c(round(happy_d$effsize[[1]],2),round(arousal_d$effsize[[1]],2),round(pride_d$effsize[[1]],2),round(emba_d$effsize[[1]],2),round(tired_d$effsize[[1]],2))
- gt(table) |>
- tab_header(
- title = html("<i> Supplementary Table 8.</i> Emotions - group comparison")
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "CON",
- columns = c(M1,SD1)
- ) |>
- tab_spanner(
- label = "MDD",
- columns = c(M, SD)
- ) |>
- tab_spanner(
- label = "t-test",
- columns = c(t, p)
- ) |>
- cols_label(
- n = html(" "),
- M1 = html("<i> M"),
- SD1 = html("<i> SD"),
- M = html("<i> M"),
- SD = html("<i> SD"),
- t = html("<i>t</i>"),
- p = html("<i>p"),
- d = html("Cohen's <i>d")
- )|>
- cols_align(
- align = "center"
- )|>
- tab_footnote(
- footnote= html("<i> Note.</i> Group comparison of emotion ratings during task performance. Two ratings per emotion on a continuous scale from zero to 100 following the presentation of self-related feedback trials. <i>M</i> = mean, <i>SD</i> = standard deviation, <i>d</i> = Cohen's <i>d</i> with Hedges correction. MDD = Major depressive disorder (n = 35), CON = control group (n = 32).")
- )|>
- gt_layout()
- ```
- **Association of affective experience and brain activity for positive and negative prediction errors within the clinical sample**
- **Fig. 2/ Supplementary Fig. 8**
- **Positive PE trials**
- ```{r, warning=FALSE, message=FALSE}
- ## create correlation matrix
- corMat<-as.matrix(data.frame(select(clinicLOOP[clinicLOOP$Group=="MDD",], starts_with("SelfPos")),select(clinicLOOP[clinicLOOP$Group=="MDD",], happinessSelf, prideSelf, embarrassmentSelf)))
- colnames(corMat)<- c("Ant ins (r)", "P ins (r)", "Ant ins (l)", "P ins (l)", "Amy (r)", "Amy (l)", "VS", "Happiness", "Pride", "Emba")
- corPos<-rcorr(corMat,type = "spearman")
- # plot
- corrplot(corPos$r[8:10,1:7], method="color",
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.5, number.cex=1.1,
- p.mat = corPos$P[8:10,1:7], sig.level = 0.05, insig = "label_sig", pch.cex = 1.2,
- diag=T,cl.cex = 0.8, cl.ratio=0.1,
- mar=c(0,0,1.5,0))
- ```
- ```{r, warning=FALSE, message=FALSE}
- pvals <- corPos$P[8:10,1:7]
- colnames(pvals) <- c("AIr","PIr", "AIl","PIl","AMr","AMl","V")
- pvals_hap_fdr <- p.adjust(pvals[1,], method = "fdr")
- pvals_pri_fdr <- p.adjust(pvals[2,], method = "fdr")
- pvals_emb_fdr <- p.adjust(pvals[3,], method = "fdr")
- pvals_fdr <- rbind(pvals_hap_fdr, pvals_pri_fdr, pvals_emb_fdr)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- #relocate
- p_table <- p_table %>%
- select(Variable,
- AIr, AIr_FDR,
- PIr, PIr_FDR,
- AIl, AIl_FDR,
- PIl, PIl_FDR,
- AMr, AMr_FDR,
- AMl, AMl_FDR,
- V, V_FDR)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values supplementary figure 5 (positive PE trials)")
- ) |>
- cols_label(
- Variable = html(" "),
- AIr = html("<i> p"),
- AIr_FDR = html("<i>p</i> (FDR)"),
- PIr = html("<i> p"),
- PIr_FDR = html("<i>p</i> (FDR)"),
- AIl = html("<i> p"),
- AIl_FDR = html("<i>p</i> (FDR)"),
- PIl = html("<i> p"),
- PIl_FDR = html("<i>p</i> (FDR)"),
- AMr = html("<i> p"),
- AMr_FDR = html("<i>p</i> (FDR)"),
- AMl = html("<i> p"),
- AMl_FDR = html("<i>p</i> (FDR)"),
- V = html("<i> p"),
- V_FDR = html("<i>p</i> (FDR)"),
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "Ant ins (r)",
- columns = c(AIr, AIr_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (r)",
- columns = c(PIr, PIr_FDR)
- )|>
- tab_spanner(
- label = "Ant ins (l)",
- columns = c(AIl, AIl_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (l)",
- columns = c(PIl, PIl_FDR)
- )|>
- tab_spanner(
- label = "Amy (r)",
- columns = c(AMr, AMr_FDR)
- ) |>
- tab_spanner(
- label = "Amy (l)",
- columns = c(AMl, AMl_FDR)
- )|>
- tab_spanner(
- label = "VS",
- columns = c(V, V_FDR)
- ) |>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- ```
- **Negative PE trials**
- ```{r, warning=FALSE, message=FALSE}
- ## create correlation matrix
- corMat<-as.matrix(data.frame(select(clinicLOOP[clinicLOOP$Group=="MDD",], starts_with("SelfNeg")),select(clinicLOOP[clinicLOOP$Group=="MDD",], happinessSelf, prideSelf, embarrassmentSelf)))
- colnames(corMat)<- c("Ant ins (r)", "P ins (r)", "Ant ins (l)", "P ins (l)", "Amy (r)", "Amy (l)", "VS", "Happiness","Pride", "Emba")
- corNeg<-rcorr(corMat,type = "spearman")
- col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
- # plot
- corrplot(corNeg$r[8:10,1:7], method="color", col=col(200),
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.5, number.cex=1.1,
- p.mat = corNeg$P[8:10,1:7], sig.level = 0.05, insig = "label_sig", pch.cex = 1.2,
- diag=T,cl.cex = 0.8, cl.ratio=0.1,
- mar=c(0,0,1.5,0))
- ```
- ```{r, warning=FALSE, message=FALSE}
- pvals <- corNeg$P[8:10,1:7]
- colnames(pvals) <- c("AIr","PIr", "AIl","PIl","AMr","AMl","V")
- pvals_hap_fdr <- p.adjust(pvals[1,], method = "fdr")
- pvals_pri_fdr <- p.adjust(pvals[2,], method = "fdr")
- pvals_emb_fdr <- p.adjust(pvals[3,], method = "fdr")
- pvals_fdr <- rbind(pvals_hap_fdr, pvals_pri_fdr, pvals_emb_fdr)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- #relocate
- p_table <- p_table %>%
- select(Variable,
- AIr, AIr_FDR,
- PIr, PIr_FDR,
- AIl, AIl_FDR,
- PIl, PIl_FDR,
- AMr, AMr_FDR,
- AMl, AMl_FDR,
- V, V_FDR)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values supplementary figure 5 (negative PE trials)")
- ) |>
- cols_label(
- Variable = html(" "),
- AIr = html("<i> p"),
- AIr_FDR = html("<i>p</i> (FDR)"),
- PIr = html("<i> p"),
- PIr_FDR = html("<i>p</i> (FDR)"),
- AIl = html("<i> p"),
- AIl_FDR = html("<i>p</i> (FDR)"),
- PIl = html("<i> p"),
- PIl_FDR = html("<i>p</i> (FDR)"),
- AMr = html("<i> p"),
- AMr_FDR = html("<i>p</i> (FDR)"),
- AMl = html("<i> p"),
- AMl_FDR = html("<i>p</i> (FDR)"),
- V = html("<i> p"),
- V_FDR = html("<i>p</i> (FDR)"),
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "Ant ins (r)",
- columns = c(AIr, AIr_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (r)",
- columns = c(PIr, PIr_FDR)
- )|>
- tab_spanner(
- label = "Ant ins (l)",
- columns = c(AIl, AIl_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (l)",
- columns = c(PIl, PIl_FDR)
- )|>
- tab_spanner(
- label = "Amy (r)",
- columns = c(AMr, AMr_FDR)
- ) |>
- tab_spanner(
- label = "Amy (l)",
- columns = c(AMl, AMl_FDR)
- )|>
- tab_spanner(
- label = "VS",
- columns = c(V, V_FDR)
- ) |>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- ```
- *Supplementary Figure 8.* Spearman correlations between the affect ratings and brain activity within ROIs in response to positive and negative prediction errors (categorical PE effect). \* p \< .05.
- Correlations with **symptom burden** within the clinical sample show the same directional pattern as the group comparison, indicating that higher symptom burden is associated with greater activation following negative prediction errors, although not statistically significant:
- ```{r, warning=FALSE, message=FALSE}
- #### MDD group only, psychopathology score PE Category
- corMat<-as.matrix(data.frame(select(clinicLOOP[clinicLOOP$Group=="MDD",], starts_with("SelfPos")),select(clinicLOOP[clinicLOOP$Group=="MDD",], psychPath, a_posSelf)))
- colnames(corMat)<- c("Ant ins (r)", "P ins (r)", "Ant ins (l)", "P ins (l)", "Amy (r)", "Amy (l)", "VS", "PE+ trials/Psychopathology", "PE- trials/Psychopathology")
- corPos<-rcorr(corMat,type = "spearman")
- corMat<-as.matrix(data.frame(select(clinicLOOP[clinicLOOP$Group=="MDD",], starts_with("SelfNeg")),select(clinicLOOP[clinicLOOP$Group=="MDD",], psychPath, a_posSelf)))
- colnames(corMat)<- c("Ant ins (r)", "P ins (r)", "Ant ins (l)", "P ins (l)", "Amy (r)", "Amy (l)", "VS", "PE+ trials/Psychopathology", "PE- trials/Psychopathology")
- corNeg<-rcorr(corMat,type = "spearman")
- corPos$r[9,]<-corNeg$r[8,]
- corPos$P[9,]<-corNeg$P[8,]
- corPos$n[9,]<-corNeg$n[8,]
- col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
- ## create plots for pos/ neg PE Category with PP Score
- corrplot(corPos$r[8:9,1:7], method="color", col=col(200),
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.5, number.cex=1.1,
- # p.mat = corPos$P[8:9,1:7], sig.level = 0.05, insig = "label_sig", pch.cex = 1.2,
- diag=T,cl.cex = 0.8, cl.ratio=0.1,
- mar=c(0,0,1.5,0))
- ```
- ```{r, warning=FALSE, message=FALSE}
- pvals <- corPos$P[8:9,1:7]
- colnames(pvals) <- c("AIr","PIr", "AIl","PIl","AMr","AMl","V")
- pvals_fdr_pepos <- p.adjust(pvals[1,], method = "fdr")
- pvals_fdr_peneg <- p.adjust(pvals[2,], method = "fdr")
- pvals_fdr <- rbind(pvals_fdr_pepos, pvals_fdr_peneg)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- #relocate
- p_table <- p_table %>%
- select(Variable,
- AIr, AIr_FDR,
- PIr, PIr_FDR,
- AIl, AIl_FDR,
- PIl, PIl_FDR,
- AMr, AMr_FDR,
- AMl, AMl_FDR,
- V, V_FDR)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values for correlations with psychopathology score")
- ) |>
- cols_label(
- Variable = html(" "),
- AIr = html("<i> p"),
- AIr_FDR = html("<i>p</i> (FDR)"),
- PIr = html("<i> p"),
- PIr_FDR = html("<i>p</i> (FDR)"),
- AIl = html("<i> p"),
- AIl_FDR = html("<i>p</i> (FDR)"),
- PIl = html("<i> p"),
- PIl_FDR = html("<i>p</i> (FDR)"),
- AMr = html("<i> p"),
- AMr_FDR = html("<i>p</i> (FDR)"),
- AMl = html("<i> p"),
- AMl_FDR = html("<i>p</i> (FDR)"),
- V = html("<i> p"),
- V_FDR = html("<i>p</i> (FDR)"),
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "Ant ins (r)",
- columns = c(AIr, AIr_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (r)",
- columns = c(PIr, PIr_FDR)
- )|>
- tab_spanner(
- label = "Ant ins (l)",
- columns = c(AIl, AIl_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (l)",
- columns = c(PIl, PIl_FDR)
- )|>
- tab_spanner(
- label = "Amy (r)",
- columns = c(AMr, AMr_FDR)
- ) |>
- tab_spanner(
- label = "Amy (l)",
- columns = c(AMl, AMl_FDR)
- )|>
- tab_spanner(
- label = "VS",
- columns = c(V, V_FDR)
- ) |>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- ```
- Generally, while participants receive recurrent performance feedback, insula activation in negative prediction error trials is correlated with the learning behavior as indicated by the negative learning rates (see Supplementary Fig. 10).
- **Supplementary Figure 10:** **Association of learning rates and brain activity for positive and negative prediction errors**
- ```{r, warning=FALSE, message=FALSE}
- ## create correlation matrix
- # Positive PE Condition
- corMat<-as.matrix(data.frame(select(clinicLOOP[clinicLOOP$Group=="MDD",], starts_with("SelfPos")),select(clinicLOOP[clinicLOOP$Group=="MDD",], a_posSelf, b_negSelf)))
- colnames(corMat)<- c("Ant Ins (r)", "P ins (r)", "Ant Ins (l)", "P ins (l)", "Amy (r)", "Amy (l)", "VS", "PE+ trials/aPE+", "PE- trials/aPE-")
- corPos<-rcorr(corMat,type = "spearman")
- # Negative PE Condition
- corMat<-as.matrix(data.frame(select(clinicLOOP[clinicLOOP$Group=="MDD",], starts_with("SelfNeg")),select(clinicLOOP[clinicLOOP$Group=="MDD",], a_posSelf, b_negSelf)))
- colnames(corMat)<- c("Ant Ins (r)", "P ins (r)", "Ant Ins (l)", "P ins (l)", "Amy (r)", "Amy (l)", "VS", "aPE+", "aPE-")
- corNeg<-rcorr(corMat,type = "spearman")
- # combine correlations of interest (according to hypothesis LR+/PE+ processing and LR-/PE- processing) in one matrix
- corPos$r[9,]<-corNeg$r[9,]
- corPos$P[9,]<-corNeg$P[9,]
- corPos$n[9,]<-corNeg$n[9,]
- col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
- ## create plots
- corrplot(corPos$r[8:9,1:7], method="color", col=col(200),
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.8, number.cex=1.1,
- p.mat = corPos$P[8:9,1:7], sig.level = 0.05, insig = "label_sig",
- pch.cex = 1.5, cl.cex = 0.8, cl.ratio=0.1,
- # hide correlation coefficient on the principal diagonal
- diag=T,mar=c(0,0,1.5,0))
- ```
- ```{r, warning=FALSE, message=FALSE}
- pvals <- corPos$P[8:9,1:7]
- colnames(pvals) <- c("AIr","PIr", "AIl","PIl","AMr","AMl","V")
- pvals_fdr_pepos <- p.adjust(pvals[1,], method = "fdr")
- pvals_fdr_peneg <- p.adjust(pvals[2,], method = "fdr")
- pvals_fdr <- rbind(pvals_fdr_pepos, pvals_fdr_peneg)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- #relocate
- p_table <- p_table %>%
- select(Variable,
- AIr, AIr_FDR,
- PIr, PIr_FDR,
- AIl, AIl_FDR,
- PIl, PIl_FDR,
- AMr, AMr_FDR,
- AMl, AMl_FDR,
- V, V_FDR)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values supplementary figure 6")
- ) |>
- cols_label(
- Variable = html(" "),
- AIr = html("<i> p"),
- AIr_FDR = html("<i>p</i> (FDR)"),
- PIr = html("<i> p"),
- PIr_FDR = html("<i>p</i> (FDR)"),
- AIl = html("<i> p"),
- AIl_FDR = html("<i>p</i> (FDR)"),
- PIl = html("<i> p"),
- PIl_FDR = html("<i>p</i> (FDR)"),
- AMr = html("<i> p"),
- AMr_FDR = html("<i>p</i> (FDR)"),
- AMl = html("<i> p"),
- AMl_FDR = html("<i>p</i> (FDR)"),
- V = html("<i> p"),
- V_FDR = html("<i>p</i> (FDR)"),
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "Ant ins (r)",
- columns = c(AIr, AIr_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (r)",
- columns = c(PIr, PIr_FDR)
- )|>
- tab_spanner(
- label = "Ant ins (l)",
- columns = c(AIl, AIl_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (l)",
- columns = c(PIl, PIl_FDR)
- )|>
- tab_spanner(
- label = "Amy (r)",
- columns = c(AMr, AMr_FDR)
- ) |>
- tab_spanner(
- label = "Amy (l)",
- columns = c(AMl, AMl_FDR)
- )|>
- tab_spanner(
- label = "VS",
- columns = c(V, V_FDR)
- ) |>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- ```
- *Supplementary Figure 10.* Spearman correlations between learning rates for self-related positive (aPE+) and negative prediction errors (aPE-) and brain activity within ROIs in response to PE+ and PE- (categorical PE effect). \* *p* \< .05.
- ### Exploratory analysis within control sample
- **Association of affective experience and brain activity for positive and negative prediction errors within the control sample**
- **Supplementary Fig. 9**
- **Positive PE trials**
- ```{r, warning=FALSE, message=FALSE}
- ## create correlation matrix
- corMat<-as.matrix(data.frame(select(clinicLOOP[clinicLOOP$Group=="CON",], starts_with("SelfPos")),select(clinicLOOP[clinicLOOP$Group=="CON",], happinessSelf, prideSelf, embarrassmentSelf)))
- colnames(corMat)<- c("Ant ins (r)", "P ins (r)", "Ant ins (l)", "P ins (l)", "Amy (r)", "Amy (l)", "VS", "Happiness", "Pride", "Emba")
- corPos<-rcorr(corMat,type = "spearman")
- # plot
- corrplot(corPos$r[8:10,1:7], method="color",
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.5, number.cex=1.1,
- # p.mat = corPos$P[8:10,1:7], sig.level = 0.05, insig = "n", pch.cex = 1.2,
- diag=T,cl.cex = 0.8, cl.ratio=0.1,
- mar=c(0,0,1.5,0))
- ```
- ```{r, warning=FALSE, message=FALSE}
- pvals <- corPos$P[8:10,1:7]
- colnames(pvals) <- c("AIr","PIr", "AIl","PIl","AMr","AMl","V")
- pvals_hap_fdr <- p.adjust(pvals[1,], method = "fdr")
- pvals_pri_fdr <- p.adjust(pvals[2,], method = "fdr")
- pvals_emb_fdr <- p.adjust(pvals[3,], method = "fdr")
- pvals_fdr <- rbind(pvals_hap_fdr, pvals_pri_fdr, pvals_emb_fdr)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- #relocate
- p_table <- p_table %>%
- select(Variable,
- AIr, AIr_FDR,
- PIr, PIr_FDR,
- AIl, AIl_FDR,
- PIl, PIl_FDR,
- AMr, AMr_FDR,
- AMl, AMl_FDR,
- V, V_FDR)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values supplementary figure XX (positive PE trials, control group")
- ) |>
- cols_label(
- Variable = html(" "),
- AIr = html("<i> p"),
- AIr_FDR = html("<i>p</i> (FDR)"),
- PIr = html("<i> p"),
- PIr_FDR = html("<i>p</i> (FDR)"),
- AIl = html("<i> p"),
- AIl_FDR = html("<i>p</i> (FDR)"),
- PIl = html("<i> p"),
- PIl_FDR = html("<i>p</i> (FDR)"),
- AMr = html("<i> p"),
- AMr_FDR = html("<i>p</i> (FDR)"),
- AMl = html("<i> p"),
- AMl_FDR = html("<i>p</i> (FDR)"),
- V = html("<i> p"),
- V_FDR = html("<i>p</i> (FDR)"),
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "Ant ins (r)",
- columns = c(AIr, AIr_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (r)",
- columns = c(PIr, PIr_FDR)
- )|>
- tab_spanner(
- label = "Ant ins (l)",
- columns = c(AIl, AIl_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (l)",
- columns = c(PIl, PIl_FDR)
- )|>
- tab_spanner(
- label = "Amy (r)",
- columns = c(AMr, AMr_FDR)
- ) |>
- tab_spanner(
- label = "Amy (l)",
- columns = c(AMl, AMl_FDR)
- )|>
- tab_spanner(
- label = "VS",
- columns = c(V, V_FDR)
- ) |>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- ```
- **Negative PE trials**
- ```{r, warning=FALSE, message=FALSE}
- ## create correlation matrix
- corMat<-as.matrix(data.frame(select(clinicLOOP[clinicLOOP$Group=="CON",], starts_with("SelfNeg")),select(clinicLOOP[clinicLOOP$Group=="CON",], happinessSelf, prideSelf, embarrassmentSelf)))
- colnames(corMat)<- c("Ant ins (r)", "P ins (r)", "Ant ins (l)", "P ins (l)", "Amy (r)", "Amy (l)", "VS", "Happiness","Pride", "Emba")
- corNeg<-rcorr(corMat,type = "spearman")
- col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
- # plot
- corrplot(corNeg$r[8:10,1:7], method="color", col=col(200),
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1.5, number.cex=1.1,
- p.mat = corNeg$P[8:10,1:7], sig.level = 0.05, insig = "label_sig", pch.cex = 1.2,
- diag=T,cl.cex = 0.8, cl.ratio=0.1,
- mar=c(0,0,1.5,0))
- ```
- ```{r, warning=FALSE, message=FALSE}
- pvals <- corNeg$P[8:10,1:7]
- colnames(pvals) <- c("AIr","PIr", "AIl","PIl","AMr","AMl","V")
- pvals_hap_fdr <- p.adjust(pvals[1,], method = "fdr")
- pvals_pri_fdr <- p.adjust(pvals[2,], method = "fdr")
- pvals_emb_fdr <- p.adjust(pvals[3,], method = "fdr")
- pvals_fdr <- rbind(pvals_hap_fdr, pvals_pri_fdr, pvals_emb_fdr)
- # pvals_fdr <- matrix(p.adjust(pvals, method = "fdr"), nrow = nrow(pvals))
- rownames(pvals_fdr) <- rownames(pvals)
- colnames(pvals_fdr) <- colnames(pvals)
- # Combine into one data frame
- p_table <- as.data.frame(pvals) %>%
- tibble::rownames_to_column("Variable")
- # Add FDR columns
- for (col in colnames(pvals)) {
- p_table[[paste0(col, "_FDR")]] <- pvals_fdr[, col]
- }
- #relocate
- p_table <- p_table %>%
- select(Variable,
- AIr, AIr_FDR,
- PIr, PIr_FDR,
- AIl, AIl_FDR,
- PIl, PIl_FDR,
- AMr, AMr_FDR,
- AMl, AMl_FDR,
- V, V_FDR)
- # Round
- p_table <- p_table %>%
- mutate(across(-Variable, ~ sprintf("%.3f", .)))
- # Create a gt table
- gt(p_table) |>
- tab_header(
- title = html("<i>P</i>-values supplementary figure XX (negative PE trials, control group)")
- ) |>
- cols_label(
- Variable = html(" "),
- AIr = html("<i> p"),
- AIr_FDR = html("<i>p</i> (FDR)"),
- PIr = html("<i> p"),
- PIr_FDR = html("<i>p</i> (FDR)"),
- AIl = html("<i> p"),
- AIl_FDR = html("<i>p</i> (FDR)"),
- PIl = html("<i> p"),
- PIl_FDR = html("<i>p</i> (FDR)"),
- AMr = html("<i> p"),
- AMr_FDR = html("<i>p</i> (FDR)"),
- AMl = html("<i> p"),
- AMl_FDR = html("<i>p</i> (FDR)"),
- V = html("<i> p"),
- V_FDR = html("<i>p</i> (FDR)"),
- ) |>
- opt_align_table_header(align = "left")|>
- tab_spanner(
- label = "Ant ins (r)",
- columns = c(AIr, AIr_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (r)",
- columns = c(PIr, PIr_FDR)
- )|>
- tab_spanner(
- label = "Ant ins (l)",
- columns = c(AIl, AIl_FDR)
- ) |>
- tab_spanner(
- label = "Post ins (l)",
- columns = c(PIl, PIl_FDR)
- )|>
- tab_spanner(
- label = "Amy (r)",
- columns = c(AMr, AMr_FDR)
- ) |>
- tab_spanner(
- label = "Amy (l)",
- columns = c(AMl, AMl_FDR)
- )|>
- tab_spanner(
- label = "VS",
- columns = c(V, V_FDR)
- ) |>
- cols_align(
- align = "center"
- )|>
- gt_layout()
- ```
- ## Methods
- **Supplementary Note 7: Posterior predictive checks - Behavioral analyses on the predicted data.**
- ```{r, warning=FALSE, message=FALSE}
- ## Repeat analyses of belief updating behavior on the predicted data
- # prepare data
- yrep<-data.frame(select(clinicLOOP,subj, Group,starts_with("X")))
- yrepLong<-reshape2::melt(yrep,id.vars=c("subj", "Group"),value.name=("expModel"))
- yrepLong$agent<-factor(c(rep(1,40*nrow(yrep)),rep(-1,40*nrow(yrep))),labels=c("other","self"))
- yrepLong$ability<-factor(c(rep(1,20*nrow(yrep)),rep(-1,20*nrow(yrep)),rep(1,20*nrow(yrep)),rep(-1,20*nrow(yrep))),labels=c("low","high"))
- yrepLong$trial<-sort(rep(1:20,nrow(yrep)))
- # model
- yrepmodel<- lme(
- expModel ~ ability * agent * trial * Group,
- random = ~ 1 + ability + agent + trial | subj,
- data = yrepLong,
- method = "ML"
- )
- # yrepmodel<-lme(expModel ~ ability + agent + trial + Group
- # + ability:agent + ability:trial + ability:Group + agent:trial + agent:Group + trial:Group
- # + ability:agent:trial + ability:agent:Group + ability:trial:Group + agent:trial:Group
- # + ability:agent:trial:Group , random = ~1|subj, data = yrepLong, method = 'ML')
- ```
- We repeated the analyses (Supplementary Note 4) using the predicted data from the winning model to see whether our winning model captured the core effects in our model-agnostic analysis. We could reproduce all effects from the model-agnostic analysis with the predicted data: main effect Ability condition: *t*(`r summary(yrepmodel)$tTable[2,3]`) = `r round(summary(yrepmodel)$tTable[2,4],2)`, *p* = `r p_txt(summary(yrepmodel)$tTable[2,5])`, main effect Agent condition: *t*(`r summary(yrepmodel)$tTable[3,3]`) = `r round(summary(yrepmodel)$tTable[3,4],2)`, *p* = `r p_txt(summary(yrepmodel)$tTable[3,5])`, interaction Trial x Ability condition: *t*(`r summary(yrepmodel)$tTable["abilityhigh:trial",3]`) = `r round(summary(yrepmodel)$tTable["abilityhigh:trial",4],2)`, *p* `r p_txt(summary(yrepmodel)$tTable["abilityhigh:trial",5])`, interaction Trial x Agent condition *t*(`r summary(yrepmodel)$tTable["agentself:trial",3]`) = `r round(summary(yrepmodel)$tTable["agentself:trial",4],2)`, *p* `r p_txt(summary(yrepmodel)$tTable["agentself:trial",5])`). This confirms that the winning model recapitulates the main effects in our data.
- **Supplementary Figure 2:** **Correlation of model parameters of the winning model**
- ```{r, warning=FALSE, message=FALSE}
- # define matrix with model parameters
- corMat<-as.matrix(data.frame(select(clinicLOOP, SW1, SW2, SW3, SW4, a_posSelf, b_negSelf, c_posOther, d_negOther,w)))
- colnames(corMat)<- c(":EXP[1]-H/Self", ":EXP[1]-L/Self", ":EXP[1]-H/Other", ":EXP[1]-L/Other", "aPE+/Self", "aPE-/Self","aPE+/Other", "aPE-/Other","w")
- # create correlation plot using Spearman correlation
- corPara<-rcorr(corMat,type = "spearman")
- col <- colorRampPalette(c("#BB4444", "#EE9988", "#FFFFFF", "#77AADD", "#4477AA"))
- # create plot
- corrplot(corPara$r, method="color", col=col(200),
- type="full",
- addCoef.col = "black", # Add coefficient of correlation
- tl.col="black", tl.srt=60, tl.cex= 1, number.cex=0.9, #Text label color and rotation
- # Combine with significance
- p.mat = corPara$P, sig.level = 0.05, insig = "label_sig", pch.cex = 1.2,
- diag=F)
- ```
- *Supplementary Figure 2.* Spearman correlations of model parameters for the winning model. EXP1 = estimated first expected performance for the two ability conditions (H = high, L = low), separately for Self and Other. a = learning rates for positive (aPE+) and negative prediction errors (aPE-), separately for Self and Other. w = weighting factor. \* *p* \< .05.
QuartoReport.qmd, no license · at the source
Overview
- Social Neuroscience Lab, Department of Psychiatry and Psychotherapy, University of Luebeck, Luebeck, Germany
- Sleep and Mental Health, Department of Psychiatry and Psychotherapy, University of Luebeck, Luebeck, Germany
- Department of Clinical Psychology and Experimental Psychopathology, Goethe University Frankfurt, Frankfurt am Main, Germany
- Section Social Neuroscience, Department of General Psychiatry, University of Heidelberg, Heidelberg, Germany
- Department of Psychiatry, Psychosomatics and Psychotherapy, University of Luebeck, Luebeck, Germany
Abstract
Background: Maladaptive self-beliefs are a core symptom of major depressive disorder. These beliefs are perpetuated by a negatively biased integration of self-related feedback. Understanding the neurocomputational mechanisms of biased belief updating may help to counteract maladaptive beliefs and the maintenance of depression.
Methods: The present study uses a belief-updating task and functional neuroimaging to examine the neurocomputational mechanisms associated with self-related feedback processing in individuals with major depression (n = 35) and matched healthy controls (n = 32). We hypothesized that increased symptom burden in depression is associated with negatively biased self-belief updating and altered hemodynamic responses to social feedback.
Results: Our findings show that, in the clinical sample, the incorporation of unexpected positive feedback was reduced with greater symptom burden, and that insula reactivity was generally elevated to unexpected negative feedback.
Conclusion: The interplay of increased hemodynamic responsiveness to negative feedback and the reduced learning from positive feedback provide new insights into cognitive distortions in depression and may explain the persistence of maladaptive self-beliefs and, thus, the maintenance of depression.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repository
Its files are read in the Code ↔ Paper reader above, with 13 matches between paragraphs and lines of code.
OSF gwkp3
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
1 file
- Data_Analysis_Script/
QuartoReport.qmd , Quarto, 2,541 lines, 13 matches
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 1 script, each with its path and the digest of its content;
- 13 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data Availability Statement
The behavioral data and code used to generate the behavioral analyses are available at https://
The behavioral data and code used to generate the behavioral analyses are available at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 12 authors, 3 keywords, 14 MeSH terms, 1 funder, 47 references.
Cite
This paper
Czekalla, N., Schröder, A., Mayer, A. V., Stierand, J., Stolz, D. S., Kube, T., Korn, C. W., Wilhelm, I., Klein, J. P., Paulus, F. M., Krach, S., & Müller-Pinzler, L. (2026). Aberrant insula activity to negative and reduced learning from positive feedback underlie maladaptive self-beliefs in depression. Translational psychiatry, 16(1), 397. https://
BibTeX
@article{czekalla2026abe
author = {Czekalla, Nora and Schröder, Alexander and Mayer, Annalina V and Stierand, Janine and Stolz, David S and Kube, Tobias and Korn, Christoph W and Wilhelm, Ines and Klein, Jan Philipp and Paulus, Frieder M and Krach, Sören and Müller-Pinzler, Laura},
title = {{Aberrant insula activity to negative and reduced learning from positive feedback underlie maladaptive self-beliefs in depression}},
journal = {Translational psychiatry},
year = {2026},
month = aug,
volume = {16},
number = {1},
pages = {397},
publisher = {Nature Publishing Group},
issn = {2158-3188},
doi = {10.1038/
url = {https://
pmid = {42562807},
pmcid = {PMC13447838}
}
RIS
TY - JOUR
AU - Czekalla, Nora
AU - Schröder, Alexander
AU - Mayer, Annalina V
AU - Stierand, Janine
AU - Stolz, David S
AU - Kube, Tobias
AU - Korn, Christoph W
AU - Wilhelm, Ines
AU - Klein, Jan Philipp
AU - Paulus, Frieder M
AU - Krach, Sören
AU - Müller-Pinzler, Laura
TI - Aberrant insula activity to negative and reduced learning from positive feedback underlie maladaptive self-beliefs in depression
T2 - Translational psychiatry
J2 - Transl Psychiatry
PY - 2026
DA - 2026/
VL - 16
IS - 1
SP - 397
SN - 2158-3188
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Aberrant insula activity to negative and reduced learning from positive feedback underlie maladaptive self-beliefs in depression",
"container-title": "Translational psychiatry",
"author": [
{
"family": "Czekalla",
"given": "Nora"
},
{
"family": "Schröder",
"given": "Alexander"
},
{
"family": "Mayer",
"given": "Annalina V"
},
{
"family": "Stierand",
"given": "Janine"
},
{
"family": "Stolz",
"given": "David S"
},
{
"family": "Kube",
"given": "Tobias"
},
{
"family": "Korn",
"given": "Christoph W"
},
{
"family": "Wilhelm",
"given": "Ines"
},
{
"family": "Klein",
"given": "Jan Philipp"
},
{
"family": "Paulus",
"given": "Frieder M"
},
{
"family": "Krach",
"given": "Sören"
},
{
"family": "Müller-Pinzler",
"given": "Laura"
}
],
"container-title-short":
"volume": "16",
"issue": "1",
"page": "397",
"DOI": "10.1038/
"PMID": "42562807",
"PMCID": "PMC13447838",
"ISSN": "2158-3188",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
6
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s42003-026-10229-5 [code]
- The neurocomputational mechanisms underlying the impact of social comparison on effort investment.Journal: Communications biologyIn common: psych, tidyverse, 5 references
- [2] doi:10.1371/journal.pbio.3003767 [code]
- Ultrasound neuromodulation reveals distinct roles of the dorsal anterior cingulate cortex and anterior insula in learning.Journal: PLoS biologyIn common: psych, reshape2, tidyverse, cognitive, 3 references
- [3] doi:10.1016/j.nicl.2026.104012 [code]
- Structural-functional multilayer brain network properties and outcome of combined repetitive transcranial magnetic stimulation and psychotherapy for obsessive-compulsive disorder.Journal: NeuroImage. ClinicalIn common: nlme, psych, rstatix, 2 other tools, fMRI
- [4] doi:10.1038/s41467-026-71415-x [code]
- Regional BOLD variability reflects microstructural maturation and neuronal ensheathment in the preterm infant cortex.Journal: Nature communicationsIn common: nlme, psych, rstatix, 2 other tools, fMRI
- [5] doi:10.1126/sciadv.aec9291 [code]
- Computational mechanisms of perception in autism revealed using games inspired by rodent operant tasks.Journal: Science advancesIn common: nlme, psych, rstatix, 2 other tools, cognitive
- [6] doi:10.1073/pnas.2606871123 [code]
- Oxytocin modulates the neurocomputational mechanisms engaged in learning rank relationships in social networks.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: nlme, psych, reshape2, 1 other tool, 1 reference
- [7] doi:10.1093/pnasnexus/pgag138 [code]
- Regretting a chance to connect: How neural responses to missed social opportunities predict self-disclosure.Journal: PNAS nexusIn common: nlme, psych, reshape2, 1 other tool, fMRI, cognitive
- [8] doi:10.1038/s41467-026-74565-0 [code]
- The functional neurobiology of dispositions towards negative emotions.Journal: Nature communicationsIn common: nlme, psych, reshape2, 1 other tool, cognitive
- [9] doi:10.1038/s41398-026-04010-9 [code]
- Bullying victimization and brain development: a longitudinal structural magnetic resonance imaging study from adolescence to early adulthood.Journal: Translational psychiatryIn common: nlme, psych, rstatix, 1 other tool
- [10] doi:10.1093/braincomms/fcag121 [code]
- Anterior insular co-activation patterns associated with stress markers in chronic primary pain.Journal: Brain communicationsIn common: psych, rstatix, reshape2, 1 other tool, fMRI
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 1 script, and 13 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:c8237341f21ae5a9…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[.
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
