diff -Nru adegenet-2.1.0/ChangeLog adegenet-2.1.1/ChangeLog --- adegenet-2.1.0/ChangeLog 2017-10-12 10:56:27.000000000 +0000 +++ adegenet-2.1.1/ChangeLog 2018-02-02 15:56:26.000000000 +0000 @@ -1,4 +1,32 @@ + CHANGES IN ADEGENET VERSION 2.1.1 +NEW FEATURES + - New documentation for `snapclust` and the associated functions. + + - New example for `snapclust.choose.k`. + + - New tutorial for `snapclust` available through + `adegenetTutorial`. + + - New dataset and example for `export_to_mvmapper`. + + - `snapclust` now implemented for haploid individuals. + + +BUG FIXES + - A warning will be issued if the user specifies a ploidy range + that is less than the observed allele dosage when data is imported + by df2genind. See: + https://github.com/thibautjombart/adegenet/issues/216 for details. + + - solved issue regarding group membership probabilities in large + datasets (many loci) with `snapclust`. See: + https://github.com/thibautjombart/adegenet/issues/221 + + - fixed an issue in the log-likelihood computation for + heterozygotes in `snapclust`. + + CHANGES IN ADEGENET VERSION 2.1.0 NEW FEATURES @@ -18,6 +46,9 @@ objects) with geo-referenced units to serve as input to mvmapper (https://popphylotools.github.io/mvMapper/) + - the new function `spca_randtest` implements a Monte Carlo test + for spatial structure in the sPCA framework. + BUG FIXES - fixed registration of C routines which could cause problems with SNPbin and genlight objects. @@ -29,7 +60,7 @@ methods for genind and genlight object (issue 193) - find.clusters with clust parameter will no longer throw an error - when attempting to find clusters of populations with less than + when attempting to find clusters of populations with fewer than n/10 individuals (issue 184) Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/dapcIllus.rda and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/dapcIllus.rda differ diff -Nru adegenet-2.1.0/data/datalist adegenet-2.1.1/data/datalist --- adegenet-2.1.0/data/datalist 2017-10-12 15:31:48.000000000 +0000 +++ adegenet-2.1.1/data/datalist 2018-02-02 16:20:48.000000000 +0000 @@ -7,3 +7,4 @@ rupica sim2pop spcaIllus +swallowtails Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/eHGDP.rda and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/eHGDP.rda differ Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/H3N2.rda and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/H3N2.rda differ Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/hybridtoy.RData and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/hybridtoy.RData differ Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/microbov.rda and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/microbov.rda differ Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/nancycats.rda and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/nancycats.rda differ Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/rupica.RData and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/rupica.RData differ Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/sim2pop.rda and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/sim2pop.rda differ Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/spcaIllus.rda and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/spcaIllus.rda differ Binary files /tmp/tmpLyXNDR/BnHAwuEcio/adegenet-2.1.0/data/swallowtails.rda and /tmp/tmpLyXNDR/QQNEuwPyoZ/adegenet-2.1.1/data/swallowtails.rda differ diff -Nru adegenet-2.1.0/debian/changelog adegenet-2.1.1/debian/changelog --- adegenet-2.1.0/debian/changelog 2018-02-04 03:49:24.000000000 +0000 +++ adegenet-2.1.1/debian/changelog 2018-02-04 03:49:24.000000000 +0000 @@ -1,14 +1,21 @@ -adegenet (2.1.0-1cran1ppa0) xenial; urgency=medium +adegenet (2.1.1-1cran1ppa0) xenial; urgency=medium * Compilation for Ubuntu 16.04.3 LTS - -- Michael Rutter Sun, 15 Oct 2017 16:02:44 +0000 + -- Michael Rutter Sun, 04 Feb 2018 03:47:18 +0000 + +adegenet (2.1.1-1cran1) testing; urgency=low + + * cran2deb svn: 362M with DB version 1. + + -- cran2deb4ubuntu Sat, 03 Feb 2018 10:57:50 -0500 + adegenet (2.1.0-1cran1) testing; urgency=low * cran2deb svn: 362M with DB version 1. - -- cran2deb4ubuntu Sat, 14 Oct 2017 15:33:34 -0400 + -- cran2deb4ubuntu Sat, 14 Oct 2017 15:34:33 -0400 adegenet (2.0.1-1cran2) testing; urgency=low diff -Nru adegenet-2.1.0/debian/copyright adegenet-2.1.1/debian/copyright --- adegenet-2.1.0/debian/copyright 2018-02-04 03:49:24.000000000 +0000 +++ adegenet-2.1.1/debian/copyright 2018-02-04 03:49:24.000000000 +0000 @@ -2,7 +2,7 @@ automatically using cran2deb4ubuntu by cran2deb4ubuntu . -The original GNU R package is Copyright (C) 2017 Thibaut Jombart, Zhian +The original GNU R package is Copyright (C) 2018 Thibaut Jombart, Zhian N. Kamvar, Caitlin Collins, Roman Lustrik, Marie- Pauline Beugin, Brian J. Knaus, Peter Solymos, Vladimir Mikryukov, Klaus Schliep, Tiago Maié, Libor Morkovsky, Ismail Ahmed, Anne Cori, Federico Calboli, RJ Ewing diff -Nru adegenet-2.1.0/DESCRIPTION adegenet-2.1.1/DESCRIPTION --- adegenet-2.1.0/DESCRIPTION 2017-10-12 19:20:52.000000000 +0000 +++ adegenet-2.1.1/DESCRIPTION 2018-02-02 18:21:36.000000000 +0000 @@ -1,5 +1,5 @@ Package: adegenet -Version: 2.1.0 +Version: 2.1.1 Encoding: UTF-8 Title: Exploratory Analysis of Genetic and Genomic Data Author: Thibaut Jombart, Zhian N. Kamvar, Caitlin Collins, Roman Lustrik, Marie- @@ -39,6 +39,6 @@ LazyLoad: yes RoxygenNote: 6.0.1 NeedsCompilation: yes -Packaged: 2017-10-12 15:31:47 UTC; thibaut +Packaged: 2018-02-02 16:20:48 UTC; thibaut Repository: CRAN -Date/Publication: 2017-10-12 19:20:52 UTC +Date/Publication: 2018-02-02 18:21:36 UTC diff -Nru adegenet-2.1.0/inst/files/swallowtails_loc.csv adegenet-2.1.1/inst/files/swallowtails_loc.csv --- adegenet-2.1.0/inst/files/swallowtails_loc.csv 1970-01-01 00:00:00.000000000 +0000 +++ adegenet-2.1.1/inst/files/swallowtails_loc.csv 2018-02-02 14:36:09.000000000 +0000 @@ -0,0 +1,782 @@ +key,spp,locality,lat,lon,COI +JRD001,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD002,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD003,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD004,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD005,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD006,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD007,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD008,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD009,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD010,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD011,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD012,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD013,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD014,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD015,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD016,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD017,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD018,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD019,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD020,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD021,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD022,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD023,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD024,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD025,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD026,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD027,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD028,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD029,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD030,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD031,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD032,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD033,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD034,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD035,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD036,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD037,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD038,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,H +JRD039,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD040,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD041,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD042,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD043,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD044,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD045,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD046,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD047,Papilio zelicaon x machaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,H +JRD048,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD049,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD050,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD051,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD052,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD053,Papilio zelicaon ,"Canada: Alberta, Marten Mountain",55.47031,-114.78509,Z +JRD059,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD060,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD061,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD062,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD063,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD064,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD065,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD066,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD067,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD068,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD069,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD070,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD071,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD072,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD073,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD074,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD075,Papilio zelicaon ,"Canada: Alberta, House Mountain",55.04839,-115.59475,Z +JRD076,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD077,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD078,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD079,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD080,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD081,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD082,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD083,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD084,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD085,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD086,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD087,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD088,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD089,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD090,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD091,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD092,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD093,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD094,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD095,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD096,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD097,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD098,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD099,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD100,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD101,Papilio zelicaon ,"Canada: Alberta, Goose Mountain",54.75171,-116.03276,Z +JRD102,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD103,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD104,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD105,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD106,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD107,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD108,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD109,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD110,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD111,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD112,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD113,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD114,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD115,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD116,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD117,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD118,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD119,Papilio machaon pikei,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,M +JRD120,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD121,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD122,Papilio zelicaon ,"Canada: British Columbia, Bullhead Mountain",56.0457,-122.13297,Z +JRD123,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD124,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD125,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD126,Papilio zelicaon ,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,Z +JRD127,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD128,Papilio zelicaon ,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,Z +JRD129,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD130,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD131,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD132,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD133,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD134,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD135,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD170,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD171,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD172,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD173,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD174,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD175,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD176,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD177,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD178,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD179,Papilio zelicaon ,"Canada: Alberta, Highland Park Central",56.01923,-118.80972,Z +JRD180,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD181,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD182,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD183,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD184,Papilio zelicaon ,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,Z +JRD185,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD186,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD187,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD188,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD189,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD190,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD191,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD192,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD193,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Fire Lookout",52.48259,-115.73825,Z +JRD194,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Fire Lookout",52.48259,-115.73825,Z +JRD195,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Fire Lookout",52.48259,-115.73825,Z +JRD196,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Fire Lookout",52.48259,-115.73825,Z +JRD197,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Fire Lookout",52.48259,-115.73825,Z +JRD198,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Mountain",52.53151,-116.1261,Z +JRD199,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Mountain",52.53151,-116.1261,M +JRD200,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Mountain",52.53151,-116.1261,Z +JRD201,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Mountain",52.53151,-116.1261,M +JRD202,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Mountain",52.53151,-116.1261,Z +JRD203,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Mountain",52.53151,-116.1261,H +JRD205,Papilio zelicaon x machaon ,"Canada: Alberta, Powderface Mountain",50.84316,-114.84863,Z +JRD206,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Fire Lookout",52.48259,-115.73825,Z +JRD207,Papilio zelicaon x machaon ,"Canada: Alberta, Shunda Fire Lookout",52.48259,-115.73825,Z +JRD209,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD210,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD211,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD212,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD213,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD214,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD215,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD216,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD217,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD218,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD219,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD220,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD221,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD222,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD223,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD224,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD225,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD226,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD227,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD228,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD229,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD230,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD231,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD232,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD233,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD234,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD235,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD236,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD237,Papilio zelicaon x machaon ,"Canada: Alberta, Powderface Mountain",50.84316,-114.84863,Z +JRD238,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD239,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD240,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD241,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD242,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD243,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD244,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD245,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD246,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD247,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD248,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD249,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD250,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD251,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD252,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD253,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD254,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD255,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD256,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD257,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD258,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD259,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD260,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD261,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD262,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD263,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD264,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD265,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD266,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD267,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD268,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD269,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD270,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD271,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD272,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD273,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD274,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD275,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD276,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD277,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD278,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD279,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD280,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD281,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD282,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD283,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD284,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD285,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD286,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD287,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD288,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD289,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD290,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD291,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD292,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD293,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD295,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD296,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD297,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD298,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD299,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD300,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD301,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD302,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD303,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD304,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD305,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD306,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD307,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD308,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD309,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD310,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD311,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD312,Papilio machaon dodi,"Canada: Alberta, Drumheller Town",51.47276,-112.70495,M +JRD313,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD314,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD315,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD316,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD317,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD318,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD319,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD320,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD321,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD322,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD323,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD324,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD325,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD326,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD327,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD328,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD329,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD330,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD331,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD332,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD333,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD334,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD335,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD336,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD337,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD338,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD339,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD340,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD341,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD342,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD343,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD344,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD345,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD346,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD347,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD348,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD349,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD350,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD351,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD352,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD353,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD354,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD355,Papilio zelicaon ,"Canada: Alberta, Enilda Fire Lookout",55.31975,-116.19717,Z +JRD356,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD357,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD358,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD359,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD360,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD361,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD362,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD363,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD364,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD365,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD366,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD367,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD368,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD369,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD370,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD371,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD372,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD373,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD374,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD375,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD376,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD377,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD378,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD379,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD380,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD381,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD382,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD383,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD384,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD385,Papilio zelicaon ,"Canada: Alberta, Sweathouse Fire Lookout",54.89917,-116.75206,Z +JRD386,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD387,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD388,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD389,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,H +JRD390,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD391,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,H +JRD392,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD393,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD394,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD395,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,Z +JRD396,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,M +JRD397,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,Z +JRD398,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,M +JRD399,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,Z +JRD400,Papilio zelicaon x machaon ,"Canada: Alberta, Mesa Butte",50.78071,-114.56134,M +JRD401,Papilio zelicaon x machaon ,"Canada: Alberta, Mesa Butte",50.78071,-114.56134,M +JRD402,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD403,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD404,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD405,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD406,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD407,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD408,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD409,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD410,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD411,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD412,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD413,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD417,Papilio zelicaon ,"Canada: Alberta, Pushwaskau Fire Lookout",55.21875,-117.493,Z +JRD418,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD419,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD420,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD421,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD422,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD423,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD424,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD426,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD427,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD428,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD429,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD431,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD432,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD433,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD436,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD437,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,M +JRD438,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,Z +JRD439,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,M +JRD440,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,Z +JRD441,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,Z +JRD442,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,Z +JRD443,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,Z +JRD444,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,M +JRD445,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,M +JRD446,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,Z +JRD447,Papilio zelicaon x machaon ,"Canada: Alberta, Mesa Butte",50.78071,-114.56134,H +JRD448,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,M +JRD449,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD450,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD451,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD452,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD453,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD454,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD455,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD456,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD457,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD458,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD459,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD460,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD461,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD462,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD463,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD464,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD466,Papilio machaon pikei,"Canada: British Columbia, Clayhurst Ferry",56.12865,-120.05228,M +JRD467,Papilio machaon pikei,"Canada: British Columbia, Clayhurst Ferry",56.12865,-120.05228,M +JRD468,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD469,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD470,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD471,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD473,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD474,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD475,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD476,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD477,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD478,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD479,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD480,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD481,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD482,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD483,Papilio zelicaon ,"Canada: British Columbia, Beatton River",56.27525,-120.67391,Z +JRD484,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD485,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD486,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD487,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD488,Papilio machaon pikei,"Canada: British Columbia, Clayhurst Ferry",56.12865,-120.05228,M +JRD489,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD490,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD491,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD492,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD493,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD494,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD495,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD496,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD497,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD498,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD499,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD500,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD501,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD502,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD503,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD504,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD505,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD506,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD507,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD508,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD509,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD510,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD511,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD512,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD513,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD514,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD515,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD516,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD517,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD518,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD519,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD520,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD521,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD522,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD523,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD524,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD525,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD526,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD527,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD528,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD529,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD530,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD531,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD532,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD533,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD534,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD540,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD541,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD542,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD543,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD544,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD545,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD546,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD547,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD548,Papilio zelicaon ,"Canada: Alberta, Hand Hills",51.53452,-112.3661,Z +JRD549,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD550,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD551,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD552,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD553,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD554,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD555,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD556,Papilio zelicaon x machaon ,"Canada: Alberta, Antler Hill",52.06313,-113.89374,Z +JRD557,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD558,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD559,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD560,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD561,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD562,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD563,Papilio zelicaon ,"Canada: Alberta, Wintering Hills West",51.2552,-112.62614,Z +JRD564,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD565,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD566,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD567,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD568,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD569,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD570,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD571,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD572,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD573,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD574,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD575,Papilio machaon dodi,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,M +JRD576,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD577,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD578,Papilio zelicaon ,"Canada: Alberta, Wintering Hills East",51.25993,-112.45478,Z +JRD581,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD582,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD583,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,H +JRD584,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD585,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD586,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD587,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD588,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD589,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD590,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD591,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD595,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD596,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD597,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD598,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD599,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD600,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.22422,-119.29686,Z +JRD601,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD602,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD603,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD604,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD605,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD606,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD607,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD608,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD609,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD610,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD611,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD612,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD613,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD614,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD616,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD617,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD618,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD619,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD620,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD621,Papilio machaon pikei,"Canada: Alberta, Highland Park Central",56.01923,-118.80972,M +JRD622,Papilio machaon pikei,"Canada: Alberta, Highland Park Central",56.01923,-118.80972,M +JRD623,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD631,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,M +JRD632,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,Z +JRD633,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,M +JRD634,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,M +JRD635,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,Z +JRD636,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,M +JRD637,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,Z +JRD638,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,Z +JRD639,Papilio zelicaon x machaon ,"Canada: Alberta, Jumpingpound Ridge",50.95052,-114.9073,M +JRD640,Papilio zelicaon x machaon ,"Canada: Alberta, Powderface Mountain",50.84316,-114.84863,Z +JRD641,Papilio zelicaon x machaon ,"Canada: Alberta, Powderface Mountain",50.84316,-114.84863,H +JRD642,Papilio zelicaon x machaon ,"Canada: Alberta, Powderface Mountain",50.84316,-114.84863,Z +JRD643,Papilio zelicaon x machaon ,"Canada: Alberta, Powderface Mountain",50.84316,-114.84863,Z +JRD644,Papilio zelicaon x machaon ,"Canada: Alberta, Powderface Mountain",50.84316,-114.84863,Z +JRD645,Papilio zelicaon x machaon ,"Canada: Alberta, Powderface Mountain",50.84316,-114.84863,M +JRD646,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD647,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD648,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD649,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD650,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD651,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD652,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD653,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD654,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD655,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD656,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD657,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD658,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD659,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD660,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD661,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD662,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD663,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD664,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD665,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD666,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD667,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD668,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD675,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD676,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD677,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD678,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD679,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD680,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD681,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,H +JRD682,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD683,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD684,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD685,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD686,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,H +JRD687,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,M +JRD688,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD689,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD690,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD691,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD692,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD693,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD694,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD695,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,M +JRD696,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD697,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD698,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD699,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD700,Papilio zelicaon x machaon ,"Canada: Alberta, Fish Butte",50.91694,-114.53558,Z +JRD711,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.21875,-117.493,Z +JRD712,Papilio zelicaon ,"Canada: Alberta, Saskatoon Hill",55.21875,-117.493,Z +JRD713,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,M +JRD714,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,M +JRD715,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD716,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD717,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD718,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD719,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD720,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD721,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD722,Papilio machaon pikei,"Canada: British Columbia, Clayhurst Ferry",56.12865,-120.05228,M +JRD723,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD724,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD725,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD726,Papilio machaon pikei,"Canada: British Columbia, Lynx Ridge Road",56.11653,-121.79996,M +JRD727,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD728,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD729,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD730,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD732,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD733,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD734,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD735,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD736,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD737,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD738,Papilio machaon dodi,"Canada: Alberta, Horsethief Canyon",51.50378,-112.92857,M +JRD739,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD740,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD741,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD742,Papilio machaon dodi,"Canada: Alberta, Morrin Bridge",51.64462,-112.92085,M +JRD743,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD744,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD745,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD746,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD747,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD748,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD749,Papilio machaon dodi,"Canada: Alberta, Orkney Lookout along Red Deer River",51.54887,-112.89692,M +JRD750,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD751,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD752,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD753,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,H +JRD754,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD755,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD756,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD757,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD758,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD759,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD760,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD761,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD762,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD763,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD764,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD765,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD766,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD768,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD769,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD771,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD772,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD773,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD774,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD775,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD776,Papilio zelicaon x machaon ,"Canada: Alberta, Medicine Lodge Hills",52.45458,-114.24826,Z +JRD777,Papilio zelicaon x machaon ,"Canada: Alberta, Medicine Lodge Hills",52.45458,-114.24826,Z +JRD778,Papilio zelicaon x machaon ,"Canada: Alberta, Medicine Lodge Hills",52.45458,-114.24826,Z +JRD779,Papilio zelicaon x machaon ,"Canada: Alberta, Medicine Lodge Hills",52.45458,-114.24826,Z +JRD780,Papilio zelicaon x machaon ,"Canada: Alberta, Mesa Butte",50.78071,-114.56134,Z +JRD782,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,Z +JRD783,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,Z +JRD784,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,M +JRD785,Papilio zelicaon x machaon ,"Canada: Alberta, East of Mesa Butte",50.7653,-114.37107,Z +JRD786,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,Z +JRD787,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,M +JRD788,Papilio zelicaon x machaon ,"Canada: Alberta, Medicine Lodge Hills",52.45458,-114.24826,Z +JRD789,Papilio zelicaon x machaon ,"Canada: Alberta, Bragg Creek Ski Hill",50.98175,-114.58286,H +JRD790,Papilio machaon pikei,"Canada: British Columbia, Clayhurst Ferry",56.12865,-120.05228,M +JRD791,Papilio zelicaon x machaon ,"Canada: Alberta, Mesa Butte",50.78071,-114.56134,Z +JRD792,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD793,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD794,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD802,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD803,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD804,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD805,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD806,Papilio zelicaon x machaon ,"Canada: Alberta, Buck Mountain",53.05209,-114.73961,Z +JRD807,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD808,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD809,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD810,Papilio zelicaon x machaon ,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,H +JRD811,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD812,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD813,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD814,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD815,Papilio machaon pikei,"Canada: Alberta, Kaufman Hill",56.24883,-117.27408,M +JRD816,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD817,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD818,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD819,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD820,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD821,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD822,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD823,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD824,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD825,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD826,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD827,Papilio machaon pikei,"Canada: Alberta, Highland Park North",56.13076,-118.88931,M +JRD828,Papilio machaon pikei,"Canada: Alberta, Highland Park Central",56.01923,-118.80972,M +JRD829,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD830,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD831,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD832,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD833,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD834,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD835,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD836,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD837,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD838,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD839,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD840,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD841,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD842,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD843,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD844,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD845,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD846,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD847,Papilio machaon dodi,"Canada: Alberta, Tolman Bridge",51.84258,-113.00796,M +JRD848,Papilio machaon dodi,"Canada: Alberta, Lousana",52.07838,-113.00907,M +JRD849,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD850,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD851,Papilio zelicaon ,"Canada: Alberta, Whitecourt Mountain",54.03232,-115.72055,Z +JRD852,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD853,Papilio zelicaon ,"Canada: British Columbia, Bear Mountain",55.72849,-120.44299,Z +JRD854,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD855,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD856,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD857,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD859,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD860,Papilio zelicaon ,"Canada: Alberta, Kleskun Hills",55.25466,-118.52737,Z +JRD861,Papilio zelicaon ,"Canada: Alberta, White Mountain",55.6943,-119.23857,Z +JRD862,Papilio zelicaon x machaon ,"Canada: Alberta, Medicine Lodge Hills",52.45458,-114.24826,Z +JRD863,Papilio zelicaon x machaon ,"Canada: Alberta, Medicine Lodge Hills",52.45458,-114.24826,Z +JRD864,Papilio zelicaon x machaon ,"Canada: Alberta, Medicine Lodge Hills",52.45458,-114.24826,Z +JRD865,Papilio zelicaon x machaon ,"Canada: Alberta, Wildcat Hills",51.28311,-114.67019,Z +JRD866,Papilio zelicaon x machaon ,"Canada: Alberta, East of Mesa Butte",50.7653,-114.37107,Z +JRD867,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M +JRD868,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD869,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD870,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD871,Papilio zelicaon x machaon ,"Canada: Alberta, Mesa Butte",50.78071,-114.56134,Z +JRD872,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD873,Papilio machaon pikei,"Canada: British Columbia, Clayhurst Ferry",56.12865,-120.05228,M +JRD874,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD875,Papilio machaon pikei,"Canada: British Columbia, Beatton River",56.27525,-120.67391,M +JRD876,Papilio machaon pikei,"Canada: Alberta, Shaftsbury",56.12168,-117.41547,M +JRD877,Papilio machaon pikei,"Canada: British Columbia, Clayhurst Ferry",56.12865,-120.05228,M +JRD878,Papilio machaon pikei,"Canada: British Columbia, Taylor",56.15403,-120.71828,M \ No newline at end of file diff -Nru adegenet-2.1.0/man/AICc.Rd adegenet-2.1.1/man/AICc.Rd --- adegenet-2.1.0/man/AICc.Rd 2017-09-27 10:19:15.000000000 +0000 +++ adegenet-2.1.1/man/AICc.Rd 2018-02-02 15:50:06.000000000 +0000 @@ -3,7 +3,7 @@ \name{AICc} \alias{AICc} \alias{AICc.snapclust} -\title{Compute Akaike Information Criterion for small samples (AICc) for snapclust} +\title{snapclust's corrected Akaike Information Criterion (AICc)} \usage{ AICc(object, ...) @@ -16,10 +16,26 @@ (currently not used).} } \description{ -Do not use. We work on that stuff. Contact us if interested. +This function computes Akaike Information Criterion for small samples (AICc) +for \code{snapclust} results. +} +\references{ +Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast + likelihood solution to the genetic clustering problem. Methods Ecol + Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} } \seealso{ -\code{\link{snapclust}} to generate clustering solutions. +\itemize{ + \item \code{\link{snapclust}}: to identify clusters + + \item \code{\link{snapclust.choose.k}}: to find the number of clusters + + \item \code{\link{AIC.snapclust}}: AIC computation + + \item \code{\link{BIC.snapclust}}: BIC computation + + \item \code{\link{KIC.snapclust}}: KIC computation +} } \author{ Thibaut Jombart \email{thibautjombart@gmail.com} diff -Nru adegenet-2.1.0/man/AIC.snapclust.Rd adegenet-2.1.1/man/AIC.snapclust.Rd --- adegenet-2.1.0/man/AIC.snapclust.Rd 2017-05-05 14:52:11.000000000 +0000 +++ adegenet-2.1.1/man/AIC.snapclust.Rd 2018-02-02 15:50:06.000000000 +0000 @@ -2,7 +2,7 @@ % Please edit documentation in R/AIC.snapclust.R \name{AIC.snapclust} \alias{AIC.snapclust} -\title{Compute Akaike Information Criterion (AIC) for snapclust} +\title{snapclust's Akaike Information Criterion (AIC)} \usage{ \method{AIC}{snapclust}(object, ...) } @@ -13,10 +13,26 @@ (currently not used).} } \description{ -Do not use. We work on that stuff. Contact us if interested. +This function computes Akaike Information Criterion (AIC) for +\code{snapclust} results. +} +\references{ +Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast + likelihood solution to the genetic clustering problem. Methods Ecol + Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} } \seealso{ -\code{\link{snapclust}} to generate clustering solutions. +\itemize{ + \item \code{\link{snapclust}}: to identify clusters + + \item \code{\link{snapclust.choose.k}}: to find the number of clusters + + \item \code{\link{AICc.snapclust}}: AICc computation + + \item \code{\link{BIC.snapclust}}: BIC computation + + \item \code{\link{KIC.snapclust}}: KIC computation +} } \author{ Thibaut Jombart \email{thibautjombart@gmail.com} diff -Nru adegenet-2.1.0/man/BIC.snapclust.Rd adegenet-2.1.1/man/BIC.snapclust.Rd --- adegenet-2.1.0/man/BIC.snapclust.Rd 2017-05-05 14:52:11.000000000 +0000 +++ adegenet-2.1.1/man/BIC.snapclust.Rd 2018-02-02 15:50:06.000000000 +0000 @@ -2,7 +2,7 @@ % Please edit documentation in R/BIC.snapclust.R \name{BIC.snapclust} \alias{BIC.snapclust} -\title{Compute Bayesian Information Criterion (BIC) for snapclust} +\title{snapclust's Bayesian Information Criterion (BIC)} \usage{ \method{BIC}{snapclust}(object, ...) } @@ -13,10 +13,26 @@ (currently not used).} } \description{ -Do not use. We work on that stuff. Contact us if interested. +This function computes the Bayesian Information Criterion (BIC) for +\code{snapclust} results. +} +\references{ +Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast + likelihood solution to the genetic clustering problem. Methods Ecol + Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} } \seealso{ -\code{\link{snapclust}} to generate clustering solutions. +\itemize{ + \item \code{\link{snapclust}}: to identify clusters + + \item \code{\link{snapclust.choose.k}}: to find the number of clusters + + \item \code{\link{AIC.snapclust}}: AIC computation + + \item \code{\link{AICc.snapclust}}: AICc computation + + \item \code{\link{KIC.snapclust}}: KIC computation +} } \author{ Thibaut Jombart \email{thibautjombart@gmail.com} diff -Nru adegenet-2.1.0/man/export_to_mvmapper.Rd adegenet-2.1.1/man/export_to_mvmapper.Rd --- adegenet-2.1.0/man/export_to_mvmapper.Rd 2017-10-11 21:08:15.000000000 +0000 +++ adegenet-2.1.1/man/export_to_mvmapper.Rd 2018-02-02 16:20:32.000000000 +0000 @@ -2,6 +2,7 @@ % Please edit documentation in R/export_to_mvmapper.R \name{export_to_mvmapper} \alias{export_to_mvmapper} +\alias{swallowtails} \alias{export_to_mvmapper.default} \alias{export_to_mvmapper.dapc} \alias{export_to_mvmapper.dudi} @@ -87,30 +88,34 @@ } \examples{ -data(sim2pop) +# An example using the microsatellite dataset of Dupuis et al. 2016 (781 +# individuals, 10 loci, doi: 10.1111/jeb.12931) -dapc1 <- dapc(sim2pop, n.pca = 10, n.da = 1) +# Reading input file from adegenet -info <- data.frame(key = indNames(sim2pop), - lat = other(sim2pop)$xy[,2], - lon = other(sim2pop)$xy[,1], - Population = pop(sim2pop)) +input_data <- system.file("data/swallowtails.rda", package="adegenet") +data(swallowtails) -out <- export_to_mvmapper(dapc1, info, write_file = FALSE) -head(out) -data(rupica) +# conducting a DAPC (n.pca determined using xvalDapc, see ??xvalDapc) -spca1 <- spca(rupica, type=5, d1 = 0, d2 = 2300, - plot = FALSE, scannf = FALSE, - nfposi = 2,nfnega = 0) +dapc1 <- dapc(swallowtails, n.pca=40, n.da=200) -info <- data.frame(key = indNames(rupica), - lat = rupica$other$xy[,2], - lon = rupica$other$xy[,1]) -out <- export_to_mvmapper(spca1, info, write_file = FALSE) -head(out) +# read in swallowtails_loc.csv, which contains "key", "lat", and "lon" +# columns with column headers (this example contains additional columns +# containing species identifications, locality descriptions, and COI +# haplotype clades) + +input_locs <- system.file("files/swallowtails_loc.csv", package = "adegenet") +loc <- read.csv(input_locs, header = TRUE) + + +# generate mvmapper input file, automatically write the output to a csv, and +# name the output csv "mvMapper_Data.csv" + +out <- export_to_mvmapper(dapc1, loc, write_file = TRUE, + out_file = "mvMapper_Data.csv") } \seealso{ diff -Nru adegenet-2.1.0/man/KIC.Rd adegenet-2.1.1/man/KIC.Rd --- adegenet-2.1.0/man/KIC.Rd 2017-09-27 10:19:15.000000000 +0000 +++ adegenet-2.1.1/man/KIC.Rd 2018-02-02 15:50:06.000000000 +0000 @@ -3,7 +3,7 @@ \name{KIC} \alias{KIC} \alias{KIC.snapclust} -\title{Compute Akaike Information Criterion for small samples (AICc) for snapclust} +\title{snapclust's Kullback Information Criterion (KIC)} \usage{ KIC(object, ...) @@ -16,10 +16,27 @@ (currently not used).} } \description{ -Do not use. We work on that stuff. Contact us if interested. +This function computes Kullback Information Criterion (KIC) for +\code{snapclust} results. +} +\references{ +Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast + likelihood solution to the genetic clustering problem. Methods Ecol + Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} } \seealso{ -\code{\link{snapclust}} to generate clustering solutions. +\itemize{ + \item \code{\link{snapclust}}: to identify clusters + + \item \code{\link{snapclust.choose.k}}: to find the number of clusters + + \item \code{\link{AIC.snapclust}}: AIC computation + + \item \code{\link{AICc.snapclust}}: AICc computation + + \item \code{\link{BIC.snapclust}}: BIC computation + +} } \author{ Thibaut Jombart \email{thibautjombart@gmail.com} diff -Nru adegenet-2.1.0/man/snapclust.choose.k.Rd adegenet-2.1.1/man/snapclust.choose.k.Rd --- adegenet-2.1.0/man/snapclust.choose.k.Rd 2017-09-27 10:19:15.000000000 +0000 +++ adegenet-2.1.1/man/snapclust.choose.k.Rd 2018-02-02 15:50:06.000000000 +0000 @@ -2,7 +2,7 @@ % Please edit documentation in R/snapclust.choose.k.R \name{snapclust.choose.k} \alias{snapclust.choose.k} -\title{Choose the number of clusters for snapclust using BIC} +\title{Choose the number of clusters for snapclust} \usage{ snapclust.choose.k(max, ..., IC = AIC, IC.only = TRUE) } @@ -21,12 +21,51 @@ returned.} } \description{ -Do not use. We work on that stuff. Contact us if interested. +The function \code{snapclust.choose.k} can be used to identify optimal values +of 'k' (number of panmictic clusters) using \code{snapclust}. It runs the +method for increasing values of 'k' and for each computes goodness-of-fit +statistics. These statistics are all different versions of deviance penalised +for the number of parameters, so that lower values should correspond to more +optimal clustering solutions. Currently available statistics include AIC, +AICc, BIC, and KIC.\cr +} +\details{ +There is no theoretical basis for favouring a given statistic over another +in the case of genetic clustering. In practice, one should look for an +'elbow' in the curve of the statistics as a function of 'k'. +} +\examples{ +\dontrun{ + ## 'a' is a simulated dataset with 6 populations, island model + data(dapcIllus) + a <- dapcIllus$a + a + + ## try and choose 'k' using AIC (real value = 6) + a.aic <- snapclust.choose.k(max = 10, a) + plot(1:10, a.aic, xlab = "Number of clusters (k)", + ylab = "AIC", type = "b", pch = 20, cex = 3) + + ## try and choose 'k' using AIC (real value = 6) + a.kic <- snapclust.choose.k(max = 10, a, IC = KIC) + plot(1:10, a.kic, xlab = "Number of clusters (k)", + ylab = "KIC", type = "b", pch = 20, cex = 3) + + +} } \seealso{ -\code{\link{snapclust}} to generate individual clustering solutions, -and \code{\link{BIC.snapclust}} for computing BIC for \code{snapclust} -objects. +\itemize{ + \item \code{\link{snapclust}}: to identify clusters + + \item \code{\link{AIC.snapclust}}: AIC computation + + \item \code{\link{AICc.snapclust}}: AICc computation + + \item \code{\link{BIC.snapclust}}: BIC computation + + \item \code{\link{KIC.snapclust}}: KIC computation +} } \author{ Thibaut Jombart \email{thibautjombart@gmail.com} diff -Nru adegenet-2.1.0/man/snapclust.Rd adegenet-2.1.1/man/snapclust.Rd --- adegenet-2.1.0/man/snapclust.Rd 2017-10-03 12:25:59.000000000 +0000 +++ adegenet-2.1.1/man/snapclust.Rd 2018-02-02 16:19:08.000000000 +0000 @@ -15,7 +15,7 @@ \item{pop.ini}{parameter indicating how the initial group membership should be found. If \code{NULL}, groups are chosen at random, and the algorithm -will be run \code{n.start times}. If "kmeans", then the function +will be run \code{n.start} times. If "kmeans", then the function \code{find.clusters} is used to define initial groups using the K-means algorithm. If "ward", then the function \code{find.clusters} is used to define initial groups using the Ward algorithm. Alternatively, a factor @@ -75,7 +75,34 @@ } } \description{ -Do not use. We work on that stuff. Contact us if interested. +The function \code{snapclust} implements fast maximum-likelihood (ML) genetic +clustering using a 2-step approach: find a 'good' initial starting point +using a fast geometric (distance-based) approach, followed by an efficient +likelihood optimization using the expectation-maximization (EM) +algorithm. The likelihood for a given locus is defined as the probability of +a given genotype given the allele frequencies of its originating population, +as defined by Hardy-Weinberg equilibrium. Different approaches are available +for the initial distance-based clustering (see argument \code{pop.ini}). The +current implementation is designed for haploid or diploid data, and assumes +constant ploidy within the dataset. +} +\details{ +This function can be used in two modes: + +\itemize{ + +\item genetic clustering mode: assign individuals to a known number 'k' + of panmictic clusters; see \code{\link{snapclust.choose.k}} for identifying + optimal values of 'k'. + +\item hybrid mode: as previous mode, but with the additional constraint that + clusters are either one of the 2 parental populations, or any hybrid classes + in between, as defined by the parameter \code{hybrid.coef}. + +} + +This method is documented in an online tutorial, which can be opened by typing: +\code{adegenetTutorial("snapclust")}. } \examples{ \dontrun{ @@ -130,10 +157,30 @@ ## method with back-cross res2.back <- snapclust(y, k = 2, hybrids = TRUE, hybrid.coef = c(.25,.5)) - compoplot(res2.hyb, col.pal = hybridpal(), n.col = 2) + compoplot(res2.back, col.pal = hybridpal(), n.col = 2) } } +\references{ +Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast + likelihood solution to the genetic clustering problem. Methods Ecol + Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} +} +\seealso{ +\itemize{ + \item \code{\link{snapclust.choose.k}} to choose 'k' using various + goodness-of-fit statistics + + \item \code{\link{AIC.snapclust}}: AIC computation + + \item \code{\link{AICc.snapclust}}: AICc computation + + \item \code{\link{BIC.snapclust}}: BIC computation + + \item \code{\link{KIC.snapclust}}: KIC computation + + } +} \author{ Thibaut Jombart \email{thibautjombart@gmail.com} and Marie-Pauline Beugin diff -Nru adegenet-2.1.0/man/web.Rd adegenet-2.1.1/man/web.Rd --- adegenet-2.1.0/man/web.Rd 2017-03-17 20:10:41.000000000 +0000 +++ adegenet-2.1.1/man/web.Rd 2018-02-02 14:36:09.000000000 +0000 @@ -8,7 +8,8 @@ \usage{ adegenetWeb() -adegenetTutorial(which = c("basics", "spca", "dapc", "genomics", "strata")) +adegenetTutorial(which = c("basics", "spca", "dapc", "genomics", "strata", + "snapclust")) adegenetIssues() } @@ -36,5 +37,6 @@ \item 'dapc': population structure using the Discriminant Analysis of Principal Components \item 'genomics': handling large genome-wide SNP data using adegenet \item 'strata': introduction to hierarchical population structure in adegenet +\item 'snapclust': introduction to fast maximum-likelihood genetic clustering using snapclust } } diff -Nru adegenet-2.1.0/MD5 adegenet-2.1.1/MD5 --- adegenet-2.1.0/MD5 2017-10-12 19:20:52.000000000 +0000 +++ adegenet-2.1.1/MD5 2018-02-02 18:21:36.000000000 +0000 @@ -1,17 +1,17 @@ -3a05103a84c00117f95e39500c135bb0 *ChangeLog -d5d9b279de52d5c84ac9c180acbac1d0 *DESCRIPTION +8a88c2fdf9ea820cca6d38ca96d317e0 *ChangeLog +f7efe61c1d70295dc02fedcc7941d7ee *DESCRIPTION d920e1db3e15f61a379b8c794042e067 *NAMESPACE -5ebf3ab120b8dc51059621f42255e069 *R/AIC.snapclust.R -957a38141833031d3003f04796430466 *R/AICc.snapclust.R -ebcd402640f7606dc419654c6293fefa *R/BIC.snapclust.R +d3f5ee54110385bec89cad9bc07de534 *R/AIC.snapclust.R +7c186dec03f3b387b13e6ae13a3a8066 *R/AICc.snapclust.R +08d23f848002b07e20f61ab7998b9dac *R/BIC.snapclust.R 872c8ca388f1bb2990513034e17011d9 *R/HWE.R e15a6bd7d43060f74695502fa53bf86c *R/Hs.R -3dc4032b28c23600a13e55a9bcf03d86 *R/KIC.snapclust.R +d425cd1ccb6aa8377008d3c0707b86dd *R/KIC.snapclust.R 33a612fe584815666b9bc9082557ce1a *R/PCtest.R 703951a322d7ccf91f261dfe2cb6728a *R/SNPbin.R 79b7bbe04137964062fac7a0a6374ec5 *R/accessors.R 013734a04306216c776620c40bdf1432 *R/adegenet.package.R -e849faa072c9ea3afcac13609e2ccd42 *R/auxil.R +8b7e90b6cdb2c75a642893b5f685c876 *R/auxil.R e81a03224dde9b18ce9025ac19125a9b *R/basicMethods.R 704b961c6c236b785a392c30ef9dc133 *R/chooseCN.R 2dfb172b9f06057918208e5b6faf92ac *R/classes.R @@ -25,7 +25,7 @@ 852a9004af860fd07866df62ecfaebe4 *R/dist.genpop.R c31c91412be03aac5f39c910b20ccd81 *R/doc_C_routines.R e9927969f66c1fb7749abc774923582a *R/export.R -f629a38c92bf046a870023125bd8601f *R/export_to_mvmapper.R +2e77c1d1e8b6f24637df3b525b2622fa *R/export_to_mvmapper.R 0a8443644964703358036eab9c2b2847 *R/find.clust.R f05ecfcf1dfd3285337e364710cf80b0 *R/fstat.R 53f9c909634adaace0d97a939455ddb1 *R/gengraph.R @@ -41,7 +41,7 @@ 90c2d9985882a2b4108e89be08d2d1ec *R/haploPop.R 0ac4bc04ff3a7ce8835ca77246c78cf4 *R/hierarchyMethods.R 4b5ca941081b19b9fe6bd7fce3aa962b *R/hybridize.R -2ed751df92eeeead98476d0919dde0cb *R/import.R +a5e137cd5ce846920cc56f20d42fd666 *R/import.R 1bd985d69b3cff1a1cea29b30da8f4b9 *R/inbreeding.R 29ab3ad7f85c0f0b436ef82f85e9d63b *R/loadingplot.R c87829e43be8d3a38526c41928ed7740 *R/makefreq.R @@ -58,10 +58,10 @@ f836bd30520f0c673d8635c0ff3b3659 *R/sequences.R c8067fab3348da179bbc350cece12460 *R/servers.R c46e97c8ebd6dbc1bae511f6ffb4fc83 *R/setAs.R -7d75bff5d807b6eeb51f5f6a3446be1d *R/showmekittens.R +2d4f4a94c5b2ecdde6f02729d0cbc312 *R/showmekittens.R 684cd5c34cbda7c5360e992401df68f9 *R/simOutbreak.R -938360215056562f20ee829b9507a445 *R/snapclust.R -1a50a9b53cc8ae07b3f0ce05901366cb *R/snapclust.choose.k.R +5cb053ae9b48dca1929e3858030ce9b3 *R/snapclust.R +7414ca1b96e9c1eff13a2363c8cd979a *R/snapclust.choose.k.R 53badb21d2c40983e5bf31bb125a811f *R/snpposi.R 2d172fbdead950ca125a09e7db041c16 *R/snpzip.R 7d787254b33643316233c5b81494c1f8 *R/spca.R @@ -69,17 +69,18 @@ 1b132461c8acb40e2ba2980f8736a189 *R/strataMethods.R 3b99f8a7484d38bfd7998bacbf752151 *R/xvalDapc.R eef5358b5b6fdc1bd80de199abf78be1 *R/zzz.R -25c42c62fadf7c9c2dc7a1e24de4f19b *README.md -8b0ef241ce04d41269e7c6294e52979f *data/H3N2.rda -eb59241a255beb173411fb6038398905 *data/dapcIllus.rda -8ce7778cd2ac39c47231a1186e66dd2f *data/datalist -f6f99d2e60db6aa3739b582589d3e342 *data/eHGDP.rda -c2092ae7faff469f321e5c4af00aea0e *data/hybridtoy.RData -07a10a6c006e674e26ee0640a2bf2fc0 *data/microbov.rda -05d7e9d00e14c3fd214d592b165dc39f *data/nancycats.rda -5918524c6abb5ae3d2103e162de3b530 *data/rupica.RData -dbc9da6e17ac338c311dff5f930be354 *data/sim2pop.rda -40f1f88109829756a94ab07b8b949239 *data/spcaIllus.rda +2a42b327301942e35f41b3af9b0b9215 *README.md +c7e020af186f9e10fcf125dbce5bfbbe *data/H3N2.rda +e9ad16c597e345f2812cd9494f254b7e *data/dapcIllus.rda +5a9e844b8fb67ec8d740b8100577c71f *data/datalist +7b185968086446a626712d1b24defb1b *data/eHGDP.rda +a5b5fd7d76277968c1879c7071434359 *data/hybridtoy.RData +a3972c1a671364fe9af06df07b26b09b *data/microbov.rda +2d9d7bd501a99da2c99e6b20a5a564d6 *data/nancycats.rda +5d514fac0ca49c71f93ac08d6daf34cf *data/rupica.RData +867eedcea6a4610cb86ab398abde6e7f *data/sim2pop.rda +f6bcdae2f3cbbe25af5c1b59153fa17c *data/spcaIllus.rda +9ee11d8ae107dca7a6bcdc5042af2424 *data/swallowtails.rda 66f7dc09e53d6bc383bdf5e6ae0b6a1a *inst/CITATION 3195d9e41d03a862de02a0049c436cd4 *inst/dapcServer/server.R f4ad07cc4532088da6a4749c1e766cd8 *inst/dapcServer/ui.R @@ -94,15 +95,16 @@ b071452ae7320a21b0709f5533275504 *inst/files/pdH1N1-HA.fasta a03a7f02d49aded8184a4e8cc8a55b55 *inst/files/pdH1N1-NA.fasta 4d54bb83efe0c672869028631a51fea0 *inst/files/pdH1N1-data.csv +fcf05e7574e9d74db2daafe779198e47 *inst/files/swallowtails_loc.csv 7a5e71b7e9963effe18c1e17562f43e9 *inst/files/usflu.fasta -12f7f2e1b045b1bed12ae54c760b1c75 *man/AIC.snapclust.Rd -9df7d858d63361e0d2e6fc62e562fb76 *man/AICc.Rd -8ebef7c898cba944052d3f75147ddc4f *man/BIC.snapclust.Rd +f267ca62147ac4e4d749fc71945aa22b *man/AIC.snapclust.Rd +920f816cceff78fdbdee6a8bbbfa523a *man/AICc.Rd +a8603325535288017d7cad0ae1bd0801 *man/BIC.snapclust.Rd b76117bd2242640da5e1baed5d45fa88 *man/H3N2.Rd f801d68f4276b8305742d7a41110754e *man/HWE.Rd 2f63cf0ec193a67ff35af9d60a0a0f49 *man/Hs.Rd 0fb8e0345704f613d846c0fe66e28d08 *man/Hs.test.Rd -e15c29481a4c8c8f26930eaac64ad229 *man/KIC.Rd +881e6044f0045f45f1aea4a204c61fcd *man/KIC.Rd 4824fe0317d5c93cb6bfae831e7138e4 *man/SNPbin.Rd 2007cebc554242eeac6335394c239988 *man/accessors.Rd 9d2b38f45151291716569f24e3f9736b *man/adegenet.package.Rd @@ -122,7 +124,7 @@ 60d761d726d79674e12aa5266d238b29 *man/dist.genpop.Rd 3ff1eb496a3aecfc64e628f1500cb519 *man/doc_C_routines.Rd 4ba4682a5311891bf81365e99947349a *man/eHGDP.Rd -0f8ec253419e3407b268919d2dba3c82 *man/export_to_mvmapper.Rd +cb1698713438af3590d78550182fb876 *man/export_to_mvmapper.Rd 6a5c68da68b27901931b2bbe468a3be5 *man/fasta2DNAbin.Rd bc118c54e88934eac5e6e84ae0b16c10 *man/fasta2genlight.Rd 048b2d9dc8e789539d30b496e2f2248c *man/find.clusters.Rd @@ -174,8 +176,8 @@ 06dd5656412bd10552e1351a32177f74 *man/servers.Rd af52442bf33bab046ff121b0aa1355f2 *man/showmekittens.Rd 90767402af8bf77cd2feac06a5333fba *man/sim2pop.Rd -ca5a7bbd30e3e508032653f702bcf550 *man/snapclust.Rd -6b9afcfa4b16be32241ef7ec33dd8c48 *man/snapclust.choose.k.Rd +6b5ab1a69bcff0135acc31bb9f854252 *man/snapclust.Rd +e681bc74c65347d6ec2edc9a47df5d7e *man/snapclust.choose.k.Rd 8238f9fb5eec829a1978445a5bd5431b *man/snpposi.Rd a07dc761eaed6ce13e3ba2c1ef1c7949 *man/snpzip.rd b8478f2203f480e09bfaaadd2ebc55ae *man/spca.Rd @@ -186,7 +188,7 @@ 9fc2bf978bbf56b40bb9baa4b064a502 *man/tab.Rd 5b0ca85d0125eeb2c597e88a16a92dde *man/truenames.Rd 2f14395a0ee936db9b13dcdef500b2aa *man/virClasses.Rd -7167db1d1f0f178749ea1af8bf58e9be *man/web.Rd +f85395372902be165ba6b733a8ee00d5 *man/web.Rd 09d7c0499ed779fd0f430d2b9e0027d3 *man/xvalDapc.Rd 3bd8bc67659887935c2085e36fdf723d *src/GLfunctions.c 7fa800842c28da56c0bbcb8c330017d1 *src/GLfunctions.h @@ -201,15 +203,15 @@ 1e059ba9872ee43edeec99b3482d9baa *tests/testthat/test-findclust.R 01622b18130f09e1b609c9f349a56ceb *tests/testthat/test-prop.R e552cebb26630d9fe44f7b79f0dbbdfa *tests/testthat/test-seppop.R -34474a1d046f69bb1ae9b1c5af0f9966 *tests/testthat/test_accessors.R +e94dd70620c7db01d8c5b87c597db5df *tests/testthat/test_accessors.R 64c69022f9d492be121322178f080618 *tests/testthat/test_compoplot.R 439335b7a33235df9b82fe46c0ef281d *tests/testthat/test_constructors.R 1443018b5340fd051f09b1448704bbc9 *tests/testthat/test_genlight.R c31694f2ca8274b384573c03cad7b985 *tests/testthat/test_haploGen.R -1aaedd2f1b74b37af7579415cf0ff898 *tests/testthat/test_hierarchy.R -130b245531634a5890d7728fb0ef012e *tests/testthat/test_import.R -0339f776dd699f378f07296573af4589 *tests/testthat/test_repool.R -0093160dba54dcec9d1d7b8e88d4fbf2 *tests/testthat/test_snapclust.R +ccd5739145221bdd955216745efb773b *tests/testthat/test_hierarchy.R +fe022f8fecc8fb474e08f1bd5048d946 *tests/testthat/test_import.R +43081888c6ce3bc1de98749d97083d79 *tests/testthat/test_repool.R +6ea3c651b94782ce41dff5cc0d276dcf *tests/testthat/test_snapclust.R 9c948ede454b03a238d17cb9f2e9efa3 *tests/testthat/test_subset.R 641aa35f562b26c0a2de99a473c212e0 *tests/testthat/test_summary.R dadd0a55f6ec8ca7953f1e35722ea76e *tests/testthat/test_xval.R diff -Nru adegenet-2.1.0/R/AICc.snapclust.R adegenet-2.1.1/R/AICc.snapclust.R --- adegenet-2.1.0/R/AICc.snapclust.R 2017-09-27 10:19:15.000000000 +0000 +++ adegenet-2.1.1/R/AICc.snapclust.R 2018-02-02 15:49:27.000000000 +0000 @@ -1,6 +1,7 @@ -#' Compute Akaike Information Criterion for small samples (AICc) for snapclust +#' snapclust's corrected Akaike Information Criterion (AICc) #' -#' Do not use. We work on that stuff. Contact us if interested. +#' This function computes Akaike Information Criterion for small samples (AICc) +#' for \code{snapclust} results. #' #' @author Thibaut Jombart \email{thibautjombart@@gmail.com} #' @@ -11,7 +12,22 @@ #' @param ... Further arguments for compatibility with the \code{AIC} generic #' (currently not used). #' -#' @seealso \code{\link{snapclust}} to generate clustering solutions. +#' @references Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast +#' likelihood solution to the genetic clustering problem. Methods Ecol +#' Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} +#' +#' @seealso +#' \itemize{ +#' \item \code{\link{snapclust}}: to identify clusters +#' +#' \item \code{\link{snapclust.choose.k}}: to find the number of clusters +#' +#' \item \code{\link{AIC.snapclust}}: AIC computation +#' +#' \item \code{\link{BIC.snapclust}}: BIC computation +#' +#' \item \code{\link{KIC.snapclust}}: KIC computation +#' } #' #' @rdname AICc #' diff -Nru adegenet-2.1.0/R/AIC.snapclust.R adegenet-2.1.1/R/AIC.snapclust.R --- adegenet-2.1.0/R/AIC.snapclust.R 2017-05-05 14:52:11.000000000 +0000 +++ adegenet-2.1.1/R/AIC.snapclust.R 2018-02-02 15:49:34.000000000 +0000 @@ -1,6 +1,7 @@ -#' Compute Akaike Information Criterion (AIC) for snapclust +#' snapclust's Akaike Information Criterion (AIC) #' -#' Do not use. We work on that stuff. Contact us if interested. +#' This function computes Akaike Information Criterion (AIC) for +#' \code{snapclust} results. #' #' @author Thibaut Jombart \email{thibautjombart@@gmail.com} #' @@ -11,7 +12,22 @@ #' @param ... Further arguments for compatibility with the \code{AIC} generic #' (currently not used). #' -#' @seealso \code{\link{snapclust}} to generate clustering solutions. +#' @references Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast +#' likelihood solution to the genetic clustering problem. Methods Ecol +#' Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} +#' +#' @seealso +#' \itemize{ +#' \item \code{\link{snapclust}}: to identify clusters +#' +#' \item \code{\link{snapclust.choose.k}}: to find the number of clusters +#' +#' \item \code{\link{AICc.snapclust}}: AICc computation +#' +#' \item \code{\link{BIC.snapclust}}: BIC computation +#' +#' \item \code{\link{KIC.snapclust}}: KIC computation +#' } #' #' AIC.snapclust <- function(object, ...) { diff -Nru adegenet-2.1.0/R/auxil.R adegenet-2.1.1/R/auxil.R --- adegenet-2.1.0/R/auxil.R 2017-10-11 21:08:49.000000000 +0000 +++ adegenet-2.1.1/R/auxil.R 2018-02-02 14:36:09.000000000 +0000 @@ -82,6 +82,7 @@ #' \item 'dapc': population structure using the Discriminant Analysis of Principal Components #' \item 'genomics': handling large genome-wide SNP data using adegenet #' \item 'strata': introduction to hierarchical population structure in adegenet +#' \item 'snapclust': introduction to fast maximum-likelihood genetic clustering using snapclust #' } #' #' @export @@ -98,11 +99,11 @@ #' @rdname web #' @export -adegenetTutorial <- function(which = c("basics","spca","dapc","genomics","strata")){ +adegenetTutorial <- function(which = c("basics","spca","dapc","genomics","strata","snapclust")){ ## which <- match.arg(which) which <- which[1] - choices <- c("basics","spca","dapc","genomics","strata","genclust") + choices <- c("basics","spca","dapc","genomics","strata","snapclust") if (!which %in% choices) { stop("Unknown tutorial") } @@ -141,10 +142,10 @@ cat(" >> Seeking url: ",url,"\n ", sep="") cat("\n") } - if(which=="genclust"){ - url <- "https://github.com/thibautjombart/adegenet/raw/master/tutorials/tutorial-genclust.pdf" + if(which=="snapclust"){ + url <- "https://github.com/thibautjombart/adegenet/raw/master/tutorials/tutorial-snapclust.pdf" cat("\n") - cat(" >> Opening the genclust tutorial.\n") + cat(" >> Opening the snapclust tutorial.\n") cat(" >> Seeking url: ",url,"\n ", sep="") cat("\n") } diff -Nru adegenet-2.1.0/R/BIC.snapclust.R adegenet-2.1.1/R/BIC.snapclust.R --- adegenet-2.1.0/R/BIC.snapclust.R 2017-05-05 14:52:11.000000000 +0000 +++ adegenet-2.1.1/R/BIC.snapclust.R 2018-02-02 15:49:22.000000000 +0000 @@ -1,6 +1,8 @@ -#' Compute Bayesian Information Criterion (BIC) for snapclust +#' snapclust's Bayesian Information Criterion (BIC) +#' +#' This function computes the Bayesian Information Criterion (BIC) for +#' \code{snapclust} results. #' -#' Do not use. We work on that stuff. Contact us if interested. #' #' @author Thibaut Jombart \email{thibautjombart@@gmail.com} #' @@ -11,8 +13,22 @@ #' @param ... Further arguments for compatibility with the \code{BIC} generic #' (currently not used). #' -#' @seealso \code{\link{snapclust}} to generate clustering solutions. +#' @references Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast +#' likelihood solution to the genetic clustering problem. Methods Ecol +#' Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} +#' +#' @seealso +#' \itemize{ +#' \item \code{\link{snapclust}}: to identify clusters +#' +#' \item \code{\link{snapclust.choose.k}}: to find the number of clusters +#' +#' \item \code{\link{AIC.snapclust}}: AIC computation +#' +#' \item \code{\link{AICc.snapclust}}: AICc computation #' +#' \item \code{\link{KIC.snapclust}}: KIC computation +#' } #' BIC.snapclust <- function(object, ...) { diff -Nru adegenet-2.1.0/R/export_to_mvmapper.R adegenet-2.1.1/R/export_to_mvmapper.R --- adegenet-2.1.0/R/export_to_mvmapper.R 2017-10-11 21:08:15.000000000 +0000 +++ adegenet-2.1.1/R/export_to_mvmapper.R 2018-02-02 16:20:05.000000000 +0000 @@ -1,3 +1,4 @@ + #' Export analysis for mvmapper visualisation #' #' \code{mvmapper} is an interactive tool for visualising outputs of a @@ -11,6 +12,8 @@ #' \code{mvmapper} can be found at: #' \url{https://popphylotools.github.io/mvMapper/} #' +#' @aliases swallowtails +#' #' @author Thibaut Jombart \email{thibautjombart@@gmail.com} #' #' @@ -106,17 +109,35 @@ #' @rdname export_to_mvmapper #' @examples #' -#' data(sim2pop) +#' # An example using the microsatellite dataset of Dupuis et al. 2016 (781 +#' # individuals, 10 loci, doi: 10.1111/jeb.12931) +#' +#' # Reading input file from adegenet +#' +#' input_data <- system.file("data/swallowtails.rda", package="adegenet") +#' data(swallowtails) +#' +#' +#' # conducting a DAPC (n.pca determined using xvalDapc, see ??xvalDapc) +#' +#' dapc1 <- dapc(swallowtails, n.pca=40, n.da=200) +#' +#' +#' # read in swallowtails_loc.csv, which contains "key", "lat", and "lon" +#' # columns with column headers (this example contains additional columns +#' # containing species identifications, locality descriptions, and COI +#' # haplotype clades) #' -#' dapc1 <- dapc(sim2pop, n.pca = 10, n.da = 1) +#' input_locs <- system.file("files/swallowtails_loc.csv", package = "adegenet") +#' loc <- read.csv(input_locs, header = TRUE) #' -#' info <- data.frame(key = indNames(sim2pop), -#' lat = other(sim2pop)$xy[,2], -#' lon = other(sim2pop)$xy[,1], -#' Population = pop(sim2pop)) #' -#' out <- export_to_mvmapper(dapc1, info, write_file = FALSE) -#' head(out) +#' # generate mvmapper input file, automatically write the output to a csv, and +#' # name the output csv "mvMapper_Data.csv" +#' +#' out <- export_to_mvmapper(dapc1, loc, write_file = TRUE, +#' out_file = "mvMapper_Data.csv") +#' export_to_mvmapper.dapc <- function(x, info, write_file = TRUE, out_file = NULL, ...) { @@ -178,21 +199,7 @@ #' @export #' @rdname export_to_mvmapper -#' @examples -#' -#' data(rupica) -#' -#' spca1 <- spca(rupica, type=5, d1 = 0, d2 = 2300, -#' plot = FALSE, scannf = FALSE, -#' nfposi = 2,nfnega = 0) -#' -#' info <- data.frame(key = indNames(rupica), -#' lat = rupica$other$xy[,2], -#' lon = rupica$other$xy[,1]) -#' -#' out <- export_to_mvmapper(spca1, info, write_file = FALSE) -#' head(out) -#' + export_to_mvmapper.spca <- function(x, info, write_file = TRUE, out_file = NULL, ...) { diff -Nru adegenet-2.1.0/R/import.R adegenet-2.1.1/R/import.R --- adegenet-2.1.0/R/import.R 2017-10-11 21:08:49.000000000 +0000 +++ adegenet-2.1.1/R/import.R 2018-02-02 14:36:09.000000000 +0000 @@ -267,7 +267,7 @@ if (any(ploidy > 1)){ allele.data <- strsplit(X, sep) n.items <- sapply(allele.data, length) - locus.data <- rep(rep(loc.names, each=nind), n.items) + locus.data <- rep(rep(loc.names, each = nind), n.items) ind.data <- rep(rep(ind.names,ncol(X)), n.items) allele.data <- unlist(allele.data) } else { @@ -348,7 +348,18 @@ # M_KH1837 1 } - + ploidmat <- vapply(loc.names, function(i){ + rowSums(out[, grepl(paste0("^", i, "\\."), colnames(out)), drop = FALSE], na.rm = TRUE) + }, FUN.VALUE = double(nrow(out))) + if (max(ploidmat, na.rm = TRUE) > max(ploidy, na.rm = TRUE)) { + oran <- paste(range(ploidmat, na.rm = TRUE), collapse = "-") + eran <- paste(range(ploidy, na.rm = TRUE), collapse = "-") + msg <- paste0("The observed allele dosage (", oran, ") ", + "does not match the defined ploidy ", "(", eran, ").\n", + "Please check that your input parameters (ncode, sep) ", + "are correct.") + warning(msg, immediate. = TRUE) + } ## call upon genind constructor prevcall <- match.call() out <- genind(tab=out, pop=pop, prevcall=prevcall, ploidy=ploidy, type=type, @@ -412,7 +423,7 @@ txt <- scan(file,skip=2,what="character",sep="\n",quiet=TRUE) txt <- gsub("\t"," ",txt) ## check that nloc is consistent with actual nloc (bug-report 1.2-2.02) - temp <- temp <- .rmspaces(txt[length(txt)]) + temp <- temp <- trimws(txt[length(txt)]) nlocbis <- length(unlist(strsplit(temp, "[[:space:]]+")))-1 if(nloc != nlocbis) { warning(paste("\n== Genetix file error == \n", @@ -436,11 +447,11 @@ temp[i] <- index index <- index + pop.nind[i] + 2 } - pop.names <- .rmspaces(pop.names) + pop.names <- trimws(pop.names) ## retrieve genotypes infos txt <- txt[-c(temp,temp+1)] - txt <- .rmspaces(txt) + txt <- trimws(txt) txt <- sapply(1:length(txt),function(i) unlist(strsplit(txt[i],"([[:space:]]+)|([[:blank:]]+)")) ) X <- t(txt) if(ncol(X) == (nloc+1)){ @@ -523,7 +534,7 @@ ## build genotype matrix txt <- txt[-(1:(nloc+1))] - txt <- .rmspaces(txt) + txt <- trimws(txt) txt <- sapply(1:length(txt),function(i) unlist(strsplit(txt[i],"([[:space:]]+)|([[:blank:]]+)")) ) X <- t(txt) pop <- as.character(X[,1]) @@ -615,7 +626,7 @@ locinfo <- txt[locinfo.idx] locinfo <- paste(locinfo,collapse=",") loc.names <- unlist(strsplit(locinfo,"([,]|[\n])+")) - loc.names <- .rmspaces(loc.names) + loc.names <- trimws(loc.names) nloc <- length(loc.names) txt <- txt[-locinfo.idx] @@ -649,12 +660,12 @@ temp <- sapply(1:length(txt),function(i) strsplit(txt[i],",")) ## temp is a list with nind elements, first being ind. name and 2nd, genotype - ind.names <- sapply(temp,function(e) e[1]) - ind.names <- .rmspaces(ind.names) + ind.names <- vapply(temp, function(e) e[1], character(1)) + ind.names <- trimws(ind.names) ## individuals' name are now clean - vec.genot <- sapply(temp,function(e) e[2]) - vec.genot <- .rmspaces(vec.genot) + vec.genot <- vapply(temp, function(e) e[2], character(1)) + vec.genot <- trimws(vec.genot) ## X is a individual x locus genotypes matrix X <- matrix(unlist(strsplit(vec.genot,"[[:space:]]+")),ncol=nloc,byrow=TRUE) @@ -846,7 +857,7 @@ ## markers names if(row.marknames != 0) { - loc.names <- .rmspaces(txt[row.marknames]) + loc.names <- trimws(txt[row.marknames]) loc.names <- unlist(strsplit(loc.names,"[[:blank:]]+")) } else { loc.names <- .genlab("L",n.loc) diff -Nru adegenet-2.1.0/R/KIC.snapclust.R adegenet-2.1.1/R/KIC.snapclust.R --- adegenet-2.1.0/R/KIC.snapclust.R 2017-09-27 10:19:15.000000000 +0000 +++ adegenet-2.1.1/R/KIC.snapclust.R 2018-02-02 15:49:15.000000000 +0000 @@ -1,6 +1,7 @@ -#' Compute Akaike Information Criterion for small samples (AICc) for snapclust +#' snapclust's Kullback Information Criterion (KIC) #' -#' Do not use. We work on that stuff. Contact us if interested. +#' This function computes Kullback Information Criterion (KIC) for +#' \code{snapclust} results. #' #' @author Thibaut Jombart \email{thibautjombart@@gmail.com} #' @@ -11,8 +12,24 @@ #' @param ... Further arguments for compatibility with the \code{AIC} generic #' (currently not used). #' -#' @seealso \code{\link{snapclust}} to generate clustering solutions. +#' @seealso +#' \itemize{ +#' \item \code{\link{snapclust}}: to identify clusters #' +#' \item \code{\link{snapclust.choose.k}}: to find the number of clusters +#' +#' \item \code{\link{AIC.snapclust}}: AIC computation +#' +#' \item \code{\link{AICc.snapclust}}: AICc computation +#' +#' \item \code{\link{BIC.snapclust}}: BIC computation +#' +#' } +#' +#' @references Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast +#' likelihood solution to the genetic clustering problem. Methods Ecol +#' Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} +#' #' @rdname KIC #' KIC <- function(object, ...) { diff -Nru adegenet-2.1.0/R/showmekittens.R adegenet-2.1.1/R/showmekittens.R --- adegenet-2.1.0/R/showmekittens.R 2016-12-03 14:02:42.000000000 +0000 +++ adegenet-2.1.1/R/showmekittens.R 2017-11-17 13:33:32.000000000 +0000 @@ -21,7 +21,9 @@ showmekittens <- function(x = NULL, list = FALSE){ ## 'pool' is a named character vector of video URLs pool <- c(capucine = "http://www.youtube.com/watch?v=KIePsbJSS04", - vacuum = "https://www.youtube.com/watch?v=uiyKVWqxXWM") + vacuum = "https://www.youtube.com/watch?v=9J4UKYm9320", + eclipse = "https://www.youtube.com/watch?v=RsUH2MuY33o", + nom = "https://www.youtube.com/watch?v=Cl5Pfc5TyO0") ## either we return the list of videos, or we show one if (list) { diff -Nru adegenet-2.1.0/R/snapclust.choose.k.R adegenet-2.1.1/R/snapclust.choose.k.R --- adegenet-2.1.0/R/snapclust.choose.k.R 2017-09-27 10:19:15.000000000 +0000 +++ adegenet-2.1.1/R/snapclust.choose.k.R 2018-02-02 15:47:03.000000000 +0000 @@ -1,14 +1,33 @@ -#' Choose the number of clusters for snapclust using BIC +#' Choose the number of clusters for snapclust #' -#' Do not use. We work on that stuff. Contact us if interested. +#' The function \code{snapclust.choose.k} can be used to identify optimal values +#' of 'k' (number of panmictic clusters) using \code{snapclust}. It runs the +#' method for increasing values of 'k' and for each computes goodness-of-fit +#' statistics. These statistics are all different versions of deviance penalised +#' for the number of parameters, so that lower values should correspond to more +#' optimal clustering solutions. Currently available statistics include AIC, +#' AICc, BIC, and KIC.\cr +#' +#' There is no theoretical basis for favouring a given statistic over another +#' in the case of genetic clustering. In practice, one should look for an +#' 'elbow' in the curve of the statistics as a function of 'k'. #' #' @author Thibaut Jombart \email{thibautjombart@@gmail.com} #' #' @export #' -#' @seealso \code{\link{snapclust}} to generate individual clustering solutions, -#' and \code{\link{BIC.snapclust}} for computing BIC for \code{snapclust} -#' objects. +#' @seealso +#' \itemize{ +#' \item \code{\link{snapclust}}: to identify clusters +#' +#' \item \code{\link{AIC.snapclust}}: AIC computation +#' +#' \item \code{\link{AICc.snapclust}}: AICc computation +#' +#' \item \code{\link{BIC.snapclust}}: BIC computation +#' +#' \item \code{\link{KIC.snapclust}}: KIC computation +#' } #' #' @param max An integer indicating the maximum number of clusters to seek; #' \code{\link{snapclust}} will be run for all k from 2 to max. @@ -16,13 +35,31 @@ #' @param IC A function computing the information criterion for #' \code{\link{snapclust}} objects. Available statistics are #' \code{AIC} (default), \code{AICc}, and \code{BIC}. -#' +#' #' @param IC.only A logical (TRUE by default) indicating if IC values only #' should be returned; if \code{FALSE}, full \code{snapclust} objects are #' returned. #' #' @param ... Arguments passed to \code{\link{snapclust}}. +#' @examples +#' \dontrun{ +#' ## 'a' is a simulated dataset with 6 populations, island model +#' data(dapcIllus) +#' a <- dapcIllus$a +#' a +#' +#' ## try and choose 'k' using AIC (real value = 6) +#' a.aic <- snapclust.choose.k(max = 10, a) +#' plot(1:10, a.aic, xlab = "Number of clusters (k)", +#' ylab = "AIC", type = "b", pch = 20, cex = 3) +#' +#' ## try and choose 'k' using AIC (real value = 6) +#' a.kic <- snapclust.choose.k(max = 10, a, IC = KIC) +#' plot(1:10, a.kic, xlab = "Number of clusters (k)", +#' ylab = "KIC", type = "b", pch = 20, cex = 3) +#' #' +#' } snapclust.choose.k <- function(max, ..., IC = AIC, IC.only = TRUE) { ## This function is a glorified for loop which runs snapclust for several @@ -30,7 +67,7 @@ ## BIC), and can also return the full snapclust objects if needed. For ## k=1, AIC and BIC are computed via an internal (i.e. non-exported) ## procedure. - + max <- as.integer(max) if (any(!is.finite(max))) { stop("Values of k need to be finite.") @@ -41,16 +78,19 @@ k.values <- 2:max call.args <- list(...) - genind.posi <- match("genind", sapply(call.args, class)) - if (is.na(genind.posi)) { + genind.posi <- which(vapply(call.args, inherits, logical(1), "genind")) + if (length(genind.posi) == 0) { stop("No genind provided in '...'.") + } else if (length(genind.posi) > 1){ + warning("Too many genind objects provided in '...'. I am taking the first one.") + genind.posi <- genind.posi[1] } names(call.args)[genind.posi] <- "x" out.IC <- double(length(k.values)) out.objects <- list(length(k.values)) - + for (i in seq_along(k.values)) { ## get clustering solution for 'k' call.args$k <- k.values[i] @@ -61,7 +101,7 @@ out.IC <- .compute.null.IC(call.args$x) out.IC <- c(out.IC, vapply(out.objects, IC, double(1))) names(out.IC) <- 1:max - + if (IC.only) { out <- out.IC } else { @@ -90,12 +130,26 @@ pop.freq <- tab(genind2genpop(x, pop = group, quiet = TRUE), freq = TRUE) - ## browser() + if (!is.genind(x)) { + stop("x is not a valid genind object") + } + + if (any(ploidy(x) > 2)) { + stop("snapclust not currently implemented for ploidy > 2") + } + + if (all(ploidy(x) == 1)) { + .ll.genotype <- .ll.genotype.haploid + } else if (all(ploidy(x) == 2)) { + .ll.genotype <- .ll.genotype.diploid + } else { + stop("snapclust not currently implemented for varying ploidy") + } ## get likelihoods of genotypes ll.mat <- apply(genotypes, 1, .ll.genotype, pop.freq, n.loc) ll.mat <- matrix(ll.mat, nrow = 1) - + ll <- .global.ll(group, ll.mat) ## make a fake snapclust object to get IC diff -Nru adegenet-2.1.0/R/snapclust.R adegenet-2.1.1/R/snapclust.R --- adegenet-2.1.0/R/snapclust.R 2017-10-03 10:40:58.000000000 +0000 +++ adegenet-2.1.1/R/snapclust.R 2018-02-02 16:18:13.000000000 +0000 @@ -1,6 +1,47 @@ #' Maximum-likelihood genetic clustering using EM algorithm #' -#' Do not use. We work on that stuff. Contact us if interested. +#' The function \code{snapclust} implements fast maximum-likelihood (ML) genetic +#' clustering using a 2-step approach: find a 'good' initial starting point +#' using a fast geometric (distance-based) approach, followed by an efficient +#' likelihood optimization using the expectation-maximization (EM) +#' algorithm. The likelihood for a given locus is defined as the probability of +#' a given genotype given the allele frequencies of its originating population, +#' as defined by Hardy-Weinberg equilibrium. Different approaches are available +#' for the initial distance-based clustering (see argument \code{pop.ini}). The +#' current implementation is designed for haploid or diploid data, and assumes +#' constant ploidy within the dataset. +#' +#' This function can be used in two modes: +#' +#' \itemize{ +#' +#' \item genetic clustering mode: assign individuals to a known number 'k' +#' of panmictic clusters; see \code{\link{snapclust.choose.k}} for identifying +#' optimal values of 'k'. +#' +#' \item hybrid mode: as previous mode, but with the additional constraint that +#' clusters are either one of the 2 parental populations, or any hybrid classes +#' in between, as defined by the parameter \code{hybrid.coef}. +#' +#' } +#' +#' This method is documented in an online tutorial, which can be opened by typing: +#' \code{adegenetTutorial("snapclust")}. +#' +#' @seealso +#' \itemize{ +#' \item \code{\link{snapclust.choose.k}} to choose 'k' using various +#' goodness-of-fit statistics +#' +#' \item \code{\link{AIC.snapclust}}: AIC computation +#' +#' \item \code{\link{AICc.snapclust}}: AICc computation +#' +#' \item \code{\link{BIC.snapclust}}: BIC computation +#' +#' \item \code{\link{KIC.snapclust}}: KIC computation +#' +#' } #' #' @author Thibaut Jombart \email{thibautjombart@@gmail.com} and Marie-Pauline #' Beugin @@ -15,7 +56,7 @@ #' #' @param pop.ini parameter indicating how the initial group membership should #' be found. If \code{NULL}, groups are chosen at random, and the algorithm -#' will be run \code{n.start times}. If "kmeans", then the function +#' will be run \code{n.start} times. If "kmeans", then the function #' \code{find.clusters} is used to define initial groups using the K-means #' algorithm. If "ward", then the function \code{find.clusters} is used to #' define initial groups using the Ward algorithm. Alternatively, a factor @@ -75,6 +116,10 @@ #' #' } #' +#' @references Beugin M-P, Gayet T, Pontier D, Devillard S, Jombart T. A fast +#' likelihood solution to the genetic clustering problem. Methods Ecol +#' Evol. 2018;00:1–11. \url{https://doi.org/10.1111/2041-210X.12968} +#' #' @examples #' \dontrun{ #' data(microbov) @@ -128,182 +173,200 @@ #' #' ## method with back-cross #' res2.back <- snapclust(y, k = 2, hybrids = TRUE, hybrid.coef = c(.25,.5)) -#' compoplot(res2.hyb, col.pal = hybridpal(), n.col = 2) +#' compoplot(res2.back, col.pal = hybridpal(), n.col = 2) #' #' } snapclust <- function(x, k, pop.ini = "ward", max.iter = 100, n.start = 10, - n.start.kmeans = 50, - hybrids = FALSE, dim.ini = 100, - hybrid.coef = NULL, parent.lab = c('A', 'B'), ...) { - ## This function uses the EM algorithm to find ML group assignment of a set - ## of genotypes stored in a genind object into 'k' clusters. We need an - ## initial cluster definition to start with. The rest of the algorithm - ## consists of: - - ## i) compute the matrix of allele frequencies + n.start.kmeans = 50, hybrids = FALSE, dim.ini = 100, + hybrid.coef = NULL, parent.lab = c('A', 'B'), ...) { - ## ii) compute the likelihood of each genotype for each group - - ## iii) assign genotypes to the group for which they have the highest - ## likelihood - - ## iv) go back to i) until convergence + if (!is.genind(x)) { + stop("x is not a valid genind object") + } + + if (any(ploidy(x) > 2)) { + stop("snapclust not currently implemented for ploidy > 2") + } + + if (all(ploidy(x) == 1)) { + .ll.genotype <- .ll.genotype.haploid + } else if (all(ploidy(x) == 2)) { + .ll.genotype <- .ll.genotype.diploid + } else { + stop("snapclust not currently implemented for varying ploidy") + } + + ## This function uses the EM algorithm to find ML group assignment of a set + ## of genotypes stored in a genind object into 'k' clusters. We need an + ## initial cluster definition to start with. The rest of the algorithm + ## consists of: + + ## i) compute the matrix of allele frequencies + + ## ii) compute the likelihood of each genotype for each group + + ## iii) assign genotypes to the group for which they have the highest + ## likelihood + + ## iv) go back to i) until convergence + + + ## Disable multiple starts if the initial condition is not random + use.random.start <- is.null(pop.ini) + if (!use.random.start) { + n.start <- 1L + } + + if (n.start < 1L) { + stop(sprintf( + "n.start is less than 1 (%d); using n.start=1", n.start)) + } + + if (hybrids && k > 2) { + warning(sprintf( + "forcing k=2 for hybrid mode (requested k is %d)", k)) + k <- 2 + } + + + ## Handle hybrid coefficients; these values reflect the contribution of the + ## first parental population to the allele frequencies of the hybrid + ## group. For instance, a value of 0.75 indicates that 'a' contributes to + ## 75%, and 'b' 25% of the allele frequencies of the hybrid - a typical + ## backcross F1 / a. + + if (hybrids) { + if (is.null(hybrid.coef)) { + hybrid.coef <- 0.5 + } + hybrid.coef <- .tidy.hybrid.coef(hybrid.coef) + } - ## Disable multiple starts if the initial condition is not random - use.random.start <- is.null(pop.ini) - if (!use.random.start) { - n.start <- 1L + ## Initialisation using 'find.clusters' + if (!is.null(pop.ini)) { + if (tolower(pop.ini)[1] %in% c("kmeans", "k-means")) { + pop.ini <- find.clusters(x, n.clust = k, n.pca = dim.ini, + n.start = n.start.kmeans, + method = "kmeans", ...)$grp + } else if (tolower(pop.ini)[1] %in% c("ward")) { + pop.ini <- find.clusters(x, n.clust = k, n.pca = dim.ini, + method = "ward", ...)$grp } + } - if (n.start < 1L) { - stop(sprintf( - "n.start is less than 1 (%d); using n.start=1", n.start)) + ## There is one run of the EM algo for each of the n.start random initial + ## conditions. + ll <- -Inf # this will be the total loglike + + for (i in seq_len(n.start)) { + + ## Set initial conditions: if initial pop is NULL, we create a random + ## group definition (each clusters have same probability) + if (use.random.start) { + pop.ini <- sample(seq_len(k), nInd(x), replace=TRUE) } - if (hybrids && k > 2) { - warning(sprintf( - "forcing k=2 for hybrid mode (requested k is %d)", k)) - k <- 2 + ## process initial population, store levels + pop.ini <- factor(pop.ini) + lev.ini <- levels(pop.ini)[1:k] # k+1 would be hybrids + + ## ensure 'pop.ini' matches 'k' + if (! (length(levels(pop.ini)) %in% c(k, k + length(hybrid.coef))) ) { + stop("pop.ini does not have k clusters") } + ## initialisation + group <- factor(as.integer(pop.ini)) # set levels to 1:k (or k+1) + genotypes <- tab(x) + n.loc <- nLoc(x) + counter <- 0L + converged <- FALSE + + + ## This is the actual EM algorithm + + while(!converged && counter<=max.iter) { + + ## get table of allele frequencies (columns) by population (rows); + ## these are stored as 'pop.freq'; note that it will include extra + ## rows for different types of hybrids too. + + if (hybrids) { + pop(x) <- group + id.parents <- .find.parents(x) + x.parents <- x[id.parents] + pop.freq <- tab(genind2genpop(x.parents, quiet=TRUE), + freq=TRUE) + pop.freq <- rbind(pop.freq, # parents + .find.freq.hyb(pop.freq, hybrid.coef)) # hybrids + } else { + pop.freq <- tab(genind2genpop(x, pop=group, quiet=TRUE), + freq=TRUE) + } + + ## ensures no allele frequency is exactly zero + pop.freq <- .tidy.pop.freq(pop.freq, locFac(x)) + + ## get likelihoods of genotypes in every pop + ll.mat <- apply(genotypes, 1, .ll.genotype, pop.freq, n.loc) + + ## assign individuals to most likely cluster + previous.group <- group + group <- apply(ll.mat, 2, which.max) + + ## check convergence + ## converged <- all(group == previous.group) + old.ll <- .global.ll(previous.group, ll.mat) + new.ll <- .global.ll(group, ll.mat) + if (!is.finite(new.ll)) { + ## stop(sprintf("log-likelihood at iteration %d is not finite (%f)", + ## counter, new.ll)) + } + converged <- abs(old.ll - new.ll) < 1e-14 + counter <- counter + 1L - ## Handle hybrid coefficients; these values reflect the contribution of the - ## first parental population to the allele frequencies of the hybrid - ## group. For instance, a value of 0.75 indicates that 'a' contributes to - ## 75%, and 'b' 25% of the allele frequencies of the hybrid - a typical - ## backcross F1 / a. - - if (hybrids) { - if (is.null(hybrid.coef)) { - hybrid.coef <- 0.5 - } - hybrid.coef <- .tidy.hybrid.coef(hybrid.coef) } + ## ## store the best run so far + ## new.ll <- .global.ll(group, ll.mat) - ## Initialisation using 'find.clusters' - if (!is.null(pop.ini)) { - if (tolower(pop.ini)[1] %in% c("kmeans", "k-means")) { - pop.ini <- find.clusters(x, n.clust = k, n.pca = dim.ini, - n.start = n.start.kmeans, - method = "kmeans", ...)$grp - } else if (tolower(pop.ini)[1] %in% c("ward")) { - pop.ini <- find.clusters(x, n.clust = k, n.pca = dim.ini, - method = "ward", ...)$grp - } + if (new.ll > ll || i == 1L) { + ## store results + ll <- new.ll + out <- list(group = group, ll = ll) + + ## group membership probability + rescaled.ll.mat <- .rescale.ll.mat(ll.mat) + out$proba <- prop.table(t(exp(rescaled.ll.mat)), 1) + + out$converged <- converged + out$n.iter <- counter } + } # end of the for loop - ## There is one run of the EM algo for each of the n.start random initial - ## conditions. - ll <- -Inf # this will be the total loglike - - for (i in seq_len(n.start)) { - - ## Set initial conditions: if initial pop is NULL, we create a random - ## group definition (each clusters have same probability) - if (use.random.start) { - pop.ini <- sample(seq_len(k), nInd(x), replace=TRUE) - } - - ## process initial population, store levels - pop.ini <- factor(pop.ini) - lev.ini <- levels(pop.ini)[1:k] # k+1 would be hybrids - - ## ensure 'pop.ini' matches 'k' - if (! (length(levels(pop.ini)) %in% c(k, k + length(hybrid.coef))) ) { - stop("pop.ini does not have k clusters") - } - - ## initialisation - group <- factor(as.integer(pop.ini)) # set levels to 1:k (or k+1) - genotypes <- tab(x) - n.loc <- nLoc(x) - counter <- 0L - converged <- FALSE - - - ## This is the actual EM algorithm - - while(!converged && counter<=max.iter) { - - ## get table of allele frequencies (columns) by population (rows); - ## these are stored as 'pop.freq'; note that it will include extra - ## rows for different types of hybrids too. - - if (hybrids) { - pop(x) <- group - id.parents <- .find.parents(x) - x.parents <- x[id.parents] - pop.freq <- tab(genind2genpop(x.parents, quiet=TRUE), - freq=TRUE) - pop.freq <- rbind(pop.freq, # parents - .find.freq.hyb(pop.freq, hybrid.coef)) # hybrids - } else { - pop.freq <- tab(genind2genpop(x, pop=group, quiet=TRUE), - freq=TRUE) - } - - ## ensures no allele frequency is exactly zero - pop.freq <- .tidy.pop.freq(pop.freq, locFac(x)) - - ## get likelihoods of genotypes in every pop - ll.mat <- apply(genotypes, 1, .ll.genotype, pop.freq, n.loc) - - ## assign individuals to most likely cluster - previous.group <- group - group <- apply(ll.mat, 2, which.max) - - ## check convergence - ## converged <- all(group == previous.group) - old.ll <- .global.ll(previous.group, ll.mat) - new.ll <- .global.ll(group, ll.mat) - if (!is.finite(new.ll)) { - ## stop(sprintf("log-likelihood at iteration %d is not finite (%f)", - ## counter, new.ll)) - } - converged <- abs(old.ll - new.ll) < 1e-14 - counter <- counter + 1L - - } - - ## ## store the best run so far - ## new.ll <- .global.ll(group, ll.mat) - - if (new.ll > ll || i == 1L) { - ## store results - ll <- new.ll - out <- list(group = group, ll = ll) - - ## group membership probability - out$proba <- prop.table(t(exp(ll.mat)), 1) - out$converged <- converged - out$n.iter <- counter - } - } # end of the for loop - - ## restore labels of groups - out$group <- factor(out$group) - if (hybrids) { - if (!is.null(parent.lab)) { - lev.ini <- parent.lab - } - hybrid.labels <- paste0(hybrid.coef, "_", lev.ini[1], "-", - 1 - hybrid.coef, "_", lev.ini[2]) - lev.ini <- c(lev.ini, hybrid.labels) + ## restore labels of groups + out$group <- factor(out$group) + if (hybrids) { + if (!is.null(parent.lab)) { + lev.ini <- parent.lab } - levels(out$group) <- lev.ini - colnames(out$proba) <- lev.ini + hybrid.labels <- paste0(hybrid.coef, "_", lev.ini[1], "-", + 1 - hybrid.coef, "_", lev.ini[2]) + lev.ini <- c(lev.ini, hybrid.labels) + } + levels(out$group) <- lev.ini + colnames(out$proba) <- lev.ini - ## compute the number of parameters; it is defined as the number of 'free' - ## allele frequencies, multiplied by the number of groups + ## compute the number of parameters; it is defined as the number of 'free' + ## allele frequencies, multiplied by the number of groups - out$n.param <- (ncol(genotypes) - n.loc) * length(lev.ini) + out$n.param <- (ncol(genotypes) - n.loc) * length(lev.ini) - class(out) <- c("snapclust", "list") - return(out) + class(out) <- c("snapclust", "list") + return(out) } @@ -324,24 +387,44 @@ ## TODO: extend this to various ploidy levels, possibly optimizing procedures ## for haploids. -.ll.genotype <- function(x, pop.freq, n.loc){ - ## homozygote (diploid) - ## p(AA) = f(A)^2 for each locus - ll.homoz.one.indiv <- function(f) { - sum(log(f[x == 2L]), na.rm = TRUE) * 2 - } +.ll.genotype.diploid <- function(x, pop.freq, n.loc){ + ## homozygote (diploid) + ## p(AA) = f(A)^2 for each locus + ## so that log(p(AA)) = 2 * log(f(A)) + ll.homoz.one.indiv <- function(f) { + sum(log(f[x == 2L]), na.rm = TRUE) * 2 + } + + ll.homoz <- apply(pop.freq, 1, ll.homoz.one.indiv) + + ## heterozygote (diploid, expl with 2 loci) + ## p(AB) = 2 * f(A) f(B) + ## so that log(p(AB)) = log(f(A)) + log(f(B)) + log(2) + ## if an individual is heterozygote for n.heter loci, the term + ## log(2) will be added n.heter times + + ll.hetero.one.indiv <- function(f) { + n.heter <- sum(x == 1L, na.rm = TRUE) / 2 + sum(log(f[x == 1L]), na.rm = TRUE) + n.heter * log(2) + } - ll.homoz <- apply(pop.freq, 1, ll.homoz.one.indiv) + ll.heteroz <- apply(pop.freq, 1, ll.hetero.one.indiv) + + return(ll.homoz + ll.heteroz) +} - ## heterozygote (diploid, expl with 2 loci) - ## p(Aa)p(Bb) = 2^n.loc * f(A)f(a) f(B)f(b) - ll.hetero.one.indiv <- function(f) { - sum(log(f[x == 1L]), na.rm = TRUE) + n.loc * log(2) - } - ll.heteroz <- apply(pop.freq, 1, ll.hetero.one.indiv) - return(ll.homoz + ll.heteroz) +.ll.genotype.haploid <- function(x, pop.freq, n.loc){ + + ## p(A) = f(A) for each locus + ll.one.indiv <- function(f) { + sum(log(f[x == 1L]), na.rm = TRUE) + } + + ll <- apply(pop.freq, 1, ll.one.indiv) + + return(ll) } @@ -353,7 +436,7 @@ ## assignments and a table of ll of genotypes in each group .global.ll <- function(group, ll){ - sum(t(ll)[cbind(seq_along(group), as.integer(group))], na.rm=TRUE) + sum(t(ll)[cbind(seq_along(group), as.integer(group))], na.rm=TRUE) } @@ -372,9 +455,9 @@ ## proximity to the first parental population. .tidy.hybrid.coef <- function(w) { - w <- w[w > 0 & w < 1] - w <- sort(unique(round(c(w, 1-w), 4)), decreasing = TRUE) - w + w <- w[w > 0 & w < 1] + w <- sort(unique(round(c(w, 1-w), 4)), decreasing = TRUE) + w } @@ -402,9 +485,9 @@ ## alleles in columns. .find.freq.hyb <- function(x, w) { - out <- cbind(w, 1-w) %*% x - rownames(out) <- w - out + out <- cbind(w, 1-w) %*% x + rownames(out) <- w + out } @@ -417,11 +500,11 @@ ## from the parental populations. .find.parents <- function(x) { - ## matrix of pairwise distances between clusters, using Nei's distance - D <- as.matrix(dist.genpop(genind2genpop(x, quiet = TRUE), method = 1)) - parents <- which(abs(max(D)-D) < 1e-14, TRUE)[1,] - out <- which(as.integer(pop(x)) %in% parents) - out + ## matrix of pairwise distances between clusters, using Nei's distance + D <- as.matrix(dist.genpop(genind2genpop(x, quiet = TRUE), method = 1)) + parents <- which(abs(max(D)-D) < 1e-14, TRUE)[1,] + out <- which(as.integer(pop(x)) %in% parents) + out } @@ -453,13 +536,77 @@ ## returned by 'locFac([a genind])' .tidy.pop.freq <- function(pop.freq, loc.fac) { - g <- function(f, a = .01) { - (a + f) / sum(a + f) + g <- function(f, a = .01) { + (a + f) / sum(a + f) + } + + out <- matrix(unlist(apply(pop.freq, 1, tapply, loc.fac, g), + use.names = FALSE), + byrow=TRUE, nrow=nrow(pop.freq)) + dimnames(out) <- dimnames(pop.freq) + return(out) +} + + + +## This function rescales log-likelihood values prior to the computation of +## group membership probabilities. + +## issue reported: prop.table(t(exp(ll.mat)), 1) can cause some numerical +## approximation problems; if numbers are large, exp(...) will return Inf +## and the group membership probabilities cannot be computed +## +## Solution: rather than use p_a = exp(ll_a) / (exp(ll_a) + exp(ll_b)) +## we can use p_a = exp(ll_a - C) / (exp(ll_a - C) + exp(ll_b - C)) + +## where 'C' is a sufficiently large constant so that exp(ll_i + C) is +## computable; naively we could use C = max(ll.mat), but the problem is this +## scaling can cause -Inf likelihoods too. In practice, we need to allow +## different scaling for each individual. + +##out$proba <- +## prop.table(t(exp(ll.mat)), 1) + + +.rescale.ll.mat <- function(ll.mat) { + ## we first compute ad-hoc minimum and maximum values of log-likelihood; these + ## will be computer dependent; this is a quick fix, but better alternatives + ## can be found. + + ## smallest ll such that exp(ll) is strictly > 0 + new_min <- (0:-1000)[max(which(exp(0:-1000) > 0))] + + ## largest ll such that exp(ll) is strictly less than +Inf + new_max <- (1:1000)[max(which(exp(1:1000) < Inf))] + + counter <- 0 + + + ## find rescaling for a single individual; + ## x: vector of ll values + rescale.ll.indiv <- function(x) { + ## set minimum to new_min + x <- x - min(x) + new_min + + ## set sum to the maximum + if (sum(x) > new_max) { + counter <<- counter + 1 + x <- x - min(x) # reset min to 0 + x <- new_min + (x / sum(x)) * new_max # range: new_min to new_max } + return(x) + } + + out <- apply(ll.mat, 2, rescale.ll.indiv) + + if (counter > 0) { + msg <- paste("Large dataset syndrome:\n", + "for", counter, "individuals,", + "differences in log-likelihoods exceed computer precision;\n", + "group membership probabilities are approximated\n", + "(only trust clear-cut values)") + message(msg) + } - out <- matrix(unlist(apply(pop.freq, 1, tapply, loc.fac, g), - use.names = FALSE), - byrow=TRUE, nrow=nrow(pop.freq)) - dimnames(out) <- dimnames(pop.freq) - return(out) + return(out) } diff -Nru adegenet-2.1.0/README.md adegenet-2.1.1/README.md --- adegenet-2.1.0/README.md 2017-03-17 20:13:19.000000000 +0000 +++ adegenet-2.1.1/README.md 2017-11-23 17:21:44.000000000 +0000 @@ -6,6 +6,8 @@ [![CRAN Downloads](https://cranlogs.r-pkg.org/badges/adegenet)](https://cran.r-project.org/package=adegenet) +[![Research software impact](http://depsy.org/api/package/cran/adegenet/badge.svg)](http://depsy.org/package/r/adegenet) + adegenet ======== *adegenet*: a R Package for the Multivariate Analysis of Genetic Markers diff -Nru adegenet-2.1.0/tests/testthat/test_accessors.R adegenet-2.1.1/tests/testthat/test_accessors.R --- adegenet-2.1.0/tests/testthat/test_accessors.R 2017-09-27 10:19:15.000000000 +0000 +++ adegenet-2.1.1/tests/testthat/test_accessors.R 2017-11-17 13:33:32.000000000 +0000 @@ -5,43 +5,43 @@ test_that("individual accessors work as expected", { skip_on_cran() - expect_that(nInd(microbov), equals(704)) + expect_equal(nInd(microbov), 704) indNames(microbov)[1] <- "replacement" - expect_that(indNames(microbov)[1], equals("replacement")) + expect_equal(indNames(microbov)[1], "replacement") }) test_that("population accessors work for genind objects", { skip_on_cran() - expect_that(nPop(microbov), equals(15)) - expect_that(popNames(microbov), is_equivalent_to(levels(pop(microbov)))) + expect_equal(nPop(microbov), 15) + expect_equivalent(popNames(microbov), levels(pop(microbov))) popNames(microbov)[1] <- "replacement" - expect_that(popNames(microbov)[1], equals("replacement")) - expect_that(unique(head(pop(microbov))), is_equivalent_to(factor("replacement"))) + expect_equal(popNames(microbov)[1], "replacement") + expect_equivalent(unique(head(pop(microbov))), factor("replacement")) }) test_that("population accessors work for genpop objects", { skip_on_cran() micpop <- genind2genpop(microbov, quiet = TRUE) - expect_that(nPop(micpop), equals(15)) - expect_that(popNames(micpop), is_equivalent_to(rownames(micpop@tab))) + expect_equal(nPop(micpop), 15) + expect_equivalent(popNames(micpop), rownames(micpop@tab)) popNames(micpop)[1] <- "replacement" - expect_that(popNames(micpop)[1], equals("replacement")) - expect_that(rownames(micpop@tab)[1], equals("replacement")) + expect_equal(popNames(micpop)[1], "replacement") + expect_equal(rownames(micpop@tab)[1], "replacement") }) test_that("locus accessors work for genind objects", { skip_on_cran() - expect_that(nLoc(microbov), equals(30)) + expect_equal(nLoc(microbov), 30) locNames(microbov)[1] <- "replacement" - expect_that(locNames(microbov)[1], equals("replacement")) + expect_equal(locNames(microbov)[1], "replacement") }) test_that("locus accessors work for genpop objects", { skip_on_cran() micpop <- genind2genpop(microbov, quiet = TRUE) - expect_that(nLoc(micpop), equals(30)) + expect_equal(nLoc(micpop), 30) locNames(micpop)[1] <- "replacement" - expect_that(locNames(micpop)[1], equals("replacement")) + expect_equal(locNames(micpop)[1], "replacement") }) test_that("'[' method works for genind objects", { @@ -62,26 +62,26 @@ names(two_random_loci) <- two_random_loci two_random_loci <- two_random_loci[levels(loci)] - expect_that(nInd(mic10), equals(10)) - expect_that(nInd(mic2Loc), equals(nInd(microbov))) - expect_that(nInd(mic2Loc10), equals(10)) - - expect_that(nLoc(mic10), equals(nLoc(microbov))) - expect_that(nLoc(mic2Loc), equals(2)) - expect_that(nLoc(mic2Loc10), equals(2)) + expect_equal(nInd(mic10), 10) + expect_equal(nInd(mic2Loc), nInd(microbov)) + expect_equal(nInd(mic2Loc10), 10) + + expect_equal(nLoc(mic10), nLoc(microbov)) + expect_equal(nLoc(mic2Loc), 2) + expect_equal(nLoc(mic2Loc10), 2) expect_equivalent(popNames(mic10), pops) expect_equivalent(popNames(mic2Loc10), pops) - expect_that(nPop(mic10), equals(length(pops))) - expect_that(nPop(mic2Loc10), equals(length(pops))) + expect_equal(nPop(mic10), length(pops)) + expect_equal(nPop(mic2Loc10), length(pops)) - expect_that(length(mic10@loc.fac), equals(ncol(tab(microbov)))) - expect_that(mic2Loc@loc.fac, equals(loci)) - expect_that(mic2Loc10@loc.fac, equals(loci)) - - expect_that(mic10@loc.n.all, equals(microbov@loc.n.all)) - expect_that(mic2Loc@loc.n.all, equals(microbov@loc.n.all[two_random_loci])) - expect_that(mic2Loc10@loc.n.all, equals(microbov@loc.n.all[two_random_loci])) + expect_equal(length(mic10@loc.fac), ncol(tab(microbov))) + expect_equal(mic2Loc@loc.fac, loci) + expect_equal(mic2Loc10@loc.fac, loci) + + expect_equal(mic10@loc.n.all, microbov@loc.n.all) + expect_equal(mic2Loc@loc.n.all, microbov@loc.n.all[two_random_loci]) + expect_equal(mic2Loc10@loc.n.all, microbov@loc.n.all[two_random_loci]) }) test_that("'[' method works for genind objects with drop = TRUE", { @@ -106,27 +106,27 @@ names(two_random_loci) <- two_random_loci two_random_loci <- two_random_loci[levels(loci)] - expect_that(nInd(mic10), equals(10)) - expect_that(nInd(mic2Loc), equals(nInd(microbov))) - expect_that(nInd(mic2Loc10), equals(10)) - - expect_that(nLoc(mic10), equals(nLoc(microbov))) - expect_that(nLoc(mic2Loc), equals(2)) - expect_that(nLoc(mic2Loc10), equals(2)) + expect_equal(nInd(mic10), 10) + expect_equal(nInd(mic2Loc), nInd(microbov)) + expect_equal(nInd(mic2Loc10), 10) + + expect_equal(nLoc(mic10), nLoc(microbov)) + expect_equal(nLoc(mic2Loc), 2) + expect_equal(nLoc(mic2Loc10), 2) expect_equivalent(popNames(mic10), pops) expect_equivalent(popNames(mic2Loc10), pops) - expect_that(nPop(mic10), equals(length(pops))) - expect_that(nPop(mic2Loc10), equals(length(pops))) + expect_equal(nPop(mic10), length(pops)) + expect_equal(nPop(mic2Loc10), length(pops)) ten_ind_loci2 <- factor(mic10@loc.fac[mic10@loc.fac %in% levels(loci)]) - expect_that(length(mic10@loc.fac), equals(ncol(tab(microbov)[, ten_ind_loci]))) - expect_that(mic2Loc@loc.fac, equals(loci)) - expect_that(mic2Loc10@loc.fac, equals(ten_ind_loci2)) + expect_equal(length(mic10@loc.fac), ncol(tab(microbov)[, ten_ind_loci])) + expect_equal(mic2Loc@loc.fac, loci) + expect_equal(mic2Loc10@loc.fac, ten_ind_loci2) expect_true(all(mic10@loc.n.all <= microbov@loc.n.all)) - expect_that(mic2Loc@loc.n.all, equals(microbov@loc.n.all[two_random_loci])) - expect_that(names(mic2Loc10@loc.n.all), equals(names(microbov@loc.n.all[two_random_loci]))) + expect_equal(mic2Loc@loc.n.all, microbov@loc.n.all[two_random_loci]) + expect_equal(names(mic2Loc10@loc.n.all), names(microbov@loc.n.all[two_random_loci])) expect_true(all(mic2Loc10@loc.n.all <= microbov@loc.n.all[two_random_loci])) }) @@ -134,15 +134,15 @@ skip_on_cran() micpop <- genind2genpop(microbov[pop(microbov) %in% popNames(microbov)[1]], quiet = TRUE) tabdim <- dim(micpop@tab) - expect_that(tabdim, equals(dim(tab(micpop)))) - expect_that(tabdim, equals(dim(tab(micpop, freq = TRUE)))) + expect_equal(tabdim, dim(tab(micpop))) + expect_equal(tabdim, dim(tab(micpop, freq = TRUE))) }) test_that("tab will return frequencies for PA data", { skip_on_cran() x <- read.table(system.file("files/AFLP.txt", package = "adegenet")) aflp <- df2genind(x, type = "PA", ploidy = 1, pop = c(rep(1, 4), rep(2, 3))) - apop <- genind2genpop(aflp) + apop <- genind2genpop(aflp, quiet = TRUE) atab <- tab(apop, freq = TRUE) res <- tab(apop)/rowSums(tab(apop)) expect_equivalent(atab, res) diff -Nru adegenet-2.1.0/tests/testthat/test_hierarchy.R adegenet-2.1.1/tests/testthat/test_hierarchy.R --- adegenet-2.1.0/tests/testthat/test_hierarchy.R 2016-12-03 14:02:42.000000000 +0000 +++ adegenet-2.1.1/tests/testthat/test_hierarchy.R 2017-11-17 13:33:32.000000000 +0000 @@ -10,13 +10,17 @@ "BlondeAquitaine", "BretPieNoire", "Charolais", "Gascon", "Limousin", "MaineAnjou", "Montbeliard", "Salers") - expect_that(length(strata(microbov)), equals(3)) - expect_that(popNames(microbov), equals(breeds)) - expect_that({microbovsplit <- splitStrata(microbov, ~Pop/Subpop)}, throws_error()) + expect_equal(length(strata(microbov)), 3) + expect_equal(popNames(microbov), breeds) + expect_warning( + expect_error({ + microbovsplit <- splitStrata(microbov, ~Pop/Subpop) + }) + ) nameStrata(microbov) <- ~Country/Breed/Species - expect_that(names(strata(microbov)), equals(c("Country", "Breed", "Species"))) + expect_equal(names(strata(microbov)), c("Country", "Breed", "Species")) setPop(microbov) <- ~Country/Species - expect_that(popNames(microbov), equals(c("AF_BI", "AF_BT", "FR_BT"))) + expect_equal(popNames(microbov), c("AF_BI", "AF_BT", "FR_BT")) }) test_that("strata produce proper errors", { @@ -41,10 +45,10 @@ set.seed(9999) glTest <- lapply(1:10, function(x, y, z) make_gl(y, z), 10, michier) res <- do.call("rbind.genlight", c(glTest, parallel = FALSE)) - expect_that(res, is_a("genlight")) - expect_that(nInd(res), equals(100)) - expect_that(nLoc(res), equals(10)) - expect_that(length(strata(res)), equals(3)) + expect_is(res, "genlight") + expect_equal(nInd(res), 100) + expect_equal(nLoc(res), 10) + expect_equal(length(strata(res)), 3) nameStrata(res) <- ~Hickory/Dickory/Doc - expect_that(names(strata(res)), equals(c("Hickory", "Dickory", "Doc"))) + expect_equal(names(strata(res)), c("Hickory", "Dickory", "Doc")) }) diff -Nru adegenet-2.1.0/tests/testthat/test_import.R adegenet-2.1.1/tests/testthat/test_import.R --- adegenet-2.1.0/tests/testthat/test_import.R 2016-12-11 23:01:53.000000000 +0000 +++ adegenet-2.1.1/tests/testthat/test_import.R 2018-02-02 14:36:09.000000000 +0000 @@ -4,11 +4,11 @@ skip_on_cran() x <- matrix(as.character(sample(20)), nrow = 10, ncol = 2) res <- df2genind(x, ploidy = 1) - expect_that(sum(res@loc.n.all), equals(20)) - expect_that(nInd(res), equals(10)) - expect_that(nLoc(res), equals(2)) + expect_equal(sum(res@loc.n.all), 20) + expect_equal(nInd(res), 10) + expect_equal(nLoc(res), 2) resdf <- genind2df(res) - all.equal(unlist(resdf, use.names=FALSE), as.vector(x)) + expect_equal(unlist(resdf, use.names=FALSE), as.vector(x)) }) test_that("df2genind makes sense for given example", { @@ -18,13 +18,13 @@ locusC=c("22","22","21","22")) row.names(df) <- .genlab("genotype",4) obj <- df2genind(df, ploidy=2, ncode=1) - expect_that(nInd(obj), equals(4)) - expect_that(nLoc(obj), equals(3)) - expect_that(locNames(obj), equals(colnames(df))) - expect_that(indNames(obj), equals(rownames(df))) - expect_that(obj@loc.n.all, is_equivalent_to(c(3, 4, 2))) + expect_equal(nInd(obj), 4) + expect_equal(nLoc(obj), 3) + expect_equal(locNames(obj), colnames(df)) + expect_equal(indNames(obj), rownames(df)) + expect_equivalent(obj@loc.n.all, c(3, 4, 2)) objdf <- genind2df(obj) - expect_that(df, is_equivalent_to(df)) + expect_equivalent(df, df) }) test_that("df2genind handles NAs for 'numerically named' samples correctly", { @@ -43,11 +43,10 @@ obj <- df2genind(X = df[, !grepl("AnimalID|Samp", colnames(df))], ind.names = df$AnimalID, sep = " ", ncode = 6) g <- tab(obj) - expect_that(g["730", grepl("REN169D01", colnames(g))], - is_equivalent_to(c(REN169D01.204 = as.integer(NA), - REN169D01.208 = as.integer(NA), - REN169D01.198 = as.integer(NA))) - ) + expect_equivalent(g["730", grepl("REN169D01", colnames(g))], + c(REN169D01.204 = NA_integer_, + REN169D01.208 = NA_integer_, + REN169D01.198 = NA_integer_)) }) test_that("df2genind will handle duplicate samples and loci", { @@ -61,14 +60,16 @@ inds <- c("one", "one", "two") loci <- rep("double", 2) expect_warning(xgid <- df2genind(xdf, sep = "/", ind.names = inds, loc.names = loci)) - expect_that(unique(rowSums(tab(xgid))), is_equivalent_to(4)) - expect_that(genind2df(xgid, sep = "/"), is_equivalent_to(xdf)) + expect_equivalent(unique(rowSums(tab(xgid))), 4) + expect_equivalent(genind2df(xgid, sep = "/"), xdf) }) test_that("read.X functions work as expected", { skip_on_cran() - gpop <- read.genepop(system.file("files/nancycats.gen",package="adegenet"), quiet = TRUE) + suppressWarnings({ + gpop <- read.genepop(system.file("files/nancycats.gen",package="adegenet"), quiet = TRUE) + }) fsta <- read.fstat(system.file("files/nancycats.dat",package="adegenet"), quiet = TRUE) gntx <- read.genetix(system.file("files/nancycats.gtx",package="adegenet"), quiet = TRUE) stru <- read.structure(system.file("files/nancycats.str",package="adegenet"), @@ -125,7 +126,7 @@ " tmp <- tempfile(fileext = ".gen") cat(x, file = tmp) - expect_warning(gp <- read.genepop(tmp)) + expect_warning(gp <- read.genepop(tmp, quiet = TRUE)) expect_identical(indNames(gp), .genlab("", nInd(gp))) }) @@ -162,12 +163,32 @@ skip_on_cran() ## read nancycats data from different formats - x.str <- read.structure(system.file("files/nancycats.str",package="adegenet"), - onerowperind=FALSE, n.ind=237, n.loc=9, col.lab=1, col.pop=2, ask=FALSE) - x.gen <- read.genepop(system.file("files/nancycats.gen",package="adegenet")) - x.dat <- read.fstat(system.file("files/nancycats.dat",package="adegenet")) - x.gtx <- read.genetix(system.file("files/nancycats.gtx",package="adegenet")) - + expect_output({ + x.str <- read.structure( + system.file("files/nancycats.str", package = "adegenet"), + onerowperind = FALSE, + n.ind = 237, + n.loc = 9, + col.lab = 1, + col.pop = 2, + ask = FALSE + ) + }, "Converting data") + expect_output({ + expect_warning({ + x.gen <- read.genepop(system.file("files/nancycats.gen", package = "adegenet")) + }, "Duplicate individual names detected.") + }, "Converting data") + + expect_output({ + x.dat <- read.fstat(system.file("files/nancycats.dat", package = "adegenet")) + }, "Converting data") + + expect_output({ + x.gtx <- read.genetix(system.file("files/nancycats.gtx", package = "adegenet")) + }, "Converting data") + + ## check that the pop are identical: ## we use 'table(pop(...))' because individuals may be sorted differently in the files, so @@ -184,7 +205,9 @@ # Column names should have no extra characters in front of them. Your IDE # may be adding them, so watch out! - cat(print(" 1_25 8_54 1358_15 1363_12 1368_57 1369_41 1372_14 1373_9 1377_42 1378_53 1379_10 1382_37 1386_27 1398_46 1400_9 1401_25 1403_13 1404_17 1409_42 1416_48 1419_11 1421_14 1423_5 1424_74 1426_55 1429_46 1432_23 1435_30 1436_7 1438_9 1443_37 + tmp <- tempfile(fileext = ".stru") + cat( +" 1_25 8_54 1358_15 1363_12 1368_57 1369_41 1372_14 1373_9 1377_42 1378_53 1379_10 1382_37 1386_27 1398_46 1400_9 1401_25 1403_13 1404_17 1409_42 1416_48 1419_11 1421_14 1423_5 1424_74 1426_55 1429_46 1432_23 1435_30 1436_7 1438_9 1443_37 A_KH1584 A 1 4 4 1 1 3 2 4 4 2 3 3 2 4 1 3 1 1 2 3 1 4 4 3 2 2 3 4 4 4 2 A_KH1584 A 1 4 4 1 1 3 2 4 4 4 3 3 4 4 1 3 1 3 2 3 3 4 4 3 4 2 3 4 4 4 2 C_KH1059 C 0 4 4 1 1 3 2 4 4 2 1 3 2 4 1 3 1 3 2 3 3 2 4 3 2 2 3 2 4 4 2 @@ -192,23 +215,32 @@ M_KH1834 M 0 2 2 1 1 3 2 4 4 2 3 3 2 4 1 3 1 1 2 3 3 4 4 3 2 2 3 2 4 4 2 M_KH1834 M 0 4 4 1 3 3 2 4 4 2 3 3 2 4 1 3 1 3 2 3 3 4 4 3 2 4 3 4 4 4 2 M_KH1837 M 1 4 4 1 1 3 2 4 4 0 3 3 2 2 1 3 1 1 2 3 3 4 4 3 4 2 3 4 4 4 2 -M_KH1837 M 1 4 4 1 3 3 2 4 4 0 3 3 4 4 1 3 1 3 2 3 3 4 4 3 4 2 3 4 4 4 2"), - file = "elizabeth_starts_with_number.stru") +M_KH1837 M 1 4 4 1 3 3 2 4 4 0 3 3 4 4 1 3 1 3 2 3 3 4 4 3 4 2 3 4 4 4 2", + file = tmp) - xy1 <- read.structure("elizabeth_starts_with_number.stru", NA.char="0", - n.ind = 4, n.loc = 31, onerowperind = FALSE, - col.lab = 1, col.pop = 2, row.marknames = 1, - sep = "\t", col.others = 0) - - unlink("elizabeth_starts_with_number.stru") + xy1 <- read.structure( + tmp, + NA.char = "0", + n.ind = 4, + n.loc = 31, + onerowperind = FALSE, + col.lab = 1, + col.pop = 2, + row.marknames = 1, + sep = "\t", + col.others = 0, + quiet = TRUE + ) x1 <- tab(xy1) # should return all 1, incorrect is NA expect_true(all(x1[, grepl("1401_25", colnames(x1)), drop = FALSE] == 1)) + tmp2 <- tempfile(fileext = ".stru") # Column names should have no extra characters in front of them. Your IDE # may be adding them, so watch out! - cat(print(" X1_25 X8_54 X1358_15 X1363_12 X1368_57 X1369_41 X1372_14 X1373_9 X1377_42 X1378_53 X1379_10 X1382_37 X1386_27 X1398_46 X1400_9 X1401_25 X1403_13 X1404_17 X1409_42 X1416_48 X1419_11 X1421_14 X1423_5 X1424_74 X1426_55 X1429_46 X1432_23 X1435_30 X1436_7 X1438_9 X1443_37 + cat( +" X1_25 X8_54 X1358_15 X1363_12 X1368_57 X1369_41 X1372_14 X1373_9 X1377_42 X1378_53 X1379_10 X1382_37 X1386_27 X1398_46 X1400_9 X1401_25 X1403_13 X1404_17 X1409_42 X1416_48 X1419_11 X1421_14 X1423_5 X1424_74 X1426_55 X1429_46 X1432_23 X1435_30 X1436_7 X1438_9 X1443_37 A_KH1584 A 1 4 4 1 1 3 2 4 4 2 3 3 2 4 1 3 1 1 2 3 1 4 4 3 2 2 3 4 4 4 2 A_KH1584 A 1 4 4 1 1 3 2 4 4 4 3 3 4 4 1 3 1 3 2 3 3 4 4 3 4 2 3 4 4 4 2 C_KH1059 C 0 4 4 1 1 3 2 4 4 2 1 3 2 4 1 3 1 3 2 3 3 2 4 3 2 2 3 2 4 4 2 @@ -216,18 +248,44 @@ M_KH1834 M 0 2 2 1 1 3 2 4 4 2 3 3 2 4 1 3 1 1 2 3 3 4 4 3 2 2 3 2 4 4 2 M_KH1834 M 0 4 4 1 3 3 2 4 4 2 3 3 2 4 1 3 1 3 2 3 3 4 4 3 2 4 3 4 4 4 2 M_KH1837 M 1 4 4 1 1 3 2 4 4 0 3 3 2 2 1 3 1 1 2 3 3 4 4 3 4 2 3 4 4 4 2 -M_KH1837 M 1 4 4 1 3 3 2 4 4 0 3 3 4 4 1 3 1 3 2 3 3 4 4 3 4 2 3 4 4 4 2"), - file = "elizabeth_starts_with_letter.stru") +M_KH1837 M 1 4 4 1 3 3 2 4 4 0 3 3 4 4 1 3 1 3 2 3 3 4 4 3 4 2 3 4 4 4 2", + file = tmp2) - xy2 <- read.structure("elizabeth_starts_with_letter.stru", NA.char="0", - n.ind = 4, n.loc = 31, onerowperind = FALSE, - col.lab = 1, col.pop = 2, row.marknames = 1, - sep = "\t", col.others = 0) + xy2 <- read.structure( + tmp2, + NA.char = "0", + n.ind = 4, + n.loc = 31, + onerowperind = FALSE, + col.lab = 1, + col.pop = 2, + row.marknames = 1, + sep = "\t", + col.others = 0, + quiet = TRUE + ) - unlink("elizabeth_starts_with_letter.stru") x2 <- tab(xy2) # should return all 1 expect_true(all(x2[, grepl("1401_25", colnames(x2)), drop = FALSE] == 1)) }) + + +test_that("df2genind throws a warning when the user borks the ncode", { + dat <- data.frame(stringsAsFactors = FALSE, + A = c("A5A5", "A5A4", "A5A5", "A5A5", "A5A4", "A5A4", "A5A5", + "A5A4", "A5A4", "A5A5"), + B = c("B1B1", "B1B1", "B1B1", "B1B1", "B1B1", "B1B1", "B1B1", + "B1B1", "B1B2", "B1B1"), + C = c("C2C2", "C2C2", "C2C2", "C2C2", "C2C2", "C2C2", "C2C2", + "C2C2", "C2C2", "C2C2"), + D = c("D2D5", "D5D3", "D5D5", "D2D5", "D2D1", "D5D3", "D1D1", + "D2D2", "D2D5", "D2D4") + ) + dat + + expect_warning(df2genind(dat, ploidy = 2, ncode = 1), "observed allele dosage \\(4-4\\)") + +}) \ No newline at end of file diff -Nru adegenet-2.1.0/tests/testthat/test_repool.R adegenet-2.1.1/tests/testthat/test_repool.R --- adegenet-2.1.0/tests/testthat/test_repool.R 2016-12-03 14:02:42.000000000 +0000 +++ adegenet-2.1.1/tests/testthat/test_repool.R 2017-11-17 13:33:32.000000000 +0000 @@ -8,15 +8,9 @@ temp <- seppop(microbov) retemp <- repool(temp) expect_null(other(retemp)) - expect_that(microbov@call, not(is_equivalent_to(retemp@call))) - expect_that(names(microbov), equals(names(retemp))) + expect_failure(expect_identical(microbov@call, retemp@call)) + expect_equal(names(microbov), names(retemp)) -# micnames <- names(microbov) -# micnames <- micnames[!micnames %in% c("other", "call", "all.names")] -# for (i in micnames){ -# x <- paste0("expect_that(slot(microbov, '", i, "'), is_equivalent_to(slot(retemp, '", i, "')))", "\n") -# cat(x) -# } # Alleles in repooled samples are out of order. # This makes sure they are ordered. retempallnames <- lapply(retemp@all.names, sort) @@ -31,5 +25,5 @@ expect_equivalent(slot(microbov, 'pop'), slot(retemp, 'pop')) expect_equivalent(slot(microbov, 'ploidy'), slot(retemp, 'ploidy')) expect_equivalent(slot(microbov, 'type'), slot(retemp, 'type')) - + }) diff -Nru adegenet-2.1.0/tests/testthat/test_snapclust.R adegenet-2.1.1/tests/testthat/test_snapclust.R --- adegenet-2.1.0/tests/testthat/test_snapclust.R 2017-05-05 14:52:11.000000000 +0000 +++ adegenet-2.1.1/tests/testthat/test_snapclust.R 2017-11-17 13:33:32.000000000 +0000 @@ -60,3 +60,31 @@ }) + +test_that("snapclust.choose.k will recognize objects that inherit genind objects", { + skip_on_cran() + skip_if_not_installed("poppr") + requireNamespace("poppr", quietly = TRUE) + data(microbov) + zebu <- poppr::as.genclone(microbov[pop = "Zebu"]) + expect_is(zebu, "genclone") + res <- snapclust.choose.k(2, zebu) + expect_length(res, 2) + expect_is(res, "numeric") + unloadNamespace("poppr") +}) + +test_that("snapclust.choose.k will ignore any extra genind objects supplied", { + skip_on_cran() + data(microbov) + expect_warning({ + res <- snapclust.choose.k(2, microbov[pop = "Zebu"], microbov[pop = "Salers"]) + }, "Too many genind objects provided") + expect_is(res, "numeric") + expect_length(res, 2) +}) + +test_that("snapclust.choose.k will throw an error if there are no genind objects", { + skip_on_cran() + expect_error(snapclust.choose.k(2, 1), "No genind provided") +}) \ No newline at end of file