OSCR

Aberrant large- and mesoscale network segregation and integration in bulimia nervosa.

Code ↔ Paper

5 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 5 matches · 1 of them tie a paragraph to a whole file, not to given lines: a weak match, whose lines are not tinted
  1. [1] § Results › Association of network system features with clinical variables ↔ step1_3_Regression_modelall_analy.R, lines 596–713 · score 0.84 · predictor retention, regression reports, Post hoc simple, model fit, iterative, SE
  2. [2] § Methods › MRI data processing › Surface preprocessing ↔ MATLAB_functions_from_system-segregation-and-graph-tools/fsLR2roizmat.m, the whole file · a weak match · score 0.63 · fs lr, hemispheres, vertices, transformation, tools
  3. [3] § Methods › MRI data processing › Network node definition and FC calculation ↔ MATLAB_functions_from_system-segregation-and-graph-tools/export/colormap_roi_meta.m, lines 1–51 · score 0.62 · dorsal attention, ventral attention, auditory, matrix, nodes, Network
  4. [4] § Methods › Clinical assessment ↔ step1_3_Regression_modelall_analy.R, lines 41–93 · score 0.55 · EDI BN, DEBQ, SAS, external, bulimia, emotional
  5. [5] § Methods › Comprehensive network-clinical association analysis ↔ step1_3_Regression_modelall_analy.R, lines 384–474 · score 0.55 · simple slope, model checking, regression, moderation, patients

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

