Variable Selection with Knockoffs

Documentation Build Status Code Coverage
build Actions Status CI (Julia nightly) codecov

This is a Julia implementation of the knockoff filter, taking many inspirations from the MATLAB/R implementation of knockoff-filter, python implementation of knockpy, and also the C++/R code of knockoffgwas. The knockoff filter is a general framework for controlling the false discovery rate when performing variable selection. As the name suggests, the knockoff filter operates by manufacturing knockoff variables that are cheap — their construction does not require collecting any new data — and are designed to mimic the correlation structure found within the original variables. The knockoffs serve as negative controls and they allow one to identify the truly important predictors, while controlling the false discovery rate (FDR) — the expected fraction of false discoveries among all discoveries.

For more information, please see the main webpage

Installation

Download and install Julia. Within Julia, copy and paste the following:

using Pkg
Pkg.add("Knockoffs")

This package supports Julia v1.8+.

Calling Knockoffs.jl from R and Python

See documentation for usage from R. If many users request of it, I will write a similar tutorial for calling Knockoffs.jl from your favorite language.

Package Features

  • Fast coordinate descent algorithms for MVR, ME, and SDP model-X knockoffs
  • Grouped MVR/ME/SDP knockoffs for improved power when there are highly correlated features. We also provide a representative group knockoff approach, based on graphical models, which is much more computationally efficient and empirically has superior power.
  • Preliminary support for many other kinds of knockoffs (ghost, HMM, IPAD...etc), see documentation.
  • Built-in functions to compute feature importance scores via Lasso/marginal regressions

Bug reports and feature requests

Please open an issue if you find a bug or have feature requests. Feature requests are welcomed!

If you want to make contributions to this package, you should follow this workflow:

  1. Fork this repository
  2. Make a new branch on your fork, named after whatever changes you'll be making
  3. Apply your code changes to the branch on your fork
  4. When you're done, submit a PR to Knockoffs.jl to merge your fork into master branch.