绘制一篇18分文章的交叉滞后网络分析图

应粉丝要求,复现一篇18分文章的交叉滞后网络分析图,文章是下面这篇

在这里插入图片描述
复现这篇文章的图三,也是文章的亮点

在这里插入图片描述
作者复现了5个数据库,我就charls这个来说下,怎么看下面这个图

在这里插入图片描述
这张图是一个交叉滞后网络分析图,主要用于展示不同变量(如疾病、身体功能、日常生活能力)在时间维度上的相互预测关系。结合图中的节点、颜色和连线,可以从以下四个维度来解读:

1. 识别节点类型(看颜色)
图中的圆圈代表不同的变量,颜色区分了它们的属性:
粉色节点 (CVD):代表心血管疾病结局。
CVD1:心脏问题
CVD2:中风
绿色节点 (Highlight):代表关键风险因素/亮点。这些通常是研究者重点关注的慢性病或特定健康行为(如高血压、糖尿病、吸烟等)。
浅蓝色节点 (Function):代表功能指标。涵盖了身体机能(如视力、听力)、日常生活能力(如穿衣、洗澡、上下床)以及认知功能。
2. 理解连线含义(看箭头)
图中的蓝色线条带有箭头,这是解读的核心:
方向性:箭头从 A 指向 B,意味着在统计上,A 是 B 的预测因子。也就是说,前一个时间点的 A 状态,能显著预测后一个时间点 B 的发生或变化。
格兰杰因果关系:这种网络通常基于格兰杰因果检验,暗示了一种时间上的先后影响逻辑。例如,如果有一条线从 FI11(高血压)指向 CVD1(心脏问题),说明高血压病史增加了后续患心脏问题的风险。
线的粗细/深浅:虽然图中看起来比较均匀,但通常在更精细的分析中,线条越粗或颜色越深,代表这种预测关系的强度越大(即统计学上的系数越高)。
3. 分析网络结构(看位置与连接数)
中心度:观察哪些节点发出的箭头最多(出度),或者接收的箭头最多(入度)。
核心驱动因素:如果某个绿色节点(如 FI11 高血压)发出了很多箭头指向其他蓝色节点或粉色节点,说明它是一个核心的驱动因素,控制着网络中的多个下游结果。
核心后果:如果粉色节点 CVD1/CVD2 接收了大量箭头,说明它们是多种前期因素共同作用的最终结果。
4.聚类:可以看到节点大致分成了几个区域。右侧主要是慢病和心血管结局,左侧和下方主要是身体功能和日常生活能力指标。

总的来说:这张图实际上是一张“健康风险地图”。它告诉你:为了预防粉色的心血管疾病(终点),你应该优先关注哪些绿色的关键指标(起点),以及这些指标是如何通过影响蓝色的身体功能(中间过程)最终导致疾病发生的。

下面我来介绍一下怎么制作这张图,我打算分成两章来介绍,本次先介绍怎么制作这样的图,我先模拟一个数据,下期介绍怎么生成这种图的数据。
绘图主要是通过igraph包或者qgraph包,本章这里我使用igraph包

library(igraph)
library(RColorBrewer)

先生成一个节点数据

nodes <- data.frame(
  id = c("CVD1", "CVD2", 
         "FI11", "FI12", "FI10", "FI13", "FI20", "FI22",
         "FI1", "FI2", "FI3", "FI4", "FI5", "FI6", "FI7", "FI8", "FI9",
         "FI14", "FI15", "FI16", "FI17", "FI18", "FI19", "FI21", 
         "FI23", "FI24", "FI25", "FI26", "FI27"),
  label = c("CVD1", "CVD2",
            "FI11", "FI12", "FI10", "FI13", "FI20", "FI22",
            "FI1", "FI2", "FI3", "FI4", "FI5", "FI6", "FI7", "FI8", "FI9",
            "FI14", "FI15", "FI16", "FI17", "FI18", "FI19", "FI21",
            "FI23", "FI24", "FI25", "FI26", "FI27"),
  group = c("CVD", "CVD",
            "Highlight", "Highlight", "Highlight", "Highlight", "Highlight", "Highlight",
            "Function", "Function", "Function", "Function", "Function", 
            "Function", "Function", "Function", "Function",
            "Function", "Function", "Function", "Function", "Function",
            "Function", "Function", "Function", "Function", "Function",
            "Function", "Function"),
  stringsAsFactors = FALSE
)

在这里插入图片描述
定义节点颜色

# 定义节点颜色
node_colors <- c(
  "CVD" = "#F4A6B5",        # 粉红 - 心血管疾病
  "Highlight" = "#8FBC8F",   # 绿色 - 关键指标
  "Function" = "#B0E0E6"    # 浅蓝 - 功能指标
)

定义一个方向数据

set.seed(42)
n_edges <- 80
edges <- data.frame(
  from = sample(nodes$id, n_edges, replace = TRUE),
  to = sample(nodes$id, n_edges, replace = TRUE),
  stringsAsFactors = FALSE
)
# 去掉自环
edges <- edges[edges$from != edges$to, ]
# 去重
edges <- unique(edges)

在这里插入图片描述
创建 igraph 对象

g <- graph_from_data_frame(d = edges, vertices = nodes, directed = TRUE)

#使用圆形布局,节点均匀分布在圆周上

layout_circle <- layout_in_circle(g, order = order(V(g)$name))

绘图

par(mar = c(2, 2, 4, 10), family = "serif")  # 右边留出图例空间

plot(g,
     
     # 节点样式
     vertex.size = 28,
     vertex.color = node_colors[V(g)$group],
     vertex.frame.color = "gray40",
     vertex.frame.width = 1.2,
     vertex.label = V(g)$name,
     vertex.label.color = "black",
     vertex.label.cex = 0.75,
     vertex.label.font = 1,
     
     # 边样式
     edge.color = "#6495ED",           # 矢车菊蓝
     edge.width = 0.8,
     edge.arrow.size = 0.4,
     edge.arrow.width = 0.8,
     edge.curved = 0.15,               # 边略微弯曲,避免重叠
     edge.alpha = 0.6,                 # 透明度(igraph 不直接支持,可用 rgb)
     
     # 整体
     main = "交叉滞后网络分析图",
     cex.main = 1.5
)

legend("right", 
       inset = c(-0.3, 0),            # 放在图外右侧
       legend = c("心血管疾病", "亮点", "功能指标"),
       fill = c("#F4A6B5", "#8FBC8F", "#B0E0E6"),
       border = "gray40",
       title = "节点类型",
       title.font = 2,
       bty = "n",
       cex = 0.9,
       xpd = TRUE)

在这里插入图片描述
也可以使用ggraph包和tidygraph包来绘图。这个图比较大时间需要久一点

library(ggraph)
library(tidygraph)

tg <- as_tbl_graph(g)

p<-ggraph(tg) +
  geom_edge_link(aes(alpha = after_stat(index)), 
                 arrow = arrow(length = unit(2, "mm")), 
                 colour = "#6495ED") +
  geom_node_point(aes(colour = group), size = 8) +
  geom_node_text(aes(label = name), repel = FALSE, size= 3) +
  scale_colour_manual(values = node_colors) +
  theme_void() +
  labs(title = "交叉滞后网络分析图") +
  theme(legend.position = "right")

在这里插入图片描述
还可以进一步修饰,我这里就不弄了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天桥下的卖艺者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值