如何在R的dagitty包中排除潜变量U生成有效调整集?
问题:在dagitty中不修改DAG结构,排除潜变量U获取有效调整集
我正在使用R语言的dagitty包,构建了包含潜变量U的DAG:
library(dagitty) dag <- dagitty(" dag { U [latent] U -> Z1 Z1 -> Z2 Z2 -> Y U -> X X -> Y }")
调用adjustmentSets(x = dag, exposure = "X", outcome = "Y" , type = "all")函数后,得到的调整集结果包含U:
{U}
{Z1}
{U, Z1}
{Z2}
{U, Z2}
{Z1, Z2}
{U, Z1, Z2 }
我期望结果中不包含U,手动修改DAG结构(将U的共同影响替换为Z1和X的双向边)虽能得到预期结果:
dag <- dagitty(" dag { Z1 -> Z2 Z2 -> Y Z1 <-> X X -> Y }")
对应的调整集为:
{Z1 }
{Z2 }
{Z1, Z2 }
但由于我的图规模很大,不想手动修改DAG结构,请问如何在不修改DAG的前提下让结果不包含U?
解决方案
有两种简单方法可以在不修改原DAG的前提下,得到不包含U的有效调整集:
方法1:调用adjustmentSets时直接限制可选变量
利用函数的restrict参数,指定只能从非U的变量中选择调整集。先获取所有可观测变量(排除U),再传入参数:
# 获取所有非U的变量 allowed_vars <- setdiff(names(dag), "U") # 调用adjustmentSets时限制可选变量 adjustmentSets(x = dag, exposure = "X", outcome = "Y", type = "all", restrict = allowed_vars)
这样返回的结果只会包含由allowed_vars中的变量组成的调整集,自动排除包含U的情况。
方法2:过滤已获取的所有调整集
如果已经拿到了包含U的所有调整集,可以通过过滤操作去掉包含U的集合:
# 获取所有调整集 all_sets <- adjustmentSets(x = dag, exposure = "X", outcome = "Y", type = "all") # 过滤掉包含U的集合 filtered_sets <- all_sets[!sapply(all_sets, function(s) "U" %in% s)] # 输出结果 filtered_sets
执行后filtered_sets就是只包含{Z1}、{Z2}、{Z1, Z2}的调整集列表,和手动修改DAG后的结果一致。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