R · 869 lines · 35 KB · no license · 3 matches

  1. # =============================================================================
  2. # Network Clinical VIF-Pruned Regression Analysis & Visualization
  3. # =============================================================================
  4. # 前置条件:data_merge 已在环境中准备好,直接调用
  5. # 输出:
  6. # - 每个 outcome 对应一份 DOCX 报告(包含简单斜率检验与鲁棒性检验图)
  7. # - 汇总 CSV 文件(模型拟合、系数、显著结果、VIF 历史等)
  8. # - 显著效应的可视化图片(PNG)和鲁棒性检验图片(PNG)
  9. # 核心逻辑:总体模型 F 检验的 p 值需在对应家族内通过 FDR 校正 (<0.05),才进行效应绘图
  10. # =============================================================================
  11. # -----------------------------------------------------------------------------
  12. # 0. 加载依赖包
  13. # -----------------------------------------------------------------------------
  14. library(dplyr)
  15. library(tidyr)
  16. library(stringr)
  17. library(purrr)
  18. library(broom)
  19. library(flextable)
  20. library(officer)
  21. library(tibble)
  22. library(readr)
  23. library(car)
  24. library(visreg)
  25. library(ggplot2)
  26. # 科学分析验证包
  27. library(emmeans) # 用于计算事后简单斜率
  28. library(performance) # 用于检验模型假设 (check_model)
  29. library(see) # performance 绘图依赖
  30. library(patchwork) # performance 绘图依赖
  31. # -----------------------------------------------------------------------------
  32. # 1. 全局配置
  33. # -----------------------------------------------------------------------------
  34. # 输出根目录
  35. output_dir <- "D:/youyi_fucha/code/network_clinical_vif_models"
  36. if (!dir.exists(output_dir)) dir.create(output_dir, recursive = TRUE)
  37. # PA 组专用 outcomes(仅患者组回归)
  38. pa_group_only <- c(
  39. "overeatting_time_perweek",
  40. "PA_time","DEBQ_33_constrain",
  41. "DEBQ_33_emotion",
  42. "DEBQ_33_external",
  43. "EDI_BN",
  44. "EAT_26",
  45. "BDI_21",
  46. "SAS_20",
  47. "EAT_Dieting",
  48. "EAT_Bulimia_and_Food_preoccupation",
  49. "EAT_Oral_control"
  50. )
  51. # 调节分析 outcomes(全样本主效应 及 全样本 × 组别交互)
  52. interaction_var <- c(
  53. "DEBQ_33_constrain",
  54. "DEBQ_33_emotion",
  55. "DEBQ_33_external",
  56. "EDI_BN",
  57. "EAT_26",
  58. "BDI_21",
  59. "SAS_20",
  60. "EAT_Dieting",
  61. "EAT_Bulimia_and_Food_preoccupation",
  62. "EAT_Oral_control"
  63. )
  64. # 分组标签统一映射
  65. patient_labels <- c("PA", "SUB", "bulimia", "patient")
  66. control_labels <- c("CON", "HC", "control", "healthy")
  67. # VIF 阈值与最少保留指标数
  68. vif_threshold <- 5
  69. min_metric_keep <- 1
  70. # 图形输出子目录
  71. plot_dir <- file.path(output_dir, "significant_effect_plots")
  72. plot_dir_pa <- file.path(plot_dir, "PA_only_main_effects")
  73. plot_dir_full <- file.path(plot_dir, "Full_sample_main_effects")
  74. plot_dir_int <- file.path(plot_dir, "interaction_effects")
  75. check_dir <- file.path(output_dir, "model_assumption_checks")
  76. for (d in c(plot_dir, plot_dir_pa, plot_dir_full, plot_dir_int, check_dir)) {
  77. if (!dir.exists(d)) dir.create(d, recursive = TRUE)
  78. }
  79. # =============================================================================
  80. # 2. 辅助函数
  81. # =============================================================================
  82. # --- 2.1 统计输出格式化 ------------------------------------------------------
  83. cleanPValue <- function(p_value) {
  84. case_when(
  85. is.na(p_value) ~ NA_character_,
  86. p_value < 0.001 ~ "< .001",
  87. TRUE ~ sprintf("%.3f", p_value)
  88. )
  89. }
  90. getSigMark <- function(p_value) {
  91. case_when(
  92. is.na(p_value) ~ "",
  93. p_value < 0.001 ~ "***",
  94. p_value < 0.01 ~ "**",
  95. p_value < 0.05 ~ "*",
  96. p_value < 0.10 ~ "†",
  97. TRUE ~ ""
  98. )
  99. }
  100. formatCoefTable <- function(df_input) {
  101. df_input %>%
  102. mutate(
  103. estimate = round(estimate, 3),
  104. std.error = round(std.error, 3),
  105. statistic = round(statistic, 3),
  106. conf.low = round(conf.low, 3),
  107. conf.high = round(conf.high, 3),
  108. p = cleanPValue(p.value),
  109. sig = getSigMark(p.value),
  110. ci_95 = paste0("[", conf.low, ", ", conf.high, "]")
  111. )
  112. }
  113. extractModelFit <- function(model_fit, model_type, outcome_name, n_obs) {
  114. if (is.null(model_fit)) {
  115. return(tibble(
  116. model_type = model_type,
  117. outcome = outcome_name,
  118. n = n_obs,
  119. r_squared = NA_real_,
  120. adj_r_squared = NA_real_,
  121. statistic = NA_real_,
  122. model_p = NA_real_,
  123. aic = NA_real_,
  124. bic = NA_real_
  125. ))
  126. }
  127. fit_glance <- broom::glance(model_fit)
  128. tibble(
  129. model_type = model_type,
  130. outcome = outcome_name,
  131. n = n_obs,
  132. r_squared = fit_glance$r.squared,
  133. adj_r_squared = fit_glance$adj.r.squared,
  134. statistic = fit_glance$statistic,
  135. model_p = fit_glance$p.value,
  136. aic = fit_glance$AIC,
  137. bic = fit_glance$BIC
  138. )
  139. }
  140. # --- 2.2 数据与变量处理 -------------------------------------------------------
  141. standardizeGroup <- function(group_vec) {
  142. case_when(
  143. group_vec %in% patient_labels ~ "Patient",
  144. group_vec %in% control_labels ~ "Control",
  145. TRUE ~ as.character(group_vec)
  146. )
  147. }
  148. makeSafeMetricName <- function(x) make.names(x)
  149. # --- 2.3 flextable 主题 -------------------------------------------------------
  150. makeFtTheme <- function(ft_obj, caption_text = NULL) {
  151. ft_obj <- ft_obj %>%
  152. bold(part = "header") %>%
  153. bg(part = "header", bg = "#2C5F8A") %>%
  154. color(part = "header", color = "white") %>%
  155. align(align = "center", part = "all") %>%
  156. fontsize(size = 10, part = "all") %>%
  157. font(fontname = "Times New Roman", part = "all") %>%
  158. border_outer(part = "all", border = fp_border(color = "#2C5F8A", width = 1.2)) %>%
  159. border_inner_h(part = "body", border = fp_border(color = "#BBBBBB", width = 0.5)) %>%
  160. set_table_properties(layout = "autofit", width = 1)
  161. if (!is.null(caption_text)) ft_obj <- ft_obj %>% set_caption(caption_text)
  162. ft_obj
  163. }
  164. # --- 2.4 绘图辅助 -------------------------------------------------------------
  165. prettyMetricName <- function(x) x %>% str_replace_all("\\.", "_") %>% str_replace_all("_", " ") %>% str_to_title()
  166. prettyOutcomeName <- function(x) x %>% str_replace_all("_", " ") %>% str_to_title()
  167. cleanFilename <- function(x) x %>% str_replace_all("[^A-Za-z0-9_]+", "_") %>% str_replace_all("_+", "_") %>% str_replace_all("^_|_$", "")
  168. # =============================================================================
  169. # 3. 数据准备:长表转宽表
  170. # =============================================================================
  171. # 确认必需变量存在于 data_merge
  172. required_vars <- unique(c(
  173. "participant", "group", "Metrics", "Degree", "BMI", "years",
  174. pa_group_only, interaction_var
  175. ))
  176. missing_vars <- setdiff(required_vars, names(data_merge))
  177. if (length(missing_vars) > 0) {
  178. stop(paste("data_merge 中缺少以下变量:", paste(missing_vars, collapse = ", ")))
  179. }
  180. # 获取显著指标列表(来自 FDR 校正后的显著性结果)
  181. metric_sig <- unique(significant_metrics_fdr$Metrics)
  182. data_merge$overeatting_time_perweek <- as.numeric(data_merge$overeatting_time_perweek )
  183. # 长表:筛选显著指标,生成安全列名与标准化分组
  184. data_metric_long <- data_merge %>%
  185. filter(Metrics %in% metric_sig) %>%
  186. mutate(
  187. metric_col = makeSafeMetricName(Metrics),
  188. group_std = standardizeGroup(group)
  189. )
  190. # 提取受试者基本信息(每人一行)
  191. subject_base <- data_metric_long %>%
  192. select(participant, group, group_std, BMI, years,
  193. all_of(pa_group_only), all_of(interaction_var)) %>%
  194. distinct(participant, group, .keep_all = TRUE) %>%
  195. mutate(group_std = factor(group_std, levels = c("Control", "Patient")))
  196. # 将 Degree 宽转:每个指标一列(多次测量取均值)
  197. metric_wide <- data_metric_long %>%
  198. select(participant, metric_col, Degree) %>%
  199. group_by(participant, metric_col) %>%
  200. summarise(Degree = mean(Degree, na.rm = TRUE), .groups = "drop") %>%
  201. pivot_wider(names_from = metric_col, values_from = Degree)
  202. # 合并为分析宽表
  203. data_wide <- subject_base %>%
  204. left_join(metric_wide, by = "participant")
  205. # 对所有指标列进行 z 标准化
  206. metric_cols_safe <- makeSafeMetricName(metric_sig)
  207. existing_metric_cols <- metric_cols_safe[metric_cols_safe %in% names(data_wide)]
  208. data_wide <- data_wide %>%
  209. mutate(across(all_of(existing_metric_cols), ~ as.numeric(scale(.x))))
  210. cat("宽表维度:", dim(data_wide), "\n")
  211. cat("指标预测变量数量:", length(existing_metric_cols), "\n")
  212. # =============================================================================
  213. # 4. 公式构造器
  214. # =============================================================================
  215. makePaFormula <- function(outcome_name, metric_terms) {
  216. rhs <- paste(c(metric_terms, "BMI", "years"), collapse = " + ")
  217. as.formula(paste0(outcome_name, " ~ ", rhs))
  218. }
  219. makeFullSampleFormula <- function(outcome_name, metric_terms) {
  220. rhs <- paste(c(metric_terms, "group_std", "BMI", "years"), collapse = " + ")
  221. as.formula(paste0(outcome_name, " ~ ", rhs))
  222. }
  223. makeModerationFormula <- function(outcome_name, metric_terms) {
  224. interaction_terms <- paste0(metric_terms, ":group_std")
  225. rhs <- paste(c(metric_terms, "group_std", interaction_terms, "BMI", "years"), collapse = " + ")
  226. as.formula(paste0(outcome_name, " ~ ", rhs))
  227. }
  228. # =============================================================================
  229. # 5. VIF 迭代剪枝
  230. # =============================================================================
  231. # 计算模型矩阵列级 VIF
  232. computeColumnVIF <- function(model_fit) {
  233. if (is.null(model_fit)) return(tibble(term = character(), vif = numeric()))
  234. mm <- model.matrix(model_fit)
  235. if ("(Intercept)" %in% colnames(mm)) mm <- mm[, colnames(mm) != "(Intercept)", drop = FALSE]
  236. if (ncol(mm) < 2) return(tibble(term = colnames(mm), vif = 1))
  237. vif_values <- sapply(seq_len(ncol(mm)), function(i) {
  238. y_col <- mm[, i]
  239. x_cols <- mm[, -i, drop = FALSE]
  240. fit_i <- lm(y_col ~ x_cols)
  241. r2 <- summary(fit_i)$r.squared
  242. if (is.na(r2) || r2 >= 0.999999) return(Inf)
  243. 1 / (1 - r2)
  244. })
  245. tibble(term = colnames(mm), vif = as.numeric(vif_values))
  246. }
  247. # 将列级 VIF 聚合为指标块级 VIF(主效应 + 交互项取最大值)
  248. computeMetricBlockVIF <- function(vif_table, metric_terms, model_type) {
  249. if (nrow(vif_table) == 0) return(tibble(metric = character(), block_vif = numeric()))
  250. lapply(metric_terms, function(metric_name) {
  251. relevant_terms <- if (model_type %in% c("PA_only", "Full_Sample")) {
  252. metric_name
  253. } else {
  254. c(metric_name,
  255. paste0(metric_name, ":group_stdPatient"),
  256. paste0("group_stdPatient:", metric_name))
  257. }
  258. tmp <- vif_table %>% filter(term %in% relevant_terms)
  259. tibble(metric = metric_name,
  260. block_vif = ifelse(nrow(tmp) == 0, NA_real_, max(tmp$vif, na.rm = TRUE)))
  261. }) %>% bind_rows()
  262. }
  263. # 主迭代剪枝函数
  264. runModelWithVIFPruning <- function(model_data, outcome_name, metric_terms,
  265. model_type = c("PA_only", "Moderation", "Full_Sample"),
  266. vif_threshold = 10, min_metric_keep = 1) {
  267. model_type <- match.arg(model_type)
  268. current_metrics <- metric_terms
  269. iteration_history <- list()
  270. removed_metrics <- character()
  271. final_fit <- NULL
  272. final_formula <- NULL
  273. iter <- 1
  274. repeat {
  275. if (length(current_metrics) < min_metric_keep) break
  276. model_formula <- if (model_type == "PA_only") {
  277. makePaFormula(outcome_name, current_metrics)
  278. } else if (model_type == "Full_Sample") {
  279. makeFullSampleFormula(outcome_name, current_metrics)
  280. } else {
  281. makeModerationFormula(outcome_name, current_metrics)
  282. }
  283. fit_obj <- lm(model_formula, data = model_data)
  284. vif_col_tbl <- computeColumnVIF(fit_obj)
  285. vif_block_tbl <- computeMetricBlockVIF(vif_col_tbl, current_metrics, model_type) %>%
  286. arrange(desc(block_vif))
  287. max_vif <- if (nrow(vif_block_tbl) == 0) NA_real_ else vif_block_tbl$block_vif[1]
  288. remove_metric <- NA_character_
  289. if (!is.na(max_vif) && max_vif > vif_threshold && length(current_metrics) > min_metric_keep) {
  290. remove_metric <- vif_block_tbl$metric[1]
  291. current_metrics <- setdiff(current_metrics, remove_metric)
  292. removed_metrics <- c(removed_metrics, remove_metric)
  293. } else {
  294. final_fit <- fit_obj
  295. final_formula <- model_formula
  296. }
  297. iteration_history[[iter]] <- vif_block_tbl %>%
  298. mutate(outcome = outcome_name, model_type = model_type,
  299. iteration = iter, threshold = vif_threshold,
  300. removed_metric = remove_metric)
  301. should_continue <- !is.na(remove_metric) &&
  302. max_vif > vif_threshold &&
  303. length(current_metrics) >= min_metric_keep
  304. if (should_continue) { iter <- iter + 1; next } else break
  305. }
  306. if (is.null(final_fit) && length(current_metrics) >= 1) {
  307. final_formula <- if (model_type == "PA_only") {
  308. makePaFormula(outcome_name, current_metrics)
  309. } else if (model_type == "Full_Sample") {
  310. makeFullSampleFormula(outcome_name, current_metrics)
  311. } else {
  312. makeModerationFormula(outcome_name, current_metrics)
  313. }
  314. final_fit <- lm(final_formula, data = model_data)
  315. }
  316. list(
  317. fit = final_fit,
  318. formula = final_formula,
  319. kept_metrics = current_metrics,
  320. removed_metrics = removed_metrics,
  321. vif_history = bind_rows(iteration_history)
  322. )
  323. }
  324. # =============================================================================
  325. # 6. 单个 outcome 的建模主函数(加入事后检验及鲁棒性检验制图)
  326. # =============================================================================
  327. runSingleOutcomeModel <- function(outcome_name, model_type,
  328. data_wide, existing_metric_cols,
  329. vif_threshold = 5, min_metric_keep = 1) {
  330. # --- 按模型类型准备分析数据 ---
  331. if (model_type == "PA_only") {
  332. model_data <- data_wide %>%
  333. filter(group_std == "Patient") %>%
  334. select(all_of(c(outcome_name, "BMI", "years", existing_metric_cols))) %>%
  335. drop_na()
  336. } else { # Moderation 和 Full_Sample 都是全数据
  337. model_data <- data_wide %>%
  338. select(all_of(c(outcome_name, "group_std", "BMI", "years", existing_metric_cols))) %>%
  339. drop_na()
  340. }
  341. n_obs <- nrow(model_data)
  342. # --- 样本量不足时报错并停止 ---
  343. insufficient <- (model_type == "PA_only" && n_obs < 15) ||
  344. (model_type %in% c("Moderation", "Full_Sample") && (n_obs < 20 || length(unique(model_data$group_std)) < 2))
  345. if (insufficient) {
  346. stop(paste("数据样本量不足以运行模型:", outcome_name, "-", model_type))
  347. }
  348. # --- VIF 剪枝建模 ---
  349. vif_result <- runModelWithVIFPruning(
  350. model_data = model_data,
  351. outcome_name = outcome_name,
  352. metric_terms = existing_metric_cols,
  353. model_type = model_type,
  354. vif_threshold = vif_threshold,
  355. min_metric_keep = min_metric_keep
  356. )
  357. fit_obj <- vif_result$fit
  358. # --- 鲁棒性检验 (Assumption Checking) ---
  359. cat(" -> 正在进行模型鲁棒性检验并保存图像: ", outcome_name, " (", model_type, ")\n", sep="")
  360. model_check_res <- performance::check_model(fit_obj)
  361. check_plot <- plot(model_check_res)
  362. check_filename <- file.path(check_dir, paste0("Check_", model_type, "_", cleanFilename(outcome_name), ".png"))
  363. ggsave(check_filename, plot = check_plot, width = 12, height = 10, dpi = 300, bg = "white")
  364. # --- 提取完整系数表 ---
  365. coef_full <- broom::tidy(fit_obj, conf.int = TRUE) %>%
  366. mutate(model_type = model_type, outcome = outcome_name)
  367. # --- 提取关键效应 ---
  368. key_effects <- if (model_type %in% c("PA_only", "Full_Sample")) {
  369. coef_full %>% filter(term %in% vif_result$kept_metrics)
  370. } else {
  371. int_terms_a <- paste0(vif_result$kept_metrics, ":group_stdPatient")
  372. int_terms_b <- paste0("group_stdPatient:", vif_result$kept_metrics)
  373. coef_full %>% filter(term %in% c(int_terms_a, int_terms_b))
  374. }
  375. # --- 事后检验 (Simple Slopes) ---
  376. simple_slopes_df <- tibble()
  377. if (model_type == "Moderation" && nrow(key_effects) > 0) {
  378. sig_ints <- key_effects %>% filter(p.value < 0.05)
  379. if (nrow(sig_ints) > 0) {
  380. sig_metrics <- unique(str_remove_all(sig_ints$term, ":group_stdPatient|group_stdPatient:"))
  381. slopes_list <- map(sig_metrics, function(m) {
  382. emt <- emtrends(fit_obj, specs = "group_std", var = m)
  383. res <- as.data.frame(test(emt))
  384. colnames(res)[1:2] <- c("Group", "Trend")
  385. res$Metric <- m
  386. res
  387. })
  388. simple_slopes_df <- bind_rows(slopes_list) %>%
  389. select(Metric, Group, Trend, SE = SE, df, t.ratio, p.value)
  390. }
  391. }
  392. list(
  393. outcome = outcome_name,
  394. model_type = model_type,
  395. n = n_obs,
  396. fit = fit_obj,
  397. formula = vif_result$formula,
  398. kept_metrics = vif_result$kept_metrics,
  399. removed_metrics = vif_result$removed_metrics,
  400. vif_history = vif_result$vif_history,
  401. coef_full = coef_full,
  402. key_effects = key_effects,
  403. simple_slopes = simple_slopes_df,
  404. check_plot_file = check_filename,
  405. fit_summary = extractModelFit(fit_obj, model_type, outcome_name, n_obs)
  406. )
  407. }
  408. # =============================================================================
  409. # 7. 批量运行全部模型
  410. # =============================================================================
  411. all_outcomes <- c(
  412. pa_group_only,
  413. interaction_var,
  414. interaction_var
  415. )
  416. all_model_types <- c(
  417. rep("PA_only", length(pa_group_only)),
  418. rep("Moderation", length(interaction_var)),
  419. rep("Full_Sample", length(interaction_var))
  420. )
  421. cat("开始运行", length(all_outcomes), "个回归模型(含验证与制图)...\n")
  422. analysis_results <- map2(
  423. .x = all_outcomes,
  424. .y = all_model_types,
  425. .f = ~ runSingleOutcomeModel(
  426. outcome_name = .x,
  427. model_type = .y,
  428. data_wide = data_wide,
  429. existing_metric_cols = existing_metric_cols,
  430. vif_threshold = vif_threshold,
  431. min_metric_keep = min_metric_keep
  432. )
  433. )
  434. names(analysis_results) <- paste(all_outcomes, all_model_types, sep = "___")
  435. cat("模型运行及鲁棒性检验完毕。\n\n")
  436. # =============================================================================
  437. # 8. 汇总结果与 FDR 校正(门控逻辑)
  438. # =============================================================================
  439. # 【核心更新】针对总体模型 F 检验的 p 值(model_p),在其各自模型类型内部进行 FDR 校正
  440. all_fit_summary <- bind_rows(map(analysis_results, "fit_summary")) %>%
  441. group_by(model_type) %>%
  442. mutate(model_p_fdr = p.adjust(model_p, method = "fdr")) %>%
  443. ungroup()
  444. # 提取 F 检验过校正门槛(model_p_fdr < 0.05)的“合规模型”
  445. valid_models <- all_fit_summary %>%
  446. filter(model_p_fdr < 0.05) %>%
  447. select(model_type, outcome)
  448. all_coef_full <- bind_rows(map(analysis_results, "coef_full"))
  449. all_vif_history <- bind_rows(map(analysis_results, "vif_history"))
  450. all_key_effects <- bind_rows(map(analysis_results, "key_effects")) %>%
  451. formatCoefTable() %>%
  452. mutate(
  453. Metric = case_when(
  454. model_type %in% c("PA_only", "Full_Sample") ~ term,
  455. TRUE ~ term %>%
  456. str_remove(":group_stdPatient") %>%
  457. str_remove("group_stdPatient:")
  458. )
  459. ) %>%
  460. transmute(
  461. Model = model_type,
  462. Outcome = outcome,
  463. Metric = Metric,
  464. Term = term,
  465. Beta = estimate,
  466. SE = std.error,
  467. t = statistic,
  468. p = p,
  469. Sig = sig,
  470. `95% CI` = ci_95,
  471. p_raw = p.value
  472. ) %>%
  473. arrange(Model, Outcome, Metric)
  474. model_metric_summary <- bind_rows(lapply(analysis_results, function(x) {
  475. tibble(
  476. Outcome = x$outcome,
  477. Model = x$model_type,
  478. N = x$n,
  479. Kept_Metrics = paste(x$kept_metrics, collapse = "; "),
  480. Removed_Metrics = paste(x$removed_metrics, collapse = "; "),
  481. Final_Formula = ifelse(
  482. length(x$formula) == 0 || all(is.na(x$formula)), NA_character_, deparse(x$formula)
  483. )
  484. )
  485. }))
  486. # --- 【核心更新】绘图门控:仅选取通过了总体 F 检验 FDR 校正(门控拦截)且自身效应也显著(p_raw < 0.05)的指标 ---
  487. significant_results <- all_key_effects %>%
  488. filter(!is.na(p_raw), p_raw < 0.05) %>%
  489. inner_join(valid_models, by = c("Model" = "model_type", "Outcome" = "outcome")) %>%
  490. arrange(Model, Outcome, p_raw)
  491. significant_pa_results <- significant_results %>% filter(Model == "PA_only")
  492. significant_fs_results <- significant_results %>% filter(Model == "Full_Sample")
  493. significant_interaction_results <- significant_results %>% filter(Model == "Moderation")
  494. cat("F 检验通过校正且显著的 PA 主效应数量:", nrow(significant_pa_results), "\n")
  495. cat("F 检验通过校正且显著的 全样本主效应数量:", nrow(significant_fs_results), "\n")
  496. cat("F 检验通过校正且显著的 组别交互效应数量:", nrow(significant_interaction_results), "\n\n")
  497. # =============================================================================
  498. # 9. 保存 CSV 汇总文件
  499. # =============================================================================
  500. write.csv(all_fit_summary, file.path(output_dir, "All_model_fit_summary.csv"), row.names = FALSE, fileEncoding = "UTF-8")
  501. write.csv(all_coef_full, file.path(output_dir, "All_full_coefficients.csv"), row.names = FALSE, fileEncoding = "UTF-8")
  502. write.csv(all_key_effects, file.path(output_dir, "All_key_effects.csv"), row.names = FALSE, fileEncoding = "UTF-8")
  503. write.csv(significant_results, file.path(output_dir, "Significant_results_only.csv"), row.names = FALSE, fileEncoding = "UTF-8")
  504. write.csv(all_vif_history, file.path(output_dir, "All_VIF_iteration_history.csv"), row.names = FALSE, fileEncoding = "UTF-8")
  505. write.csv(model_metric_summary, file.path(output_dir, "Model_metric_retention_summary.csv"), row.names = FALSE, fileEncoding = "UTF-8")
  506. cat("CSV 文件保存完毕。\n\n")
  507. # =============================================================================
  508. # 10. 每个模型生成独立 DOCX 报告
  509. # =============================================================================
  510. buildDocxReport <- function(res_obj, vif_threshold, fit_summary_df) {
  511. outcome_name <- res_obj$outcome
  512. model_type <- res_obj$model_type
  513. fit_obj <- res_obj$fit
  514. # 获取该模型 FDR 校正后的 overall p 值
  515. current_fdr_p <- fit_summary_df %>%
  516. filter(model_type == res_obj$model_type, outcome == res_obj$outcome) %>%
  517. pull(model_p_fdr)
  518. # -- 各子表 --
  519. fit_tbl <- res_obj$fit_summary %>%
  520. mutate(`R²` = round(r_squared, 3), `Adj. R²` = round(adj_r_squared, 3),
  521. `F Statistic` = round(statistic, 3),
  522. `Model p` = cleanPValue(model_p),
  523. `Model p (FDR)` = cleanPValue(current_fdr_p), # 【核心更新】插入 FDR P 值
  524. AIC = round(aic, 2), BIC = round(bic, 2)) %>%
  525. transmute(Model = model_type, Outcome = outcome, N = n,
  526. `R²`, `Adj. R²`, `F Statistic`, `Model p`, `Model p (FDR)`, AIC, BIC)
  527. coef_tbl <- formatCoefTable(res_obj$coef_full) %>%
  528. transmute(Term = term, Beta = estimate, SE = std.error,
  529. t = statistic, p = p, Sig = sig, `95% CI` = ci_95)
  530. key_tbl <- formatCoefTable(res_obj$key_effects) %>%
  531. mutate(Metric = case_when(
  532. model_type %in% c("PA_only", "Full_Sample") ~ term,
  533. TRUE ~ term %>% str_remove(":group_stdPatient") %>% str_remove("group_stdPatient:")
  534. )) %>%
  535. transmute(Metric, Term = term, Beta = estimate, SE = std.error,
  536. t = statistic, p = p, Sig = sig, `95% CI` = ci_95)
  537. vif_tbl <- if (nrow(res_obj$vif_history) == 0) {
  538. tibble(Iteration = NA_integer_, Metric = NA_character_, `Block VIF` = NA_real_,
  539. Threshold = NA_real_, `Removed This Round` = NA_character_)
  540. } else {
  541. res_obj$vif_history %>%
  542. mutate(block_vif = round(block_vif, 3)) %>%
  543. transmute(Iteration = iteration, Metric = metric, `Block VIF` = block_vif,
  544. Threshold = threshold, `Removed This Round` = removed_metric)
  545. }
  546. metric_tbl <- tibble(
  547. Item = c("Kept Metrics", "Removed Metrics", "Final Formula"),
  548. Value = c(
  549. paste(res_obj$kept_metrics, collapse = "; "),
  550. paste(res_obj$removed_metrics, collapse = "; "),
  551. ifelse(length(res_obj$formula) == 0 || all(is.na(res_obj$formula)),
  552. NA_character_, deparse(res_obj$formula))
  553. )
  554. )
  555. narrative_lines <- c(
  556. paste0("Outcome: ", outcome_name),
  557. paste0("Model type: ", model_type),
  558. paste0("Sample size used: ", res_obj$n),
  559. paste0("Initial number of metric predictors: ", length(existing_metric_cols)),
  560. paste0("Final number of retained metric predictors: ", length(res_obj$kept_metrics)),
  561. paste0("Number of removed metrics due to VIF pruning: ", length(res_obj$removed_metrics)),
  562. paste0("VIF threshold: ", vif_threshold),
  563. "",
  564. case_when(
  565. model_type == "PA_only" ~ "Interpretation focus: metric main effects within the patient group.",
  566. model_type == "Full_Sample" ~ "Interpretation focus: metric main effects in the pooled full sample, controlling for group differences.",
  567. model_type == "Moderation" ~ "Interpretation focus: metric × group interaction effects in the full sample."
  568. )
  569. )
  570. # -- 构建文档 --
  571. doc_obj <- read_docx() %>%
  572. body_add_par(paste0("Regression Report: ", outcome_name, " (", model_type, ")"), style = "heading 1") %>%
  573. body_add_par(format(Sys.time(), "Generated on %Y-%m-%d %H:%M:%S"), style = "Normal") %>%
  574. body_add_par("1. Analysis Summary", style = "heading 2")
  575. for (txt in narrative_lines) doc_obj <- body_add_par(doc_obj, txt, style = "Normal")
  576. doc_obj <- doc_obj %>%
  577. body_add_par("2. Model Fit", style = "heading 2") %>%
  578. body_add_flextable(flextable(fit_tbl) %>% makeFtTheme("Table 1. Model fit summary")) %>%
  579. body_add_par("3. Predictor Retention", style = "heading 2") %>%
  580. body_add_flextable(flextable(metric_tbl) %>% makeFtTheme("Table 2. Predictor retention summary")) %>%
  581. body_add_par("4. VIF Pruning History", style = "heading 2") %>%
  582. body_add_flextable(flextable(vif_tbl) %>% makeFtTheme("Table 3. VIF pruning history")) %>%
  583. body_add_par("5. Key Effects", style = "heading 2") %>%
  584. body_add_flextable(flextable(key_tbl) %>% makeFtTheme(
  585. case_when(
  586. model_type == "PA_only" ~ "Table 4. Key metric main effects (Patient)",
  587. model_type == "Full_Sample" ~ "Table 4. Key metric main effects (Full Sample)",
  588. model_type == "Moderation" ~ "Table 4. Key metric × group interaction effects"
  589. ))) %>%
  590. body_add_par("6. Full Coefficient Table", style = "heading 2") %>%
  591. body_add_flextable(flextable(coef_tbl) %>% makeFtTheme("Table 5. Full coefficient table"))
  592. # --- 插入简单斜率结果 ---
  593. if (model_type == "Moderation" && nrow(res_obj$simple_slopes) > 0) {
  594. slope_tbl <- res_obj$simple_slopes %>%
  595. mutate(Trend = round(Trend, 3), SE = round(SE, 3), t.ratio = round(t.ratio, 3),
  596. p.value = cleanPValue(p.value), Sig = getSigMark(p.value)) %>%
  597. rename(`p-value` = p.value)
  598. doc_obj <- doc_obj %>%
  599. body_add_par("7. Post-Hoc Simple Slopes Analysis", style = "heading 2") %>%
  600. body_add_par("Simple slopes calculated for metrics with significant interaction effects.", style = "Normal") %>%
  601. body_add_flextable(flextable(slope_tbl) %>% makeFtTheme("Table 6. Simple slopes by Group"))
  602. }
  603. # --- 插入鲁棒性检验图 ---
  604. if (file.exists(res_obj$check_plot_file)) {
  605. doc_obj <- doc_obj %>%
  606. body_add_par("Model Assumption Checks", style = "heading 2") %>%
  607. body_add_img(src = res_obj$check_plot_file, width = 6.5, height = 5.5)
  608. }
  609. out_path <- file.path(output_dir, paste0("Regression_Report_", model_type, "_", outcome_name, ".docx"))
  610. print(doc_obj, target = out_path)
  611. invisible(out_path)
  612. }
  613. cat("开始生成 DOCX 报告...\n")
  614. walk(analysis_results, ~ buildDocxReport(.x, vif_threshold, all_fit_summary))
  615. cat("DOCX 报告生成完毕。\n\n")
  616. # =============================================================================
  617. # 11. 绘图函数
  618. # =============================================================================
  619. getModelData <- function(outcome_name, model_type, kept_metrics, data_wide) {
  620. if (model_type == "PA_only") {
  621. data_wide %>%
  622. filter(group_std == "Patient") %>%
  623. select(all_of(c(outcome_name, "BMI", "years", kept_metrics))) %>%
  624. drop_na()
  625. } else {
  626. data_wide %>%
  627. select(all_of(c(outcome_name, "group_std", "BMI", "years", kept_metrics))) %>%
  628. drop_na()
  629. }
  630. }
  631. # 主效应绘图通用函数
  632. plotMainEffect <- function(outcome_name, metric_name, fit_obj, data_plot, out_file, title_sub) {
  633. vis_obj <- visreg(fit_obj, data = data_plot, xvar = metric_name,
  634. gg = TRUE, partial = FALSE, rug = FALSE, overlay = FALSE)
  635. p <- vis_obj +
  636. geom_point(data = data_plot,
  637. aes_string(x = metric_name, y = outcome_name),
  638. inherit.aes = FALSE, color = "#619bc1", alpha = 0.65, size = 4) +
  639. labs(
  640. title = paste0(prettyOutcomeName(outcome_name), " ~ ", prettyMetricName(metric_name)),
  641. subtitle = title_sub,
  642. x = prettyMetricName(metric_name),
  643. y = prettyOutcomeName(outcome_name),
  644. caption = "Line shows fitted association after covariate adjustment (BMI, years)."
  645. ) +
  646. theme_classic(base_size = 13) +
  647. theme(plot.title = element_text(face = "bold", hjust = 0.5),
  648. plot.subtitle = element_text(hjust = 0.5),
  649. plot.caption = element_text(size = 10, colour = "gray40"))
  650. ggsave(out_file, plot = p, width = 6.8, height = 5.2, dpi = 300, bg = "white")
  651. invisible(p)
  652. }
  653. plotInteractionEffect <- function(outcome_name, metric_name, fit_obj, data_plot, out_file) {
  654. data_plot <- data_plot %>%
  655. mutate(group_std = factor(group_std, levels = c("Control", "Patient")))
  656. vis_obj <- visreg(fit_obj, data = data_plot, xvar = metric_name,
  657. by = "group_std", overlay = TRUE,
  658. gg = TRUE, partial = FALSE, rug = FALSE)
  659. p <- vis_obj +
  660. geom_point(data = data_plot,
  661. aes_string(x = metric_name, y = outcome_name, color = "group_std"),
  662. inherit.aes = FALSE, alpha = 0.60, size = 3.0) +
  663. scale_color_manual(
  664. values = c("Control" = "#e88936", "Patient" = "#619bc1"),
  665. labels = c("Control" = "CON", "Patient" = "Patient"),
  666. name = "Group"
  667. ) +
  668. scale_fill_manual(
  669. values = c("Control" = alpha("#e88936", 0.2), "Patient" = alpha("#619bc1", 0.2)),
  670. guide = "none"
  671. ) +
  672. labs(
  673. title = paste0(prettyOutcomeName(outcome_name), " ~ ", prettyMetricName(metric_name), " × Group"),
  674. subtitle = "Interaction plot from final VIF-pruned model",
  675. x = prettyMetricName(metric_name),
  676. y = prettyOutcomeName(outcome_name),
  677. caption = "Lines show fitted slopes after covariate adjustment (BMI, years)."
  678. ) +
  679. theme_classic(base_size = 13) +
  680. theme(plot.title = element_text(face = "bold", hjust = 0.5),
  681. plot.subtitle = element_text(hjust = 0.5),
  682. plot.caption = element_text(size = 10, colour = "gray40"),
  683. legend.position = "top")
  684. ggsave(out_file, plot = p, width = 7.2, height = 5.4, dpi = 300, bg = "white")
  685. invisible(p)
  686. }
  687. # =============================================================================
  688. # 12. 批量绘图(基于通过了模型FDR校正的显著结果)
  689. # =============================================================================
  690. # -- 12.1 PA 主效应图 ----------------------------------------------------------
  691. cat("开始绘制显著 PA 主效应图...\n")
  692. pa_plot_log <- if (nrow(significant_pa_results) > 0) {
  693. map_dfr(seq_len(nrow(significant_pa_results)), function(i) {
  694. outcome_name <- significant_pa_results$Outcome[i]
  695. metric_name <- significant_pa_results$Metric[i]
  696. list_key <- paste0(outcome_name, "___PA_only")
  697. res_i <- analysis_results[[list_key]]
  698. data_plot <- getModelData(outcome_name, "PA_only", res_i$kept_metrics, data_wide)
  699. out_file <- file.path(plot_dir_pa, paste0("PAonly_", cleanFilename(outcome_name), "_", cleanFilename(metric_name), ".png"))
  700. plotMainEffect(outcome_name, metric_name, res_i$fit, data_plot, out_file, "Patient group only")
  701. tibble(Plot_Type = "PA_only_main_effect", Outcome = outcome_name, Metric = metric_name, File = out_file)
  702. })
  703. } else { tibble() }
  704. # -- 12.2 全样本主效应图 -------------------------------------------------------
  705. cat("开始绘制显著 全样本主效应图...\n")
  706. fs_plot_log <- if (nrow(significant_fs_results) > 0) {
  707. map_dfr(seq_len(nrow(significant_fs_results)), function(i) {
  708. outcome_name <- significant_fs_results$Outcome[i]
  709. metric_name <- significant_fs_results$Metric[i]
  710. list_key <- paste0(outcome_name, "___Full_Sample")
  711. res_i <- analysis_results[[list_key]]
  712. data_plot <- getModelData(outcome_name, "Full_Sample", res_i$kept_metrics, data_wide)
  713. out_file <- file.path(plot_dir_full, paste0("FullSample_", cleanFilename(outcome_name), "_", cleanFilename(metric_name), ".png"))
  714. plotMainEffect(outcome_name, metric_name, res_i$fit, data_plot, out_file, "Pooled Full Sample (Controlling for Group)")
  715. tibble(Plot_Type = "Full_Sample_main_effect", Outcome = outcome_name, Metric = metric_name, File = out_file)
  716. })
  717. } else { tibble() }
  718. # -- 12.3 交互效应图 -----------------------------------------------------------
  719. cat("开始绘制显著交互效应图...\n")
  720. interaction_plot_log <- if (nrow(significant_interaction_results) > 0) {
  721. map_dfr(seq_len(nrow(significant_interaction_results)), function(i) {
  722. outcome_name <- significant_interaction_results$Outcome[i]
  723. metric_name <- significant_interaction_results$Metric[i]
  724. list_key <- paste0(outcome_name, "___Moderation")
  725. res_i <- analysis_results[[list_key]]
  726. data_plot <- getModelData(outcome_name, "Moderation", res_i$kept_metrics, data_wide)
  727. out_file <- file.path(plot_dir_int, paste0("Interaction_", cleanFilename(outcome_name), "_", cleanFilename(metric_name), ".png"))
  728. plotInteractionEffect(outcome_name, metric_name, res_i$fit, data_plot, out_file)
  729. tibble(Plot_Type = "Metric_Group_interaction", Outcome = outcome_name, Metric = metric_name, File = out_file)
  730. })
  731. } else { tibble() }
  732. # 保存绘图日志
  733. all_plot_log <- bind_rows(pa_plot_log, fs_plot_log, interaction_plot_log)
  734. if (nrow(all_plot_log) > 0) {
  735. write.csv(all_plot_log, file.path(plot_dir, "Significant_effect_plot_log.csv"), row.names = FALSE, fileEncoding = "UTF-8")
  736. }
  737. # =============================================================================
  738. # 13. 最终控制台摘要
  739. # =============================================================================
  740. cat("\n============================================================\n")
  741. cat("VIF 剪枝多指标回归分析(附总体 FDR 门控、事后检验与鲁棒性验证)全流程完成。\n")
  742. cat("输出目录:", output_dir, "\n\n")
  743. cat("生成文件:\n")
  744. cat(" DOCX 报告:", length(analysis_results), "份(内附假设检验图及简单斜率结果)\n")
  745. cat(" 所有模型鲁棒检验:", check_dir, "\n")
  746. cat("============================================================\n")

