You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:50:22