Run the Greedy Relaxations of the Sparsest Permutation algorithm for causal discovery using one of several engines.
Arguments
- engine
Character; which engine to use. Must be one of:
"tetrad"Tetrad Java library.
- score
Character; name of the scoring function to use.
- test
Character; name of the conditional‐independence test.
- alpha
Numeric; significance level for the CI tests.
- ...
Additional arguments passed to the chosen engine (e.g. score and algorithm parameters).
Details
For specific details on the supported scores, and parameters for each engine, see:
TetradSearch for Tetrad.
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 (of classPDAG) representing the learned causal graph from the causal discovery algorithm.
References
Lam, W.-Y., Andrews, B., & Ramsey, J. (2022). Greedy Relaxations of the Sparsest Permutation Algorithm. In The 38th Conference on Uncertainty in Artificial Intelligence.
See also
Other causal discovery algorithms:
boss(),
boss_fci(),
fci(),
ges(),
gfci(),
grasp_fci(),
gs(),
iamb-family,
pc(),
rfci(),
sp_fci(),
tfci(),
tges(),
tpc()
Examples
data(tpc_example)
# Requires Tetrad to be installed
if (verify_tetrad()$installed && verify_tetrad()$java_ok) {
# Recommended path using disco()
grasp_tetrad <- grasp(
engine = "tetrad",
test = "fisher_z",
score = "sem_bic",
alpha = 0.05
)
disco(tpc_example, grasp_tetrad)
# or using grasp_tetrad directly
grasp_tetrad(tpc_example)
}
#> <Disco UNKNOWN: 6 nodes | 6 edges>
#> nodes: child_x2, child_x1, youth_x4, youth_x3, oldage_x6, oldage_x5
#> edges: child_x2---child_x1, child_x2-->oldage_x5, child_x2---youth_x4
#> oldage_x5-->oldage_x6, youth_x3-->oldage_x5, youth_x4-->oldage_x6
#### With tier knowledge ####
if (verify_tetrad()$installed && verify_tetrad()$java_ok) {
kn <- knowledge(
tpc_example,
tier(
child ~ tidyselect::starts_with("child"),
youth ~ tidyselect::starts_with("youth"),
oldage ~ tidyselect::starts_with("oldage")
)
)
# Recommended path using disco()
grasp_tetrad <- grasp(
engine = "tetrad",
test = "fisher_z",
score = "sem_bic",
alpha = 0.05
)
disco(tpc_example, grasp_tetrad, knowledge = kn)
# or using grasp_tetrad directly
grasp_tetrad <- grasp_tetrad |> set_knowledge(kn)
grasp_tetrad(tpc_example)
}
#> <Disco UNKNOWN: 6 nodes | 6 edges>
#> nodes: child_x2, child_x1, youth_x4, youth_x3, oldage_x6, oldage_x5
#> edges: child_x2---child_x1, child_x2-->oldage_x5, child_x2-->youth_x4
#> oldage_x5-->oldage_x6, youth_x3-->oldage_x5, youth_x4-->oldage_x6
# With all algorithm arguments specified
if (verify_tetrad()$installed && verify_tetrad()$java_ok) {
grasp_tetrad <- grasp_fci(
engine = "tetrad",
test = "poisson_prior",
score = "rank_bic",
alpha = 0.05,
depth = 3,
stable_fas = FALSE,
max_disc_path_length = 5,
covered_depth = 3,
singular_depth = 2,
nonsingular_depth = 2,
ordered_alg = TRUE,
raskutti_uhler = TRUE,
use_data_order = FALSE,
num_starts = 3
)
disco(tpc_example, grasp_tetrad)
}
#> <Disco PAG: 6 nodes | 6 edges>
#> nodes: child_x2, child_x1, youth_x4, youth_x3, oldage_x6, oldage_x5
#> edges: child_x2o-ochild_x1, child_x2o->oldage_x5, child_x2o-oyouth_x4
#> oldage_x5-->oldage_x6, youth_x3o->oldage_x5, youth_x4-->oldage_x6
