应粉丝要求,复现一篇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")

还可以进一步修饰,我这里就不弄了。

744

被折叠的 条评论
为什么被折叠?



