PLINK: Whole genome data analysis toolset plink...
Last original PLINK release is v1.07 (10-Oct-2009); PLINK 1.9 is now available for beta-testing

Whole genome association analysis toolset

Introduction | Basics | Download | Reference | Formats | Data management | Summary stats | Filters | Stratification | IBS/IBD | Association | Family-based | Permutation | LD calcualtions | Haplotypes | Conditional tests | Proxy association | Imputation | Dosage data | Meta-analysis | Result annotation | Clumping | Gene Report | Epistasis | Rare CNVs | Common CNPs | R-plugins | SNP annotation | Simulation | Profiles | ID helper | Resources | Flow chart | Misc. | FAQ | gPLINK

1. Introduction

2. Basic information

3. Download and general notes

4. Command reference table

5. Basic usage/data formats 6. Data management

7. Summary stats 8. Inclusion thresholds 9. Population stratification 10. IBS/IBD estimation 11. Association 12. Family-based association 13. Permutation procedures 14. LD calculations 15. Multimarker tests 16. Conditional haplotype tests 17. Proxy association 18. Imputation (beta) 19. Dosage data 20. Meta-analysis 21. Annotation 22. LD-based results clumping 23. Gene-based report 24. Epistasis 25. Rare CNVs 26. Common CNPs 27. R-plugins 28. Annotation web-lookup 29. Simulation tools 30. Profile scoring 31. ID helper 32. Resources 33. Flow-chart 34. Miscellaneous 35. FAQ & Hints

36. gPLINK

LD-based result clumping procedure

This page describes PLINK's ability to group SNP-based results across one or more datasets or analyses, based on empirical estimates of linkage disequilibrium between SNPs. The basic procedure was inspired by a script written by Ben Voight.

There are probably two main applications for this method:
  • To report the top X single SNP results from a genome-wide scan in terms of a smaller number of clumps of correlated SNPs (i.e. to assess how many independent loci are associated, for example)
  • To provide a quick way to combine sets of results from two or more studies, when the studies might also be genotyped on different marker sets

Basic usage for LD-based clumping

The --clump command is used to specify one or more result files (i.e. precomputed analyses of some kind). By default, PLINK scans these files and extracts fields with the headers SNP and P. For example:

plink --file mydata --clump mytest1.assoc

which generates a file
The actual genotype dataset specified here (i.e. the mydata.* fileset) may or may not be the same dataset that was used to generate the results in mytest1.assoc. The mydata fileset is only used to calculate linkage disequilibrium between the SNPs that feature in mytest1.assoc (i.e. the analyses are not re-run).

There are four main parameters that determine the level of clumping, listed here in terms of the command flag used to change them and their default values:
     --clump-p1 0.0001            Significance threshold for index SNPs
     --clump-p2 0.01              Secondary significance threshold for clumped SNPs
     --clump-r2 0.50              LD threshold for clumping

     --clump-kb 250               Physical distance threshold for clumping
The clumping procedure takes all SNPs that are significant at threshold p1 that have not already been clumped (denoting these as index SNPs) and forms clumps of all other SNPs that are within a certain kb distance from the index SNP (default 250kb) and that are in linkage disequilibrium with the index SNP, based on an r-squared threshold (default 0.50). These SNPs are then subsetted based on the result for that SNP, as illustrated below. This is a greedy algorithm and so each SNP will only appear in a single clump, if at all.

In the default, non-verbose mode, the default output lists all index SNPs and a summary of the other SNPs that are clumped with this SNP: (note, SNP IDs and positions are made-up in the example below):

    CHR  F         SNP         BP         P  TOTAL   NSIG    S05    S01   S001  S0001    SP2
      8  1   rs1234564   15716326  5.01e-07      0      0      0      0      0      0   NONE
     14  1   rs1205236   69831825  1.46e-06      0      0      0      0      0      0   NONE
      2  1  rs16331058  114547107  2.33e-06      3      0      0      0      0      3   rs2366902(1),...
      2  1    rs759966   54902416  9.28e-06      4      0      0      0      3      1   rs12538389(1),...
     11  1   rs8031586   44633498  9.75e-06      1      0      0      0      0      1   rs802328(1)
     12  1  rs12431413   30028246  9.89e-06      0      0      0      0      0      0   NONE
      6  1  rs14966070   62091121  1.07e-05      0      0      0      0      0      0   NONE
where the fields are as follows

     CHR     Chromosome code
     F       Results fileset code (1,2,...)
     SNP     SNP identifier
     BP      Physical position of SNP (base-pairs)
     TOTAL   Total number of other SNPs in clump (i.e. passing --clump-kb and --clump-r2 thresholds)
     NSIG    Number of clumped SNPs that are not significant ( p > 0.05 )
     S05     Number of clumped SNPs 0.01 < p < 0.05
     S01     Number of clumped SNPs 0.001 < p < 0.01
     S001    Number of clumped SNPs 0.0001 < p < 0.001 
     S0001   Number of clumped SNPs p < 0.0001
     SP2     List of SNPs names (and fileset code) clumped and significant at --clump-p2
