Run the Greedy Relaxations of the Sparsest Permutation Fast Causal Inference 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 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
Ramsej, J., Andrews, B., Sprites, P. (2025). Efficient Latent Variable Causal Discovery: Combining Score Search and Targeted Testing. doi:10.48550/arXiv.2510.04263.
Examples
data(tpc_example)
# Requires Tetrad to be installed
if (verify_tetrad()$installed && verify_tetrad()$java_ok) {
# Recommended path using disco()
grasp_fci_tetrad <- grasp_fci(
engine = "tetrad",
test = "fisher_z",
score = "sem_bic",
alpha = 0.05
)
disco(tpc_example, grasp_fci_tetrad)
# or using grasp_fci_tetrad directly
grasp_fci_tetrad(tpc_example)
}
#>
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: UNKNOWN
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x2 o-o child_x1
#> 2 child_x2 o-> oldage_x5
#> 3 child_x2 o-o youth_x4
#> 4 oldage_x5 --> oldage_x6
#> 5 youth_x3 o-> oldage_x5
#> 6 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 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_fci_tetrad <- grasp_fci(
engine = "tetrad",
test = "fisher_z",
score = "sem_bic",
alpha = 0.05
)
disco(tpc_example, grasp_fci_tetrad, knowledge = kn)
# or using grasp_fci_tetrad directly
grasp_fci_tetrad <- grasp_fci_tetrad |> set_knowledge(kn)
grasp_fci_tetrad(tpc_example)
}
#>
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: UNKNOWN
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x2 o-o child_x1
#> 2 child_x2 o-> oldage_x5
#> 3 child_x2 o-o youth_x4
#> 4 oldage_x5 --> oldage_x6
#> 5 youth_x3 o-> oldage_x5
#> 6 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
if (verify_tetrad()$installed && verify_tetrad()$java_ok) {
grasp_fci_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,
guarantee_pag = TRUE
)
disco(tpc_example, grasp_fci_tetrad)
}
#>
#> ── caugi graph ─────────────────────────────────────────────────────────────────
#> Graph class: UNKNOWN
#>
#> ── Edges ──
#>
#> from edge to
#> <chr> <chr> <chr>
#> 1 child_x2 o-o child_x1
#> 2 child_x2 o-> oldage_x5
#> 3 child_x2 o-o youth_x4
#> 4 oldage_x5 --> oldage_x6
#> 5 youth_x3 o-> oldage_x5
#> 6 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 ────────────────────────────────────────────────────────────