step1_3_Regression_modelall_analy.R at commit a439e06, no license · at the source

Overview

Authors: Peng Zhang1, Lirong Tang2,3, Weihua Li1, Miao Wang4, Yulong Jia1, Fengxia Yu1, Zhanjiang Li2,3, Zhenchang Wang1, Jiani Wang1, Guowei Wu5, Yiling Wang6
  1. Department of Radiology, Beijing Friendship Hospital, Capital Medical University,No. 95 Yongan Road, Xicheng District, Beijing, 100050 China
  2. Beijing Anding Hospital Capital Medical University,No.5 Ankang Lane, Dewai Avenue, Xicheng District, Beijing, 100088 China
  3. The National Clinical Research Center for Mental Disorders & Beijing Key Laboratory of Mental Disorders, Beijing Anding Hospital, Capital Medical University,No.5 Ankang Lane, Dewai Avenue, Xicheng District, Beijing, 100088 China
  4. Academy for Advanced Interdisciplinary Studies, Peking University,No. 5 Yiheyuan Road, Haidian District, Beijing, 100871 China
  5. CAS Key Laboratory of Behavioral Science, Institute of Psychology, Chinese Academy of Sciences,No.16 Lincui Road, Chaoyang District, Beijing, 100020 China
  6. Department of Radiology, The Affiliated Hospital of Qingdao University,No. 16, Jiangsu Road, Qingdao, 266003 Shandong China