That is, the TOTAL field lists all SNPs that are clumped with the index SNP, irrespective of the p-value for those SNPs. This number is then split into those clumped SNPs that are not significant (p>0.05) and various other groups defined by significance thresholds. For SNPs that are significant at the p2 threshold, they are listed explicitly. The (1) after each SNP name refers to the results file they came from (in this case, there is only a single result file specified, so all values are 1).

To specify more than a single result file, use a comma-delimited list after --clump (without any spaces between file names), for example:
plink --bfile mydata --clump mytest1.assoc,mytest2.assoc

To specify a field labelled other than P, use the command
plink --bfile mydata --clump mytest1.assoc --clump-field P_CMH

for example.

NOTE The same fields are extracted from all results files (e.g. SNP and P) -- i.e. it is not possible to specify different fields from different files.

NOTE All results are interpreted as p-values -- i.e. it is not possible to specify a Z-statistic, as significance is always defined as less than the threshold. Finally, by default a SNP is not allowed to appear in more than one clump, either as an index or non-index SNP. If you add the command, then a SNP that has appeared as a non-index SNP in one clump can appear as a non-index SNP in other clumps:

Verbose report

For a more detailed report of the SNPs in each clump, add the flag --clump-verbose
plink --bfile mydata --clump mytest1.assoc --clump-verbose

which produces a report as follows:

 CHR    F             SNP         BP          P    TOTAL   NSIG    S05    S01   S001  S0001
   8    1       rs1234564   15716326  5.019e-07        0      0      0      0      0      0


 CHR    F             SNP         BP          P    TOTAL   NSIG    S05    S01   S001  S0001
  14    1       rs1205236   69831825  1.469e-06        0      0      0      0      0      0


 CHR    F             SNP         BP          P    TOTAL   NSIG    S05    S01   S001  S0001  
   2    1      rs16331058  114547107  2.337e-06        3      0      0      0      0      3

                                  KB      RSQ  ALLELES    F            P 
  (INDEX)      rs16331058        0.0    1.000        A    1     2.34e-06 

                rs2366902      -75.4    0.611    AT/GC    1     4.42e-05 
                rs1274528      -47.4    0.555    AC/GT    1     1.28e-05
                rs3200591      -22.3    0.964    AT/GC    1     2.68e-05


