{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/recursive-causal-discovery","title":"Recursive Causal Discovery","arxiv_id":"2403.09300","date":"2024-03-14","proceeding":null,"authors":["Ehsan Mokhtarian","Sepehr Elahi","Sina Akbari","Negar Kiyavash"],"abstract":"Causal discovery, i.e., learning the causal graph from data, is often the first step toward the identification and estimation of causal effects, a key requirement in numerous scientific domains. Causal discovery is hampered by two main challenges: limited data results in errors in statistical testing and the computational complexity of the learning task is daunting. This paper builds upon and extends four of our prior publications (Mokhtarian et al., 2021; Akbari et al., 2021; Mokhtarian et al., 2022, 2023a). These works introduced the concept of removable variables, which are the only variables that can be removed recursively for the purpose of causal discovery. Presence and identification of removable variables allow recursive approaches for causal discovery, a promising solution that helps to address the aforementioned challenges by reducing the problem size successively. This reduction not only minimizes conditioning sets in each conditional independence (CI) test, leading to fewer errors but also significantly decreases the number of required CI tests. The worst-case performances of these methods nearly match the lower bound. In this paper, we present a unified framework for the proposed algorithms, refined with additional details and enhancements for a coherent presentation. A comprehensive literature review is also included, comparing the computational complexity of our methods with existing approaches, showcasing their state-of-the-art efficiency. Another contribution of this paper is the release of RCD, a Python package that efficiently implements these algorithms. This package is designed for practitioners and researchers interested in applying these methods in practical scenarios. The package is available at github.com/ban-epfl/rcd, with comprehensive documentation provided at rcdpackage.com.","url_abs":"https://arxiv.org/abs/2403.09300v1","url_pdf":"https://arxiv.org/pdf/2403.09300v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"recursive-causal-discovery","repo_url":"https://github.com/ban-epfl/rcd","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"none","reach":{"status":"ok"}}],"tasks":[{"task_slug":"causal-discovery","task_name":"Causal Discovery"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2403.09300","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2403.09300"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/ban-epfl/rcd","reach":{"status":"ok"}}],"summary":{"ran":7},"by_repo_kind":{"official":{"samples":7,"ran":7,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":7,"samples":[{"code_sha256_prefix":"a99fbcac400273c9","entry":"f1_score_edges","repo":"ban-epfl/rcd","repo_kind":"official","path":"rcd/utilities/utils.py","file_url":"https://github.com/ban-epfl/rcd/blob/HEAD/rcd/utilities/utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"a99fbcac400273c9"}},{"code_sha256_prefix":"5451607d7c685f07","entry":"gen_er_dag_adj_mat","repo":"ban-epfl/rcd","repo_kind":"official","path":"rcd/utilities/data_graph_generation.py","file_url":"https://github.com/ban-epfl/rcd/blob/HEAD/rcd/utilities/data_graph_generation.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"5451607d7c685f07"}},{"code_sha256_prefix":"47a0eeefd116cc75","entry":"gen_gaussian_data","repo":"ban-epfl/rcd","repo_kind":"official","path":"rcd/utilities/data_graph_generation.py","file_url":"https://github.com/ban-epfl/rcd/blob/HEAD/rcd/utilities/data_graph_generation.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"47a0eeefd116cc75"}},{"code_sha256_prefix":"b56db319ad54ebef","entry":"get_clique_number","repo":"ban-epfl/rcd","repo_kind":"official","path":"rcd/utilities/utils.py","file_url":"https://github.com/ban-epfl/rcd/blob/HEAD/rcd/utilities/utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"b56db319ad54ebef"}},{"code_sha256_prefix":"e75a1c5a9bbe9dbb","entry":"get_perfect_ci_test","repo":"ban-epfl/rcd","repo_kind":"official","path":"rcd/utilities/ci_tests.py","file_url":"https://github.com/ban-epfl/rcd/blob/HEAD/rcd/utilities/ci_tests.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"e75a1c5a9bbe9dbb"}},{"code_sha256_prefix":"07539643c276cc00","entry":"is_d_separated","repo":"ban-epfl/rcd","repo_kind":"official","path":"rcd/utilities/ci_tests.py","file_url":"https://github.com/ban-epfl/rcd/blob/HEAD/rcd/utilities/ci_tests.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"07539643c276cc00"}},{"code_sha256_prefix":"b5fcb6a2396621aa","entry":"sanitize_data","repo":"ban-epfl/rcd","repo_kind":"official","path":"rcd/utilities/utils.py","file_url":"https://github.com/ban-epfl/rcd/blob/HEAD/rcd/utilities/utils.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"b5fcb6a2396621aa"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}