Как лучше написать код для анализа медаций и модераций для психологического исследования?
Сейчас ситуация такая: я провожу научное исследование. Хочу посмотреть, являются ли стратегии цифрового поведения медиатором или модератором для влияния особенностей цифрового поведения на показатели благополучия пользователя. Решил сделать анализ через R. Написал код. Но столкнулся с двумя проблемами: не понимаю, правильно ли я интерпретирую полученные результаты и не знаю, как сделать красивые сводные графики, чтобы визуализировать результаты. Оговорюсь заранее: у меня есть только базовые навыки работы в R, только начал его учить. Код писал с очень большой помощью дипсика
По вводным: вот сам код. Это для удовлетворенности и тревожности.
data <- read.csv("vediations для R.csv", stringsAsFactors = FALSE) data$strategy <- as.factor(data$strategy) med_model <- glm(strategy ~ Preference + Regulation, data = data, family = binomial(link = "logit")) data$Satisfaction_adj <- data$Satisfaction + 0.01 out_model_satisfaction <- glm(Satisfaction_adj ~ Preference + Regulation + strategy, data = data, family = Gamma(link = "identity")) out_model_anxiety <- glm(Anxiety ~ Preference + Regulation + strategy, data = data, family = quasipoisson(link = "log")) set.seed(123) med_results_sat <- mediate(med_model, out_model_satisfaction, treat = "Preference", mediator = "strategy", robustSE = TRUE, sims = 1000) summary(med_results_sat) med_results_anx <- mediate(med_model, out_model_anxiety, treat = "Preference", mediator = "strategy", robustSE = TRUE, sims = 1000) summary(med_results_anx) plot(med_results_sat, main = "Медиационный анализ: Satisfaction") plot(med_results_anx, main = "Медиационный анализ: Anxiety") problem_use_vars <- c("Preference", "Regulation", "Absorption", "Compulsiveness", "Negativeconsequences", "Problemsolving") med_formula <- as.formula(paste("strategy ~", paste(problem_use_vars, collapse = " + "))) med_model_full <- glm(med_formula, data = data, family = binomial(link = "logit")) data$Satisfaction_adj <- data$Satisfaction + 0.01 out_formula_sat <- as.formula(paste("Satisfaction_adj ~", paste(problem_use_vars, collapse = " + "), "+ strategy")) out_model_sat_full <- glm(out_formula_sat, data = data, family = Gamma(link = "identity")) out_formula_anx <- as.formula(paste("Anxiety ~", paste(problem_use_vars, collapse = " + "), "+ strategy")) out_model_anx_full <- glm(out_formula_anx, data = data, family = quasipoisson(link = "log")) summary(med_model_full) summary(out_model_sat_full) summary(out_model_anx_full) model_interaction <- glm(Satisfaction_adj ~ Preference * strategy + Regulation * strategy + Absorption * strategy + Compulsiveness * strategy + Negativeconsequences * strategy, data = data, family = Gamma(link = "identity")) summary(model_interaction) model_anxiety_interaction <- glm(Anxiety ~ Preference*strategy + Regulation*strategy + Absorption*strategy+ Compulsiveness * strategy + Negativeconsequences * strategy,, data = data, family = quasipoisson(link = "log")) summary(model_anxiety_interaction) <code> А это для глобального самоотношения и чувствительности: med_model <- glm(strategy ~ Preference + Regulation, data = data, family = binomial(link = "logit")) data$GSE_adj <- data$GSE + 0.01 data$Sens_adj <- data$Sens + 0.01 out_model_GSE <- glm(GSE_adj ~ Preference + Regulation + strategy, data = data, family = Gamma(link = "log")) out_model_Sens <- glm(Sens_adj ~ Preference + Regulation + strategy, data = data, family = Gamma(link = "log")) med_results_GSE <- mediate(med_model, out_model_GSE, treat = "Preference", mediator = "strategy", robustSE = TRUE, sims = 1000) summary(med_results_GSE) med_results_Sens <- mediate(med_model, out_model_Sens, treat = "Preference", mediator = "strategy", robustSE = TRUE, sims = 1000) summary(med_results_Sens) plot(med_results_GSE, main = "Медиационный анализ: GSE") plot(med_results_Sens, main = "Медиационный анализ: Sens") problem_use_vars <- c("Preference", "Regulation", "Absorption", "Compulsiveness", "Negativeconsequences", "Problemsolving") med_formula <- as.formula(paste("strategy ~", paste(problem_use_vars, collapse = " + "))) med_model_full <- glm(med_formula, data = data, family = binomial(link = "logit")) out_formula_GSE <- as.formula(paste("GSE_adj ~", paste(problem_use_vars, collapse = " + "), "+ strategy")) out_model_GSE_full <- glm(out_formula_GSE, data = data, family = Gamma(link = "log")) out_formula_Sens <- as.formula(paste("Sens_adj ~", paste(problem_use_vars, collapse = " + "), "+ strategy")) out_model_Sens_full <- glm(out_formula_Sens, data = data, family = Gamma(link = "log")) summary(med_model_full) summary(out_model_GSE_full) summary(out_model_Sens_full) model_interaction_GSE <- glm(GSE_adj ~ Preference * strategy + Regulation * strategy + Absorption * strategy + Compulsiveness * strategy + Negativeconsequences * strategy, data = data, family = Gamma(link = "log")) summary(model_interaction_GSE) model_interaction_Sens <- glm(Sens_adj ~ Preference * strategy + Regulation * strategy + Absorption * strategy + Compulsiveness * strategy + Negativeconsequences * strategy, data = data, family = Gamma(link = "log")) summary(model_interaction_Sens)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для медиаторного и модераторного анализа в психологическом исследовании я бы сначала разделил две задачи: статистическая корректность модели и визуализация. Сейчас у вас смешаны разные типы моделей: медиатор
strategyкак бинарная переменная через logit, удовлетворённость через Gamma с identity link, тревожность через quasipoisson. Это может быть оправдано, но интерпретировать такой набор “на глаз” сложно, особенно если переменные шкальные.Первое, что нужно проверить: какая природа переменных. Если Satisfaction и Anxiety — шкалы/баллы, часто начинают с линейных моделей, а не Gamma/quasipoisson. Если распределение сильно скошено, можно рассмотреть робастные модели, трансформации или GLM, но выбор family должен быть обоснован.
Для медиации в R удобнее использовать пакет
mediation:library(mediation) med_model <- glm(strategy ~ Preference + Regulation, data = data, family = binomial(link = "logit")) out_model <- lm(Satisfaction ~ Preference + Regulation + strategy, data = data) set.seed(123) res <- mediate(med_model, out_model, treat = "Preference", mediator = "strategy", boot = TRUE, sims = 1000) summary(res) plot(res)library(mediation) med_model <- glm(strategy ~ Preference + Regulation, data = data, family = binomial(link = "logit")) out_model <- lm(Satisfaction ~ Preference + Regulation + strategy, data = data) set.seed(123) res <- mediate(med_model, out_model, treat = "Preference", mediator = "strategy", boot = TRUE, sims = 1000) summary(res) plot(res)
В summary смотрите не только p-value, а ACME, ADE и Total Effect. ACME — косвенный эффект через медиатор, ADE — прямой эффект, Total Effect — общий эффект. Если доверительный интервал ACME не пересекает ноль, есть аргумент в пользу медиации.
Для модерации нужна модель с interaction term:
mod_model <- lm(Satisfaction ~ Preference * strategy + Regulation, data = data) summary(mod_model)
Если коэффициент при
Preference:strategyзначим и содержательно интерпретируем, можно говорить о модерации. Для графиков используйтеinteractionsилиggeffects:library(ggeffects) library(ggplot2) pred <- ggpredict(mod_model, terms = c("Preference", "strategy")) plot(pred)
Главное: не делайте вывод “переменная является медиатором/модератором” только по одному куску кода. Сначала формулируется теоретическая модель, затем проверяется тип переменных, пропуски, выбросы, распределения, коллинеарность и только потом запускается mediation/moderation. Для научной работы лучше показать таблицу коэффициентов, доверительные интервалы, график эффекта и короткую интерпретацию на языке исследования, а не только вывод R.