DAG(有向无环图)的实现方法

 DAG(有向无环图)的实现方法,DAG是寻找和筛选合适协变量的可视化方法,可以方便的筛选出所需的协变量

原理:

DAG只是一种可视化方法,具体原理关系到图论等知识较为复杂,我们只需要学会读和画DAG图,以及学会用它来进行协变量筛选,对于应用者来说才是DAG的核心

 

协变量筛选方法:

1. 中间变量不能纳入

中间变量(中介变量)是A通过B作用于C,这个比较好理解,就是中间变量的作用可以看做A和C作用的一种途径,作用是属于A的,自然不能放入,不然会导致A对C的影响降低

2. 混杂因素(cofounder)必须放入

cofounder是B同时对A和C有作用(Figure 1 ),B便是A对C的混杂因素,与之相对的是碰撞因素(A和C都对B有作用)较为复杂不再讨论。混杂因素于中间变量不同,必须要放入模型

请注意中间变量与混杂因素的区别!

 Figure 1

3.社会人口学特征一般不作为解释变量

谁都知道年龄、性别等社会学因素对癌症等疾病结局有影响。它们存在的意义是因为它们是混杂因素。一般需要放入到模型中来但无须讨论。


代码实践

# 下载两个包:dagitty和ggdag
##install.packages("dagitty")   
##install.packages("ggdag")
library(tidyverse)
library(dagitty)
library(ggdag)
# 使用dagitty包当中的dagitty函数来创建DAG
# X,Y,Z这些字母都是随便的,你可以想用什么字母用什么,大写小写都可以
# 这些字母代表你的变量
# ->代表方向
# 每一个;表示一个具体的点边关系
# {}代表组,例如{A R D J S}都是效应修饰变量,组里的每个字母用空格隔开
dag<-dagitty::dagitty("dag{X->Z->Y;
  X<-U->Y;{A R D J S}->Y;{B I}->Z;D->S;D->J;R->Z;}")

##matrix2dag可以实现从邻接矩阵生成dag

dag_tidy<-ggdag::tidy_dagitty(dag,seed = 4)%>%
dag_label(labels=c("X"="Meth Use","Y"="HIV","U"="Unobserved Confounder","A"="Age","B"="Binge Drink", "D" = "Education", "J" = "Occupation", 
                   "S" = "Monthly Income", "R" = "Sexual Orientation",  
                   "I" = "Injection Drug", "Z" = "Condomless Sex"))

# 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)))

运行结果示例:

较为粗略,颜色等美学要素可以进行更改

 作者:小天

以下是使用JavaScript和SVG实现Web前端WorkFlow工作流DAG有向无环图的步骤: 1. 首先,需要定义一个包含节点和边的数据结构,可以使用邻接表或邻接矩阵来表示。 2. 接下来,需要使用SVG来绘制节点和边。可以使用SVG的circle元素来绘制节点,使用line元素来绘制边。 3. 在绘制节点和边之前,需要计算每个节点的位置。可以使用拓扑排序算法来计算节点的位置,确保没有环。 4. 绘制节点和边时,可以使用鼠标事件来实现节点的拖拽和边的连线。 5. 最后,可以添加一些交互式功能,例如缩放和平移。 以下是一个简单的JavaScript和SVG实现Web前端WorkFlow工作流DAG有向无环图的示例代码: ```javascript // 定义节点和边的数据结构 var nodes = [ { id: 1, name: 'Node 1', x: 100, y: 100 }, { id: 2, name: 'Node 2', x: 200, y: 200 }, { id: 3, name: 'Node 3', x: 300, y: 100 } ]; var edges = [ { source: 1, target: 2 }, { source: 2, target: 3 } ]; // 计算节点的位置 var layout = dagre.layout() .nodeSep(50) .rankSep(50) .run({ nodes: nodes, edges: edges }); // 绘制节点和边 var svg = d3.select('svg'); var g = svg.append('g'); var node = g.selectAll('.node') .data(nodes) .enter() .append('g') .attr('class', 'node') .attr('transform', function(d) { return 'translate(' + d.x + ',' + d.y + ')'; }); node.append('circle') .attr('r', 20) .style('fill', 'white') .style('stroke', 'black') .style('stroke-width', '2px'); node.append('text') .attr('dy', '.35em') .text(function(d) { return d.name; }); var edge = g.selectAll('.edge') .data(edges) .enter() .append('line') .attr('class', 'edge') .attr('x1', function(d) { return layout.nodes[d.source].x; }) .attr('y1', function(d) { return layout.nodes[d.source].y; }) .attr('x2', function(d) { return layout.nodes[d.target].x; }) .attr('y2', function(d) { return layout.nodes[d.target].y; }) .style('stroke', 'black') .style('stroke-width', '2px'); // 添加交互式功能 var zoom = d3.zoom() .on('zoom', function() { g.attr('transform', d3.event.transform); }); svg.call(zoom); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值