For example, for the third SNP, rs16331058 we see there are 3 other SNPs that fulfil the specified criteria (kb distance less than 250kb, r-squared greater then 0.5 and p-value of less than p2 threshold of 0.01), and they are listed explicitly in verbose mode. As well as the kb and r-squared for each SNP (relative to rs16331058) we see listed the fileset which the result comes from (F -- in this case, all are listed 1, as there was only one result file specified) and p-value. Also, the alleles column indicates for the index SNP what the minor allele is (A); for the other SNPs, the two haplotypes that are more common than expected are listed (e.g. for SNPs A/B and 1/2, then if P(A1) > P(A)P(1) it will list A1/B2, otherwise A2/B1.

Annotation by SNP details and genomic co-ordinates
Another useful verbose-mode option is --clump-anotate which takes as a parameter a comma-delimited list of header names, e.g.
     --clump-annotate A1,OR
and will then list these items in the verbose report mode (e.g. minor allele and odds ratio, in this case, if the results file were a plink.assoc file). The output would then appear as, for example,

 CHR    F             SNP         BP          P    TOTAL   NSIG    S05    S01   S001  S0001  
   2    1      rs16331058  114547107  2.337e-06        3      0      0      0      0      3

                                  KB      RSQ  ALLELES    F            P       ANNOT
  (INDEX)      rs16331058        0.0    1.000        A    1     2.34e-06     A, 1.23

                rs2366902      -75.4    0.611    AT/GC    1     4.42e-05     T, 1.17
                rs1274528      -47.4    0.555    AC/GT    1     1.28e-05     C, 1.22
                rs3200591      -22.3    0.964    AT/GC    1     2.68e-05     T, 1.19
i.e. here we can see that for rs2366902 the minor allele T had an odds ratio of 1.17; this is consistent with the index SNP, as the haplotype AT is more common than expected (i.e. indicating the direction of the LD).

NOTE The allele coding in the ALLELES field is taken directly from the specified genotype data, i.e. mydata.* in this case, whereas the allele coding in the ANNOT field is taken (if available and --clump-annotate selects an allele field) from the results file. It is up to the user to ensure that these match to be interpretable (i.e. in terms of number versus letter coding, but more importantly in terms of strand, etc, which might be an issue if the genotype data is a file different from that which the results were calculated on, e.g. see below for an example).

A further option is --clump-range, which takes a gene-list or region-list file as a parameter. For example, this might be a list of all RefSeq genes, as available here. The command
plink --bfile mydata --clump myresults.assoc --clump-range glist-hg18

would, for example, generate the additional file
which has the fields
     CHR      Chromosome code
     SNP      Index SNP per clump
     P        p-value 
     N        Number of clumped SNPs
     POS      Genomic co-ordinates
     KB       kb span of clumped SNPs 
     RANGES   List of ranges/genes that intersect the clumped region
For example, the first four rows of a simulated, random study are:
      CHR         SNP          P      N                          POS         KB RANGES
       17   rs9944528  1.927e-05      2     chr17:77894039..77933018     38.979 [UTS2R,SKIP,FLJ35767]
        9  rs17534370  1.958e-05      1      chr9:70297172..70297172          0 [PGM5]
       11  rs12418173  1.965e-05      7   chr11:112102294..112133479     31.185 []
which indicates that rs9944528 has one other SNP that clumps with it (N=2), which is just under 40kb away, spanning three genes; the next SNP doesn't have any clumped partners and falls in the PGM5 gene; the third SNP has 6 other clumped SNPs, spanning just over 30kb, but no genes are in that interval.

If the --clump-range flag is added in --clump-verbose mode, the output looks slightly different. In this case, the special plink.clumped.ranges file is not produced: now all the output is in the plink.clumped file:

      CHR    F         SNP         BP          P    TOTAL   NSIG    S05    S01   S001  S0001
       17    1   rs9944528   77894039   1.93e-05        1      0      0      0      0      1 

                                   KB      RSQ  ALLELES    F            P 
       (INDEX)   rs9944528          0    1.000        C    1     1.93e-05 
                 rs7207095         39    0.648    CG/GA    1     2.83e-05 

               RANGE: chr17:77894039..77933018
                SPAN: 38kb
          GENES w/SNPs: SKIP
                 GENES: UTS2R,SKIP,FLJ35767


      CHR    F         SNP         BP          P    TOTAL   NSIG    S05    S01   S001  S0001
        9    1  rs17534370   70297172   1.96e-05        0      0      0      0      0      0 
                 GENES: PGM5
      CHR    F         SNP         BP          P    TOTAL   NSIG    S05    S01   S001  S0001
       11    1  rs12418173  112133479   1.96e-05        6      0      0      0      2      4 
                                   KB      RSQ  ALLELES    F            P 
       (INDEX)  rs12418173          0    1.000        G    1     1.96e-05 
                rs12800322      -31.2    0.902    GG/AC    1     0.000133 
                 rs1870496      -30.7    0.853    GC/AT    1     0.000267 
                 rs2199197      -20.1        1    GG/AA    1     9.76e-05 
                 rs7931135      -16.7        1    GG/AA    1     1.96e-05 
                rs12418739      -10.8        1    GA/AC    1      3.5e-05 
                  rs898311      -4.98        1    GT/AC    1     1.96e-05 
               RANGE: chr11:112102294..112133479
                SPAN: 31kb
          GENES w/SNPs: 
Note, if there is more than 1 SNP in a clump, we distinguish here between whether or not one of the clumped SNPs is actually within the a specified region or gene (GENES w/SNPs) versus whether that gene or region is just within the general clumped range (GENES).

Naturally, any file can be used with --clump-range -- the regions do not have to correspond to actual genes, but they could be regions of interest identified by other means.

Finally, the command
     --clump-range-border 20
adds a 20kb border to the start and stop of each gene or region.

Combining multiple result files (potentially from different SNP panels)

When more than one output file is specified, e.g. as
plink --bfile mydata --clump mytest1.assoc,mytest2.assoc,mytest3.assoc

there are two other options that can modify the behaviour of --clump. First,
indicates that index SNPs should only taken from the first result file listed (mytest1.assoc in the example above). In other words, this allows for an asymmetric comparison, in which we ask only whether or not a result in a particular file has any other SNPs (in that same, or in different files) that could be clumped.

Second, the additional option
means that only clumps containing clumped SNPs with p2-significant results in more than one result file are shown. This could be used in the following context: imagine one had data for two different whole-genome scans, for the same phenotype but performed on different platforms, e.g. Affymetrix and Illumina. A quick way to compare these sets of results would be to use the HapMap as a common dataset (i.e. containing all SNPs on both platforms, or the majority of these in any case) as follows:
plink --bfile hapmap --clump affymetrix.assoc,illumina.assoc --clump-verbose --clump-replicate

This assumes that you have made the fileset hapmap.* to contain all SNPs for one of the analysis panels, e.g. CEU. In this context, we are only interested in hits (e.g. p-values less than 1e-3) that are seen across the studies, by using the --clump-replicate flag (i.e. only clumps where F is seen to have values of both 1 and 2 for p2-significant SNPs). In this case, it also probably makes sense to equate the p1 and p2 thresholds, by adding, for example,
     --clump-p1 1e-3 --clump-p2 1e-3 
Finally, by also adding the
     --clump-annotate A1,OR
flag, you can see whether or not there appears to be a consistent direction of effect also (by putting together the direction of odds ratios with the over-represented haplotype to tie together the two or three SNPs).

Selecting the single best proxy

The command
produces an additional file
which contains the fields
     INDEX     Index SNP identifier
     PSNP      Best proxy SNP
     RSQ       LD (r-squared) between index and proxy
     KB        Physical distance between index and proxy
     P         p-value for proxy SNP
     ALLELES   The associated haplotypes for the index and proxy SNP
     F         Which file (from --clump) this result came from
For example, if we use the command
plink --bfile mydata --clump myresults-a.assoc,myresults-b.assoc --clump-best

based on dummy simulated data result files myresults-a.assoc and myresults-b.assoc, the first few lines of plink.clumped are as follows:

    CHR    F         SNP         BP         P  TOTAL  NSIG  S05  S01 S001 S0001  SP2
     11    1   rs2513514   75922141  2.27e-07      3     0    0    0    1     2  rs2508756(1),...
     20    1   rs6110115   13911728  8.24e-07      9     0    2    3    2     2  rs6079243(1),...
     11    1   rs2508756   75921549  1.07e-06      0     0    0    0    0     0  NONE
     15    1  rs16976702   54120691  1.15e-06      1     0    0    0    1     0  rs16976702(2)
The corresponding file shows the single best proxy SNP for each index SNP. This information could have been extracted manually after using the --clump-verbose, but the --clump-best option simply makes this easier.
         INDEX        PSNP    RSQ       KB        P  ALLELES        F
     rs2513514   rs2513514      1        0 8.04e-05    AA/GG        2 
     rs6110115   rs6110115      1        0  0.00145    CC/AA        2 
     rs2508756          NA     NA       NA       NA       NA       NA 
    rs16976702  rs16976702      1        0   0.0009    GG/CC        2 
For example, the best SNP, rs2513514 (which had the lowest p-value in this case for F 1, i.e. myresults-a.assoc) has a single best proxy of rs2513514, the same SNP, but in F 2, i.e. myresults-b.assoc. The third SNP here, rs2508756, does not have any proxy SNP that meets the criteria for clumping (--clump-r2, --clump-p2, etc).

Warning If the same SNP existed in both myresults-a.assoc and myresults-b.assoc then the P value and ALLELES would always, arbitrarily be selected from the first file. See the note below also.

One might often want to add the three options
along with --clump-best. This would pose the question: what is the best proxy in myresults-b.assoc (i.e. --clump-replicate forces a cross-file proxy) for the top results in myresults-a.assoc (e.g. --clump-index-first forces the first-listed file to contain index SNPs only). The --clump-allow-overlap will mean that a proxy SNP can be selected for more than one index SNP, if it is the best. These may sometimes be the same SNP, if it is present in both result sets, otherwise it will rely on all SNPs being present in the mydata fileset, and will use LD information to select the best proxy.

NOTE By best proxy, we mean the SNP with the strongest LD to the index, rather than the best p-value. Which SNP has the greatest LD will be based on the genotype data and will therefore be the same for all result files. As such, this command should be used in such a way that only one result file is being queried for the best proxy at a time. That is, used without --clump-replicate, only a single result file should be specified with --clump. If used with --clump-replicate then a) --clump-index-first should always be used and no more than two result files should be specified with --clump. That is, in this second usage, this command will try to find the best proxy in the second result file for each index SNP selected from the first file. Otherwise, if the same SNP is present in more than one result file, only details for the first encountered will be reported.

Overall, the most command usage of this will be to select the best SNP proxy in file B for the hits in A, i.e. in the form:
./plink --bfile mydata
        --clump myresults-a.assoc,myresults-b.assoc 
        --clump-p1 1e-4 
        --clump-p2 1
        --clump-kb 250 
        --clump-r2 0.2

That is: this will select the SNP from B that is in highest LD with each SNP in A that has a p-value less than 1e-4 in A. The same SNP in B is allowed to be the best proxy for more than one SNP in A (--clump-allow-overlap). The best proxy will be reported no matter what p-value it has in B (--clump-p2 1) although it must satisfy the criteria of being at least above r-sq of 0.2 and within 250kb.
This document last modified Thursday, 01-Oct-2009 08:00:57 EDT