Introduction, downloads

S: 2 Apr 2022 (b6.26)

D: 2 Apr 2022

Recent version history

What's new?

Future development


Note to testers

[Jump to search box]

General usage

Getting started

Citation instructions

Standard data input

PLINK 1 binary (.bed)

Autoconversion behavior

PLINK text (.ped, .tped...)

VCF (.vcf[.gz], .bcf)

Oxford (.gen[.gz], .bgen)

23andMe text

Generate random

Unusual chromosome IDs

Recombination map

Allele frequencies



Clusters of samples

Variant sets

Binary distance matrix

IBD report (.genome)

Input filtering

Sample ID file

Variant ID file

Positional ranges file

Cluster membership

Set membership



SNPs only

Simple variant window

Multiple variant ranges

Sample/variant thinning

Covariates (--filter)

Missing genotypes

Missing phenotypes

Minor allele frequencies


Mendel errors

Quality scores


Main functions

Data management

















Merge failures

VCF reference merge




Basic statistics









Linkage disequilibrium





Distance matrices






Distance-pheno. analysis





Population stratification





Association analysis

Basic case/control

  (--assoc, --model)

Stratified case/control

  (--mh, --mh2, --homog)

Quantitative trait

  (--assoc, --gxe)

Regression w/ covariates

  (--linear, --logistic)




Monte Carlo permutation

Set-based tests

REML additive heritability

Family-based association





Report postprocessing









Allelic scoring (--score)

R plugins (--R)

Secondary input

GCTA matrix (.grm.bin...)

Distributed computation

Command-line help


Tabs vs. spaces

Flag/parameter reuse

System resource usage

Pseudorandom numbers


1000 Genomes phase 1

Teaching materials

Gene range lists

Functional SNP attributes

Errors and warnings

Output file list

Order of operations

For developers

GitHub repository


Core algorithms

Partial sum lookup

Bit population count

Ternary dot product

Vertical population count

Exact statistical tests

Multithreaded gzip

Adding new functionality

Google groups




File formats

Quick index search

Copy number analysis

Rare copy number variants

The following commands operate on .cnv + .fam filesets. (Most development has been postponed until PLINK 2.0's merge command is available for testing; many functions are incomplete.)



--cnv-kb <minimum size in kb>
--cnv-max-kb <maximum size in kb>

--cnv-score <minimum score>
--cnv-max-score <maximum score>
--cnv-sites <minimum sites>
--cnv-max-sites <maximum sites>

  • --cnv-del filters out all CNVs with more than one copy, while --cnv-dup filters out all CNVs with fewer than three copies.
  • --cnv-kb excludes all segments shorter than the given length; --cnv-max-kb filters out long segments. (To remove a minor internal inconsistency concerning how segment length is defined, PLINK 1.9 "--cnv-kb x.001" is equivalent to PLINK 1.07 "--cnv-kb x".)
  • --cnv-score excludes all CNVs with confidence score below the given threshold; --cnv-max-score filters out high scores.
  • --cnv-sites excludes all segments with fewer than the given number of probes, while --cnv-max-sites filters out high probe counts.

--cnv-intersect <region file>
--cnv-exclude <region file>
--cnv-subset <region name file>

--cnv-intersect causes only segments which overlap at least one of the regions in the given file to be included in the analysis, while --cnv-exclude excludes all segments which overlap a region.

Each line of the region file is expected to have the following 3-4 fields in front:

  1. Chromosome code
  2. Start of range (base-pair units)
  3. End of range
  4. Region identifier (only needed with --cnv-subset)

Given a file with one region name per line, --cnv-subset causes only regions named in that file to be loaded with --cnv-intersect/-exclude.

--cnv-overlap <x>

--cnv-region-overlap <x>
--cnv-union-overlap <x>

These flags modify the behavior of --cnv-{intersect,exclude}.

Given a segment of length n, --cnv-overlap redefines 'intersection' to require a minimum of xn base pairs. --cnv-region-overlap instead requires a minimum of xr base pairs, where r is the region's length, while --cnv-union-overlap has the most stringent requirement: x ≥ <intersection length> / <union length>.

--cnv-disrupt causes only segments with an endpoint in a region to be included/excluded.

--cnv-freq-exclude-above <k>
--cnv-freq-exclude-below <k>
--cnv-freq-exclude-exact <k>
--cnv-freq-include-exact <k>

--cnv-freq-overlap [x]

--cnv-freq-method2 [x]

--cnv-freq-exclude-above excludes all segments where any portion is included in more than k total segments. Similarly, --cnv-freq-exclude-below excludes segments where no portion is included in k or more total segments; --cnv-freq-exclude-exact excludes segments for which there is a portion which is included in at least k total segments but no portion is included in more; and --cnv-freq-include-exact is the reverse of --cnv-freq-exclude-exact.

These can be combined with --cnv-freq-overlap, which forces each 'portion' to be at least xn base pairs, where n is the segment length. Alternatively, --cnv-freq-method2 causes k to instead be compared against the number of segments (not excluding the original segment) where x ≥ <intersection length> / <union length>. For both --cnv-freq-overlap and --cnv-freq-method2, if x is zero or not given, it's treated as an infinitesimal positive value.

Refer to the PLINK 1.07 documentation for more discussion of these segment filtering flags.

--cnv-make-map ['short']


--cnv-make-map generates the file needed by all other PLINK CNV analysis commands to proceed. It now automatically runs when needed, so it is unnecessary to explicitly invoke this (though you may still want to for performance reasons).

When automatically triggered, the new file is generated before any segmental filters are applied, to avoid nasty surprises when different filters are being applied to different analysis steps. It is put in the same directory and assigned the same prefix as the .cnv file, except when that might destroy existing data.

In contrast, when --cnv-make-map is explicitly invoked, segmental filters are applied first, and the filename is determined by the global output prefix instead of the input .cnv filename.

If there is a segment starting at bp x and ending at bp y, the resulting will have entries at positions x and (y+1). If the file was created via an explicit --cnv-make-map invocation without the 'short' modifier, it will also have an entry at position y (this is needed by PLINK 1.07, but not PLINK 1.9).

For compatibility with files generated by third-party scripts according to the PLINK 1.07 documentation, if there is a entry at position y but not (y+1), .cnv segments (of length > 1) ending at position y are normally still loaded, and treated as if they had ended at position (y-1) instead. Since this can lead to slightly inaccurate results, a warning will be printed when this happens. To exclude such segments, use the --cnv-exclude-off-by-1 flag.

--cnv-write ['freq']

This command causes a new .cnv fileset to be generated, with all requested filters applied. With the --cnv-freq-method2 flag and the 'freq' modifier, an extra 'FREQ' field is written to the .cnv with each overlap parameter.



This checks for within-sample CNV overlaps (which shouldn't happen). If any are present, they are reported in plink.cnv.overlap.

--cnv-indiv-perm <permutation count>


--cnv-test [{1sided | 2sided}] <permutation count>
--cnv-test-region <permutation count>

--cnv-test-window <window size, in kb>


--cnv-enrichment-test [permutation count]

--cnv-count <region file>


Common copy number polymorphisms

These commands operate on .gvar + .fam + .map filesets.

(No commands yet.)

Distributed computation >>