
IAMB Family of Causal Discovery Algorithms
Source:R/aaa-iamb-family.R, R/iamb-family.R
iamb-family.RdFunctions for causal discovery using variants of the Incremental Association algorithm:
iamb: Incremental Association (IAMB)inter_iamb: Interleaved Incremental Association (Inter-IAMB)iamb_fdr: Incremental Association with FDR (IAMB-FDR)fast_iamb: Fast Incremental Association (Fast-IAMB)
Details
Each function supports the same engines and parameters. For details on tests and parameters for each engine, see:
BnlearnSearch for bnlearn.
Recommendation
While it is possible to call the function returned directly with a data frame,
we recommend using disco(). This provides a consistent interface and handles knowledge
integration.
Value
A function that takes a single argument data (a data frame). When called,
this function returns a list containing:
knowledgeAKnowledgeobject with the background knowledge used in the causal discovery algorithm. Seeknowledge()for how to construct it.caugiAcaugi::caugiobject representing the learned causal graph. This graph is a PAG (Partial Ancestral Graph), but since PAGs are not yet natively supported in caugi, it is currently stored with classUNKNOWN.
References
I. Tsamardinos, C. F. Aliferis, and A. Statnikov. Algorithms for large scale Markov blanket discovery. In Proceedings of the Sixteenth International Florida Artificial Intelligence Research Society Conference, pages 376-381. AAAI Press, 2003.
Examples
data(tpc_example)
kn <- knowledge(
tpc_example,
starts_with("child") %-->% starts_with("youth")
)
##### iamb #####
# Recommended path using disco()
iamb_bnlearn <- iamb(engine = "bnlearn", test = "fisher_z", alpha = 0.05)
disco(tpc_example, iamb_bnlearn, knowledge = kn)
#>
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: PDAG
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x1 --- child_x2
#> 2 child_x1 --> youth_x3
#> 3 child_x1 --> youth_x4
#> 4 child_x2 --> oldage_x5
#> 5 child_x2 --> youth_x3
#> 6 child_x2 --> youth_x4
#> 7 oldage_x5 --> oldage_x6
#> 8 youth_x3 --> oldage_x5
#> 9 youth_x4 --> oldage_x6
#> ── Nodes ──
#>
#> name
#> <chr>
#> 1 child_x2
#> 2 child_x1
#> 3 youth_x4
#> 4 youth_x3
#> 5 oldage_x6
#> 6 oldage_x5
#> ── Knowledge object ────────────────────────────────────────────────────────────
#>
#> ── Variables ──
#>
#> var tier
#> <chr> <chr>
#> 1 child_x1 NA
#> 2 child_x2 NA
#> 3 oldage_x5 NA
#> 4 oldage_x6 NA
#> 5 youth_x3 NA
#> 6 youth_x4 NA
#> ── Edges ──
#>
#> ✔ child_x1 → youth_x3
#> ✔ child_x1 → youth_x4
#> ✔ child_x2 → youth_x3
#> ✔ child_x2 → youth_x4
# or using iamb_bnlearn directly
iamb_bnlearn <- iamb_bnlearn |> set_knowledge(kn)
iamb_bnlearn(tpc_example)
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: PDAG
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x1 --- child_x2
#> 2 child_x1 --> youth_x3
#> 3 child_x1 --> youth_x4
#> 4 child_x2 --> oldage_x5
#> 5 child_x2 --> youth_x3
#> 6 child_x2 --> youth_x4
#> 7 oldage_x5 --> oldage_x6
#> 8 youth_x3 --> oldage_x5
#> 9 youth_x4 --> oldage_x6
#> ── Nodes ──
#>
#> name
#> <chr>
#> 1 child_x2
#> 2 child_x1
#> 3 youth_x4
#> 4 youth_x3
#> 5 oldage_x6
#> 6 oldage_x5
#> ── Knowledge object ────────────────────────────────────────────────────────────
# With all algorithm arguments specified
iamb_bnlearn <- iamb(
engine = "bnlearn",
test = "fisher_z",
alpha = 0.05,
max.sx = 2,
debug = FALSE,
undirected = TRUE
)
disco(tpc_example, iamb_bnlearn)
#>
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: PDAG
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x1 --- child_x2
#> 2 child_x2 --- oldage_x5
#> 3 oldage_x5 --- oldage_x6
#> 4 oldage_x5 --- youth_x3
#> 5 oldage_x6 --- youth_x4
#> ── Nodes ──
#>
#> name
#> <chr>
#> 1 child_x2
#> 2 child_x1
#> 3 youth_x4
#> 4 youth_x3
#> 5 oldage_x6
#> 6 oldage_x5
#> ── Knowledge object ────────────────────────────────────────────────────────────
##### iamb_fdr #####
iamb_fdr_bnlearn <- iamb_fdr(
engine = "bnlearn",
test = "fisher_z",
alpha = 0.05
)
disco(tpc_example, iamb_fdr_bnlearn, knowledge = kn)
#>
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: PDAG
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x1 --- child_x2
#> 2 child_x1 --> youth_x3
#> 3 child_x1 --> youth_x4
#> 4 child_x2 --> oldage_x5
#> 5 child_x2 --> youth_x3
#> 6 child_x2 --> youth_x4
#> 7 oldage_x5 --> oldage_x6
#> 8 youth_x3 --> oldage_x5
#> 9 youth_x4 --> oldage_x6
#> ── Nodes ──
#>
#> name
#> <chr>
#> 1 child_x2
#> 2 child_x1
#> 3 youth_x4
#> 4 youth_x3
#> 5 oldage_x6
#> 6 oldage_x5
#> ── Knowledge object ────────────────────────────────────────────────────────────
#>
#> ── Variables ──
#>
#> var tier
#> <chr> <chr>
#> 1 child_x1 NA
#> 2 child_x2 NA
#> 3 oldage_x5 NA
#> 4 oldage_x6 NA
#> 5 youth_x3 NA
#> 6 youth_x4 NA
#> ── Edges ──
#>
#> ✔ child_x1 → youth_x3
#> ✔ child_x1 → youth_x4
#> ✔ child_x2 → youth_x3
#> ✔ child_x2 → youth_x4
##### fast_iamb #####
fast_iamb_bnlearn <- fast_iamb(
engine = "bnlearn",
test = "fisher_z",
alpha = 0.05
)
disco(tpc_example, fast_iamb_bnlearn, knowledge = kn)
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: PDAG
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x1 --- child_x2
#> 2 child_x1 --> youth_x3
#> 3 child_x1 --> youth_x4
#> 4 child_x2 --> oldage_x5
#> 5 child_x2 --> youth_x3
#> 6 child_x2 --> youth_x4
#> 7 oldage_x5 --> oldage_x6
#> 8 youth_x3 --> oldage_x5
#> 9 youth_x4 --> oldage_x6
#> ── Nodes ──
#>
#> name
#> <chr>
#> 1 child_x2
#> 2 child_x1
#> 3 youth_x4
#> 4 youth_x3
#> 5 oldage_x6
#> 6 oldage_x5
#> ── Knowledge object ────────────────────────────────────────────────────────────
#>
#> ── Variables ──
#>
#> var tier
#> <chr> <chr>
#> 1 child_x1 NA
#> 2 child_x2 NA
#> 3 oldage_x5 NA
#> 4 oldage_x6 NA
#> 5 youth_x3 NA
#> 6 youth_x4 NA
#> ── Edges ──
#>
#> ✔ child_x1 → youth_x3
#> ✔ child_x1 → youth_x4
#> ✔ child_x2 → youth_x3
#> ✔ child_x2 → youth_x4
#### inter_iamb #####
inter_iamb_bnlearn <- inter_iamb(
engine = "bnlearn",
test = "fisher_z",
alpha = 0.05
)
disco(tpc_example, inter_iamb_bnlearn, knowledge = kn)
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: PDAG
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x1 --- child_x2
#> 2 child_x1 --> youth_x3
#> 3 child_x1 --> youth_x4
#> 4 child_x2 --> oldage_x5
#> 5 child_x2 --> youth_x3
#> 6 child_x2 --> youth_x4
#> 7 oldage_x5 --> oldage_x6
#> 8 youth_x3 --> oldage_x5
#> 9 youth_x4 --> oldage_x6
#> ── Nodes ──
#>
#> name
#> <chr>
#> 1 child_x2
#> 2 child_x1
#> 3 youth_x4
#> 4 youth_x3
#> 5 oldage_x6
#> 6 oldage_x5
#> ── Knowledge object ────────────────────────────────────────────────────────────
#>
#> ── Variables ──
#>
#> var tier
#> <chr> <chr>
#> 1 child_x1 NA
#> 2 child_x2 NA
#> 3 oldage_x5 NA
#> 4 oldage_x6 NA
#> 5 youth_x3 NA
#> 6 youth_x4 NA
#> ── Edges ──
#>
#> ✔ child_x1 → youth_x3
#> ✔ child_x1 → youth_x4
#> ✔ child_x2 → youth_x3
#> ✔ child_x2 → youth_x4