R语言绘制有向无环图(DAG)
有向无环图(Directed Acyclic Graph,简称DAG)是一种特殊的有向图,它由一系列顶点和有方向的边组成,其中不存在任何环路。这意味着从任一顶点出发,沿着箭头方向移动,你永远无法回到起始点。

从流行病学来说,有向无环图主要用来进行因果推断。研究者们会通过已知的理论框架来构建自己的DAG、确定研究假设、确定统计分析的思路。DAG更多时候是作为一个更加直观的方式来梳理和呈现一个研究者的研究框架。这种梳理和呈现是非常有意义的,因为它会指导你如何设计你的研究以及如何分析你的数据。
下面咱们来介绍一下怎么使用R语言来绘制有向无环图,先导入R包
library(ggdag)
library(ggplot2)
theme_set(theme_dag())
先来个最基础的,比如x导致y
dagify(y ~ x) %>%ggdag()

上图可以看到x到y有个箭头,表明x导致y
下面做一个双向的
dagify(y ~ ~x) %>%ggdag()

上图有点奇怪,因为少了一个潜在变量,咱们重新画一下
###规范化DAG:将潜在变量添加到图中
dagify(y ~ ~x) %>%ggdag_canonical()

可以看出,是L1导致x和y
上面两个只是比较初级的,用得不是很顺手,下面咱们来个自定义的:x导致y,a导致x, y导致a
###自己编写方向
dagify(y ~ x,x ~ a,a ~ y
) %>%ggdag()

咱们也可以不走通道写成下面这种形式
dag <- dagify(y ~ x,x ~ a,a ~ y,labels = c("y" = "outcome","x" = "observed","a" = "mediator")
) ggdag(dag)

上面这些只是一些比较简单的情况,ggdag包还能绘制一些比较复杂的因果关系
假设我们正在研究吸烟与 心搏骤停。我们可以假设吸烟(smoking)会导致胆固醇(cholesterol),导致心脏骤停(cardiacarrest)
从吸烟到心脏骤停的路径是:吸烟 导致胆固醇升高,从而增加患心脏病的风险 逮捕。胆固醇是介于吸烟和 心搏骤停。有向路径也是链,因为每个链都是因果关系 在下一个。假设我们还假设体重会导致胆固醇 升高,从而增加心脏骤停的风险。现在还有另一个 DAG 中的链条:从体重到心脏骤停。然而,这条链条是间接的,至少就吸烟之间的关系而言 心脏骤停。
我们还假设吸烟的人更有可能是 从事其他不健康行为的人,例如暴饮暴食。在 DAG 的 DAG 节点,这被描述为一个潜在(未测量的)节点,称为 unhealthy 生活方式。偏爱不健康的行为会导致 吸烟和体重增加。在这里,两者之间的关系 吸烟和体重是通过一条分叉路径(体重 < - 不健康 生活方式 - >吸烟)而不是连锁店;因为他们有一个共同的 父母、吸烟和体重有关(在现实生活中,有 可能是两者之间更直接的关系,但我们会忽略 为简单起见)。
smoking_ca_dag <- dagify(cardiacarrest ~ cholesterol,cholesterol ~ smoking + weight,smoking ~ unhealthy,weight ~ unhealthy,labels = c("cardiacarrest" = "Cardiac\n Arrest","smoking" = "Smoking","cholesterol" = "Cholesterol","unhealthy" = "Unhealthy\n Lifestyle","weight" = "Weight"),latent = "unhealthy",exposure = "smoking",outcome = "cardiacarrest"
)ggdag(smoking_ca_dag, text = FALSE, use_labels = "label")

上图可以理清各种关系,最后导致心脏停博得原因,调理非常清晰。
还可以显示变量间得开放路径
ggdag_paths(smoking_ca_dag, text = FALSE, use_labels = "label", shadow = TRUE)

Ggdag包还能绘制很多得复杂因果结构图,我这里不打算一一介绍,有兴趣得可以去看R包说明。我打算介绍ggdag包得一个辅助包dagitty包,用它来辅助绘制更加简单。
先导入R包,
library(dagitty)
还是刚才得例子,这个例子没有实际意义,只是演示用
dag1 <- dagitty:: dagitty("dag{x-> y;y-> a;a-> x}")这里可以看到,dagitty包写法稍有不同,方向用箭头替代,也是很清洗明了的。接下来咱们要把dag1转成tidy格式,有利于后面操作,这里seed = 1234是设定一个种子,避免每次图形不一样dag_tidy <- ggdag::tidy_dagitty(dag1, seed = 1234) %>%dag_label(labels = c("x" = "observed", "y" = "outcome", "a" = "mediator"))
最后绘图,
# dag_tidy是你的dag数据,node_size可以修改点的大小,text_size可以修改字母大小
# label_size修改标签大小,edge_type是边的类型,可以是直的,也可以是弯的
# geom_dag_label_repel里面是添加标签的函数,最好不要变动
# geom_dag_edges可以改变边的属性,我这里改变了宽度
# theme_dag_blank可以删掉背景
ggdag(dag_tidy, node_size = 15, text_size = 5, label_size = 5,edge_type = "link_arc") +geom_dag_label_repel(aes(label = label)) +geom_dag_edges(edge_width = 1) +theme_dag_blank() +expand_plot(expand_x = expansion(c(0.1, 0.1)),expand_y = expansion(c(0.1, 0.1)))