Journal: Journal of eating disorders, volume 14, issue 1, article 164
Dates: received 5 November 2025; accepted 31 May 2026; published online 23 June 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1186/s40337-026-01671-1 · PMID 42337633 · PMCID PMC13366929 · OpenAlex W7165650131
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: fMRI (modality), human (organism), other condition (population)
Methods: Spectral & time-frequency, Connectivity, Statistics, fMRI & imaging
Keywords: Bulimia nervosa, Resting-state fMRI, Integration, Segregation, Graph theory
Topic: Eating Disorders and Behaviors (Clinical Psychology, Psychology), according to OpenAlex
Funding: National Natural Science Foundation of China (82572162)
Citations: not cited yet (Europe PMC); 102 references in the paper

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repository

Its files are read in the Code ↔ Paper reader above, with 5 matches between paragraphs and lines of code.

guoweiwuorgin/BN_Large_scale_network_Seg_Integ

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: a439e0648deb05824fb6304fb4c0a42d1f70bece, 5 April 2026
Languages: MATLAB (10), R (2)
Size: 14 files, 12 scripts
Software Heritage: not checked
Found in: “Code availability”
Holds: README, 1 notebook
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: cifti-matlab (2 files), ggplot2 (2 files), GIfTI library for MATLAB (2 files), tidyverse (2 files), broom (1 file), car (1 file), easystats (1 file), emmeans (1 file), Statistics and Machine Learning Toolbox (1 file), patchwork (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
13 files

Code availability statement

The paper has a code availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1186/s40337-026-01671-1.

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;
  • 12 scripts, each with its path and the digest of its content;
  • 5 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 paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

  • it says that the data are available on request

Read it in the paper: doi.org/10.1186/s40337-026-01671-1.

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, 11 authors, 5 keywords, 1 funder, 99 references.

Cite

This paper

Zhang, P., Tang, L., Li, W., Wang, M., Jia, Y., Yu, F., Li, Z., Wang, Z., Wang, J., Wu, G., & Wang, Y. (2026). Aberrant large- and mesoscale network segregation and integration in bulimia nervosa. Journal of eating disorders, 14(1), 164. https://doi.org/10.1186/s40337-026-01671-1

BibTeX

@article{zhang2026aberrant,
author = {Zhang, Peng and Tang, Lirong and Li, Weihua and Wang, Miao and Jia, Yulong and Yu, Fengxia and Li, Zhanjiang and Wang, Zhenchang and Wang, Jiani and Wu, Guowei and Wang, Yiling},
title = {{Aberrant large- and mesoscale network segregation and integration in bulimia nervosa}},
journal = {Journal of eating disorders},
year = {2026},
month = jun,
volume = {14},
number = {1},
pages = {164},
publisher = {BMC},
issn = {2050-2974},
doi = {10.1186/s40337-026-01671-1},
url = {https://doi.org/10.1186/s40337-026-01671-1},
pmid = {42337633},
pmcid = {PMC13366929}
}

RIS

TY - JOUR
AU - Zhang, Peng
AU - Tang, Lirong
AU - Li, Weihua
AU - Wang, Miao
AU - Jia, Yulong
AU - Yu, Fengxia
AU - Li, Zhanjiang
AU - Wang, Zhenchang
AU - Wang, Jiani
AU - Wu, Guowei
AU - Wang, Yiling
TI - Aberrant large- and mesoscale network segregation and integration in bulimia nervosa
T2 - Journal of eating disorders
J2 - J Eat Disord
PY - 2026
DA - 2026/06/23
VL - 14
IS - 1
SP - 164
SN - 2050-2974
PB - BMC
DO - 10.1186/s40337-026-01671-1
UR - https://doi.org/10.1186/s40337-026-01671-1
LA - en
ER -

CSL-JSON

{
"id": "10.1186/s40337-026-01671-1",
"type": "article-journal",
"title": "Aberrant large- and mesoscale network segregation and integration in bulimia nervosa",
"container-title": "Journal of eating disorders",
"author": [
{
"family": "Zhang",
"given": "Peng"
},
{
"family": "Tang",
"given": "Lirong"
},
{
"family": "Li",
"given": "Weihua"
},
{
"family": "Wang",
"given": "Miao"
},
{
"family": "Jia",
"given": "Yulong"
},
{
"family": "Yu",
"given": "Fengxia"
},
{
"family": "Li",
"given": "Zhanjiang"
},
{
"family": "Wang",
"given": "Zhenchang"
},
{
"family": "Wang",
"given": "Jiani"
},
{
"family": "Wu",
"given": "Guowei"
},
{
"family": "Wang",
"given": "Yiling"
}
],
"container-title-short": "J Eat Disord",
"volume": "14",
"issue": "1",
"page": "164",
"DOI": "10.1186/s40337-026-01671-1",
"PMID": "42337633",
"PMCID": "PMC13366929",
"ISSN": "2050-2974",
"publisher": "BMC",
"URL": "https://doi.org/10.1186/s40337-026-01671-1",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
23
]
]
}
}

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-10282-0 [code]
Genetic risk of Alzheimer's disease is associated with loss of brain network segregation in midlife.
Journal: Communications biology
In common: easystats, car, broom, 2 other tools, 9 references
[2] doi:10.1162/imag.a.1285 [code]
Individualized mapping of functional brain networks in older adulthood.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: cifti-matlab, GIfTI library for MATLAB, Statistics and Machine Learning Toolbox, fMRI, 7 references
[3] doi:10.1002/hbm.70605 [code]
BrainEnrich: Revealing Biological Insights for Imaging-Derived Phenotypes Through Transcriptomic Enrichment.
Journal: Human brain mapping
In common: cifti-matlab, GIfTI library for MATLAB, easystats, 6 other tools, 1 reference
[4] doi:10.1162/imag.a.1338 [code]
Systematic fMRI signal differences across cohorts alter lifespan trajectories of functional brain networks.
Journal: Imaging neuroscience (Cambridge, Mass.)
In common: cifti-matlab, GIfTI library for MATLAB, fMRI, 6 references
[5] doi:10.1093/nc/niag029 [code]
A data-driven approach to identifying and evaluating connectivity-based neural correlates of conscious visual perception.
Journal: Neuroscience of consciousness
In common: easystats, car, broom, 5 other tools, 2 references
[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 America
In common: easystats, car, broom, 4 other tools, 1 reference
[7] doi:10.1038/s41586-026-10910-z [code]
Psychedelics align brain activity with context.
Journal: Nature
In common: cifti-matlab, GIfTI library for MATLAB, Statistics and Machine Learning Toolbox, fMRI, 5 references
[8] doi:10.1002/hbm.70526 [code]
Resting-State and Task Functional Magnetic Resonance Imaging Network Topology Metrics With no Threshold Selection to Predict Cognition.
Journal: Human brain mapping
In common: easystats, car, emmeans, 3 other tools, fMRI, 2 references
[9] doi:10.1093/oons/kvag006 [code]
Social disconnection in the brain: loneliness and age across networks using graph theory.
Journal: Oxford open neuroscience
In common: car, broom, tidyverse, fMRI, 5 references
[10] doi:10.1016/j.isci.2026.116747 [code]
Age and loneliness relate to reduced trust learning and alterations in amygdala function.
Journal: iScience
In common: easystats, car, broom, 4 other tools, 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.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

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.