Chapter 35 [fMRI] Vicarious signature ~ single trial
author: "Heejung Jung"
date: "2023-03-04"
Step 1: Common parameters
# step 1: load data
for (signature_key in c("VPS")) {
#c("NPS", "NPSpos", "NPSneg", "VPS", #"VPSnooccip", "ThermalPain", "MechPain", "GeneralAversive", "AversiveVisual"
# "ZhouVPS", "PINES", "GSR", "GeuterPaincPDM")) {
= signature_key
dv_keyword = signature_key
signature_name # step 1: common parameters _______
<- dirname(dirname(getwd()))
main_dir #signature_key = "NPSpos"
= paste0("model36_iv-task-stim_dv-VPS")
analysis_folder
<-
sig_name Sys.glob(file.path(
main_dir,"analysis/fmri/nilearn/signature_extract",
paste0(
"signature-",
signature_key,"_sub-all_runtype-pvc_event-stimulus.tsv"
)# nolint
)) print(sig_name)
<-
analysis_dir file.path(main_dir,
"analysis",
"mixedeffect",
analysis_folder,as.character(Sys.Date())) # nolint
dir.create(analysis_dir,
showWarnings = FALSE,
recursive = TRUE)
<- analysis_dir
savedir
# step 2: load data
= read.csv(sig_name)
df = df %>% separate(
sig_df
singletrial_fname,sep = "_",
c(
"sub",
"ses",
"run",
"runtype",
"event",
"trial",
"cuetype",
"stimintensity"
)
)= sig_df %>% separate(
sig_df
stimintensity,into = c(NA, "stimintensity"),
extra = "drop",
fill = "left"
)<- simple_contrasts_singletrial(sig_df)
pvc $task[pvc$runtype == "runtype-pain"] <- "pain"
pvc$task[pvc$runtype == "runtype-vicarious"] <- "vicarious"
pvc$task[pvc$runtype == "runtype-cognitive"] <- "cognitive"
pvc$task <- factor(pvc$task)
pvc
# step 3: parameters
= "all"
taskname = "stimulusintensity"
plot_keyword = "(3 tasks x 3 stimulus intensity)"
ggtitle_phrase
$task = factor(pvc$task)
pvc<- list(
plot_keys sub_mean = "mean_per_sub",
group_mean = "mean_per_sub_norm_mean",
legend_keyword = "stimulus intensity",
se = "se",
subject = "sub",
ggtitle = paste0(
str_to_title(signature_key),
" dot product: ",
str_to_title(taskname),
' ',
ggtitle_phrase," (N = ",
length(unique(pvc$sub)),
")"
),title = paste0(
str_to_title(signature_key),
" - ",
str_to_title(plot_keyword)
),xlab = "",
ylab = paste(signature_key, " (dot product)"),
ylim = c(-250, 500)
)
# step 4: within between summary
<- data.frame()
groupwise <- data.frame()
subjectwise <- summary_for_plots_PVC(
summary df = pvc,
# taskname = taskname,
groupwise_measurevar = plot_keys$sub_mean,
# "mean_per_sub",
subject_keyword = plot_keys$subject,
# "sub",
model_iv1 = "task",
model_iv2 = "stim_ordered",
dv = signature_key #"NPSpos"
)<<- as.data.frame(summary[[1]])
subjectwise <<- as.data.frame(summary[[2]])
groupwise if (any(startsWith(dv_keyword, c("expect", "Expect")))) {
$color <- c("#1B9E77", "#D95F02", "#D95F02")
plot_keyselse {
} $color <- c("#4575B4", "#FFA500", "#D73027")
plot_keys
}
# step 5: plot
= "stim_ordered"
iv2 = "task"
iv1 = "all"
taskname if (any(startsWith(dv_keyword, c("expect", "Expect")))) {
<- c("#1B9E77", "#D95F02", "#D95F02")
color else {
} <- c("#4575B4", "#FFA500", "#D73027")
color
}<- "mean_per_sub"
subject_mean = subject_mean
sub_mean <- "mean_per_sub_norm_mean"
group_mean <- "se"
se <- c(-25, 26)
ylim <- "sub"
subject <- "(3 tasks x 3 stimulus intensity)"
ggtitle_phrase <-
ggtitle paste0(
str_to_title(signature_name),
" dot product: ",
str_to_title(taskname),
' ',
ggtitle_phrase," (N = ",
length(unique(pvc$sub)),
")"
)
<-
title paste0(str_to_title(dv_keyword),
" - ",
str_to_title(plot_keys$legend_keyword))
<- ""
xlab = "stimintensity"
plot_keyword <- paste(signature_name, " (dot product)")
ylab <- file.path(
plot2_savefname
analysis_dir,paste(
"signature_task-",
taskname,"_event-",
plot_keyword,"_dv-",
signature_key,"_",
as.character(Sys.Date()),
".png",
sep = ""
)
)<- plot_halfrainclouds_twofactor(
p
subjectwise,
groupwise,
iv1,
iv2,
subject_mean,
group_mean,
se,
subject,
ggtitle,
title,
xlab,
ylab,
taskname,
ylim,w = 10,
h = 6,
dv_keyword,
color,
plot2_savefname
)
p }
## [1] "/Users/h/Dropbox (Dartmouth College)/projects_dropbox/social_influence_analysis/analysis/fmri/nilearn/signature_extract/signature-VPS_sub-all_runtype-pvc_event-stimulus.tsv"
## Warning: Removed 1 rows containing missing values (`geom_half_violin()`).
35.1 load behavioral data
= dirname(dirname(getwd()))
main_dir print(main_dir)
## [1] "/Users/h/Dropbox (Dartmouth College)/projects_dropbox/social_influence_analysis"
= file.path(main_dir, 'data', 'beh', 'beh02_preproc')
datadir = '*'
taskname <- "src_subject_id"
subject_varkey <- "param_stimulus_type";
iv <- "stim";
iv_keyword <- "event04_actual_angle"; dv_keyword <- "outcome"
dv <- "sub-0001|sub-0003|sub-0004|sub-0005|sub-0025|sub-0999"
exclude
<- load_task_social_df(datadir, taskname = "pain", subject_varkey, iv, dv, exclude)
p.df <- load_task_social_df(datadir, taskname = "vicarious", subject_varkey, iv, dv, exclude)
v.df <- load_task_social_df(datadir, taskname = "cognitive", subject_varkey, iv, dv, exclude)
c.df
= p.df %>%
p.df2arrange(src_subject_id ) %>%
group_by(src_subject_id) %>%
::mutate(trial_index = row_number())
dplyr# dplyr::mutate(trial_index = dplyr::row_number())
# mutate(trial_index = row_number())
<- p.df2 %>%
data_p group_by(src_subject_id, session_id, param_run_num) %>%
::mutate(trial_index = row_number(param_run_num))
dplyr
= v.df %>%
v.df2arrange(src_subject_id ) %>%
group_by(src_subject_id) %>%
::mutate(trial_index = row_number())
dplyr<- v.df2 %>%
data_v group_by(src_subject_id, session_id, param_run_num) %>%
::mutate(trial_index = row_number(param_run_num))
dplyr
= c.df %>%
c.df2arrange(src_subject_id ) %>%
group_by(src_subject_id) %>%
::mutate(trial_index = row_number()-1)
dplyr<- c.df2 %>%
data_c group_by(src_subject_id, session_id, param_run_num) %>%
::mutate(trial_index = row_number(param_run_num) )
dplyr<- data_p[,c("src_subject_id", "session_id", "param_run_num", "param_task_name", "event02_expect_angle", "param_cue_type", "param_stimulus_type", "event04_actual_angle", "trial_index")]
p.sub <- data_v[,c("src_subject_id", "session_id", "param_run_num", "param_task_name", "event02_expect_angle", "param_cue_type", "param_stimulus_type", "event04_actual_angle", "trial_index")]
v.sub <- data_c[,c("src_subject_id", "session_id", "param_run_num", "param_task_name", "event02_expect_angle", "param_cue_type", "param_stimulus_type", "event04_actual_angle", "trial_index")]
c.sub # sub, ses, run, runtype, event, trial, cuetype, stimintensity
# src_subject_id, session_id, param_run_num, param_task_name, event02_expect_angle, param_cue_type, param_stimulus_type, event04_actual_angle
= rbind(p.sub, v.sub, c.sub) pvc.sub
$trial_ind <- pvc.sub$trial_index -1
pvc.sub$sub <- sprintf("sub-%04d", pvc.sub$src_subject_id)
pvc.sub$ses <- sprintf("ses-%02d", pvc.sub$session_id)
pvc.sub$run <- sprintf("run-%02d", pvc.sub$param_run_num)
pvc.sub$runtype <- sprintf("runtype-%s", pvc.sub$param_task_name)
pvc.sub$trial <- sprintf("trial-%03d", pvc.sub$trial_ind)
pvc.subc('cue', 'DEPc')] <- str_split_fixed(pvc.sub$param_cue_type , '_', 2)
pvc.sub[$cuetype <- sprintf("cuetype-%s", pvc.sub$cue)
pvc.subc('stimintensity', 'DEP')] <- str_split_fixed(pvc.sub$param_stimulus_type , '_', 2)
pvc.sub[
# merge
<- pvc.sub[,c("sub", "ses", "run", "runtype", "trial", "cuetype", "stimintensity","event02_expect_angle", "event04_actual_angle")]
pvc.beh <- merge(pvc, pvc.beh,
df_merge by.x = c("sub", "ses", "run", "runtype", "trial", "cuetype", "stimintensity"),
by.y = c("sub", "ses", "run", "runtype", "trial", "cuetype", "stimintensity")
)
35.2 expect & NPS as a function of cue
<- df_merge[df_merge$runtype == "runtype-vicarious",]
v.sig = "event02_expect_angle"; iv2 = "VPS"
iv1 <-
df_dropna !is.na(v.sig$event02_expect_angle) & !is.na(v.sig$VPS),]
v.sig[<-
total plot_twovariable(
df_dropna, iv1, iv2,group = "cuetype", subject = "sub",
xmin=0, xmax=200, ymin=-50, ymax=50,
xlab = "expectation rating",
ylab = signature_key,
ggtitle = "all stimulus intensity",
color_scheme = c("cuetype-high" ="#941100","cuetype-low" = "#BBBBBB"),
alpha = .8, fit_lm = TRUE
)+ labs(title =paste0("task-",taskname, "- What is the pattern for NPS pos dotproduct and expect ratings? \nHow is does this pattern differ depending on high vs low cues?\n\n")
total )
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
# geom_line(method="lm", alpha=0.3, size=1, span=0.5) # geom_smooth(method=lm, se = TRUE)
# +geom_smooth(method = "lm", alpha=0.1, size=0, span=0.5)
35.3 2x3 stim*cue
<- data.frame()
combined_se_calc_cooksd = "vicarious"
taskname <- paste(taskname, " - actual judgment (degree)")
ggtitle <- paste(taskname, " - actual")
title <- "sub"
subject <- 10
w <- 6
h <- v.sig
data # [ CONTRASTS ] ________________________________________________________________________________ # nolint
# contrast code ________________________________________
$stim[data$stimintensity == "low"] <- -0.5 # social influence task
data$stim[data$stimintensity == "med"] <- 0 # no influence task
data$stim[data$stimintensity == "high"] <- 0.5 # no influence task
data
$stim_factor <- factor(data$stimintensity)
data
# contrast code 1 linear
$stim_con_linear[data$stimintensity == "low"] <- -0.5
data$stim_con_linear[data$stimintensity == "med"] <- 0
data$stim_con_linear[data$stimintensity == "high"] <- 0.5
data
# contrast code 2 quadratic
$stim_con_quad[data$stimintensity == "low"] <- -0.33
data$stim_con_quad[data$stimintensity == "med"] <- 0.66
data$stim_con_quad[data$stimintensity == "high"] <- -0.33
data
# social cude contrast
$social_cue[data$cuetype == "cuetype-low"] <- -0.5 # social influence task
data$social_cue[data$cuetype == "cuetype-high"] <- 0.5 # no influence task
data
<- "stim_con_linear"
stim_con1 <- "stim_con_quad"
stim_con2 <- "social_cue"
iv1 <- "VPS"
dv
# [ MODEL ] _________________________________________________ # nolint
<- file.path(
model_savefname
analysis_dir,paste("lmer_task-", taskname,
"_rating-", dv_keyword,
"_", as.character(Sys.Date()), "_cooksd.txt",
sep = ""
)
)
<- lmer_twofactor_cooksd_fix(
cooksd
data, taskname, iv1, stim_con1, stim_con2, dv,'random_intercept', print_lmer_output = FALSE
subject, dv_keyword, model_savefname,
)<- as.numeric(names(cooksd)[
influential > (4 / as.numeric(length(unique(data$sub)))))
(cooksd
])<- data[-influential, ]
data_screen # [ PLOT ] reordering for plots _________________________ # nolint
$cue_name[data_screen$cuetype == "cuetype-high"] <- "high cue"
data_screen$cue_name[data_screen$cuetype == "cuetype-low"] <- "low cue"
data_screen
$stim_name[data_screen$stimintensity == "high"] <- "high"
data_screen$stim_name[data_screen$stimintensity == "med"] <- "med"
data_screen$stim_name[data_screen$stimintensity == "low"] <- "low"
data_screen
# DATA$levels_ordered <- factor(DATA$param_stimulus_type, levels=c("low", "med", "high"))
$stim_ordered <- factor(
data_screen$stim_name,
data_screenlevels = c("low", "med", "high")
)$cue_ordered <- factor(
data_screen$cue_name,
data_screenlevels = c("low cue", "high cue")
)<- "stim_ordered"
model_iv1 <- "cue_ordered"
model_iv2
# [ PLOT ] calculate mean and se _________________________
<- meanSummary(
actual_subjectwise
data_screen,c(subject, model_iv1, model_iv2), dv
)<- summarySEwithin(
actual_groupwise data = actual_subjectwise,
measurevar = "mean_per_sub",
withinvars = c(model_iv1, model_iv2), idvar = subject
)$task <- taskname
actual_groupwise# https://stackoverflow.com/questions/29402528/append-data-frames-together-in-a-for-loop/29419402
<- rbind(combined_se_calc_cooksd, actual_groupwise)
combined_se_calc_cooksd # if(any(startsWith(dv_keyword, c("expect", "Expect")))){color = c( "#1B9E77", "#D95F02")}else{color=c( "#4575B4", "#D73027")} # if keyword starts with
# print("groupwisemean")
# [ PLOT ] calculate mean and se ----------------------------------------------------------------------------
<- "mean_per_sub"
sub_mean <- "mean_per_sub_norm_mean"
group_mean <- "se"
se <- "sub"
subject <- paste(taskname, " - VPS Cooksd removed")
ggtitle <- paste(taskname, " - VPS")
title <- ""
xlab <- "VPS (degree)"
ylab <- c(-30,40)
ylim <- "VPS"
dv_keyword if (any(startsWith(dv_keyword, c("expect", "Expect")))) {
<- c("#1B9E77", "#D95F02")
color else {
} <- c("#4575B4", "#D73027")
color # if keyword starts with
} <- file.path(
plot_savefname
analysis_dir,paste("raincloud_task-", taskname,
"_rating-", dv_keyword,
"_", as.character(Sys.Date()), "_cooksd.png",
sep = ""
)
)<- plot_rainclouds_twofactor(
g
actual_subjectwise, actual_groupwise, model_iv1, model_iv2,
sub_mean, group_mean, se, subject,
ggtitle, title, xlab, ylab, taskname,ylim,
w, h, dv_keyword, color, plot_savefname )
## Warning in geom_line(data = subjectwise, aes(group = .data[[subject]], y
## = .data[[sub_mean]], : Ignoring unknown aesthetics: fill
## Warning: Duplicated aesthetics after name standardisation: width
## Warning: Using the `size` aesthietic with geom_polygon was deprecated in ggplot2 3.4.0.
## ℹ Please use the `linewidth` aesthetic instead.
g
## lineplot
plot_lineplot_twofactor(actual_groupwise, taskname = "vicarious",
iv1 = "stim_ordered", iv2 = "cue_ordered",
mean = "mean_per_sub_norm_mean", error = "se",
color = c("#4575B4", "#D73027"), ggtitle = "placeholder")