转换格式后能轻松的对图形修改和设定。
参考文献:
- ggdag包说明
- https://zhuanlan.zhihu.com/p/350952313
相关文章:
R语言绘制有向无环图(DAG)
有向无环图(Directed Acyclic Graph,简称DAG)是一种特殊的有向图,它由一系列顶点和有方向的边组成,其中不存在任何环路。这意味着从任一顶点出发,沿着箭头方向移动,你永远无法回到起始点。 从流…...
报错Too many open files
1、先查看系统最大打开文件数 # 查看当前系统打开文件最大数 # ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signal…...
Spring Web MVC基础第一篇
目录 1.什么是Spring Web MVC? 2.创建Spring Web MVC项目 3.注解使用 3.1RequestMapping(路由映射) 3.2一般参数传递 3.3RequestParam(参数重命名) 3.4RequestBody(传递JSON数据) 3.5Pa…...
129.求根节点到叶节点数字之和(遍历思想)
Problem: 129.求根节点到叶节点数字之和 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 直接利用二叉树的先序遍历,将遍历过程中的节点值先利用字符串拼接起来遇到根节点时再转为数字并累加起来,在归的过程中…...
unity中的动画混合树
为什么需要动画混合树,动画混合树有什么作用? 在Unity中,动画混合树(Animation Blend Tree)是一种用于管理和混合多个动画状态的工具,包括1D和2D两种类型,以下是其作用及使用必要性的介绍&…...
AWS EMR使用Apache Kylin快速分析大数据
在AWS Elastic MapReduce(EMR)集群上部署和使用Apache Kylin,以实现对大规模数据集的快速分析,企业可以充分利用云计算的强大资源和Kylin的数据分析能力,实现快速、高效的数据分析。以下是该案例的详细步骤和要点&…...
MySQL存储过程和存储函数_mysql 存储过 call proc_stat_data(3,null)
2)很难调试存储过程。只有少数数据库管理系统允许调试存储过程。不幸的是,MySQL不提供调试存储过程的功能。 1.2 数据准备 创建数据库: DEFAULT CHARACTER SET utf8; use test;这里记得设置编码! 创建测试表: DROP…...
spacemacs gnuplot
个人博客地址:spacemacs gnuplot | 一张假钞的真实世界 环境 Ubuntu 16.10Emacs 24 安装过程 spacemacs安装 安装Emacs sudo apt-get install emacs 安装spacemacs (1)如果已经存在Emacs配置文件,首先备份: c…...
Flink2支持提交StreamGraph到Flink集群
最近研究Flink源码的时候,发现Flink已经支持提交StreamGraph到集群了,替换掉了原来的提交JobGraph。 新增ExecutionPlan接口,将JobGraph和StreamGraph作为实现。 Flink集群Dispatcher也进行了修改,从JobGraph改成了接口Executio…...
Kotlin 使用 Springboot 反射执行方法并自动传参
在使用反射的时候,执行方法的时候在想如果Springboot 能对需要执行的反射方法的参数自动注入就好了。所以就有了下文。 知识点 获取上下文通过上下文获取 Bean通过上下文创建一个对象,该对象所需的参数由 Springboot 自己注入 创建参数 因为需要对反…...
索罗斯的“反身性”(Reflexivity)理论:市场如何扭曲现实?(中英双语)
索罗斯的“反身性”(Reflexivity)理论:市场如何扭曲现实? 一、引言:市场是镜子,还是哈哈镜? 在传统经济学中,市场通常被认为是一个理性、有效的反映现实的系统。按照经典经济学理论…...
Vue 入门到实战 七
第7章 渲染函数 目录 7.1 DOM树 7.2 什么是渲染函数 7.3 h()函数 7.3.1 基本参数 7.3.2 约束 7.3.3 使用JavaScript代替模板功能 7.1 DOM树 7.2 什么是渲染函数 在多数情况下,Vue推荐使用模板template来创建HTML。然而在一些应用场景中,需要使用J…...
系统学习算法: 专题八 二叉树中的深搜
深搜其实就是深度优先遍历(dfs),与此相对的还有宽度优先遍历(bfs) 如果学完数据结构有点忘记,如下图,左边是dfs,右边是bfs 而二叉树的前序,中序,后序遍历都可…...
进程、线程、内存和IO模型的概念详解
进程、线程、内存和IO模型的概念详解 1 进程与线程1.1 进程1.1.1 进程分类1.1.2 进程的状态和转换1.1.3 僵尸进程和孤儿进程的区别1.1.4 进程之间的通信1.1.5 用户态和内核态1.1.6 用户空间和内核空间 1.2 线程1.2.1 线程的状态和转换1.2.2 进程与线程的区别 1.3 多进程和多线程…...
DeepSeek:AI领域的创新先锋
在人工智能领域,DeepSeek正以其独特的创新技术引领着行业的发展。作为一款高性能、低成本的AI模型,DeepSeek在架构设计、训练优化和应用场景等多个方面都展现出了显著的创新点。这些创新不仅使其在技术上取得了突破,也为AI的普及化和应用拓展…...
Labelme转Voc、Coco
Q:在github找的cv代码基本都是根据现有且流行的公共数据集格式组织的训练数据集,这导致我使用labelme标注好之后需要我们重新组织数据集 labelme2coco #!/usr/bin/env pythonimport argparse import collections import datetime import glob import j…...
pytorch实现变分自编码器
人工智能例子汇总:AI常见的算法和例子-CSDN博客 变分自编码器(Variational Autoencoder, VAE)是一种生成模型,属于深度学习中的无监督学习方法。它通过学习输入数据的潜在分布(Latent Distribution)&…...
使用 Numpy 自定义数据集,使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
1. 导入必要的库 首先,导入我们需要的库:Numpy、Pytorch 和相关工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定义数据集 …...
JVM方法区
一、栈、堆、方法区的交互关系 二、方法区的理解: 尽管所有的方法区在逻辑上属于堆的一部分,但是一些简单的实现可能不会去进行垃圾收集或者进行压缩,方法区可以看作是一块独立于Java堆的内存空间。 方法区(Method Area)与Java堆一样,是各个…...
【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…...
指导初学者使用Anaconda运行GitHub上One - DM项目的步骤
以下是指导初学者使用Anaconda运行GitHub上One - DM项目的步骤: 1. 安装Anaconda 下载Anaconda: 让初学者访问Anaconda官网(https://www.anaconda.com/products/distribution),根据其操作系统(Windows、M…...
在实际开发中,如何正确使用 INT(1) 和 INT(10)
在实际开发中,如何正确使用 INT(1) 和 INT(10) 前言 在数据库设计和开发过程中,数据类型的选择至关重要。 最近,我在工作中遇到了一个关于MySQL中INT类型的误解问题,这让我意识到很多开发者对INT类型的理解存在误区。 本文将深…...
像接口契约文档 这种工件,在需求 分析 设计 工作流里面 属于哪一个工作流
οゞ浪漫心情ゞο(20***328) 2016/2/18 10:26:47 请教一下,像接口契约文档 这种工件,在需求 分析 设计 工作流里面 属于哪一个工作流? 潘加宇(35***47) 17:17:28 你这相当于问用例图、序列图属于哪个工作流,看内容。 如果你的&quo…...
GAMES101学习笔记(六):Geometry 几何(基本表示方法、曲线与曲面、网格处理)
文章目录 几何的表示方法隐式几何 Implicit Geometry代数曲面(Algebraic surface)构造实体几何CSG(Constructive Solid Geometry)距离函数(Distance Function)水平集方法(Level Set Methods)分型几何(Fractal) 显式几何 Explicit Geometry点云(Point Cloud)多边形网格(Polygon …...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.24 随机宇宙:生成现实世界数据的艺术
1.24 随机宇宙:生成现实世界数据的艺术 目录 #mermaid-svg-vN1An9qZ6t4JUcGa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vN1An9qZ6t4JUcGa .error-icon{fill:#552222;}#mermaid-svg-vN1An9qZ6t4JUc…...
深入解析:一个简单的浮动布局 HTML 示例
深入解析:一个简单的浮动布局 HTML 示例 示例代码解析代码结构分析1. HTML 结构2. CSS 样式 核心功能解析1. 浮动布局(Float)2. 清除浮动(Clear)3. 其他样式 效果展示代码优化与扩展总结 在网页设计中,浮动…...
爬虫基础(三)Session和Cookie讲解
目录 一、前备知识点 (1)静态网页 (2)动态网页 (3)无状态HTTP 二、Session和Cookie 三、Session 四、Cookie (1)维持过程 (2)结构 正式开始说 Sessi…...
HTMLCSS :下雪了
这段代码创建了一个动态的雪花飘落加载动画,通过 CSS 技术实现了雪花的下落和消失效果,为页面添加了视觉吸引力和动态感。 大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能…...
力扣 84. 柱状图中最大的矩形
🔗 https://leetcode.cn/problems/largest-rectangle-in-histogram 题目 给一个数组 num 表示位置 i 上圆柱的高度,求圆柱可以勾勒出的矩形的最大面积 思路 枚举圆柱 i,以该圆柱为高,计算其可以组成的矩形的最大面积。记录这过…...
【Windows Server实战】生产环境云和NPS快速搭建
前置条件 本文假定你已达成以下前提条件: 有域控DC。有证书服务器(AD CS)。已使用Microsoft Intune或者GPO为客户机申请证书。服务器上至少有两张网卡(如果用虚拟机做的测试环境,可以用一张HostOnly网卡做测试&#…...
