From c4638801b05991ed49896465d52f9cb79e959183 Mon Sep 17 00:00:00 2001 From: pat-s Date: Thu, 7 Dec 2017 10:02:43 +0000 Subject: [PATCH] Deploy from Travis build 543 [ci skip] Build URL: https://travis-ci.org/pat-s/sperrorest/builds/312871355 Commit: 6972f9f96ed8fbe9f2d8418f1d58988cbdc8520d --- docs/LICENSE.html | 796 ++++++++++++++++++ docs/articles/Biblio.bib | 143 ++++ .../custom-pred-and-model-functions.html | 183 ++++ docs/articles/index.html | 128 +++ docs/articles/parallel-modes.html | 209 +++++ docs/articles/spatial-modeling-use-case.html | 473 +++++++++++ docs/authors.html | 152 ++++ docs/index.html | 193 +++++ docs/jquery.sticky-kit.min.js | 9 + docs/link.svg | 12 + docs/news/index.html | 331 ++++++++ docs/pkgdown.css | 163 ++++ docs/pkgdown.js | 45 + docs/reference/add.distance.html | 202 +++++ docs/reference/as.represampling.html | 227 +++++ docs/reference/as.resampling.html | 291 +++++++ docs/reference/as.tilename.html | 182 ++++ docs/reference/dataset_distance.html | 200 +++++ docs/reference/ecuador-1.png | Bin 0 -> 26229 bytes docs/reference/ecuador.html | 177 ++++ docs/reference/err_default.html | 323 +++++++ docs/reference/figures/plotresampling.png | Bin 0 -> 156751 bytes docs/reference/get_small_tiles.html | 255 ++++++ docs/reference/index.html | 331 ++++++++ docs/reference/maipo.html | 130 +++ docs/reference/partition_cv.html | 518 ++++++++++++ docs/reference/partition_cv_strat.html | 213 +++++ docs/reference/partition_disc.html | 278 ++++++ docs/reference/partition_factor.html | 214 +++++ docs/reference/partition_factor_cv.html | 210 +++++ docs/reference/partition_kmeans.html | 237 ++++++ docs/reference/partition_tiles.html | 315 +++++++ docs/reference/plot.represampling.html | 192 +++++ docs/reference/remove_missing_levels.html | 152 ++++ docs/reference/represampling_bootstrap.html | 192 +++++ .../represampling_disc_bootstrap.html | 209 +++++ .../represampling_factor_bootstrap.html | 222 +++++ .../represampling_kmeans_bootstrap.html | 180 ++++ .../represampling_tile_bootstrap.html | 176 ++++ docs/reference/resample_factor.html | 171 ++++ docs/reference/resample_strat_uniform.html | 181 ++++ docs/reference/resample_uniform.html | 175 ++++ docs/reference/runfolds.html | 141 ++++ docs/reference/runreps.html | 141 ++++ docs/reference/sperrorest-package.html | 155 ++++ docs/reference/sperrorest.html | 440 ++++++++++ docs/reference/summary.represampling.html | 157 ++++ docs/reference/summary.sperrorest.html | 191 +++++ docs/reference/summary.sperroresterror.html | 202 +++++ .../summary.sperrorestimportance.html | 170 ++++ docs/reference/tile_neighbors.html | 162 ++++ docs/reference/transfer_parallel_output.html | 132 +++ 52 files changed, 10881 insertions(+) create mode 100644 docs/LICENSE.html create mode 100644 docs/articles/Biblio.bib create mode 100644 docs/articles/custom-pred-and-model-functions.html create mode 100644 docs/articles/index.html create mode 100644 docs/articles/parallel-modes.html create mode 100644 docs/articles/spatial-modeling-use-case.html create mode 100644 docs/authors.html create mode 100644 docs/index.html create mode 100644 docs/jquery.sticky-kit.min.js create mode 100644 docs/link.svg create mode 100644 docs/news/index.html create mode 100644 docs/pkgdown.css create mode 100644 docs/pkgdown.js create mode 100644 docs/reference/add.distance.html create mode 100644 docs/reference/as.represampling.html create mode 100644 docs/reference/as.resampling.html create mode 100644 docs/reference/as.tilename.html create mode 100644 docs/reference/dataset_distance.html create mode 100644 docs/reference/ecuador-1.png create mode 100644 docs/reference/ecuador.html create mode 100644 docs/reference/err_default.html create mode 100644 docs/reference/figures/plotresampling.png create mode 100644 docs/reference/get_small_tiles.html create mode 100644 docs/reference/index.html create mode 100644 docs/reference/maipo.html create mode 100644 docs/reference/partition_cv.html create mode 100644 docs/reference/partition_cv_strat.html create mode 100644 docs/reference/partition_disc.html create mode 100644 docs/reference/partition_factor.html create mode 100644 docs/reference/partition_factor_cv.html create mode 100644 docs/reference/partition_kmeans.html create mode 100644 docs/reference/partition_tiles.html create mode 100644 docs/reference/plot.represampling.html create mode 100644 docs/reference/remove_missing_levels.html create mode 100644 docs/reference/represampling_bootstrap.html create mode 100644 docs/reference/represampling_disc_bootstrap.html create mode 100644 docs/reference/represampling_factor_bootstrap.html create mode 100644 docs/reference/represampling_kmeans_bootstrap.html create mode 100644 docs/reference/represampling_tile_bootstrap.html create mode 100644 docs/reference/resample_factor.html create mode 100644 docs/reference/resample_strat_uniform.html create mode 100644 docs/reference/resample_uniform.html create mode 100644 docs/reference/runfolds.html create mode 100644 docs/reference/runreps.html create mode 100644 docs/reference/sperrorest-package.html create mode 100644 docs/reference/sperrorest.html create mode 100644 docs/reference/summary.represampling.html create mode 100644 docs/reference/summary.sperrorest.html create mode 100644 docs/reference/summary.sperroresterror.html create mode 100644 docs/reference/summary.sperrorestimportance.html create mode 100644 docs/reference/tile_neighbors.html create mode 100644 docs/reference/transfer_parallel_output.html diff --git a/docs/LICENSE.html b/docs/LICENSE.html new file mode 100644 index 00000000..5899a2d2 --- /dev/null +++ b/docs/LICENSE.html @@ -0,0 +1,796 @@ + + + + + + + + +License • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+
+ + +
                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    {one line to give the program's name and a brief idea of what it does.}
+    Copyright (C) {year}  {name of author}
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    {project}  Copyright (C) {year}  {fullname}
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+ +
+ +
+ + +
+ + +
+

Site built with pkgdown.

+
+ +
+
+ + + diff --git a/docs/articles/Biblio.bib b/docs/articles/Biblio.bib new file mode 100644 index 00000000..36d60c21 --- /dev/null +++ b/docs/articles/Biblio.bib @@ -0,0 +1,143 @@ +% Encoding: UTF-8 + +@InProceedings{Brenning2012, + author = {A. Brenning}, + title = {Spatial cross-validation and bootstrap for the assessment of prediction rules in remote sensing: The {R} package sperrorest}, + booktitle = {2012 {IEEE} {International} {Geoscience} and {Remote} {Sensing} {Symposium}}, + year = {2012}, + pages = {5372-5375}, + doi = {10.1109/IGARSS.2012.6352393}, + issn = {2153-6996}, + keywords = {Gabor filters;computer bootstrapping;data analysis;geographic information systems;geophysics computing;pattern classification;prediction theory;remote sensing;sampling methods;statistical analysis;support vector machines;IKONOS-derived Gabor texture features;R package sperrorest;bootstrap strategies;computational prediction methods;geospatial data;maximum-likelihood classification;nonspatial equivalent;open-source statistical data analysis software R;prediction rules;remote-sensing applications;rock-glacier flow structures;spatial autocorrelation;spatial context;spatial crossvalidation;spatial resampling-based estimation procedures;statistical prediction methods;support vector machine;terrain attribute data;Context;Data analysis;Estimation;Predictive models;Remote sensing;Rocks;Support vector machines;Gabor filters;Spatial cross-validation;classification accuracy;land cover classification;rock glaciers;spatial bootstrap}, +} + +@InBook{Russ2010b, + pages = {350--359}, + title = {Data Mining in Precision Agriculture: Management of Spatial Information}, + publisher = {Springer Berlin Heidelberg}, + year = {2010}, + author = {Russ, Georg and Brenning, Alexander}, + editor = {Hüllermeier, Eyke and Kruse, Rudolf and Hoffmann, Frank}, + address = {Berlin, Heidelberg}, + booktitle = {{Computational Intelligence for Knowledge-Based Systems Design: 13th International Conference on Information Processing}and {Management of Uncertainty, IPMU 2010, Dortmund, Germany, June 28 - July 2, 2010. Proceedings}}, + doi = {10.1007/978-3-642-14049-5_36}, + isbn = {978-3-642-14049-5}, + url = {http://dx.doi.org/10.1007/978-3-642-14049-5_36}, +} + +@InCollection{Russ2010a, + author = {Georg Russ and Alexander Brenning}, + title = {Spatial Variable Importance Assessment for Yield Prediction in Precision Agriculture}, + booktitle = {Lecture Notes in Computer Science}, + publisher = {Springer Science + Business Media}, + year = {2010}, + pages = {184--195}, + doi = {10.1007/978-3-642-13062-5_18}, + url = {http://dx.doi.org/10.1007/978-3-642-13062-5_18}, +} + +@Article{Brenning2005, + author = {A. Brenning}, + title = {Spatial prediction models for landslide hazards: review, comparison and evaluation}, + journal = {Natural Hazards and Earth System Science}, + year = {2005}, + volume = {5}, + number = {6}, + pages = {853--862}, + month = {nov}, + doi = {10.5194/nhess-5-853-2005}, + publisher = {Copernicus {GmbH}}, + url = {http://dx.doi.org/10.5194/nhess-5-853-2005}, +} + +@Article{Breiman1996, + author = {Leo Breiman}, + title = {Bagging Predictors}, + journal = {Machine Learning}, + year = {1996}, + volume = {24}, + number = {2}, + pages = {123--140}, + month = {aug}, + doi = {10.1007/bf00058655}, + publisher = {Springer Nature}, + url = {https://doi.org/10.1007%2Fbf00058655}, +} + +@Article{Breiman2001, + author = {Leo Breiman}, + title = {Random Forests}, + journal = {Machine Learning}, + year = {2001}, + volume = {45}, + number = {1}, + pages = {5--32}, + doi = {10.1023/a:1010933404324}, + publisher = {Springer Nature}, + url = {https://doi.org/10.1023%2Fa%3A1010933404324}, +} + +@Article{Pena2015, + author = {M.A. Pe{\~{n}}a and A. Brenning}, + title = {Assessing fruit-tree crop classification from Landsat-8 time series for the Maipo Valley, Chile}, + journal = {Remote Sensing of Environment}, + year = {2015}, + volume = {171}, + pages = {234--244}, + month = {dec}, + doi = {10.1016/j.rse.2015.10.029}, + publisher = {Elsevier {BV}}, + url = {https://doi.org/10.1016%2Fj.rse.2015.10.029}, +} + +@Book{James2013, + title = {An Introduction to Statistical Learning}, + publisher = {Springer New York}, + year = {2013}, + author = {Gareth James and Daniela Witten and Trevor Hastie and Robert Tibshirani}, + doi = {10.1007/978-1-4614-7138-7}, + url = {https://doi.org/10.1007%2F978-1-4614-7138-7}, +} + +@Article{Hothorn2005, + author = {Torsten Hothorn and Berthold Lausen}, + title = {Bundling classifiers by bagging trees}, + journal = {Computational Statistics {\&} Data Analysis}, + year = {2005}, + volume = {49}, + number = {4}, + pages = {1068--1078}, + month = {jun}, + doi = {10.1016/j.csda.2004.06.019}, + publisher = {Elsevier {BV}}, + url = {https://doi.org/10.1016%2Fj.csda.2004.06.019}, +} + +@Article{Goetz2015, + author = {J.N. Goetz and A. Brenning and H. Petschko and P. Leopold}, + title = {Evaluating machine learning and statistical prediction techniques for landslide susceptibility modeling}, + journal = {Computers {\&} Geosciences}, + year = {2015}, + volume = {81}, + pages = {1--11}, + month = {aug}, + doi = {10.1016/j.cageo.2015.04.007}, + publisher = {Elsevier {BV}}, + url = {https://doi.org/10.1016%2Fj.cageo.2015.04.007}, +} + +@Article{Knudby2010, + author = {Anders Knudby and Alexander Brenning and Ellsworth LeDrew}, + title = {New approaches to modelling fish{\textendash}habitat relationships}, + journal = {Ecological Modelling}, + year = {2010}, + volume = {221}, + number = {3}, + pages = {503--511}, + month = {feb}, + doi = {10.1016/j.ecolmodel.2009.11.008}, + publisher = {Elsevier {BV}}, + url = {https://doi.org/10.1016%2Fj.ecolmodel.2009.11.008}, +} + +@Comment{jabref-meta: databaseType:bibtex;} diff --git a/docs/articles/custom-pred-and-model-functions.html b/docs/articles/custom-pred-and-model-functions.html new file mode 100644 index 00000000..9c03ac1a --- /dev/null +++ b/docs/articles/custom-pred-and-model-functions.html @@ -0,0 +1,183 @@ + + + + + + + +Custom Predict and Model Functions • sperrorest + + + + + + +
+
+ + + +
+
+ + + + +
+
+

+Introduction

+

sperrorest is a generic framework which aims to work with all R models/packages. In statistical learning, model setups, their formulas and error measures all depend on the family of the response variable. Various families exist (numeric, binary, multiclass) which again include sub-families (e.g. gaussian or poisson distribution of a numeric response).

+

This detail needs to be specified via the respective function, e.g. when using glm() with a binary response, one needs to set family = "binomial" to make sure that the model does something meaningful. Most of the time, the same applies to the generic predict() function. For the glm() case, one would need to set type = "response" if the predicted values should reflect probabilities instead of log-odds.

+

These settings can be specified using model_args and pred_args in sperrorest(). So fine, “why do we need to write all these wrappers and custom model/predict functions then?!”

+
+
+

+User-defined Model Functions

+
+

+Problem

+

model_fun expects at least formula argument and a data.frame with the learning sample. All arguments, including the additional ones provided via model_args, are getting passed to model_fun via a do.call() call. However, if model_fun does not have an argument named formula but e.g. fixed (like it is the case for glmmPQL()) the do.call() call will fail because sperrorest() tries to pass an argument named formula but glmmPQL expects an argument named fixed.

+
+
+

+Solution

+

In this case, we need to write a wrapper function for glmmPQL (named glmmPQL_modelfun here) which accounts for this naming problem. Here, we are passing the formula argument to our custom model function which then does the actual call to glmmPQL() using the supplied formula object as the fixed argument of glmmPQL.
+By default, glmmPQL() has further arguments like family or random. If we want to use these, we pass them to model_args which then appends these to the arguments of glmmPQL_modelfun.

+
glmmPQL_modelfun <- function(formula = NULL, data = NULL, random = NULL,
+                             family = NULL) {
+  fit <- glmmPQL(fixed = formula, data = data, random = random, family = family)
+  return(fit)
+}
+
+
+
+

+User-defined Predict Functions

+
+

+Problem

+

Unless specified explicitly, sperrorest() tries to use the generic predict() function. This function works differently depending on the class of the provided fitted model, i.e. many models slightly differ in the naming (and availability) of their arguments. For example, when fitting a Support Vector Machine (SVM) with a binary response variable, package kernlab expects an argument type = "probabilities" in its predict() call to receive predicted probabilities while in package e1071 it is "probability = TRUE". Similar to model_args, this can be accounted for in the pred_args of sperrorest().

+

However, sperrorest() expects that the predicted values (of any response type) are stored directly in the returned object of the predict() function. While this is the case for many models, mainly with a numeric response, classification cases often behave differently. Here, the predicted values (classes in this case) are often stored in a sub-object named class or predicted.

+
+
+

+Solution

+

Since there is no way to account for this in a general way (when every package may return the predicted values in a different format/column), we need to account for it by providing a custom predict function which returns only the predicted values so that sperrorest() can continue properly. This time we are showing two examples. The first takes again a binary classification using randomForest.

+
+

+randomForest

+

When calling predict on a fitted randomForest model with a binary response variable, the predicted values are actually stored in the resulting object returned by predict() (here called pred). So why do we have trouble here then?
+Simply because pred is a matrix containing both probabilities for the FALSE (= 0) and TRUE (= 1) case. sperrorest() needs a vector containing only the predicted values of the TRUE case to pass these further onto err_fun() which then takes care of calculating all the error measures. So the important part is to subset the resulting matrix in the pred object to TRUE cases only and return the result.

+
rf_predfun <- function(object = NULL, newdata = NULL, type = NULL) {
+  pred <- predict(object = object, newdata = newdata, type = type)
+  pred <- pred[, 2]
+}
+
+
+

+svm

+

The same case (binary response) using svm from the e1071 package. Here, the predicted probabilities are stored in a sub-object of pred. We can address it using the attr() function. Then again, we only need the TRUE cases for sperrorest().

+
svm_predfun <- function(object = NULL, newdata = NULL, probability = NULL) {
+  pred <- predict(object, newdata = newdata, probability = TRUE)
+  pred <- attr(pred, "probabilities")[, 2]
+}
+
+
+
+
+
+ + + +
+ + +
+ +
+

Site built with pkgdown.

+
+ +
+
+ + + diff --git a/docs/articles/index.html b/docs/articles/index.html new file mode 100644 index 00000000..1e9465dd --- /dev/null +++ b/docs/articles/index.html @@ -0,0 +1,128 @@ + + + + + + + + +Articles • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ + + + + +
+ + +
+

Site built with pkgdown.

+
+ +
+
+ + + diff --git a/docs/articles/parallel-modes.html b/docs/articles/parallel-modes.html new file mode 100644 index 00000000..e62b70b8 --- /dev/null +++ b/docs/articles/parallel-modes.html @@ -0,0 +1,209 @@ + + + + + + + +Parallel Modes of <code>sperrorest</code> • sperrorest + + + + + + +
+
+ + + +
+
+ + + + +
+
+

+Introduction

+

sperrorest is parallelized by default from v2.0.0 and higher.

+

Most users are not familiar with parallelization and have no time/motivation to wrap their head around it. Instead, they just accept to wait “a bit” longer until the process finishes.

+

While this is no problem for “quick” cross-validation (CV) cases with a low number of repetitions and models which converge quickly, in some cases processing may take up to several months. For example, running a spatial cross-validation using a Generalized Linear Mixed Model (GLMM) with both random effects and a spatial autocorrelation structure on around 1000 observations takes roughly this time, if executed sequentially. Most of the fitting time hereby is devoted to the integration of the spatial autocorrelation structure.

+

sperrorest comes with four different parallelization modes and also offers sequential execution.

+

Unless specified otherwise, all cores of the machine are used. Limiting the number of cores makes sense in cases when you want to do other work on your machine while running a cross-validation so that your system stays responsive. Also, if you are working on a server and have, let’s say, 48 cores available and want to do a 100 repetition CV. Since most models take roughly the same time to fit, it would be smart to use 34 cores. Taking this number of cores is faster than using 48 because

+
    +
  1. You need 3 iterations (34 in the first, 68 in the second and finishing in the 3rd) to process all repetitions. During the third iteration, a lot of cores would do nothing else but just wait for the others to finish.

  2. +
  3. The parallelization overhead, which is mainly caused by splitting and combining all jobs to the workers, would be higher for the case with 48 cores than for 34 cores. Hence, 34 cores will finish faster than 48 cores on 100 repetitions. Of course, when taking 50 cores it would only need 2 worker iterations to process everything which would again speed up the process.

  4. +
+
+
+

+The future backend

+

All modes expect "apply" (including the sequential one) are running on the parallel API of the future package. It offers a unified, cross-platform API combining all other existing parallel approaches of R into one package. Besides the variety of parallel options to choose from (multiprocess, multisession, multicore, cluster, etc.) it also provides a sequential option. Every options is initiated in the same way:

+
library(future)
+registerDoFuture()
+
+plan("sequential") # sequential
+plan("multicore") # parallel (Unix only)
+plan("multisession") # parallel
+plan("multiprocess") # parallel
+plan("cluster") # parallel
+

Every option has its advantages and disadvantages. Check the future package vignettes for more information.

+
+
+

+Mode “foreach”

+

Unless specified otherwise, the default parallel mode uses foreach with the "cluster" option of the future package. Package doFuture takes care that foreach works with the parallel initialization of the future package.

+

This option is taken as default because it works cross-platform and provides progress output to the console. Unfortunately, on Windows this output is not shown to the console but needs to be written to a file (default to the current working directory). Another downside is that the global environment needs to copied to every worker before processing starts. Workers are started sequentially and therefore the startup of > 10 workers may take some seconds.

+
+
+

+Mode “apply”

+

This mode is also cross-platform but uses different functions on Unix/non-Unix systems for actual processing. On Unix, it uses the pbmcapply package which combines the pbapply package (provides progress bar for ‘apply’ functions) and the future package to speed up processing. On Windows, pbapply is used which in the end uses parApply() to setup a cluster like parallelization including a progress bar.

+
+
+

+Mode “future”

+

This modes entirely uses the future package in combination with future_lapply() as the working horse. It can be used with any future plan specified via par_option. It is the fastest mode but provides no progress output.

+
+
+

+Mode “sequential”

+

This mode executes sperrorest() sequentially. It also runs on the future API using foreach/doFuture which provide the possibility of sequential execution using plan("sequential").

+
+
+

+Performance comparison

+

Example setup:

+
    +
  • Machine: 48 cores, Debian 9 (stretch)
  • +
  • 100 repetitions, 5 folds
  • +
  • 100 variable importance permutations using all variables
  • +
  • non-spatial partitioning (partition_cv)
  • +
  • Model: glm +
  • +
  • Response type: binary
  • +
  • Progress: None
  • +
+

Note that the only argument which needs to be changed is par_mode here. Subsequently, par_mode = "foreach", par_mode = "apply" and par_mode = "future" were used.

+

All default settings of each mode were used. par_mode = "foreach" runs on plan("cluster") while par_mode = "future" runs on plan("multiprocess"). Mode "apply" used pbmcapply in the end since the test was running on a Unix System.

+
data(ecuador)
+fo <- slides ~ dem + slope + hcurv + vcurv + log.carea + cslope
+
+sperrorest(data = ecuador, formula = fo,
+           model_fun = glm, model_args = list(family = "binomial"),
+           pred_args = list(type = "response"),
+           smp_fun = partition_cv,
+           smp_args = list(repetition = 1:100, nfold = 5),
+           par_args = list(par_mode = "foreach", par_units = 20),
+           benchmark = TRUE, progress = FALSE,
+           importance = TRUE, imp_permutations = 100)
+ + + + + + + + + + + + + + + +
foreachapplyfuture
runtime (min)52.3351.6749.54
+
+
+
+ + + +
+ + +
+ +
+

Site built with pkgdown.

+
+ +
+
+ + + diff --git a/docs/articles/spatial-modeling-use-case.html b/docs/articles/spatial-modeling-use-case.html new file mode 100644 index 00000000..69eb4d2d --- /dev/null +++ b/docs/articles/spatial-modeling-use-case.html @@ -0,0 +1,473 @@ + + + + + + + +Spatial Modeling Using Statistical Learning Techniques • sperrorest + + + + + + +
+
+ + + +
+
+ + + + +
+
+

+Introduction

+

Geospatial data scientists often make use of a variety of statistical and machine learning techniques for spatial prediction in applications such as landslide susceptibility modeling (Goetz et al. 2015) or habitat modeling (Knudby, Brenning, and LeDrew 2010). Novel and often more flexible techniques promise improved predictive performances as they are better able to represent nonlinear relationships or higher-order interactions between predictors than less flexible linear models.

+

Nevertheless, this increased flexibility comes with the risk of possible over-fitting to the training data. Since nearby spatial observations often tend to be more similar than distant ones, traditional random cross-validation is unable to detect this over-fitting whenever spatial observations are close to each other (e.g. Brenning (2005)). Spatial cross-validation addresses this by resampling the data not completely randomly, but using larger spatial regions. In some cases, spatial data is grouped, e.g. in remotely-sensed land use mapping grid cells belonging to the same field share the same management procedures and cultivation history, making them more similar to each other than to pixels from other fields with the same crop type.

+

This package provides a customizable toolkit for cross-validation (and bootstrap) estimation using a variety of spatial resampling schemes. More so, this toolkit can even be extended to spatio-temporal data or other complex data structures. This vignette will walk you through a simple case study, crop classification in central Chile (Peña and Brenning 2015).

+

This vignette is based on code that Alex Brenning developed for his course on ‘Environmental Statistics and GeoComputation’ that he teaches in the Geographic Information Science Master’s program at Friedrich Schiller University Jena, Germany. Please take a look at our program and spread the word!

+
+
+

+Data and Packages

+

As a case study we will carry out a supervised classification analysis using remotely-sensed data to predict fruit-tree crop types in central Chile. This data set is a subsample of data from (Peña and Brenning 2015).

+
library(pacman)
+p_load(sperrorest)
+
data("maipo", package = "sperrorest")
+

The remote-sensing predictor variables were derived from an image times series consisting of eight Landsat images acquired throughout the (southern hemisphere) growing season. The data set includes the following variables:

+

Response
+- croptype: response variable (factor) with 4 levels: ground truth information

+

Predictors
+- b[12-87]: spectral data, e.g. b82 = image date #8, spectral band #2
+- ndvi[01-08]: Normalized Difference Vegetation Index, e.g. #8 = image date #8
+- ndwi[01-08]: Normalized Difference Water Index, e.g. #8 = image date #8

+

Others
+- field: field identifier (grouping variable - not to be used as predictor)
+- utmx, utmy: x/y location; not to be used as predictors

+

All but the first four variables of the data set are predictors; their names are used to construct a formula object:

+
predictors <- colnames(maipo)[5:ncol(maipo)]
+# Construct a formula:
+fo <- as.formula(paste("croptype ~", paste(predictors, collapse = "+")))
+
+
+

+Modeling

+

Here we will take a look at a few classification methods with varying degrees of computational complexity and flexibility. This should give you an idea of how different models are handled by sperrorest, depending on the characteristics of their fitting and prediction methods. Please refer to (James et al. 2013) for background information on the models used here.

+
+

+Linear Discriminant Analysis (LDA)

+

LDA is simple and fast, and often performs surprisingly well if the problem at hand is ‘linear enough’. As a start, let’s fit a model with all predictors and using all available data:

+
p_load(MASS)
+fit <- lda(fo, data = maipo)
+

Predict the croptype with the fitted model and calculate the misclassification error rate (MER) on the training sample:

+
pred <- predict(fit, newdata = maipo)$class
+mean(pred != maipo$croptype)
+
## [1] 0.0437
+

But remember that this result is over-optimistic because we are re-using the training sample for model evaluation. We will soon show you how to do better with cross-validation.

+

We can also take a look at the confusion matrix but again, this result is overly optimistic:

+
table(pred = pred, obs = maipo$croptype)
+
##         obs
+##   pred  crop1 crop2 crop3 crop4
+##   crop1  1294     8     4    37
+##   crop2    50  1054     4    44
+##   crop3     0     0  1935     6
+##   crop4    45   110    29  3093
+
+
+

+Classification Tree

+

Classification and regression trees (CART) take a completely different approach—they are based on yes/no questions in the predictor variables and can be referred to as a binary partitioning technique. Fit a model with all predictors and default settings:

+
p_load(rpart)
+
fit <- rpart(fo, data = maipo)
+
+## optional: view the classiciation tree
+# par(xpd = TRUE)
+# plot(fit)
+# text(fit, use.n = TRUE)
+

Again, predict the croptype with the fitted model and calculate the average MER:

+
pred <- predict(fit, newdata = maipo, type = "class")
+mean(pred != maipo$croptype)
+
## [1] 0.113
+

Here the predict call is slightly different. Again, we could calculate a confusion matrix.

+
table(pred = pred, obs = maipo$croptype)
+
##         obs
+##   pred  crop1 crop2 crop3 crop4
+##   crop1  1204    66     0    54
+##   crop2    47   871    38   123
+##   crop3    38     8  1818    53
+##   crop4   100   227   116  2950
+
+
+

+RandomForest

+

Bagging, bundling and random forests build upon the CART technique by fitting many trees on bootstrap resamples of the original data set (Breiman 1996) (Breiman 2001) (Hothorn and Lausen 2005). They differ in that random forest also samples from the predictors, and bundling adds an ancillary classifier for improved classification. We will use the nowadays widely used randomForest() here.

+
p_load(randomForest)
+
fit <- randomForest(fo, data = maipo, coob = TRUE)
+fit
+
## 
+## Call:
+##  randomForest(formula = fo, data = maipo, coob = TRUE) 
+##                Type of random forest: classification
+##                      Number of trees: 500
+## No. of variables tried at each split: 8
+## 
+##         OOB estimate of  error rate: 0.57%
+## Confusion matrix:
+##       crop1 crop2 crop3 crop4 class.error
+## crop1  1382     2     0     5     0.00504
+## crop2     1  1163     0     8     0.00768
+## crop3     0     0  1959    13     0.00659
+## crop4     7     5     3  3165     0.00472
+

Let’s take a look at the MER achieved on the training sample:

+
pred <- predict(fit, newdata = maipo, type = "class")
+mean(pred != maipo$croptype)
+
## [1] 0
+
table(pred = pred, obs = maipo$croptype)
+
##         obs
+##   pred  crop1 crop2 crop3 crop4
+##   crop1  1389     0     0     0
+##   crop2     0  1172     0     0
+##   crop3     0     0  1972     0
+##   crop4     0     0     0  3180
+

Isn’t this amazing? Only one grid cell is misclassified by the bagging classifier! Even the OOB (out-of-bag) estimate of the error rate is < 1%.
+Too good to be true? We’ll see…

+
+
+
+

+Cross-Validation Estimation of Predictive Performance

+

Of course we can’t take the MER on the training set too seriously—it is biased. But we’ve heard of cross-validation, in which disjoint subsets are used for model training and testing. Let’s use sperrorest for cross-validation.

+

Also, at this point we should highlight that the observations in this data set are pixels, and multiple grid cells belong to the same field. In a predictive situation, and when field boundaries are known (as is the case here), we would want to predict the same class for all grid cells that belong to the same field. Here we will use a majority filter. This filter ensures that the final predicted class type of every field is the most often predicted croptype within one field.

+
+

+Linear Discriminant Analysis (LDA)

+

First, we need to create a wrapper predict method for LDA for sperrorest(). This is necessary in order to accomodate the majority filter, and also because class predictions from lda’s predict method are hidden in the $class component of the returned object.

+
lda_predfun <- function(object, newdata, fac = NULL) {
+  
+  p_load(nnet)
+  majority <- function(x) {
+    levels(x)[which.is.max(table(x))]
+  }
+  
+  majority_filter <- function(x, fac) {
+    for (lev in levels(fac)) {
+      x[fac == lev] <- majority(x[fac == lev])
+    }
+    x
+  }
+  
+  pred <- predict(object, newdata = newdata)$class
+  if (!is.null(fac)) pred <- majority_filter(pred, newdata[, fac]) 
+  return(pred)
+}
+

To ensure that custom predict-functions will work with sperrorest(), we need to wrap all custom functions in one single function. Otherwise, sperrorest() might fail during execution.

+

Finally, we can run sperrorest() with a non-spatial sampling setting (partition_cv()). In this example we use a ‘100 repetitions - 5 folds’ setup to reduce the influence of random partitioning.

+
res_lda_nsp <- sperrorest(fo, data = maipo, coords = c("utmx","utmy"), 
+                          model_fun = lda,
+                          pred_fun = lda_predfun, 
+                          pred_args = list(fac = "field"),
+                          smp_fun = partition_cv, 
+                          smp_args = list(repetition = 1:100, nfold = 5),
+                          error_rep = TRUE, error_fold = TRUE,
+                          progress = FALSE)
+
summary(res_lda_nsp$error_rep)
+
##                    mean    sd   median   IQR
+## train_error    3.40e-02 0.001 3.40e-02 0.001
+## train_accuracy 9.66e-01 0.001 9.66e-01 0.001
+## train_events   4.69e+03 0.000 4.69e+03 0.000
+## train_count    3.09e+04 0.000 3.09e+04 0.000
+## test_error     4.00e-02 0.002 4.00e-02 0.002
+## test_accuracy  9.60e-01 0.002 9.60e-01 0.002
+## test_events    1.17e+03 0.000 1.17e+03 0.000
+## test_count     7.71e+03 0.000 7.71e+03 0.000
+

To run a spatial cross-validation at the field level, we can use partition_factor_cv() as the sampling function. Since we are using 5 folds, we get a coarse 80/20 split of our data. 80% will be used for training, 20% for testing our trained model.

+

To take a look where our training and tests sets will be partitioned on each fold, we can plot them. The red colored points represent the test set in each fold, the black colored points the training set. Note that because we plotted over 7000 points, overplotting occurs and since the red crosses are plotted after the black ones, it seems visually that way more than ~20% of red points exist than it is really the case.

+
resamp <- partition_factor_cv(maipo, nfold = 5, repetition = 1:1, fac = "field")
+plot(resamp, maipo, coords = c("utmx","utmy"))
+
+ +
+

Subsequently, we have to specify the location of the fields (fac = "field") in the prediction arguments (pred_args) and sampling arguments (smp_args) in sperrorest().

+
res_lda_sp <- sperrorest(fo, data = maipo, coords = c("utmx","utmy"), 
+                         model_fun = lda,
+                         pred_fun = lda_predfun, 
+                         pred_args = list(fac = "field"),
+                         smp_fun = partition_factor_cv,
+                         smp_args = list(fac = "field", repetition = 1:50, nfold = 5),
+                         error_rep = TRUE, error_fold = TRUE, 
+                         benchmark = TRUE, progress = FALSE)
+res_lda_sp$benchmark$runtime_performance
+
summary(res_lda_sp$error_rep)
+
##                    mean      sd   median     IQR
+## train_error    2.95e-02 0.00177 2.97e-02 0.00261
+## train_accuracy 9.70e-01 0.00177 9.70e-01 0.00261
+## train_events   4.69e+03 0.00000 4.69e+03 0.00000
+## train_count    3.09e+04 0.00000 3.09e+04 0.00000
+## test_error     6.65e-02 0.00807 6.59e-02 0.01083
+## test_accuracy  9.33e-01 0.00807 9.34e-01 0.01083
+## test_events    1.17e+03 0.00000 1.17e+03 0.00000
+## test_count     7.71e+03 0.00000 7.71e+03 0.00000
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

+RandomForest

+

In the case of Random Forest, the customized pred_fun looks as follows; it is only required because of the majority filter, without it, we could just omit the pred_fun and pred_args arguments below.

+
rf_predfun <- function(object, newdata, fac = NULL) {
+  
+  p_load(nnet)
+  majority <- function(x) {
+    levels(x)[which.is.max(table(x))]
+  }
+  
+  majority_filter <- function(x, fac) {
+    for (lev in levels(fac)) {
+      x[fac == lev] <- majority(x[fac == lev])
+    }
+    x
+  }
+  
+  pred <- predict(object, newdata = newdata)
+  if (!is.null(fac)) pred <- majority_filter(pred, newdata[,fac]) 
+  return(pred)
+}
+

Running sperrorest() takes some time here (Test machine: 3,2 Ghz Intel I-5 with 4 physical cores).

+
res_rf_sp <- sperrorest(fo, data = maipo, coords = c("utmx","utmy"), 
+                        model_fun = randomForest,
+                        pred_fun = rf_predfun,
+                        pred_args = list(fac = "field"),
+                        smp_fun = partition_factor_cv,
+                        smp_args = list(fac = "field",
+                                        repetition = 1:50, nfold = 5),
+                        error_rep = TRUE, error_fold = TRUE,
+                        benchmark = TRUE, progress = 2)
+
## Mon Feb 27 20:56:01 2017 Repetition 1 
+## Mon Feb 27 20:57:12 2017 Repetition 2 
+## Mon Feb 27 20:58:20 2017 Repetition 3 
+## Mon Feb 27 20:59:29 2017 Repetition 4 
+## Mon Feb 27 21:00:36 2017 Repetition 5 
+## Mon Feb 27 21:01:46 2017 Repetition 6 
+## Mon Feb 27 21:02:55 2017 Repetition 7 
+## Mon Feb 27 21:04:01 2017 Repetition 8 
+## Mon Feb 27 21:05:07 2017 Repetition 9 
+## Mon Feb 27 21:06:16 2017 Repetition 10 
+## Mon Feb 27 21:07:23 2017 Repetition 11 
+## Mon Feb 27 21:08:30 2017 Repetition 12 
+## Mon Feb 27 21:09:38 2017 Repetition 13 
+## Mon Feb 27 21:10:45 2017 Repetition 14 
+## Mon Feb 27 21:11:53 2017 Repetition 15 
+## Mon Feb 27 21:13:01 2017 Repetition 16 
+## Mon Feb 27 21:14:09 2017 Repetition 17 
+## Mon Feb 27 21:15:16 2017 Repetition 18 
+## Mon Feb 27 21:16:23 2017 Repetition 19 
+## Mon Feb 27 21:17:31 2017 Repetition 20 
+## Mon Feb 27 21:18:39 2017 Repetition 21 
+## Mon Feb 27 21:19:46 2017 Repetition 22 
+## Mon Feb 27 21:20:53 2017 Repetition 23 
+## Mon Feb 27 21:22:03 2017 Repetition 24 
+## Mon Feb 27 21:23:13 2017 Repetition 25 
+## Mon Feb 27 21:24:23 2017 Repetition 26 
+## Mon Feb 27 21:25:32 2017 Repetition 27 
+## Mon Feb 27 21:26:39 2017 Repetition 28 
+## Mon Feb 27 21:27:47 2017 Repetition 29 
+## Mon Feb 27 21:28:55 2017 Repetition 30 
+## Mon Feb 27 21:30:03 2017 Repetition 31 
+## Mon Feb 27 21:31:11 2017 Repetition 32 
+## Mon Feb 27 21:32:18 2017 Repetition 33 
+## Mon Feb 27 21:33:25 2017 Repetition 34 
+## Mon Feb 27 21:34:33 2017 Repetition 35 
+## Mon Feb 27 21:35:40 2017 Repetition 36 
+## Mon Feb 27 21:36:47 2017 Repetition 37 
+## Mon Feb 27 21:37:54 2017 Repetition 38 
+## Mon Feb 27 21:39:02 2017 Repetition 39 
+## Mon Feb 27 21:40:09 2017 Repetition 40 
+## Mon Feb 27 21:41:17 2017 Repetition 41 
+## Mon Feb 27 21:42:24 2017 Repetition 42 
+## Mon Feb 27 21:43:31 2017 Repetition 43 
+## Mon Feb 27 21:44:38 2017 Repetition 44 
+## Mon Feb 27 21:45:46 2017 Repetition 45 
+## Mon Feb 27 21:46:54 2017 Repetition 46 
+## Mon Feb 27 21:48:01 2017 Repetition 47 
+## Mon Feb 27 21:49:07 2017 Repetition 48 
+## Mon Feb 27 21:50:15 2017 Repetition 49 
+## Mon Feb 27 21:51:21 2017 Repetition 50 
+## Mon Feb 27 21:52:27 2017 Done.
+
+res_rf_sp$benchmark$runtime_performance
+## Time difference of 56.4 mins
+
summary(res_rf_sp$error_rep$test_error)
+
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
+##  0.0630  0.0827  0.0871  0.0868  0.0928  0.1100
+
summary(res_rf_sp$error_rep$test_accuracy)
+
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
+##   0.890   0.907   0.913   0.913   0.917   0.937
+

What a surprise! RandomForest classification isn’t that good after all, if we acknowledge that in ‘real life’ we wouldn’t be making predictions in situations where the class membership of other grid cells in the same field is known in the training stage. So spatial dependence does matter.

+
+
+
+

+Usage Advices

+

Given all the different sampling functions and the required custom predict functions (e.g. rf_predfun()) in this example, you might be a little confused which function to use for your use case.
+If you want to do a “normal”, i.e. non-spatial cross-validation we recommend to use partition_cv() as smp_fun in sperrorest(). If you want to perform a spatial cross-validation (and you do not have a grouping structure like fields in this example), partition_kmeans() takes care of spatial partitioning. In most cases you can simply use the generic predict() method for your model (= skip this argument in sperrorest()). Check our “custom model and predict functions” vignette for more information on cases where adjustments are needed.

+

For further questions/issues, please open an issue at our Github repo.

+
+
+

+References

+
+
+

Breiman, Leo. 1996. “Bagging Predictors.” Machine Learning 24 (2). Springer Nature: 123–40. doi:10.1007/bf00058655.

+
+
+

———. 2001. “Random Forests.” Machine Learning 45 (1). Springer Nature: 5–32. doi:10.1023/a:1010933404324.

+
+
+

Brenning, A. 2005. “Spatial Prediction Models for Landslide Hazards: Review, Comparison and Evaluation.” Natural Hazards and Earth System Science 5 (6). Copernicus GmbH: 853–62. doi:10.5194/nhess-5-853-2005.

+
+
+

Goetz, J.N., A. Brenning, H. Petschko, and P. Leopold. 2015. “Evaluating Machine Learning and Statistical Prediction Techniques for Landslide Susceptibility Modeling.” Computers & Geosciences 81 (August). Elsevier BV: 1–11. doi:10.1016/j.cageo.2015.04.007.

+
+
+

Hothorn, Torsten, and Berthold Lausen. 2005. “Bundling Classifiers by Bagging Trees.” Computational Statistics & Data Analysis 49 (4). Elsevier BV: 1068–78. doi:10.1016/j.csda.2004.06.019.

+
+
+

James, Gareth, Daniela Witten, Trevor Hastie, and Robert Tibshirani. 2013. An Introduction to Statistical Learning. Springer New York. doi:10.1007/978-1-4614-7138-7.

+
+
+

Knudby, Anders, Alexander Brenning, and Ellsworth LeDrew. 2010. “New Approaches to Modelling Fishhabitat Relationships.” Ecological Modelling 221 (3). Elsevier BV: 503–11. doi:10.1016/j.ecolmodel.2009.11.008.

+
+
+

Peña, M.A., and A. Brenning. 2015. “Assessing Fruit-Tree Crop Classification from Landsat-8 Time Series for the Maipo Valley, Chile.” Remote Sensing of Environment 171 (December). Elsevier BV: 234–44. doi:10.1016/j.rse.2015.10.029.

+
+
+
+
+
+ + + +
+ + +
+ +
+

Site built with pkgdown.

+
+ +
+
+ + + diff --git a/docs/authors.html b/docs/authors.html new file mode 100644 index 00000000..bb394e60 --- /dev/null +++ b/docs/authors.html @@ -0,0 +1,152 @@ + + + + + + + + +Citation and Authors • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+
+ + + +

Brenning A (2012). +“Spatial cross-validation and bootstrap for the assessment of prediction rules in remote sensing: the R package 'sperrorest'.” +In IEEE International Symposium on Geoscience and Remote Sensing IGARSS. +In press. +

+
@InProceedings{,
+  author = {Alexander Brenning},
+  title = {Spatial cross-validation and bootstrap for the assessment of prediction rules in remote sensing: the R package 'sperrorest'},
+  booktitle = {IEEE International Symposium on Geoscience and Remote Sensing IGARSS},
+  year = {2012},
+  note = {In press},
+}
+ + +
    +
  • +

    Alexander Brenning. Author, maintainer. +
    0000-0001-6640-679X

    +
  • +
  • +

    Patrick Schratz. Author. +
    0000-0003-0748-6624

    +
  • +
  • +

    Tobias Herrmann. Author. +
    0000-0001-9768-0708

    +
  • +
+ +
+ +
+ + +
+ + +
+

Site built with pkgdown.

+
+ +
+
+ + + diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..f24ab283 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,193 @@ + + + + + + + +Perform Spatial Error Estimation and Variable Importance in Parallel • sperrorest + + + + + + +
+
+ + + +
+
+ + + + +
+ +
+ +

partition_kmeans()has been integrated into mlr (see e865e4). sperrorest is currently not actively developed. We recommend to use mlr for all future (spatial) cross-validation work. We will provide an tutorial for spatial data in the mlr-tutorial soon.

+
+

+General

+

Project Status: Active – The project has reached a stable, usable state and is being actively developed. DOI

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Resource:CRANTravis CIAppveyor
Platforms:MultipleLinux & macOSWindows
R CMD checkCRAN versionBuild statusBuild status
Test coverageCoverage Status
+
+
+

+CRAN

+

CRAN_Status_Badge Downloads

+
+
+
+

+Description

+

Spatial Error Estimation and Variable Importance

+

This package implements spatial error estimation and permutation-based spatial variable importance using different spatial cross-validation and spatial block bootstrap methods. To cite sperrorest in publications, reference the paper by (???). To see the package in action, please check the vignette.

+
+

+Installation

+

Get the released version from CRAN:

+
install.packages("sperrorest")
+

Or the development version from Github:

+
remotes::install_github("pat-s/sperrorest@dev")
+
+
+
+

+References

+
+ +
+
+
+
+ + + +
+ + +
+ +
+

Site built with pkgdown.

+
+ +
+
+ + + diff --git a/docs/jquery.sticky-kit.min.js b/docs/jquery.sticky-kit.min.js new file mode 100644 index 00000000..e2a3c6de --- /dev/null +++ b/docs/jquery.sticky-kit.min.js @@ -0,0 +1,9 @@ +/* + Sticky-kit v1.1.2 | WTFPL | Leaf Corcoran 2015 | http://leafo.net +*/ +(function(){var b,f;b=this.jQuery||window.jQuery;f=b(window);b.fn.stick_in_parent=function(d){var A,w,J,n,B,K,p,q,k,E,t;null==d&&(d={});t=d.sticky_class;B=d.inner_scrolling;E=d.recalc_every;k=d.parent;q=d.offset_top;p=d.spacer;w=d.bottoming;null==q&&(q=0);null==k&&(k=void 0);null==B&&(B=!0);null==t&&(t="is_stuck");A=b(document);null==w&&(w=!0);J=function(a,d,n,C,F,u,r,G){var v,H,m,D,I,c,g,x,y,z,h,l;if(!a.data("sticky_kit")){a.data("sticky_kit",!0);I=A.height();g=a.parent();null!=k&&(g=g.closest(k)); +if(!g.length)throw"failed to find stick parent";v=m=!1;(h=null!=p?p&&a.closest(p):b("
"))&&h.css("position",a.css("position"));x=function(){var c,f,e;if(!G&&(I=A.height(),c=parseInt(g.css("border-top-width"),10),f=parseInt(g.css("padding-top"),10),d=parseInt(g.css("padding-bottom"),10),n=g.offset().top+c+f,C=g.height(),m&&(v=m=!1,null==p&&(a.insertAfter(h),h.detach()),a.css({position:"",top:"",width:"",bottom:""}).removeClass(t),e=!0),F=a.offset().top-(parseInt(a.css("margin-top"),10)||0)-q, +u=a.outerHeight(!0),r=a.css("float"),h&&h.css({width:a.outerWidth(!0),height:u,display:a.css("display"),"vertical-align":a.css("vertical-align"),"float":r}),e))return l()};x();if(u!==C)return D=void 0,c=q,z=E,l=function(){var b,l,e,k;if(!G&&(e=!1,null!=z&&(--z,0>=z&&(z=E,x(),e=!0)),e||A.height()===I||x(),e=f.scrollTop(),null!=D&&(l=e-D),D=e,m?(w&&(k=e+u+c>C+n,v&&!k&&(v=!1,a.css({position:"fixed",bottom:"",top:c}).trigger("sticky_kit:unbottom"))),eb&&!v&&(c-=l,c=Math.max(b-u,c),c=Math.min(q,c),m&&a.css({top:c+"px"})))):e>F&&(m=!0,b={position:"fixed",top:c},b.width="border-box"===a.css("box-sizing")?a.outerWidth()+"px":a.width()+"px",a.css(b).addClass(t),null==p&&(a.after(h),"left"!==r&&"right"!==r||h.append(a)),a.trigger("sticky_kit:stick")),m&&w&&(null==k&&(k=e+u+c>C+n),!v&&k)))return v=!0,"static"===g.css("position")&&g.css({position:"relative"}), +a.css({position:"absolute",bottom:d,top:"auto"}).trigger("sticky_kit:bottom")},y=function(){x();return l()},H=function(){G=!0;f.off("touchmove",l);f.off("scroll",l);f.off("resize",y);b(document.body).off("sticky_kit:recalc",y);a.off("sticky_kit:detach",H);a.removeData("sticky_kit");a.css({position:"",bottom:"",top:"",width:""});g.position("position","");if(m)return null==p&&("left"!==r&&"right"!==r||a.insertAfter(h),h.remove()),a.removeClass(t)},f.on("touchmove",l),f.on("scroll",l),f.on("resize", +y),b(document.body).on("sticky_kit:recalc",y),a.on("sticky_kit:detach",H),setTimeout(l,0)}};n=0;for(K=this.length;n + + + + + diff --git a/docs/news/index.html b/docs/news/index.html new file mode 100644 index 00000000..5a5f02b2 --- /dev/null +++ b/docs/news/index.html @@ -0,0 +1,331 @@ + + + + + + + + +All news • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + +
+ +
+ +
+ + +
+
+

+sperrorest 2.1.1 (15-Oct-2017)

+
+

+Bugfixes:

+
    +
  • +train_fun and test_fun are now handled correctly and eventual sub-sampling is correctly reflected to the resulting ‘resampling’ object
  • +
+
+
+
+

+sperrorest 2.1.0 (25-Sep-2017)

+
+

+Features:

+
    +
  • error handling during model fitting & performance evaluation: If a model does not converge for some folds or an error occurs during performance calculation, results of this fold are set to NA and a message is printed to the console. sperrorest() will continue normally and uses the successful folds to calculate the repetition error. This helps to run CV with many repetitions using models which do not always converge like maxnet(), gamm() or svm().
  • +
+
+
+

+Bugfixes:

+
    +
  • Size of example data set ecuador has been adjusted to avoid exact duplicates of partitions when using partition_kmeans().
  • +
+
+
+
+

+sperrorest 2.0.1 (20-Jul-2017)

+
+

+Bugfixes:

+
    +
  • Fixes a bug which caused equal importance of all predictors when performing permutation-based variable importance assessment
  • +
+
+
+
+

+sperrorest 2.0.0 (12-Jun-2017)

+
+

+Major:

+
    +
  • integration of parsperrorest() into sperrorest().
  • +
  • by default, sperrorest() now runs in parallel using all available cores.
  • +
  • +runfolds() and runreps() are now doing the heavy lifting in the background. All modes are now running on the same code base. Before, all parallel modes were running on different code implementations.
  • +
  • function and argument name changes to ‘snake_case’
  • +
+
+
+

+Features:

+
    +
  • new (parallel) modes: +
      +
    • +apply: calls pbmclapply() on Unix and pbapply() on Windows.
    • +
    • +future: calls future_lapply() with various future options (multiprocess, multicore, etc.).
    • +
    • +foreach: foreach() with various future options (multiprocess, multicore, etc.). Default option to cluster. This is also the overall default mode for sperrorest().
    • +
    • +sequential: sequential execution using future backend.
    • +
    +
  • +
  • RMSE instead of MSE as error measure
  • +
  • You can now pass also single values to repetition argument of sperrorest(). Specifying a range like repetition = 1:10 will also stay valid.
  • +
  • New vignette sperrorest::parallel-modes comparing the various parallel modes.
  • +
  • New vignette sperrorest::custom-pred-and-model-functions explaining why and how custom defined model and predict functions are needed for some model setups.
  • +
+
+
+

+Misc:

+
    +
  • Limit workers to number of repetitions if number of cores > number of repetitions. This ensures that no unnecessary workers are started and increases robustness of parallel execuction.
  • +
  • documentation improvements.
  • +
  • +do_try argument has been removed.
  • +
  • +error.fold, error.rep and err.train arguments have been removed because they are all calculated by default now.
  • +
+
+
+

+Bugfixes:

+
    +
  • partial matching of arguments
  • +
  • account for factor levels only present in test data but missing in training data. Previously, sperrorest errored during the predict step when this case occured. Now, this is accounted for and an informative message is given.
  • +
+
+
+
+

+sperrorest 1.0.0 (08-Mar-2017)

+
+

+New features:

+
    +
  • add parsperrorest(): This function lets you exexute sperrorest() in parallel. It includes two modes (par.mode = 1 and par.mode = 2) which use different parallelization approaches in the background. See ?parsperrorest() for more details.

  • +
  • add partition.factor.cv(): This resampling method enables partitioning based on a given factor variable. This can be used, for example, to resample agricultural data, that is grouped by fields, at the agricultural field level in order to preserve spatial autocorrelation within fields.

  • +
  • sperrorest() and parsperrorest(): Add benchmark item to returned object giving information about execution time, used cores and other system details.

  • +
+

Changes to functions:

+
    +
  • sperrorest(): Change argument naming. err.unpooled is now error.fold and err.pooled is now error.rep

  • +
  • +sperrorest() and parsperrorest(): Change order and naming of returned object +
      +
    • class sperrorestpoolederror is now sperrorestreperror +
    • +
    • returned sperrorest list is now ordered as follows: +
        +
      1. error.rep
      2. +
      3. error.fold
      4. +
      5. importance
      6. +
      7. benchmarks
      8. +
      9. package.version
      10. +
      +
    • +
    +
  • +
+
+ +
+
+

+sperrorest 0.2-1 (19 June 2012)

+
    +
  • First release on CRAN
  • +
+
+
+

+sperrorest 0.2-0 (19 June 2012)

+
    +
  • last pre-release version
  • +
  • replaced Stoyan’s data set with Jannes Muenchow’s data, adapted examples
  • +
+
+
+

+sperrorest 0.1-5 (1 Mar 2012)

+
    +
  • made training set estimation optional
  • +
  • robustified code using try()
  • +
+
+
+

+sperrorest 0.1-2 (29 Jan 2012)

+
    +
  • internal release 0.1-2
  • +
  • some bug fixes, e.g. in err.* functions
  • +
  • improved support of pooled versus unpooled error estimation
  • +
  • changed some argument names
  • +
  • this version was used for Angie’s analyses
  • +
+
+
+

+sperrorest 0.1-1 (29 Dec 2011)

+
    +
  • built internal release 0.1-1
  • +
+
+
+

+sperrorest 0.1

+
    +
  • general code development (2009 - 2011)
  • +
  • package project and documentation created (Oct-Dec 2011)
  • +
+
+
+
+ + + +
+ +
+ + +
+

Site built with pkgdown.

+
+ +
+
+ + + diff --git a/docs/pkgdown.css b/docs/pkgdown.css new file mode 100644 index 00000000..209ce57f --- /dev/null +++ b/docs/pkgdown.css @@ -0,0 +1,163 @@ +/* Sticker footer */ +body > .container { + display: flex; + padding-top: 60px; + min-height: calc(100vh); + flex-direction: column; +} + +body > .container .row { + flex: 1; +} + +footer { + margin-top: 45px; + padding: 35px 0 36px; + border-top: 1px solid #e5e5e5; + color: #666; + display: flex; +} +footer p { + margin-bottom: 0; +} +footer div { + flex: 1; +} +footer .pkgdown { + text-align: right; +} +footer p { + margin-bottom: 0; +} + +img.icon { + float: right; +} + +img { + max-width: 100%; +} + +/* Section anchors ---------------------------------*/ + +a.anchor { + margin-left: -30px; + display:inline-block; + width: 30px; + height: 30px; + visibility: hidden; + + background-image: url(./link.svg); + background-repeat: no-repeat; + background-size: 20px 20px; + background-position: center center; +} + +.hasAnchor:hover a.anchor { + visibility: visible; +} + +@media (max-width: 767px) { + .hasAnchor:hover a.anchor { + visibility: hidden; + } +} + + +/* Fixes for fixed navbar --------------------------*/ + +.contents h1, .contents h2, .contents h3, .contents h4 { + padding-top: 60px; + margin-top: -60px; +} + +/* Static header placement on mobile devices */ +@media (max-width: 767px) { + .navbar-fixed-top { + position: absolute; + } + .navbar { + padding: 0; + } +} + + +/* Sidebar --------------------------*/ + +#sidebar { + margin-top: 30px; +} +#sidebar h2 { + font-size: 1.5em; + margin-top: 1em; +} + +#sidebar h2:first-child { + margin-top: 0; +} + +#sidebar .list-unstyled li { + margin-bottom: 0.5em; +} + +/* Reference index & topics ----------------------------------------------- */ + +.ref-index th {font-weight: normal;} +.ref-index h2 {font-size: 20px;} + +.ref-index td {vertical-align: top;} +.ref-index .alias {width: 40%;} +.ref-index .title {width: 60%;} + +.ref-index .alias {width: 40%;} +.ref-index .title {width: 60%;} + +.ref-arguments th {text-align: right; padding-right: 10px;} +.ref-arguments th, .ref-arguments td {vertical-align: top;} +.ref-arguments .name {width: 20%;} +.ref-arguments .desc {width: 80%;} + +/* Nice scrolling for wide elements --------------------------------------- */ + +table { + display: block; + overflow: auto; +} + +/* Syntax highlighting ---------------------------------------------------- */ + +pre { + word-wrap: normal; + word-break: normal; + border: 1px solid #eee; +} + +pre, code { + background-color: #f8f8f8; + color: #333; +} + +pre .img { + margin: 5px 0; +} + +pre .img img { + background-color: #fff; + display: block; + height: auto; +} + +code a, pre a { + color: #375f84; +} + +.fl {color: #1514b5;} +.fu {color: #000000;} /* function */ +.ch,.st {color: #036a07;} /* string */ +.kw {color: #264D66;} /* keyword */ +.co {color: #888888;} /* comment */ + +.message { color: black; font-weight: bolder;} +.error { color: orange; font-weight: bolder;} +.warning { color: #6A0366; font-weight: bolder;} + diff --git a/docs/pkgdown.js b/docs/pkgdown.js new file mode 100644 index 00000000..4b817132 --- /dev/null +++ b/docs/pkgdown.js @@ -0,0 +1,45 @@ +$(function() { + $("#sidebar").stick_in_parent({offset_top: 40}); + $('body').scrollspy({ + target: '#sidebar', + offset: 60 + }); + + var cur_path = paths(location.pathname); + $("#navbar ul li a").each(function(index, value) { + if (value.text == "Home") + return; + if (value.getAttribute("href") === "#") + return; + + var path = paths(value.pathname); + if (is_prefix(cur_path, path)) { + // Add class to parent
  • , and enclosing
  • if in dropdown + var menu_anchor = $(value); + menu_anchor.parent().addClass("active"); + menu_anchor.closest("li.dropdown").addClass("active"); + } + }); +}); + +function paths(pathname) { + var pieces = pathname.split("/"); + pieces.shift(); // always starts with / + + var end = pieces[pieces.length - 1]; + if (end === "index.html" || end === "") + pieces.pop(); + return(pieces); +} + +function is_prefix(needle, haystack) { + if (needle.length > haystack.lengh) + return(false); + + for (var i = 0; i < haystack.length; i++) { + if (needle[i] != haystack[i]) + return(false); + } + + return(true); +} diff --git a/docs/reference/add.distance.html b/docs/reference/add.distance.html new file mode 100644 index 00000000..98e7896f --- /dev/null +++ b/docs/reference/add.distance.html @@ -0,0 +1,202 @@ + + + + + + + + +Add distance information to resampling objects — add.distance • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Add distance information to resampling objects

    + + +
    add.distance(object, ...)
    +
    +# S3 method for resampling
    +add.distance(object, data, coords = c("x", "y"), ...)
    +
    +# S3 method for represampling
    +add.distance(object, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + +
    object

    resampling or represampling object.

    ...

    Additional arguments to dataset_distance and +add.distance.resampling, respectively.

    data

    data.frame containing at least the columns specified +by coords

    coords

    (ignored by partition_cv)

    + +

    Value

    + +

    A resampling or represampling object +containing an additional. +$distance component in each resampling object. +The distance component is a single numeric value indicating, for +each train / test pair, the (by default, mean) +nearest-neighbour distance between the two sets.

    + +

    Details

    + +

    Nearest-neighbour distances are calculated for each sample in the +test set. These nrow(???$test) nearest-neighbour distances are then +averaged. Aggregation methods other than mean can be chosen using +the fun argument, which will be passed on to +dataset_distance.

    + +

    See also

    + +

    dataset_distance represampling +resampling

    + + +

    Examples

    +
    data(ecuador) # Muenchow et al. (2012), see ?ecuador +nsp.parti <- partition_cv(ecuador) +sp.parti <- partition_kmeans(ecuador) +nsp.parti <- add.distance(nsp.parti, ecuador) +sp.parti <- add.distance(sp.parti, ecuador) +# non-spatial partioning: very small test-training distance: +nsp.parti[[1]][[1]]$distance
    #> [1] 53.79223
    # spatial partitioning: more substantial distance, depending on number of +# folds etc. +sp.parti[[1]][[1]]$distance
    #> [1] 390.1742
    +
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/as.represampling.html b/docs/reference/as.represampling.html new file mode 100644 index 00000000..5058569e --- /dev/null +++ b/docs/reference/as.represampling.html @@ -0,0 +1,227 @@ + + + + + + + + +Resampling objects with repetition, i.e. sets of partitionings or boostrap +samples — as.represampling • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Functions for handling represampling objects, i.e. lists of +resampling objects.

    + + +
    as.represampling(object, ...)
    +
    +# S3 method for list
    +as.represampling(object, ...)
    +
    +# S3 method for represampling
    +print(x, ...)
    +
    +is_represampling(object)
    + +

    Arguments

    + + + + + + + + + + + + + + +
    object

    object of class represampling, or a list to be coerced +to this class.

    ...

    currently not used.

    x

    object of class represampling.

    + +

    Value

    + +

    as.represampling methods return an object of class +represampling with the contents of object.

    + +

    Details

    + +

    represampling objects are (names) lists of +resampling objects. Such objects are typically created by +partition_cv, partition_kmeans, +represampling_disc_bootstrap and related functions.

    +

    In r-repeated k-fold cross-validation, for example, the +corresponding represampling object has length r, and each of +its r resampling objects has length k. + as.resampling_list coerces object to class represampling +while coercing its elements to resampling objects. +Some validity checks are performed.

    + +

    See also

    + +

    resampling, partition_cv, +partition_kmeans, +represampling_disc_bootstrap, etc.

    + + +

    Examples

    +
    data(ecuador) # Muenchow et al. (2012), see ?ecuador +# Partitioning by elevation classes in 200 m steps: +fac <- factor( as.character( floor( ecuador$dem / 300 ) ) ) +summary(fac)
    #> 10 5 6 7 8 9 +#> 4 21 246 255 147 78
    parti <- as.resampling(fac) +# a list of lists specifying sets of training and test sets, +# using each factor at a time as the test set: +str(parti)
    #> List of 6 +#> $ 10:List of 2 +#> ..$ train: int [1:747] 1 2 3 4 5 6 7 8 9 10 ... +#> ..$ test : int [1:4] 535 566 684 734 +#> $ 5 :List of 2 +#> ..$ train: int [1:730] 1 2 3 4 5 6 7 8 9 10 ... +#> ..$ test : int [1:21] 42 77 93 106 115 139 250 332 385 405 ... +#> $ 6 :List of 2 +#> ..$ train: int [1:505] 2 4 7 8 9 12 13 14 15 17 ... +#> ..$ test : int [1:246] 1 3 5 6 10 11 16 19 23 29 ... +#> $ 7 :List of 2 +#> ..$ train: int [1:496] 1 3 5 6 7 8 10 11 12 13 ... +#> ..$ test : int [1:255] 2 4 9 18 20 22 24 26 28 30 ... +#> $ 8 :List of 2 +#> ..$ train: int [1:604] 1 2 3 4 5 6 7 9 10 11 ... +#> ..$ test : int [1:147] 8 12 14 15 21 25 27 32 46 54 ... +#> $ 9 :List of 2 +#> ..$ train: int [1:673] 1 2 3 4 5 6 8 9 10 11 ... +#> ..$ test : int [1:78] 7 13 17 35 44 75 78 79 88 97 ... +#> - attr(*, "class")= chr "resampling"
    summary(parti)
    #> n.train n.test +#> 10 747 4 +#> 5 730 21 +#> 6 505 246 +#> 7 496 255 +#> 8 604 147 +#> 9 673 78
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/as.resampling.html b/docs/reference/as.resampling.html new file mode 100644 index 00000000..55d90ab1 --- /dev/null +++ b/docs/reference/as.resampling.html @@ -0,0 +1,291 @@ + + + + + + + + +Resampling objects such as partitionings or bootstrap samples — as.resampling • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Create/coerce and print resampling objects, e.g., partitionings or boostrap +samples derived from a data set.

    + + +
    as.resampling(object, ...)
    +
    +# S3 method for default
    +as.resampling(object, ...)
    +
    +# S3 method for factor
    +as.resampling(object, ...)
    +
    +# S3 method for list
    +as.resampling(object, ...)
    +
    +validate.resampling(object)
    +
    +is.resampling(x, ...)
    +
    +# S3 method for resampling
    +print(x, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + +
    object

    depending on the function/method, a list or a vector of type +factor defining a partitioning of the dataset.

    ...

    currently not used.

    x

    object of class resampling.

    + +

    Value

    + +

    as.resampling methods: An object of class resampling.

    + +

    Details

    + +

    A resampling object is a list of lists defining a set of +training and test samples.

    +

    In the case of k-fold cross-validation partitioning, for example, +the corresponding resampling object would be of length k, +i.e. contain k lists. Each of these k lists defines a training +set of size n(k-1)/k (where n is the overall sample size), and +a test set of size n/k. +The resampling object does, however, not contain the data itself, but +only indices between 1 and n identifying the selection +(see Examples).

    +

    Another example is bootstrap resampling. represampling_bootstrap +with argument oob = TRUE generates represampling objects +with indices of a bootstrap sample in the train component and indices +of the out-of-bag sample in the test component (see Examples below). + as.resampling.factor: For each factor level of the input variable, +as.resampling.factor determines the indices of samples in this level +(= test samples) and outside this level (= training samples). Empty levels of +object are dropped without warning. + as.resampling_list checks if the list in object has a valid +resampling object structure (with components train and +test etc.) and assigns the class attribute 'resampling' if +successful.

    + +

    See also

    + +

    represampling, partition_cv, +partition_kmeans, represampling_bootstrap, etc.

    + + +

    Examples

    +
    data(ecuador) # Muenchow et al. (2012), see ?ecuador + +# Partitioning by elevation classes in 200 m steps: +parti <- factor( as.character( floor( ecuador$dem / 200 ) ) ) +smp <- as.resampling(parti) +summary(smp)
    #> n.train n.test +#> 10 600 151 +#> 11 585 166 +#> 12 660 91 +#> 13 641 110 +#> 14 727 24 +#> 15 747 4 +#> 8 730 21 +#> 9 567 184
    # Compare: +summary(parti)
    #> 10 11 12 13 14 15 8 9 +#> 151 166 91 110 24 4 21 184
    +# k-fold (non-spatial) cross-validation partitioning: +parti <- partition_cv(ecuador) +parti <- parti[[1]] # the first (and only) resampling object in parti +# data corresponding to the test sample of the first fold: +str( ecuador[ parti[[1]]$test , ])
    #> 'data.frame': 76 obs. of 13 variables: +#> $ x : num 714042 715282 713962 713412 714902 ... +#> $ y : num 9558482 9557602 9561082 9560472 9559262 ... +#> $ dem : num 2408 2837 1839 1869 2363 ... +#> $ slope : num 24.1 34.4 63.4 16.9 50.7 ... +#> $ hcurv : num 0.00659 -0.02191 -0.04951 -0.00156 -0.01407 ... +#> $ vcurv : num 0.01041 -0.00579 -0.00529 0.00406 0.00547 ... +#> $ carea : num 773 2247 3282 2421 519 ... +#> $ cslope : num 27.5 37.7 29.1 31 35.3 ... +#> $ distroad : num 300 300 173 300 300 ... +#> $ slides : Factor w/ 2 levels "FALSE","TRUE": 2 2 2 2 2 2 2 2 2 2 ... +#> $ distdeforest : num 300 300 33.8 52.5 300 ... +#> $ distslidespast: num 6 100 100 39 59 100 37 100 25 0 ... +#> $ log.carea : num 2.89 3.35 3.52 3.38 2.72 ...
    # the corresponding training sample - larger: +str( ecuador[ parti[[1]]$train , ])
    #> 'data.frame': 675 obs. of 13 variables: +#> $ x : num 712882 715232 715392 715042 715382 ... +#> $ y : num 9560002 9559582 9560172 9559312 9560142 ... +#> $ dem : num 1912 2199 1989 2320 2021 ... +#> $ slope : num 25.6 23.2 40.5 42.9 42 ... +#> $ hcurv : num -0.00681 -0.00501 -0.01919 -0.01106 0.00958 ... +#> $ vcurv : num -0.00029 -0.00649 -0.04051 -0.04634 0.02642 ... +#> $ carea : num 5577 1399 351155 501 671 ... +#> $ cslope : num 34.4 30.7 32.8 33.9 41.6 ... +#> $ distroad : num 300 300 300 300 300 ... +#> $ slides : Factor w/ 2 levels "FALSE","TRUE": 2 2 2 2 2 2 2 2 2 2 ... +#> $ distdeforest : num 15 300 300 300 300 9.15 300 300 300 0 ... +#> $ distslidespast: num 9 21 40 100 21 2 100 100 41 5 ... +#> $ log.carea : num 3.75 3.15 5.55 2.7 2.83 ...
    +# Bootstrap training sets, out-of-bag test sets: +parti <- represampling_bootstrap(ecuador, oob = TRUE) +parti <- parti[[1]] # the first (and only) resampling object in parti +# out-of-bag test sample: approx. one-third of nrow(ecuador): +str( ecuador[ parti[[1]]$test , ])
    #> 'data.frame': 290 obs. of 13 variables: +#> $ x : num 715232 715042 715382 712802 714842 ... +#> $ y : num 9559582 9559312 9560142 9559952 9558892 ... +#> $ dem : num 2199 2320 2021 1838 2483 ... +#> $ slope : num 23.2 42.9 42 52.1 68.8 ... +#> $ hcurv : num -0.00501 -0.01106 0.00958 0.00183 -0.04921 ... +#> $ vcurv : num -0.00649 -0.04634 0.02642 -0.09203 -0.12438 ... +#> $ carea : num 1399 501 671 634 754 ... +#> $ cslope : num 30.7 33.9 41.6 30.3 53.7 ... +#> $ distroad : num 300 300 300 300 300 ... +#> $ slides : Factor w/ 2 levels "FALSE","TRUE": 2 2 2 2 2 2 2 2 2 2 ... +#> $ distdeforest : num 300 300 300 9.15 300 ... +#> $ distslidespast: num 21 100 21 2 100 5 20 100 100 100 ... +#> $ log.carea : num 3.15 2.7 2.83 2.8 2.88 ...
    # bootstrap training sample: same size as nrow(ecuador): +str( ecuador[ parti[[1]]$train , ])
    #> 'data.frame': 751 obs. of 13 variables: +#> $ x : num 715382 713132 715432 714892 715722 ... +#> $ y : num 9558062 9560672 9558592 9559282 9557532 ... +#> $ dem : num 2799 1897 2622 2374 3097 ... +#> $ slope : num 50.6 24.7 19 42.8 28.8 ... +#> $ hcurv : num -0.00812 0.00306 -0.00301 -0.01057 0.02327 ... +#> $ vcurv : num -0.02208 -0.00436 -0.01099 0.02427 0.01833 ... +#> $ carea : num 951 2603 1146 381 300 ... +#> $ cslope : num 50.9 29 20.1 27.2 25.9 ... +#> $ distroad : num 300 10 300 300 300 300 300 300 300 300 ... +#> $ slides : Factor w/ 2 levels "FALSE","TRUE": 1 2 1 2 1 1 2 2 2 1 ... +#> $ distdeforest : num 300 166 300 300 300 ... +#> $ distslidespast: num 100 2 26 46 100 55 100 100 11 45 ... +#> $ log.carea : num 2.98 3.42 3.06 2.58 2.48 ...
    +
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/as.tilename.html b/docs/reference/as.tilename.html new file mode 100644 index 00000000..69c3c2de --- /dev/null +++ b/docs/reference/as.tilename.html @@ -0,0 +1,182 @@ + + + + + + + + +Alphanumeric tile names — as.tilename • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Functions for generating and handling alphanumeric tile names of the +form 'X2:Y7' as used by partition_tiles and +represampling_tile_bootstrap.

    + + +
    as.tilename(x, ...)
    +
    +# S3 method for numeric
    +as.tilename(x, ...)
    +
    +# S3 method for tilename
    +as.character(x, ...)
    +
    +# S3 method for tilename
    +as.numeric(x, ...)
    +
    +# S3 method for character
    +as.tilename(x, ...)
    +
    +# S3 method for tilename
    +print(x, ...)
    + +

    Arguments

    + + + + + + + + + + +
    x

    object of class tilename, character, or +numeric (of length 2).

    ...

    additional arguments (currently ignored).

    + +

    Value

    + +

    object of class tilename, character, or numeric +vector of length 2

    + +

    See also

    + +

    partition_tiles, represampling, +represampling_tile_bootstrap

    + + +

    Examples

    +
    tnm <- as.tilename(c(2,3)) +tnm # 'X2:Y3'
    #> [1] "X2:Y3"
    as.numeric(tnm) # c(2,3)
    #> Warning: NAs introduced by coercion
    #> [1] NA
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/dataset_distance.html b/docs/reference/dataset_distance.html new file mode 100644 index 00000000..9d7beedf --- /dev/null +++ b/docs/reference/dataset_distance.html @@ -0,0 +1,200 @@ + + + + + + + + +Calculate mean nearest-neighbour distance between point datasets — dataset_distance • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    dataset_distance calculates Euclidean nearest-neighbour distances +between two point datasets and summarizes these distances using some +function, by default the mean.

    + + +
    dataset_distance(d1, d2, x_name = "x", y_name = "y", fun = mean,
    +  method = "euclidean", ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    d1

    a data.frame with (at least) columns with names given by +x_name and y_name; these contain the x and y coordinates, +respectively.

    d2

    see d1 - second set of points

    x_name

    name of column in d1 and d2 containing the x +coordinates of points.

    y_name

    same for y coordinates

    fun

    function to be applied to the vector of nearest-neighbor +distances of d1 from d2.

    method

    type of distance metric to be used; only 'euclidean' +is currently supported.

    ...

    additional arguments to fun.

    + +

    Value

    + +

    depends on fun; typically (e.g., mean) a numeric vector +of length 1

    + +

    Details

    + +

    Nearest-neighbour distances are calculated for each point in +d1, resulting in a vector of length nrow(d1), and fun +is applied to this vector.

    + +

    See also

    + +

    add.distance

    + + +

    Examples

    +
    df <- data.frame(x = rnorm(100), y = rnorm(100)) +dataset_distance(df, df) # == 0
    #> [1] 0
    +
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/ecuador-1.png b/docs/reference/ecuador-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae0919edb6416dd9f0511ee44f7c789aa9874c18 GIT binary patch literal 26229 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 + + + + + + + +J. Muenchow's Ecuador landslide data set — ecuador • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Data set created by Jannes Muenchow, University of Erlangen-Nuremberg, +Germany. +These data should be cited as Muenchow et al. (2012) (see reference below). +This publication also contains additional information on data collection and +the geomorphology of the area. The data set provded here is (a subset of) the +one from the 'natural' part of the RBSF area and corresponds to landslide +distribution in the year 2000.

    + + + +

    Format

    + +

    a data.frame with point samples of landslide and +non-landslide locations in a study area in the Andes of southern Ecuador.

    + +

    References

    + +

    Muenchow, J., Brenning, A., Richter, M., 2012. Geomorphic process +rates of landslides along a humidity gradient in the tropical Andes. +Geomorphology, 139-140: 271-284.

    +

    Brenning, A., 2005. Spatial prediction models for landslide hazards: +review, comparison and evaluation. +Natural Hazards and Earth System Sciences, 5(6): 853-862.

    + + +

    Examples

    +
    data(ecuador) +str(ecuador)
    #> 'data.frame': 751 obs. of 13 variables: +#> $ x : num 712882 715232 715392 715042 715382 ... +#> $ y : num 9560002 9559582 9560172 9559312 9560142 ... +#> $ dem : num 1912 2199 1989 2320 2021 ... +#> $ slope : num 25.6 23.2 40.5 42.9 42 ... +#> $ hcurv : num -0.00681 -0.00501 -0.01919 -0.01106 0.00958 ... +#> $ vcurv : num -0.00029 -0.00649 -0.04051 -0.04634 0.02642 ... +#> $ carea : num 5577 1399 351155 501 671 ... +#> $ cslope : num 34.4 30.7 32.8 33.9 41.6 ... +#> $ distroad : num 300 300 300 300 300 ... +#> $ slides : Factor w/ 2 levels "FALSE","TRUE": 2 2 2 2 2 2 2 2 2 2 ... +#> $ distdeforest : num 15 300 300 300 300 9.15 300 300 300 0 ... +#> $ distslidespast: num 9 21 40 100 21 2 100 100 41 5 ... +#> $ log.carea : num 3.75 3.15 5.55 2.7 2.83 ...
    library(rpart) +ctrl <- rpart.control(cp = 0.02) +fit <- rpart(slides ~ dem + slope + hcurv + vcurv + + log.carea + cslope, data = ecuador, control = ctrl) +par(xpd = TRUE) +plot(fit, compress = TRUE, main = 'Muenchows landslide data set')
    text(fit, use.n = TRUE)
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/err_default.html b/docs/reference/err_default.html new file mode 100644 index 00000000..ab1b4f1d --- /dev/null +++ b/docs/reference/err_default.html @@ -0,0 +1,323 @@ + + + + + + + + +Default error function — err_default • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Calculate a variety of accuracy measures from observations +and predictions of numerical and categorical response variables.

    + + +
    err_default(obs, pred)
    + +

    Arguments

    + + + + + + + + + + +
    obs

    factor, logical, or numeric vector with observations

    pred

    factor, logical, or numeric vector with predictions. Must be of +same type as obs with the exception that pred may be numeric +if obs is factor or logical ('soft' classification).

    + +

    Value

    + +

    A list with (currently) the following components, depending on the +type of prediction problem:

    +
    'hard' classification

    misclassification error, overall accuracy; +if two classes, sensitivity, specificity, positive predictive value (PPV), +negative predictive value (NPV), kappa

    +
    'soft' classification

    area under the ROC curve, error and accuracy +at a obs>0.5 dichotomization, false-positive rate (FPR; 1-specificity) +at 70, 80 and 90 percent sensitivity, true-positive rate (sensitivity) +at 80, 90 and 95 percent specificity

    +
    regression

    bias, standard deviation, mean squared error, +MAD (mad), median, interquartile range (IQR) +of residuals

    + + +

    Note

    + +

    NA values are currently not handled by this function, +i.e. they will result in an error.

    + +

    See also

    + +

    ROCR

    + + +

    Examples

    +
    obs <- rnorm(1000) +# Two mock (soft) classification examples: +err_default( obs > 0, rnorm(1000) ) # just noise
    #> $auroc +#> [1] 0.4621542 +#> +#> $error +#> [1] 0.513 +#> +#> $accuracy +#> [1] 0.487 +#> +#> $sensitivity +#> [1] 0.2727273 +#> +#> $specificity +#> [1] 0.6970297 +#> +#> $fpr70 +#> [1] 0.7366337 +#> +#> $fpr80 +#> [1] 0.829703 +#> +#> $fpr90 +#> [1] 0.9069307 +#> +#> $tpr80 +#> [1] 0.1515152 +#> +#> $tpr90 +#> [1] 0.06868687 +#> +#> $tpr95 +#> [1] 0.04040404 +#> +#> $events +#> [1] 495 +#> +#> $count +#> [1] 1000 +#>
    err_default( obs > 0, obs + rnorm(1000) ) # some discrimination
    #> $auroc +#> [1] 0.8270627 +#> +#> $error +#> [1] 0.259 +#> +#> $accuracy +#> [1] 0.741 +#> +#> $sensitivity +#> [1] 0.6282828 +#> +#> $specificity +#> [1] 0.8514851 +#> +#> $fpr70 +#> [1] 0.219802 +#> +#> $fpr80 +#> [1] 0.3465347 +#> +#> $fpr90 +#> [1] 0.5009901 +#> +#> $tpr80 +#> [1] 0.6888889 +#> +#> $tpr90 +#> [1] 0.5313131 +#> +#> $tpr95 +#> [1] 0.4121212 +#> +#> $events +#> [1] 495 +#> +#> $count +#> [1] 1000 +#>
    # Three mock regression examples: +err_default( obs, rnorm(1000) ) # just noise, but no bias
    #> $bias +#> [1] 0.01646476 +#> +#> $stddev +#> [1] 1.437289 +#> +#> $rmse +#> [1] 1.436665 +#> +#> $mad +#> [1] 1.486945 +#> +#> $median +#> [1] 0.01263483 +#> +#> $iqr +#> [1] 2.004161 +#> +#> $count +#> [1] 1000 +#>
    err_default( obs, obs + rnorm(1000) ) # some association, no bias
    #> $bias +#> [1] -0.05961818 +#> +#> $stddev +#> [1] 1.000054 +#> +#> $rmse +#> [1] 1.00133 +#> +#> $mad +#> [1] 0.9719318 +#> +#> $median +#> [1] -0.05654433 +#> +#> $iqr +#> [1] 1.302193 +#> +#> $count +#> [1] 1000 +#>
    err_default( obs, obs + 1 ) # perfect correlation, but with bias
    #> $bias +#> [1] -1 +#> +#> $stddev +#> [1] 6.429096e-17 +#> +#> $rmse +#> [1] 1 +#> +#> $mad +#> [1] 0 +#> +#> $median +#> [1] -1 +#> +#> $iqr +#> [1] 0 +#> +#> $count +#> [1] 1000 +#>
    +
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/figures/plotresampling.png b/docs/reference/figures/plotresampling.png new file mode 100644 index 0000000000000000000000000000000000000000..c7bdd599cb067f9d9103a3bb1eb19a3c83b4688d GIT binary patch literal 156751 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
  • 8;DnB4hae%M=1=GY9Axy8=c8m%ihd@?Vz?!8?0 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 z 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¨g@ebyVU_7B0{&;`r2lwf- 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 + + + + + + + +Identify small partitions that need to be fixed. — get_small_tiles • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/reference/index.html b/docs/reference/index.html new file mode 100644 index 00000000..cad6f7f8 --- /dev/null +++ b/docs/reference/index.html @@ -0,0 +1,331 @@ + + + + + + + + +Function reference • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    All functions

    +

    +
    +

    add.distance

    +

    Add distance information to resampling objects

    +

    as.represampling print is_represampling

    +

    Resampling objects with repetition, i.e. sets of partitionings or boostrap +samples

    +

    as.resampling validate.resampling is.resampling print

    +

    Resampling objects such as partitionings or bootstrap samples

    +

    as.tilename as.character as.numeric print

    +

    Alphanumeric tile names

    +

    dataset_distance

    +

    Calculate mean nearest-neighbour distance between point datasets

    +

    err_default

    +

    Default error function

    +

    get_small_tiles

    +

    Identify small partitions that need to be fixed.

    +

    partition_cv_strat

    +

    Partition the data for a stratified (non-spatial) cross-validation

    +

    partition_cv

    +

    Partition the data for a (non-spatial) cross-validation

    +

    partition_disc partition_loo

    +

    Leave-one-disc-out cross-validation and leave-one-out cross-validation

    +

    partition_factor_cv

    +

    Partition the data for a (non-spatial) k-fold cross-validation at the group +level

    +

    partition_factor

    +

    Partition the data for a (non-spatial) leave-one-factor-out cross-validation +based on a given, fixed partitioning

    +

    partition_kmeans

    +

    Partition samples spatially using k-means clustering of the coordinates

    +

    partition_tiles

    +

    Partition the study area into rectangular tiles

    +

    plot

    +

    Plot spatial resampling objects

    +

    represampling_bootstrap

    +

    Non-spatial bootstrap resampling

    +

    represampling_disc_bootstrap

    +

    Overlapping spatial block bootstrap using circular blocks

    +

    represampling_factor_bootstrap

    +

    Bootstrap at an aggregated level

    +

    represampling_kmeans_bootstrap

    +

    Spatial block bootstrap at the level of spatial k-means clusters

    +

    represampling_tile_bootstrap

    +

    Spatial block bootstrap using rectangular blocks

    +

    resample_factor

    +

    Draw uniform random (sub)sample at the group level

    +

    resample_strat_uniform

    +

    Draw stratified random sample

    +

    resample_uniform

    +

    Draw uniform random (sub)sample

    +

    sperrorest-package

    +

    Spatial Error Estimation and Variable Importance

    +

    sperrorest

    +

    Perform spatial error estimation and variable importance assessment +in parallel

    +

    summary

    +

    Summary statistics for a resampling objects

    +

    summary print

    +

    Summary and print methods for sperrorest results

    +

    summary

    +

    Summarize error statistics obtained by sperrorest

    +

    summary

    +

    Summarize variable importance statistics obtained by sperrorest

    +

    tile_neighbors

    +

    Determine the names of neighbouring tiles in a rectangular pattern

    +
    +
    + + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/maipo.html b/docs/reference/maipo.html new file mode 100644 index 00000000..c6008ceb --- /dev/null +++ b/docs/reference/maipo.html @@ -0,0 +1,130 @@ + + + + + + + + +Maipo dataset from Marco Pena — maipo • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Maipo dataset from Marco Pena

    + + + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/partition_cv.html b/docs/reference/partition_cv.html new file mode 100644 index 00000000..0e7bb4a6 --- /dev/null +++ b/docs/reference/partition_cv.html @@ -0,0 +1,518 @@ + + + + + + + + +Partition the data for a (non-spatial) cross-validation — partition_cv • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    partition_cv creates a represampling object for +length(repetition)-repeated nfold-fold cross-validation.

    + + +
    partition_cv(data, coords = c("x", "y"), nfold = 10, repetition = 1,
    +  seed1 = NULL, return_factor = FALSE)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    (ignored by partition_cv)

    nfold

    number of partitions (folds) in nfold-fold +cross-validation partitioning

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    return_factor

    if FALSE (default), return a +represampling object; if TRUE (used internally by +other sperrorest functions), return a list containing factor +vectors (see Value)

    + +

    Value

    + +

    If return_factor = FALSE (the default), a +represampling object. Specifically, this is a (named) list of +length(repetition) resampling objects. +Each of these resampling objects is a list of length +nfold corresponding to the folds. +Each fold is represented by a list of containing the components train +and test, specifying the indices of training and test samples +(row indices for data). +If return_factor = TRUE (mainly used internally), a (named) list of +length length(repetition). +Each component of this list is a vector of length nrow(data) of type +factor, specifying for each sample the fold to which it belongs. +The factor levels are factor(1:nfold).

    + +

    Details

    + +

    This function does not actually perform a cross-validation +or partition the data set itself; it simply creates a data structure +containing the indices of training and test samples.

    + +

    See also

    + +

    sperrorest, represampling

    + + +

    Examples

    +
    data(ecuador) +## non-spatial cross-validation: +resamp <- partition_cv(ecuador, nfold = 5, repetition = 5) +# plot(resamp, ecuador) +# first repetition, second fold, test set indices: +idx <- resamp[['1']][[2]]$test +# test sample used in this particular repetition and fold: +ecuador[idx , ]
    #> x y dem slope hcurv vcurv carea +#> 4965 715042.5 9559312 2320.49 42.857816 -0.01106 -0.04634 500.5027 +#> 37912 712802.5 9559952 1838.40 52.101344 0.00183 -0.09203 634.3320 +#> 31357 714752.5 9561022 1848.22 33.446411 -0.00347 0.02357 1752.0375 +#> 25090 715362.5 9560102 2059.29 49.119672 0.02059 -0.00628 556.0121 +#> 40756 714022.5 9558862 2331.20 45.085476 -0.00075 0.00475 1001.0861 +#> 14254 714852.5 9557882 2680.00 23.335425 0.00479 0.01261 323.8441 +#> 24072 715282.5 9557602 2837.46 34.394083 -0.02191 -0.00579 2246.7725 +#> 34512 713162.5 9559632 2041.52 46.815236 -0.00857 0.03677 1675.4679 +#> 24129 714602.5 9560542 2038.30 25.584857 0.00065 0.00005 769.3426 +#> 9669 713852.5 9558612 2308.97 52.180412 -0.01059 -0.07431 4079.0366 +#> 39885 715062.5 9561022 1840.94 38.435728 0.00250 -0.01340 604.1032 +#> 32622 714972.5 9557762 2687.38 30.556412 -0.00730 -0.01491 1844.4353 +#> 38993 714202.5 9558402 2475.75 33.159359 -0.01607 0.00677 1343.5006 +#> 22814 713862.5 9558582 2327.48 48.612031 -0.02894 -0.03416 947.4878 +#> 42598 713542.5 9559972 2184.39 35.241488 -0.00841 -0.00010 1527.1028 +#> 38287 714872.5 9561162 1719.41 48.235598 -0.03021 -0.09328 2235.5259 +#> 39061 712922.5 9559912 1931.50 36.315211 0.00414 -0.00104 1641.4587 +#> 30800 715182.5 9557582 2772.37 39.204064 -0.02475 0.00665 25318.3555 +#> 38410 713712.5 9561172 1776.08 36.319222 -0.02678 -0.04272 4955.5586 +#> 48498 714972.5 9557972 2681.66 38.346919 0.00528 0.01392 1255.0884 +#> 35285 714602.5 9560112 2142.75 51.107835 -0.00017 -0.00032 994.6740 +#> 29472 714792.5 9561072 1786.08 36.173117 -0.01029 -0.02312 2657.6936 +#> 22933 712712.5 9560432 1902.17 38.123466 -0.00746 0.00096 3210.5781 +#> 38032 714762.5 9560442 1988.33 35.169868 -0.00905 -0.01385 674.0721 +#> 14522 715012.5 9557732 2721.34 35.181327 -0.00382 0.00672 1114.8801 +#> 31576 713942.5 9558492 2387.12 46.143156 -0.05634 -0.02626 4316.0977 +#> 20290 714812.5 9561092 1775.73 34.626704 -0.01537 -0.00203 10263.2734 +#> 27978 713552.5 9558532 2373.05 17.044921 0.00832 0.00838 238.6685 +#> 15340 715452.5 9558852 2523.95 34.165473 0.00151 0.00899 1394.2274 +#> 4827 714962.5 9559882 2274.42 29.244912 0.00051 0.00889 362.8363 +#> 6808 715192.5 9559492 2219.03 21.817660 0.00713 -0.00173 8967.1924 +#> 18391 715112.5 9559432 2235.02 22.257691 -0.02651 -0.03629 360379.1875 +#> 8073 712572.5 9560302 1917.62 52.009098 0.01937 0.00083 994.7876 +#> 27957 715012.5 9559332 2306.35 20.480376 0.00225 0.00325 616.8652 +#> 15390 713132.5 9560622 1873.26 38.480418 0.00252 0.01118 2359.5059 +#> 22735 714492.5 9559772 2170.30 39.688786 -0.00440 -0.02651 419.0927 +#> 46756 713372.5 9559192 2120.47 46.005073 0.03696 0.02514 297.7842 +#> 2858 714292.5 9559332 2335.04 42.355905 0.04547 0.03323 183.1836 +#> 34563 715022.5 9558162 2675.70 18.889846 -0.01993 0.01373 16031.7500 +#> 46235 712712.5 9561042 2023.11 41.277025 0.01458 0.00672 565.1107 +#> 27084 713632.5 9558472 2380.37 23.135463 -0.01752 -0.00517 1000.7119 +#> 5578 714962.5 9557612 2751.95 39.191459 0.00288 0.01452 437.3965 +#> 2976 715122.5 9559142 2390.05 33.167954 0.01008 0.00102 483.4184 +#> 34707 713962.5 9561092 1819.49 65.686173 -0.04749 0.04779 2972.0193 +#> 20220 714052.5 9558522 2378.67 39.656128 -0.00855 -0.02175 1122.9120 +#> 21952 715352.5 9560172 2013.44 40.488063 0.02409 0.02771 674.3859 +#> 25244 713472.5 9559092 2137.03 18.348973 -0.10372 -0.00008 825875.6875 +#> 26698 713382.5 9559082 2155.56 34.264595 -0.00211 0.00241 585.6182 +#> 19887 714662.5 9559632 2266.47 45.179441 -0.02797 -0.00063 576.2819 +#> 38862 712952.5 9559892 1950.86 37.721822 -0.00048 -0.00332 1418.6622 +#> 2595 714912.5 9557662 2700.72 24.194862 -0.02681 -0.01319 3457.7519 +#> 32909 712812.5 9560452 1883.85 38.251235 -0.00221 0.00121 4159.6738 +#> 10507 714892.5 9559282 2374.45 42.842346 -0.01057 0.02427 380.9472 +#> 7668 713372.5 9559062 2164.82 37.934963 -0.01807 -0.01883 616.1993 +#> 44825 714322.5 9557882 2534.80 40.688598 0.00114 0.03026 247.0894 +#> 46065 713072.5 9559162 2109.39 16.264553 -0.00195 -0.00656 3036.7383 +#> 7064 715592.5 9558662 2597.69 34.222196 0.00099 0.00240 1201.4724 +#> 2552 714942.5 9557652 2719.32 34.873649 -0.01238 -0.00851 1012.5963 +#> 45592 714962.5 9559862 2282.08 22.160862 -0.00028 0.01318 289.0063 +#> 41783 715572.5 9558652 2609.51 32.408212 0.00291 -0.00081 940.6002 +#> 34192 712702.5 9560102 1867.01 35.474682 0.00629 -0.00469 1021.5407 +#> 5239 714832.5 9560992 1859.70 19.960131 -0.00320 0.00180 3904.5254 +#> 31834 713492.5 9560682 1800.85 34.237093 -0.00472 -0.00228 2262.3796 +#> 18897 712802.5 9559882 1851.71 50.234648 -0.02627 -0.05393 8301.6094 +#> 39722 715022.5 9557712 2735.53 30.260766 0.00133 0.00367 806.0966 +#> 30268 714172.5 9558612 2328.84 54.950663 0.03743 -0.05242 507.9263 +#> 39166 712832.5 9560142 1922.46 39.660139 0.01469 0.02940 987.8085 +#> 33910 715202.5 9559572 2195.66 13.791667 -0.04376 -0.01644 1057765.6250 +#> 31117 712892.5 9558922 2129.84 30.550683 0.00521 -0.00870 1895.1399 +#> 47702 714692.5 9559712 2200.51 33.098626 -0.13038 -0.04212 46310.0195 +#> 20797 713012.5 9560392 1842.25 36.649818 0.01299 0.00141 4611.0718 +#> 34615 713242.5 9560732 1879.60 27.593647 0.00384 0.00175 1026.6818 +#> 30933 714672.5 9561082 1798.37 54.810289 0.00542 -0.00722 1373.4147 +#> 26428 713042.5 9560332 1895.15 33.959781 -0.01439 -0.01161 3065.3694 +#> 26101 715562.5 9558682 2594.87 32.411077 0.00079 0.00321 1170.5904 +#> 17058 714032.5 9558502 2402.95 31.352824 0.01924 0.02606 564.6876 +#> 28173 714562.5 9560382 2048.26 27.685894 -0.00124 -0.00456 1531.4274 +#> 2801 715252.5 9559612 2199.28 24.403418 0.03051 0.02190 264.6404 +#> 16071 714562.5 9560062 2166.69 28.696018 0.02281 0.04759 158.9370 +#> 22297 714642.5 9558172 2606.18 59.469008 -0.00495 -0.03756 353.9086 +#> 39624 715222.5 9559552 2205.54 23.897497 0.00401 -0.00391 1794.7964 +#> 750 712812.5 9560032 1847.09 54.959258 -0.00767 -0.03713 6379.7974 +#> 48650 715592.5 9558612 2626.74 31.876507 0.00010 0.00140 1066.3957 +#> 14494 715332.5 9558792 2557.22 20.720446 0.01267 0.00483 343.1384 +#> 44612 714932.5 9558822 2578.80 38.255246 0.01257 0.00044 288.5468 +#> 39405 713122.5 9559052 2169.30 37.646192 -0.02110 -0.02450 2589.9910 +#> 14950 713382.5 9559172 2111.91 48.106682 0.00915 -0.02705 413.5702 +#> 24723 712942.5 9560202 1983.18 33.071697 0.00285 -0.01325 595.0426 +#> 42617 714092.5 9558392 2469.21 42.799947 -0.01397 0.00526 706.1463 +#> 29024 713492.5 9559112 2173.47 53.432325 0.04864 0.04226 338.3474 +#> 28260 715312.5 9558302 2681.75 34.484038 -0.01125 -0.02685 2568.4631 +#> 22847 714582.5 9560382 2040.49 25.336194 0.00181 -0.00341 1363.4000 +#> 46792 713862.5 9559672 2272.03 35.464942 0.00560 0.00610 454.8103 +#> 46627 714852.5 9558932 2459.24 53.445503 0.02451 -0.03921 525.3245 +#> 49459 714692.5 9557342 2639.74 42.047081 0.00216 -0.02606 919.4241 +#> 37115 715612.5 9559202 2358.15 9.727677 -0.01020 0.00279 39495.1797 +#> 17227 714812.5 9558892 2545.43 54.071746 0.00458 0.04291 293.4231 +#> 12074 714562.5 9560372 2045.17 26.287304 -0.00144 -0.00856 1789.1596 +#> 47722 712732.5 9561022 1999.03 37.492639 0.00004 -0.02384 947.2075 +#> 4479 713982.5 9557812 2399.24 41.231189 0.01895 0.04744 226.7911 +#> 10213 715542.5 9558782 2532.10 35.413375 -0.00893 -0.00867 2247.8748 +#> 23832 714252.5 9560182 2188.12 30.647512 0.00427 0.02403 474.8613 +#> 3771 714842.5 9561152 1724.51 45.539831 0.02405 -0.05655 130.9468 +#> 21490 714672.5 9560382 2021.86 32.804126 -0.00783 -0.00367 1966.2112 +#> 39466 714942.5 9557772 2680.35 16.753286 0.00166 -0.01265 1148.6487 +#> 6470 713742.5 9558802 2260.79 30.680171 0.00000 0.00320 911.5911 +#> 10145 713782.5 9560932 1865.62 23.595548 -0.00203 0.00642 1688.1782 +#> 748 715102.5 9559692 2301.39 27.021836 -0.00759 0.00158 837.3730 +#> 34250 713822.5 9559142 2316.36 33.759819 -0.02284 0.01085 2229.5105 +#> 15558 714732.5 9559502 2283.66 53.431752 0.00390 -0.02831 454.9113 +#> 31071 713472.5 9558462 2298.33 29.153239 0.00156 -0.00116 1817.5222 +#> 18286 714792.5 9557882 2650.57 28.253695 -0.00124 0.00204 853.2902 +#> 26023 715832.5 9557632 3097.56 41.710182 0.00133 -0.00452 578.5847 +#> 20067 714242.5 9560442 2125.23 38.640274 0.00363 -0.00363 389.2691 +#> 26963 715702.5 9557882 2880.32 43.733296 -0.01174 -0.01466 2633.9666 +#> 19493 714252.5 9560372 2156.93 24.879546 0.00825 0.00445 355.5078 +#> 29125 714992.5 9558792 2584.41 24.665833 0.01253 -0.00333 422.8840 +#> 44396 715512.5 9558102 2845.31 26.598420 0.01263 0.03598 186.3527 +#> 20547 713732.5 9560822 1851.67 36.968383 -0.01405 0.00476 11992.5273 +#> 40139 712852.5 9560072 1907.89 43.704075 0.00001 0.00759 1880.4403 +#> 34616 714522.5 9558742 2568.77 34.997981 0.00990 0.02790 209.6952 +#> 32849 714302.5 9558222 2520.01 32.157256 -0.00846 0.00216 1412.2295 +#> 21925 714542.5 9559232 2314.33 50.247826 0.00737 0.01033 3446.5520 +#> 14800 712952.5 9558682 2120.89 38.273581 -0.00022 0.00662 1269.2650 +#> 8895 714132.5 9557692 2487.19 37.364297 0.03423 -0.00983 270.7949 +#> 47059 713822.5 9558272 2413.20 38.175032 -0.00687 -0.00223 1056.3701 +#> 34105 715432.5 9558592 2621.73 18.956309 -0.00301 -0.01099 1146.2140 +#> 29835 715402.5 9558512 2610.14 27.118092 -0.01322 -0.00759 4131.5356 +#> 13908 715022.5 9559372 2290.81 27.242997 -0.03004 0.00714 480535.5000 +#> 35038 715092.5 9558152 2715.69 40.183822 0.00270 -0.00250 2225.4426 +#> 42424 714692.5 9560902 1921.34 25.331037 0.01154 -0.00204 618.2027 +#> 41612 713952.5 9560002 2198.00 28.756179 0.00119 0.00361 1011.0248 +#> 1479 715622.5 9557952 2888.67 34.953863 0.01635 -0.00105 868.7802 +#> 14671 712672.5 9560372 1872.21 39.197189 -0.00873 -0.01417 1520.6630 +#> 32430 715832.5 9558112 2824.39 23.694097 0.00944 0.00836 250.5111 +#> 484 713812.5 9560592 2016.41 44.301097 -0.00719 0.00079 1647.6451 +#> 44434 713022.5 9558762 2161.07 31.454237 -0.00273 -0.01047 2826.7700 +#> 9007 714952.5 9560902 1863.75 32.770321 0.00074 -0.02904 608.3561 +#> 280 713182.5 9560632 1862.83 39.004102 0.00745 0.00875 2156.9358 +#> 4943 712452.5 9559172 1927.46 34.465130 0.00105 -0.01576 1045.1074 +#> 10981 713832.5 9560022 2125.33 34.848439 -0.06909 -0.01151 143213.1562 +#> 16845 712772.5 9560022 1831.76 21.399974 -0.00865 -0.00805 7489.7417 +#> 14881 715482.5 9559232 2376.03 29.905532 -0.01137 -0.01523 888.2811 +#> 33881 712992.5 9558822 2173.26 33.197748 -0.00595 0.03064 1485.5201 +#> 35257 713822.5 9557982 2350.80 29.307937 0.01549 -0.00169 649.9975 +#> 39883 712732.5 9560842 2082.69 25.090968 0.00732 0.01858 298.4490 +#> 6577 714142.5 9559902 2244.30 57.890510 -0.06986 -0.05013 616.4128 +#> 32342 714862.5 9559622 2294.74 36.967237 0.01021 0.00109 915.4989 +#> 13548 715812.5 9558122 2821.65 15.508249 0.02751 0.00388 180.4414 +#> 6206 714122.5 9560992 1917.28 37.969913 -0.01023 -0.00227 841.2025 +#> cslope distroad slides distdeforest distslidespast log.carea +#> 4965 33.9059234 300.00 TRUE 300.00 100 2.699406 +#> 37912 30.2945705 300.00 TRUE 9.15 2 2.802317 +#> 31357 23.8172826 158.92 TRUE 0.00 5 3.243543 +#> 25090 43.5316144 300.00 TRUE 300.00 26 2.745084 +#> 40756 39.3352715 300.00 TRUE 300.00 100 3.000471 +#> 14254 15.6652391 300.00 TRUE 300.00 10 2.510336 +#> 24072 37.6668184 300.00 TRUE 300.00 100 3.351559 +#> 34512 34.6398824 300.00 TRUE 195.00 2 3.224136 +#> 24129 24.1289716 300.00 TRUE 300.00 89 2.886120 +#> 9669 31.6645125 300.00 TRUE 300.00 1 3.610558 +#> 39885 6.0848118 210.57 TRUE 0.00 100 2.781111 +#> 32622 30.1713845 300.00 TRUE 300.00 100 3.265863 +#> 38993 29.5485794 300.00 TRUE 300.00 2 3.128238 +#> 22814 34.9120373 300.00 TRUE 300.00 6 2.976574 +#> 42598 20.0689927 300.00 TRUE 247.02 100 3.183868 +#> 38287 14.8969027 41.43 TRUE 1.90 100 3.349380 +#> 39061 35.2409151 300.00 TRUE 70.65 56 3.215230 +#> 30800 33.2481679 300.00 TRUE 300.00 100 4.403435 +#> 38410 8.7610976 69.52 TRUE 47.61 65 3.695093 +#> 48498 33.6182986 300.00 TRUE 300.00 100 3.098674 +#> 35285 42.4664859 300.00 TRUE 300.00 100 2.997681 +#> 29472 18.6486303 111.09 TRUE 0.00 25 3.424505 +#> 22933 33.0631025 87.56 TRUE 115.40 2 3.506583 +#> 38032 35.0082942 300.00 TRUE 300.00 60 2.828706 +#> 14522 28.3986531 300.00 TRUE 300.00 100 3.047228 +#> 31576 26.9353189 300.00 TRUE 300.00 4 3.635091 +#> 20290 15.4566824 95.53 TRUE 0.00 49 4.011286 +#> 27978 14.3285285 300.00 TRUE 300.00 12 2.377795 +#> 15340 27.9752373 300.00 TRUE 300.00 100 3.144334 +#> 4827 21.0739607 300.00 TRUE 300.00 0 2.559711 +#> 6808 28.5659568 300.00 TRUE 300.00 40 3.952656 +#> 18391 34.5075291 300.00 TRUE 300.00 100 5.556760 +#> 8073 36.0757146 138.71 TRUE 76.41 35 2.997730 +#> 27957 30.0602307 300.00 TRUE 300.00 75 2.790190 +#> 15390 29.3222611 60.00 TRUE 118.92 2 3.372821 +#> 22735 36.5168921 300.00 TRUE 300.00 90 2.622310 +#> 46756 38.9617030 300.00 TRUE 300.00 37 2.473902 +#> 2858 35.3194103 300.00 TRUE 300.00 2 2.262887 +#> 34563 38.1566973 300.00 TRUE 300.00 100 4.204981 +#> 46235 30.1083592 300.00 TRUE 41.37 0 2.752133 +#> 27084 21.6727016 300.00 TRUE 300.00 81 3.000309 +#> 5578 25.7418478 300.00 TRUE 300.00 100 2.640875 +#> 2976 26.8820338 300.00 TRUE 300.00 100 2.684323 +#> 34707 27.7025094 165.13 TRUE 39.56 100 3.473052 +#> 20220 32.1755909 300.00 TRUE 300.00 8 3.050346 +#> 21952 40.0915758 300.00 TRUE 300.00 64 2.828908 +#> 25244 33.2189470 300.00 TRUE 300.00 6 5.916915 +#> 26698 34.2496981 300.00 TRUE 300.00 7 2.767615 +#> 19887 38.0621593 300.00 TRUE 300.00 63 2.760635 +#> 38862 34.9000052 300.00 TRUE 104.48 92 3.151879 +#> 2595 30.4395288 300.00 TRUE 300.00 100 3.538794 +#> 32909 28.3791726 118.07 TRUE 98.15 0 3.619059 +#> 10507 27.1622102 300.00 TRUE 300.00 46 2.580865 +#> 7668 36.3203676 300.00 TRUE 300.00 5 2.789721 +#> 44825 29.0214582 300.00 TRUE 300.00 100 2.392854 +#> 46065 29.7708870 300.00 TRUE 251.11 100 3.482407 +#> 7064 29.1326121 300.00 TRUE 300.00 100 3.079714 +#> 2552 32.2156979 300.00 TRUE 300.00 100 3.005436 +#> 45592 15.6486233 300.00 TRUE 300.00 2 2.460907 +#> 41783 28.1860858 300.00 TRUE 300.00 100 2.973405 +#> 34192 33.8749837 273.94 TRUE 4.48 85 3.009256 +#> 5239 24.6652601 197.29 TRUE 4.67 57 3.591568 +#> 31834 24.6469255 215.68 TRUE 0.00 100 3.354565 +#> 18897 31.7882714 300.00 TRUE 20.00 5 3.919162 +#> 39722 26.5416969 300.00 TRUE 300.00 100 2.906387 +#> 30268 47.2724558 300.00 TRUE 300.00 41 2.705801 +#> 39166 29.8184425 300.00 TRUE 1.90 90 2.994673 +#> 33910 32.6734912 300.00 TRUE 300.00 6 6.024389 +#> 31117 26.6459752 300.00 TRUE 291.23 100 3.277641 +#> 47702 33.6664271 300.00 TRUE 300.00 86 4.665675 +#> 20797 32.0569886 285.07 TRUE 0.00 96 3.663802 +#> 34615 34.1895376 17.57 TRUE 142.95 16 3.011436 +#> 30933 12.8434219 99.29 TRUE 0.00 6 3.137802 +#> 26428 35.4752548 300.00 TRUE 0.00 100 3.486483 +#> 26101 28.6461709 300.00 TRUE 300.00 100 3.068405 +#> 17058 26.3228270 300.00 TRUE 300.00 8 2.751808 +#> 28173 23.8837457 300.00 TRUE 300.00 59 3.185096 +#> 2801 25.7464315 300.00 TRUE 300.00 26 2.422656 +#> 16071 29.6213451 300.00 TRUE 300.00 100 2.201225 +#> 22297 46.6496507 300.00 TRUE 300.00 11 2.548891 +#> 39624 33.2945775 300.00 TRUE 300.00 2 3.254015 +#> 750 34.3471009 300.00 TRUE 0.00 0 3.804807 +#> 48650 27.0522023 300.00 TRUE 300.00 100 3.027918 +#> 14494 21.1851145 300.00 TRUE 300.00 28 2.535469 +#> 44612 34.6914486 300.00 TRUE 300.00 100 2.460216 +#> 39405 27.7202711 300.00 TRUE 300.00 100 3.413298 +#> 14950 41.8740475 300.00 TRUE 300.00 15 2.616549 +#> 24723 28.1734807 300.00 TRUE 36.63 100 2.774548 +#> 42617 31.2319294 300.00 TRUE 300.00 100 2.848895 +#> 29024 42.5730560 300.00 TRUE 300.00 32 2.529363 +#> 28260 31.8335351 300.00 TRUE 300.00 100 3.409673 +#> 22847 24.7477660 300.00 TRUE 300.00 41 3.134623 +#> 46792 27.6010959 300.00 TRUE 300.00 18 2.657830 +#> 46627 53.6832806 300.00 TRUE 300.00 100 2.720428 +#> 49459 41.8568588 300.00 TRUE 300.00 100 2.963516 +#> 37115 32.1870501 300.00 TRUE 300.00 100 4.596544 +#> 17227 43.5975045 300.00 TRUE 300.00 100 2.467494 +#> 12074 23.2855778 300.00 TRUE 300.00 63 3.252649 +#> 47722 33.1158146 300.00 TRUE 65.02 1 2.976445 +#> 4479 32.0117250 300.00 TRUE 300.00 55 2.355626 +#> 10213 31.5986224 300.00 TRUE 300.00 100 3.351772 +#> 23832 25.4851627 300.00 TRUE 300.00 8 2.676567 +#> 3771 0.3294507 44.23 TRUE 1.67 94 2.117095 +#> 21490 34.0600491 300.00 TRUE 300.00 1 3.293630 +#> 39466 27.2515916 300.00 TRUE 300.00 100 3.060187 +#> 6470 28.0932666 300.00 TRUE 300.00 2 2.959800 +#> 10145 27.4160305 276.16 FALSE 91.33 100 3.227418 +#> 748 38.1326331 300.00 FALSE 300.00 12 2.922919 +#> 34250 30.8927384 300.00 FALSE 300.00 100 3.348210 +#> 15558 50.3440826 300.00 FALSE 300.00 45 2.657927 +#> 31071 31.7378511 300.00 FALSE 300.00 76 3.259480 +#> 18286 24.3507063 300.00 FALSE 300.00 42 2.931097 +#> 26023 45.0728709 300.00 FALSE 300.00 100 2.762367 +#> 20067 29.8235992 300.00 FALSE 268.03 100 2.590250 +#> 26963 42.0631236 300.00 FALSE 300.00 100 3.420610 +#> 19493 18.5724269 300.00 FALSE 291.23 100 2.550849 +#> 29125 23.9450522 300.00 FALSE 300.00 100 2.626221 +#> 44396 21.4423725 300.00 FALSE 300.00 100 2.270336 +#> 20547 34.2611573 300.00 FALSE 42.56 100 4.078911 +#> 40139 33.1433166 300.00 FALSE 1.11 21 3.274260 +#> 34616 31.4995007 300.00 FALSE 300.00 100 2.321589 +#> 32849 29.5520172 300.00 FALSE 300.00 45 3.149905 +#> 21925 31.2485452 300.00 FALSE 300.00 95 3.537385 +#> 14800 31.5229920 300.00 FALSE 300.00 100 3.103552 +#> 8895 38.0776291 300.00 FALSE 300.00 90 2.432641 +#> 47059 25.7596095 300.00 FALSE 300.00 100 3.023816 +#> 34105 20.0770141 300.00 FALSE 300.00 26 3.059266 +#> 29835 28.8530086 300.00 FALSE 300.00 45 3.616112 +#> 13908 34.3774677 300.00 FALSE 300.00 96 5.681725 +#> 35038 40.2038755 300.00 FALSE 300.00 100 3.347416 +#> 42424 22.6071957 275.21 FALSE 93.50 70 2.791131 +#> 41612 25.5871492 300.00 FALSE 300.00 100 3.004762 +#> 1479 43.6765727 300.00 FALSE 300.00 100 2.938910 +#> 14671 37.8822505 123.04 FALSE 75.11 0 3.182033 +#> 32430 22.8604431 300.00 FALSE 300.00 100 2.398827 +#> 484 32.1457971 300.00 FALSE 55.63 100 3.216864 +#> 44434 36.3197946 300.00 FALSE 300.00 100 3.451290 +#> 9007 30.9643581 300.00 FALSE 14.98 35 2.784158 +#> 280 29.3234070 60.55 FALSE 127.54 29 3.333837 +#> 4943 37.7716697 300.00 FALSE 300.00 100 3.019161 +#> 10981 29.1664166 300.00 FALSE 300.00 100 5.155983 +#> 16845 22.8827884 300.00 FALSE 25.55 33 3.874467 +#> 14881 26.8562507 300.00 FALSE 300.00 100 2.948550 +#> 33881 29.1858971 300.00 FALSE 300.00 100 3.171879 +#> 35257 30.8818522 300.00 FALSE 300.00 79 2.812912 +#> 39883 17.0443485 233.81 FALSE 219.23 100 2.474870 +#> 6577 42.4074712 300.00 FALSE 300.00 70 2.789872 +#> 32342 37.6198359 300.00 FALSE 300.00 81 2.961658 +#> 13548 16.9784583 300.00 FALSE 300.00 100 2.256336 +#> 6206 32.4632157 294.31 FALSE 35.90 100 2.924901
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/partition_cv_strat.html b/docs/reference/partition_cv_strat.html new file mode 100644 index 00000000..d2de550f --- /dev/null +++ b/docs/reference/partition_cv_strat.html @@ -0,0 +1,213 @@ + + + + + + + + +Partition the data for a stratified (non-spatial) cross-validation — partition_cv_strat • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    partition_cv_strat creates a set of sample indices corresponding +to cross-validation test and training sets.

    + + +
    partition_cv_strat(data, coords = c("x", "y"), nfold = 10,
    +  return_factor = FALSE, repetition = 1, seed1 = NULL, strat)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations

    nfold

    number of partitions (folds) in nfold-fold +cross-validation partitioning

    return_factor

    if FALSE (default), return a +represampling object; if TRUE (used internally by +other sperrorest functions), return a list containing factor +vectors (see Value)

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    strat

    character: column in data containing a factor variable +over which the partitioning should be stratified; or factor vector of length +nrow(data): variable over which to stratify

    + +

    Value

    + +

    A represampling object, see also +partition_cv. partition_strat_cv, however, +stratified with respect to the variable data[,strat]; +i.e., cross-validation partitioning is done within each set +data[data[,strat]==i,] (i in levels(data[, strat])), and +the ith folds of all levels are combined into one cross-validation +fold.

    + +

    See also

    + +

    sperrorest, as.resampling, +resample_strat_uniform

    + + +

    Examples

    +
    data(ecuador) +parti <- partition_cv_strat(ecuador, strat = 'slides', nfold = 5, +repetition = 1) +idx <- parti[['1']][[1]]$train +mean(ecuador$slides[idx] == 'TRUE') / mean(ecuador$slides == 'TRUE')
    #> [1] 0.9996672
    # always == 1 +# Non-stratified cross-validation: +parti <- partition_cv(ecuador, nfold = 5, repetition = 1) +idx <- parti[['1']][[1]]$train +mean(ecuador$slides[idx] == 'TRUE') / mean(ecuador$slides == 'TRUE')
    #> [1] 1.002166
    # close to 1 because of large sample size, but with some random variation +
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/partition_disc.html b/docs/reference/partition_disc.html new file mode 100644 index 00000000..29e58eed --- /dev/null +++ b/docs/reference/partition_disc.html @@ -0,0 +1,278 @@ + + + + + + + + +Leave-one-disc-out cross-validation and leave-one-out cross-validation — partition_disc • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    partition_disc partitions the sample into training and tests set by +selecting circular test areas (possibly surrounded by an exclusion buffer) +and using the remaining samples as training samples (leave-one-disc-out +cross-validation). partition_loo creates training and test sets for +leave-one-out cross-validation with (optional) buffer.

    + + +
    partition_disc(data, coords = c("x", "y"), radius, buffer = NULL,
    +  ndisc = nrow(data), seed1 = NULL, return_train = TRUE, prob = NULL,
    +  replace = FALSE, repetition = 1)
    +
    +partition_loo(data, ndisc = nrow(data), replace = FALSE, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    radius

    radius of test area discs; performs leave-one-out resampling +if radius <0.

    buffer

    radius of additional 'neutral area' around test area discs +that is excluded from training and test sets; defaults to 0, +i.e. all samples are either in the test area or in the training area.

    ndisc

    Number of discs to be randomly selected; each disc constitutes +a separate test set. Defaults to nrow(data), i.e. one disc around +each sample.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    return_train

    If FALSE, returns only test sample; +if TRUE, also the training area.

    prob

    optional argument to sample.

    replace

    optional argument to sample: sampling with or +without replacement?

    repetition

    see partition_cv; however, +see Note below: repetition should normally be = 1 in this function.

    ...

    arguments to be passed to partition_disc

    + +

    Value

    + +

    A represampling object. +Contains length(repetition) resampling objects. +Each of these contains ndisc lists with indices of test and +(if return_train = TRUE) training sets.

    + +

    Note

    + +

    Test area discs are centered at (random) samples, not at general +random locations. Test area discs may (and likely will) overlap independently +of the value of replace. replace only controls the replacement +of the center point of discs when drawing center points from the samples. + radius < 0 does leave-one-out resampling with an optional buffer. +radius = 0 is similar except that samples with identical coordinates +would fall within the test area disc.

    + +

    References

    + +

    Brenning, A. 2005. Spatial prediction models for landslide +hazards: review, comparison and evaluation. Natural Hazards and Earth System +Sciences, 5(6): 853-862.

    + +

    See also

    + +

    sperrorest, partition_cv, +partition_kmeans

    + + +

    Examples

    +
    data(ecuador) +parti <- partition_disc(ecuador, radius = 200, buffer = 200, + ndisc = 5, repetition = 1:2) +# plot(parti,ecuador) +summary(parti)
    #> $`1` +#> n.train n.test +#> 635 718 6 +#> 44 727 9 +#> 263 723 24 +#> 28 727 6 +#> 129 708 17 +#> +#> $`2` +#> n.train n.test +#> 70 712 6 +#> 594 708 13 +#> 412 711 13 +#> 250 729 5 +#> 689 725 5 +#>
    +# leave-one-out with buffer: +parti.loo <- partition_loo(ecuador, buffer = 200) +summary(parti)
    #> $`1` +#> n.train n.test +#> 635 718 6 +#> 44 727 9 +#> 263 723 24 +#> 28 727 6 +#> 129 708 17 +#> +#> $`2` +#> n.train n.test +#> 70 712 6 +#> 594 708 13 +#> 412 711 13 +#> 250 729 5 +#> 689 725 5 +#>
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/partition_factor.html b/docs/reference/partition_factor.html new file mode 100644 index 00000000..65ec430a --- /dev/null +++ b/docs/reference/partition_factor.html @@ -0,0 +1,214 @@ + + + + + + + + +Partition the data for a (non-spatial) leave-one-factor-out cross-validation +based on a given, fixed partitioning — partition_factor • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    partition_factor creates a represampling object, i.e. a set of sample +indices defining cross-validation test and training sets.

    + + +
    partition_factor(data, coords = c("x", "y"), fac, return_factor = FALSE,
    +  repetition = 1)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    fac

    either the name of a variable (column) in data, or a vector +of type factor and length nrow(data) that contains the partitions +to be used for defining training and test samples.

    return_factor

    if FALSE (default), return a +represampling object; if TRUE (used internally by +other sperrorest functions), return a list containing factor +vectors (see Value)

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    + +

    Value

    + +

    A represampling object, +see also partition_cv for details.

    + +

    Note

    + +

    In this partitioning approach, all repetitions are identical and +therefore pseudo-replications.

    + +

    See also

    + +

    sperrorest, partition_cv, +as.resampling.factor

    + + +

    Examples

    +
    data(ecuador) +# I don't recommend using this partitioning for cross-validation, +# this is only for demonstration purposes: +breaks <- quantile(ecuador$dem, seq(0, 1, length = 6)) +ecuador$zclass <- cut(ecuador$dem, breaks, include.lowest = TRUE) +summary(ecuador$zclass)
    #> [1.72e+03,1.92e+03] (1.92e+03,2.14e+03] (2.14e+03,2.31e+03] (2.31e+03,2.57e+03] +#> 151 150 150 150 +#> (2.57e+03,3.11e+03] +#> 150
    parti <- partition_factor(ecuador, fac = 'zclass') +# plot(parti,ecuador) +summary(parti)
    #> $`1` +#> n.train n.test +#> [1.72e+03,1.92e+03] 600 151 +#> (1.92e+03,2.14e+03] 601 150 +#> (2.14e+03,2.31e+03] 601 150 +#> (2.31e+03,2.57e+03] 601 150 +#> (2.57e+03,3.11e+03] 601 150 +#>
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/partition_factor_cv.html b/docs/reference/partition_factor_cv.html new file mode 100644 index 00000000..326ce658 --- /dev/null +++ b/docs/reference/partition_factor_cv.html @@ -0,0 +1,210 @@ + + + + + + + + +Partition the data for a (non-spatial) k-fold cross-validation at the group +level — partition_factor_cv • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    partition_factor_cv creates a represampling object, +i.e. a set of sample indices defining cross-validation test and +training sets, where partitions are obtained by resampling at the level of +groups of observations as defined by a given factor variable. +This can be used, for example, to resample agricultural data that is grouped +by fields, at the agricultural field level in order to preserve +spatial autocorrelation within fields.

    + + +
    partition_factor_cv(data, coords = c("x", "y"), fac, nfold = 10,
    +  repetition = 1, seed1 = NULL, return_factor = FALSE)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data +that contain the x and y coordinates of sample locations.

    fac

    either the name of a variable (column) in data, or a +vector of type factor and length nrow(data) that defines groups or +clusters of observations.

    nfold

    number of partitions (folds) in nfold-fold +cross-validation partitioning

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    return_factor

    if FALSE (default), return a +represampling object; if TRUE (used internally by +other sperrorest functions), return a list containing factor +vectors (see Value)

    + +

    Value

    + +

    A represampling object, +see also partition_cv for details.

    + +

    Note

    + +

    In this partitioning approach, the number of factor levels in +fac must be large enough for this factor-level resampling to make +sense.

    + +

    See also

    + +

    sperrorest, partition_cv, +partition_factor, as.resampling.factor

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/partition_kmeans.html b/docs/reference/partition_kmeans.html new file mode 100644 index 00000000..fe8b217e --- /dev/null +++ b/docs/reference/partition_kmeans.html @@ -0,0 +1,237 @@ + + + + + + + + +Partition samples spatially using k-means clustering of the coordinates — partition_kmeans • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    partition_kmeans divides the study area into irregularly shaped +spatial partitions based on k-means (kmeans) clustering +of spatial coordinates.

    + + +
    partition_kmeans(data, coords = c("x", "y"), nfold = 10, repetition = 1,
    +  seed1 = NULL, return_factor = FALSE, balancing_steps = 1,
    +  order_clusters = TRUE, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    nfold

    number of cross-validation folds, i.e. parameter k in +k-means clustering.

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    return_factor

    if FALSE (default), return a +represampling object; if TRUE (used internally by +other sperrorest functions), return a list containing factor +vectors (see Value)

    balancing_steps

    if > 1, perform nfold-means clustering +balancing_steps times, and pick the clustering that minimizes the Gini +index of the sample size distribution among the partitions. The idea is that +'degenerate' partitions will be avoided, but this also has the side effect of +reducing variation among partitioning repetitions. More meaningful +constraints (e.g., minimum number of positive and negative samples within +each partition should be added in the future.

    order_clusters

    if TRUE, clusters are ordered by increasing x +coordinate of center point.

    ...

    additional arguments to kmeans.

    + +

    Value

    + +

    A represampling object, see also +partition_cv for details.

    + +

    Note

    + +

    Default parameter settings may change in future releases.

    + +

    References

    + +

    Brenning, A., Long, S., & Fieguth, P. (2012). +Detecting rock glacier flow structures using Gabor filters and IKONOS +imagery. Remote Sensing of Environment, 125, 227-237. +doi:10.1016/j.rse.2012.07.005

    +

    Russ, G. & A. Brenning. 2010a. Data mining in precision agriculture: +Management of spatial information. In 13th International Conference on +Information Processing and Management of Uncertainty, +IPMU 2010; Dortmund; 28 June - 2 July 2010. +Lecture Notes in Computer Science, 6178 LNAI: 350-359.

    + +

    See also

    + +

    sperrorest, partition_cv, +partition_disc, partition_tiles, +kmeans

    + + +

    Examples

    +
    data(ecuador) +resamp <- partition_kmeans(ecuador, nfold = 5, repetition = 2) +# plot(resamp, ecuador)
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/partition_tiles.html b/docs/reference/partition_tiles.html new file mode 100644 index 00000000..a72d7c3b --- /dev/null +++ b/docs/reference/partition_tiles.html @@ -0,0 +1,315 @@ + + + + + + + + +Partition the study area into rectangular tiles — partition_tiles • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    partition_tiles divides the study area into a specified number of +rectangular tiles. Optionally small partitions can be merged with adjacent +tiles to achieve a minimum number or percentage of samples in each tile.

    + + +
    partition_tiles(data, coords = c("x", "y"), dsplit = NULL, nsplit = NULL,
    +  rotation = c("none", "random", "user"), user_rotation, offset = c("none",
    +  "random", "user"), user_offset, reassign = TRUE, min_frac = 0.025,
    +  min_n = 5, iterate = 1, return_factor = FALSE, repetition = 1,
    +  seed1 = NULL)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations

    dsplit

    optional vector of length 2: equidistance of splits in +(possibly rotated) x direction (dsplit[1]) and y direction +(dsplit[2]) used to define tiles. If dsplit is of length 1, +its value is recycled. Either dsplit or nsplit must be specified.

    nsplit

    optional vector of length 2: number of splits in +(possibly rotated) x direction (nsplit[1]) and y direction +(nsplit[2]) used to define tiles. If nsplit is of length 1, +its value is recycled.

    rotation

    indicates whether and how the rectangular grid should +be rotated; random rotation is only between -45 and +45 degrees.

    user_rotation

    if rotation='user', angles (in degrees) by which +the rectangular grid is to be rotated in each repetition. Either a vector of +same length as repetition, or a single number that will be replicated +length(repetition) times.

    offset

    indicates whether and how the rectangular grid should be +shifted by an offset.

    user_offset

    if offset='user', a list (or vector) of two +components specifying a shift of the rectangular grid in (possibly rotated) x +and y direction. The offset values are relative values, a value of 0.5 +resulting in a one-half tile shift towards the left, or upward. +If this is a list, its first (second) component refers to the rotated x (y) +direction, and both components must have same length as repetition +(or length 1). If a vector of length 2 (or list components have length 1), +the two values will be interpreted as relative shifts in (rotated) x and y +direction, respectively, and will therefore be recycled as needed +(length(repetition) times each).

    reassign

    logical (default TRUE): if TRUE, 'small' tiles +(as per min_frac and min_n arguments and +get_small_tiles) are merged with (smallest) adjacent tiles. +If FALSE, small tiles are 'eliminated', i.e. set to NA.

    min_frac

    numeric >=0, <1: minimum relative size of partition as +percentage of sample; argument passed to get_small_tiles. +Will be ignored if NULL.

    min_n

    integer >=0: minimum number of samples per partition; +argument passed to get_small_tiles. +Will be ignored if NULL.

    iterate

    argument to be passed to tile_neighbors

    return_factor

    if FALSE (default), return a +represampling object; if TRUE (used internally by +other sperrorest functions), return a list containing factor +vectors (see Value)

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    + +

    Value

    + +

    A represampling object. +Contains length(repetition) resampling objects as +repetitions. The exact number of folds / test-set tiles within each +resampling objects depends on the spatial configuration of +the data set and possible cleaning steps (see min_frac, min_n).

    + +

    Note

    + +

    Default parameter settings may change in future releases. +This function, especially the rotation and shifting part of it and the +algorithm for cleaning up small tiles is still a bit experimental. +Use with caution. +For non-zero offsets (offset!='none')), the number of tiles may +actually be greater than nsplit[1]*nsplit[2] because of fractional +tiles lurking into the study region. reassign=TRUE with suitable +thresholds is therefore recommended for non-zero (including random) offsets.

    + +

    See also

    + +

    sperrorest, as.resampling.factor, +get_small_tiles, tile_neighbors

    + + +

    Examples

    +
    data(ecuador) +parti <- partition_tiles(ecuador, nsplit = c(4, 3), reassign = FALSE) +# plot(parti,ecuador) +summary(parti) # tile A4 has only 55 samples
    #> $`1` +#> n.train n.test +#> X1:Y2 686 65 +#> X1:Y3 665 86 +#> X2:Y1 711 40 +#> X2:Y2 666 85 +#> X2:Y3 690 61 +#> X3:Y1 664 87 +#> X3:Y2 661 90 +#> X3:Y3 681 70 +#> X4:Y1 671 80 +#> X4:Y2 692 59 +#> X4:Y3 723 28 +#>
    # same partitioning, but now merge tiles with less than 100 samples to +# adjacent tiles: +parti2 <- partition_tiles(ecuador, nsplit = c(4,3), reassign = TRUE, +min_n = 100) +# plot(parti2,ecuador) +summary(parti2)
    #> $`1` +#> n.train n.test +#> X1:Y3 600 151 +#> X2:Y2 626 125 +#> X3:Y1 584 167 +#> X3:Y2 574 177 +#> X3:Y3 620 131 +#>
    # tile B4 (in 'parti') was smaller than A3, therefore A4 was merged with B4, +# not with A3 +# now with random rotation and offset, and tiles of 2000 m length: +parti3 <- partition_tiles(ecuador, dsplit = 2000, offset = 'random', +rotation = 'random', reassign = TRUE, min_n = 100) +# plot(parti3, ecuador) +summary(parti3)
    #> $`1` +#> n.train n.test +#> X1:Y2 584 167 +#> X2:Y1 530 221 +#> X2:Y2 508 243 +#> X3:Y2 631 120 +#>
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/plot.represampling.html b/docs/reference/plot.represampling.html new file mode 100644 index 00000000..aaf4738e --- /dev/null +++ b/docs/reference/plot.represampling.html @@ -0,0 +1,192 @@ + + + + + + + + +Plot spatial resampling objects — plot.represampling • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    plot.represampling displays the partitions or samples corresponding +arising from the resampling of a data set.

    + + +
    # S3 method for represampling
    +plot(x, data, coords = c("x", "y"), pch = "+",
    +  wiggle_sd = 0, ...)
    +
    +# S3 method for resampling
    +plot(x, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    x

    a represampling resp. resampling object.

    data

    a data.frame of samples containing at least the x and y +coordinates of samples as specified by coords.

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    pch

    point symbol (to be passed to points).

    wiggle_sd

    'wiggle' the point locations in x and y direction to avoid +overplotting of samples drawn multiple times by bootstrap methods; +this is a standard deviation (in the units of the x/y coordinates) of a +normal distribution and defaults to 0 (no wiggling).

    ...

    additional arguments to plot.

    + +

    Note

    + +

    This function is not intended for samples obtained by resampling with +replacement (e.g., bootstrap) because training and test points will be +overplotted in that case. The size of the plotting region will also limit +the number of maps that can be displayed at once, i.e., the number of rows +(repetitions) and fields (columns).

    + + +

    Examples

    +
    data(ecuador) +# non-spatial cross-validation: +resamp <- partition_cv(ecuador, nfold = 5, repetition = 1:2) +# plot(resamp, ecuador) +# spatial cross-validation using k-means clustering: +resamp <- partition_kmeans(ecuador, nfold = 5, repetition = 1:2) +# plot(resamp, ecuador)
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/remove_missing_levels.html b/docs/reference/remove_missing_levels.html new file mode 100644 index 00000000..4ed3380d --- /dev/null +++ b/docs/reference/remove_missing_levels.html @@ -0,0 +1,152 @@ + + + + + + + + +remove_missing_levels — remove_missing_levels • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Accounts for missing factor levels present only in test data +but not in train data by setting values to NA

    + + +
    remove_missing_levels(fit, test_data)
    + +

    Arguments

    + + + + + + + + + + +
    fit

    fitted model on training data

    test_data

    data to make predictions for

    + +

    Value

    + +

    data.frame with matching factor levels to fitted model

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/represampling_bootstrap.html b/docs/reference/represampling_bootstrap.html new file mode 100644 index 00000000..77ac946a --- /dev/null +++ b/docs/reference/represampling_bootstrap.html @@ -0,0 +1,192 @@ + + + + + + + + +Non-spatial bootstrap resampling — represampling_bootstrap • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    represampling_bootstrap draws a bootstrap random sample +(with replacement) from data.

    + + +
    represampling_bootstrap(data, coords = c("x", "y"), nboot = nrow(data),
    +  repetition = 1, seed1 = NULL, oob = FALSE)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    nboot

    Size of bootstrap sample

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    oob

    logical (default FALSE): if TRUE, use the out-of-bag +sample as the test sample; if FALSE, draw a second bootstrap sample of +size nboot independently to obtain a test sample.

    + +

    Value

    + +

    A represampling object. This is a (named) list +containing length(repetition). +resampling objects. Each of these contains only one list with +indices of training and test samples. +Indices are row indices for data.

    + + +

    Examples

    +
    data(ecuador) +# only 10 bootstrap repetitions, normally use >=100: +parti <- represampling_bootstrap(ecuador, repetition = 10) +# plot(parti, ecuador) # careful: overplotting occurs +# because some samples are included in both the training and +# the test sample (possibly even multiple times)
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/represampling_disc_bootstrap.html b/docs/reference/represampling_disc_bootstrap.html new file mode 100644 index 00000000..f7e95276 --- /dev/null +++ b/docs/reference/represampling_disc_bootstrap.html @@ -0,0 +1,209 @@ + + + + + + + + +Overlapping spatial block bootstrap using circular blocks — represampling_disc_bootstrap • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    represampling_disc_bootstrap performs a spatial block bootstrap by +resampling at the level of rectangular partitions or 'tiles' generated by +partition_tiles.

    + + +
    represampling_disc_bootstrap(data, coords = c("x", "y"), nboot,
    +  repetition = 1, seed1 = NULL, oob = FALSE, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    nboot

    number of bootstrap samples; you may specify different values +for the training sample (nboot[1]) and for the test sample +(nboot[2]).

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    oob

    logical (default FALSE): if TRUE, use the out-of-bag +sample as the test sample (the complement of the nboot[1] test set +discs, minus the buffer area as specified in the ... arguments to +partition_disc); if FALSE, draw a second bootstrap +sample of size nboot independently to obtain a test sample +(sets of overlapping discs drawn with replacement).

    ...

    additional arguments to be passed to partition_disc; +note that a buffer argument has not effect if oob=FALSE; +see example below

    + +

    Note

    + +

    Performs nboot out of nrow(data) resampling of circular +discs. This is an overlapping spatial block bootstrap where the +blocks are circular.

    + + +

    Examples

    +
    data(ecuador) +# Overlapping disc bootstrap: +parti <- represampling_disc_bootstrap(ecuador, radius = 200, nboot = 20, +oob = FALSE) +# plot(parti, ecuador) +# Note that a 'buffer' argument would make no difference because boostrap +# sets of discs are drawn independently for the training and test sample. +# +# Overlapping disc bootstrap for training sample, out-of-bag sample as test +# sample: +parti <- represampling_disc_bootstrap(ecuador, radius = 200, buffer = 200, + nboot = 10, oob = TRUE) +# plot(parti,ecuador)
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/represampling_factor_bootstrap.html b/docs/reference/represampling_factor_bootstrap.html new file mode 100644 index 00000000..18f308b8 --- /dev/null +++ b/docs/reference/represampling_factor_bootstrap.html @@ -0,0 +1,222 @@ + + + + + + + + +Bootstrap at an aggregated level — represampling_factor_bootstrap • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    represampling_factor_bootstrap resamples partitions defined by a +factor variable. This can be used for non-overlapping block bootstraps and +similar.

    + + +
    represampling_factor_bootstrap(data, fac, repetition = 1, nboot = -1,
    +  seed1 = NULL, oob = FALSE)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    fac

    defines a grouping or partitioning of the samples in data; +three possible types: +(1) the name of a variable in data (coerced to factor if not already +a factor variable); +(2) a factor variable (or a vector that can be coerced to factor); +(3) a list of factor variables (or vectors that can be coerced to factor); +this list must be of length length(repetition), and if it is named, +the names must be equal to as.character(repetition); this list will +typically be generated by a partition.* function with +return_factor = TRUE (see Examples below)

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    nboot

    number of bootstrap replications used for generating the +bootstrap training sample (nboot[1]) and the test sample +(nboot[2]); nboot[2] is ignored (with a warning) if +oob = TRUE. A value of -1 will be substituted with the number +of levels of the factor variable, corresponding to an n out of +n bootstrap at the grouping level defined by fac.

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    oob

    if TRUE, the test sample will be the out-of-bag sample; +if FALSE (default), the test sample is an independently drawn +bootstrap sample of size nboot[2].

    + +

    Details

    + +

    nboot refers to the number of groups +(as defined by the factors) to be drawn with replacement from the set of +groups. I.e., if fac is a factor variable, nboot would normally +not be greater than nlevels(fac), nlevels(fac) being the +default as per nboot = -1.

    + +

    See also

    + +

    represampling_disc_bootstrap, +represampling_tile_bootstrap

    + + +

    Examples

    +
    data(ecuador) +# a dummy example for demonstration, performing bootstrap +# at the level of an arbitrary factor variable: +parti <- represampling_factor_bootstrap(ecuador, + factor(floor(ecuador$dem / 100)), + oob = TRUE) +# plot(parti,ecuador) +# using the factor bootstrap for a non-overlapping block bootstrap +# (see also represampling_tile_bootstrap): +fac <- partition_tiles(ecuador, return_factor = TRUE, repetition = c(1:3), + dsplit = 500, min_n = 200, rotation = 'random', + offset = 'random') +parti <- represampling_factor_bootstrap(ecuador, fac, oob = TRUE, +repetition = c(1:3)) +# plot(parti, ecuador)
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/represampling_kmeans_bootstrap.html b/docs/reference/represampling_kmeans_bootstrap.html new file mode 100644 index 00000000..340b3e1d --- /dev/null +++ b/docs/reference/represampling_kmeans_bootstrap.html @@ -0,0 +1,180 @@ + + + + + + + + +Spatial block bootstrap at the level of spatial k-means clusters — represampling_kmeans_bootstrap • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    represampling_kmeans_bootstrap performs a non-overlapping spatial +block bootstrap by resampling at the level of irregularly-shaped partitions +generated by partition_kmeans.

    + + +
    represampling_kmeans_bootstrap(data, coords = c("x", "y"), repetition = 1,
    +  nfold = 10, nboot = nfold, seed1 = NULL, oob = FALSE, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    nfold

    see partition_kmeans

    nboot

    see represampling_factor_bootstrap

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    oob

    see represampling_factor_bootstrap

    ...

    additional arguments to be passed to partition_kmeans

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/represampling_tile_bootstrap.html b/docs/reference/represampling_tile_bootstrap.html new file mode 100644 index 00000000..48aa1f81 --- /dev/null +++ b/docs/reference/represampling_tile_bootstrap.html @@ -0,0 +1,176 @@ + + + + + + + + +Spatial block bootstrap using rectangular blocks — represampling_tile_bootstrap • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    represampling_tile_bootstrap performs a non-overlapping spatial +block bootstrap by resampling at the level of rectangular partitions or +'tiles' generated by partition_tiles.

    + + +
    represampling_tile_bootstrap(data, coords = c("x", "y"), repetition = 1,
    +  nboot = -1, seed1 = NULL, oob = FALSE, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    data

    data.frame containing at least the columns specified +by coords

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    repetition

    numeric vector: cross-validation repetitions +to be generated. Note that this is not the number of repetitions, +but the indices of these repetitions. E.g., use repetition = c(1:100) +to obtain (the 'first') 100 repetitions, and repetition = c(101:200) +to obtain a different set of 100 repetitions.

    nboot

    see represampling_factor_bootstrap

    seed1

    seed1+i is the random seed that will be used by +set.seed in repetition i (i in repetition) +to initialize the random number generator before sampling from the data set.

    oob

    see represampling_factor_bootstrap

    ...

    additional arguments to be passed to partition_tiles

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/resample_factor.html b/docs/reference/resample_factor.html new file mode 100644 index 00000000..821d1705 --- /dev/null +++ b/docs/reference/resample_factor.html @@ -0,0 +1,171 @@ + + + + + + + + +Draw uniform random (sub)sample at the group level — resample_factor • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    resample_factor draws a random (sub)sample +(with or without replacement) of the groups or clusters identified by +the fac argument.

    + + +
    resample_factor(data, param = list(fac = "class", n = Inf, replace = FALSE))
    + +

    Arguments

    + + + + + + + + + + +
    data

    a data.frame, rows represent samples

    param

    a list with the following components: fac is a factor +variable of length nrow(data) or the name of a factor variable +in data; n is a numeric value specifying the size of the +subsample (in terms of groups, not observations); replace determines +if resampling of groups is to be done with or without replacement.

    + +

    Value

    + +

    a data.frame containing a subset of the rows of data.

    + +

    Details

    + +

    If param$replace=FALSE, a subsample of +min(param$n,nlevel(data[,fac])) groups will be drawn from data. +If param$replace=TRUE, the number of groups to be drawn is param$n.

    + +

    See also

    + +

    resample_strat_uniform(), sample()

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/resample_strat_uniform.html b/docs/reference/resample_strat_uniform.html new file mode 100644 index 00000000..55ab6c5d --- /dev/null +++ b/docs/reference/resample_strat_uniform.html @@ -0,0 +1,181 @@ + + + + + + + + +Draw stratified random sample — resample_strat_uniform • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    resample_strat_uniform draws a stratified random sample +(with or without replacement) from the samples in data. +Stratification is over the levels of data[, param$response]. +The same number of samples is drawn within each level.

    + + +
    resample_strat_uniform(data, param = list(strat = "class", nstrat = Inf,
    +  replace = FALSE))
    + +

    Arguments

    + + + + + + + + + + +
    data

    a data.frame, rows represent samples

    param

    a list with the following components: strat is either +the name of a factor variable in data that defines the stratification +levels, or a vector of type factor and length nrow(data); +n is a numeric value specifying the size of the subsample; +replace determines if sampling is with or without replacement

    + +

    Value

    + +

    a data.frame containing a subset of the rows of data.

    + +

    Details

    + +

    If param$replace=FALSE, a subsample of size +min(param$n,nrow(data)) will be drawn from data. +If param$replace=TRUE, the size of the subsample is param$n.

    + +

    See also

    + +

    resample_uniform(), sample()

    + + +

    Examples

    +
    data(ecuador) # Muenchow et al. (2012), see ?ecuador +d <- resample_strat_uniform(ecuador, + param = list(strat = 'slides', nstrat = 100)) +nrow(d) # == 200
    #> [1] 200
    sum(d$slides == 'TRUE') # == 100
    #> [1] 100
    +
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/resample_uniform.html b/docs/reference/resample_uniform.html new file mode 100644 index 00000000..549c0ecd --- /dev/null +++ b/docs/reference/resample_uniform.html @@ -0,0 +1,175 @@ + + + + + + + + +Draw uniform random (sub)sample — resample_uniform • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    resample_uniform draws a random (sub)sample +(with or without replacement) from the samples in data.

    + + +
    resample_uniform(data, param = list(n = Inf, replace = FALSE))
    + +

    Arguments

    + + + + + + + + + + +
    data

    a data.frame, rows represent samples

    param

    a list with the following components: n is a numeric +value specifying the size of the subsample; replace determines if +sampling is with or without replacement

    + +

    Value

    + +

    a data.frame containing a subset of the rows of data.

    + +

    Details

    + +

    If param$replace=FALSE, a subsample of size +min(param$n,nrow(data)) will be drawn from data. +If param$replace=TRUE, the size of the subsample is param$n.

    + +

    See also

    + +

    resample_strat_uniform(), sample()

    + + +

    Examples

    +
    data(ecuador) # Muenchow et al. (2012), see ?ecuador +d <- resample_uniform(ecuador, param = list(strat = 'slides', n = 200)) +nrow(d) # == 200
    #> [1] 200
    sum(d$slides == 'TRUE')
    #> [1] 139
    +
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/runfolds.html b/docs/reference/runfolds.html new file mode 100644 index 00000000..5248381e --- /dev/null +++ b/docs/reference/runfolds.html @@ -0,0 +1,141 @@ + + + + + + + + +runfolds — runfolds • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Runs model fitting, error estimation and variable importance +on fold level

    + + +
    runfolds(j = NULL, current_sample = NULL, data = NULL, i = NULL,
    +  formula = NULL, model_args = NULL, par_cl = NULL, par_mode = NULL,
    +  model_fun = NULL, pred_fun = NULL, imp_variables = NULL,
    +  imp_permutations = NULL, err_fun = NULL, train_fun = NULL,
    +  importance = NULL, current_res = NULL, current_impo = NULL,
    +  pred_args = NULL, pooled_obs_train = NULL, pooled_obs_test = NULL,
    +  pooled_pred_train = NULL, response = NULL, progress = NULL,
    +  is_factor_prediction = NULL, pooled_pred_test = NULL, coords = NULL,
    +  test_fun = NULL, imp_one_rep = NULL, do_gc = NULL, test_param = NULL,
    +  train_param = NULL)
    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/runreps.html b/docs/reference/runreps.html new file mode 100644 index 00000000..71663181 --- /dev/null +++ b/docs/reference/runreps.html @@ -0,0 +1,141 @@ + + + + + + + + +runreps — runreps • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Runs model fitting, error estimation and variable importance +on fold level

    + + +
    runreps(current_sample = NULL, data = NULL, formula = NULL,
    +  model_args = NULL, par_cl = NULL, do_gc = NULL, imp_one_rep = NULL,
    +  model_fun = NULL, pred_fun = NULL, imp_variables = NULL,
    +  imp_permutations = NULL, err_fun = NULL, importance = NULL,
    +  current_res = NULL, current_impo = NULL, pred_args = NULL,
    +  progress = NULL, pooled_obs_train = NULL, pooled_obs_test = NULL,
    +  pooled_pred_train = NULL, response = NULL, is_factor_prediction = NULL,
    +  pooled_pred_test = NULL, test_fun = NULL, test_param = NULL,
    +  train_fun = NULL, train_param = NULL, coords = NULL, par_mode = NULL,
    +  i = NULL)
    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/sperrorest-package.html b/docs/reference/sperrorest-package.html new file mode 100644 index 00000000..1062e502 --- /dev/null +++ b/docs/reference/sperrorest-package.html @@ -0,0 +1,155 @@ + + + + + + + + +Spatial Error Estimation and Variable Importance — sperrorest-package • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    This package implements spatial error estimation and permutation-based +spatial variable importance using different spatial cross-validation +and spatial block bootstrap methods. To cite `sperrorest' in publications, +reference the paper by Brenning (2012).

    + + + +

    References

    + +

    Brenning, A. 2012. Spatial cross-validation and bootstrap for the +assessment of prediction rules in remote sensing: the R package 'sperrorest'. +2012 IEEE International Geoscience and Remote Sensing Symposium (IGARSS), +23-27 July 2012, p. 5372-5375.

    +

    Brenning, A. 2005. Spatial prediction models for landslide hazards: +review, comparison and evaluation. Natural Hazards and Earth System Sciences, +5(6): 853-862.

    +

    Russ, G. & A. Brenning. 2010a. Data mining in precision agriculture: +Management of spatial information. In 13th International Conference on +Information Processing and Management of Uncertainty, IPMU 2010; Dortmund; +28 June - 2 July 2010. Lecture Notes in Computer Science, +6178 LNAI: 350-359.

    +

    Russ, G. & A. Brenning. 2010b. Spatial variable importance assessment for +yield prediction in Precision Agriculture. In Advances in Intelligent +Data Analysis IX, Proceedings, 9th International Symposium, IDA 2010, +Tucson, AZ, USA, 19-21 May 2010. +Lecture Notes in Computer Science, 6065 LNCS: 184-195.

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/sperrorest.html b/docs/reference/sperrorest.html new file mode 100644 index 00000000..34158fe9 --- /dev/null +++ b/docs/reference/sperrorest.html @@ -0,0 +1,440 @@ + + + + + + + + +Perform spatial error estimation and variable importance assessment +in parallel — sperrorest • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    sperrorest is a flexible interface for multiple types of +parallelized spatial and non-spatial cross-validation +and bootstrap error estimation and parallelized permutation-based +assessment of spatial variable importance.

    + + +
    sperrorest(formula, data, coords = c("x", "y"), model_fun,
    +  model_args = list(), pred_fun = NULL, pred_args = list(),
    +  smp_fun = partition_cv, smp_args = list(), train_fun = NULL,
    +  train_param = NULL, test_fun = NULL, test_param = NULL,
    +  err_fun = err_default, imp_variables = NULL, imp_permutations = 1000,
    +  importance = !is.null(imp_variables), distance = FALSE,
    +  par_args = list(par_mode = "foreach", par_units = NULL, par_option = NULL),
    +  do_gc = 1, progress = "all", out_progress = "", benchmark = FALSE,
    +  ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    formula

    A formula specifying the variables used by the model. +Only simple formulas without interactions or nonlinear terms should +be used, e.g. y~x1+x2+x3 but not y~x1*x2+log(x3). +Formulas involving interaction and nonlinear terms may possibly work +for error estimation but not for variable importance assessment, +but should be used with caution.

    data

    a data.frame with predictor and response variables. +Training and test samples will be drawn from this data set by train_fun +and test_fun, respectively.

    coords

    vector of length 2 defining the variables in data that +contain the x and y coordinates of sample locations.

    model_fun

    Function that fits a predictive model, such as glm +or rpart. The function must accept at least two arguments, the first +one being a formula and the second a data.frame with the learning sample.

    model_args

    Arguments to be passed to model_fun +(in addition to the formula and data argument, +which are provided by sperrorest)

    pred_fun

    Prediction function for a fitted model object created +by model. Must accept at least two arguments: the fitted +object and a data.frame newdata with data +on which to predict the outcome.

    pred_args

    (optional) Arguments to pred_fun (in addition to the +fitted model object and the newdata argument, +which are provided by sperrorest).

    smp_fun

    A function for sampling training and test sets from +data. E.g. partition_kmeans for +spatial cross-validation using spatial k-means clustering.

    smp_args

    (optional) Arguments to be passed to smp_fun.

    train_fun

    (optional) A function for resampling or subsampling the +training sample in order to achieve, e.g., uniform sample sizes on all +training sets, or maintaining a certain ratio of positives and negatives +in training sets. +E.g. resample_uniform or resample_strat_uniform.

    train_param

    (optional) Arguments to be passed to resample_fun.

    test_fun

    (optional) Like train_fun but for the test set.

    test_param

    (optional) Arguments to be passed to test_fun.

    err_fun

    A function that calculates selected error measures from the +known responses in data and the model predictions delivered +by pred_fun. E.g. err_default (the default).

    imp_variables

    (optional; used if importance = TRUE). +Variables for which permutation-based variable importance assessment +is performed. If importance = TRUE and imp_variables == +NULL, all variables in formula will be used.

    imp_permutations

    (optional; used if importance = TRUE). +Number of permutations used for variable importance assessment.

    importance

    logical (default: FALSE): perform permutation-based +variable importance assessment?

    distance

    logical (default: FALSE): if TRUE, calculate +mean nearest-neighbour distances from test samples to training samples using +add.distance.represampling.

    par_args

    list of parallelization parameters:

      +
    • par_mode: the parallelization mode. See details.

    • +
    • par_units: the number of parallel processing units.

    • +
    • par_option: optional future settings for par_mode = "future" or +par_mode = "foreach".

    • +
    do_gc

    numeric (default: 1): defines frequency of memory garbage +collection by calling gc; if < 1, no garbage collection; +if >= 1, run a gc after each repetition; +if >= 2, after each fold.

    progress

    character (default: all): Whether to show progress +information (if possible). Default shows repetition, fold and (if enabled) +variable importance progress for par_mode = "foreach" or +par_mode = "sequential". +Set to "rep" for repetition information only or FALSE for no progress +information.

    out_progress

    only used if par_mode = foreach: Write progress +output to a file instead of console output. +The default ('') results in console output for Unix-systems and +file output ('sperrorest.progress.txt') in the current working directory +for Windows systems. No console output is possible on Windows systems.

    benchmark

    (optional) logical (default: FALSE): if TRUE, +perform benchmarking and return sperrorestbenchmark object.

    ...

    Further options passed to makeCluster for +par_mode = "foreach".

    + +

    Value

    + +

    A list (object of class sperrorest) with (up to) six components:

    +
    error_rep

    a sperrorestreperror object containing +predictive performances at the repetition level

    +
    error_fold

    a sperroresterror object containing predictive +performances at the fold level

    +
    represampling

    a represampling() object

    +
    importance

    a sperrorestimportance object containing +permutation-based variable importances at the fold level

    +
    benchmark

    a sperrorestbenchmark object containing +information on the system the code is running on, starting and +finishing times, number of available CPU cores, parallelization mode, +number of parallel units, and runtime performance

    +
    package_version

    a sperrorestpackageversion object containing +information about the sperrorest package version

    + + +

    Details

    + +

    By default sperrorest runs in parallel on all cores using +foreach with the future backend. If this is not desired, specify +par_units in par_args or set par_mode = "sequential".

    +

    Available parallelization modes include par_mode = "apply" +(calls pbmclapply on Unix, parApply on Windows) and +future (future_lapply). +For the latter and par_mode = "foreach", par_option +(default to multiprocess and +cluster, respectively) can be specified. See plan for further details.

    + +

    Note

    + +

    Custom predict functions passed to pred_fun, which consist of +multiple custom defined child functions, must be defined in one function.

    + +

    References

    + +

    Brenning, A. 2012. Spatial cross-validation and bootstrap for +the assessment of prediction rules in remote sensing: the R package +'sperrorest'. +2012 IEEE International Geoscience and Remote Sensing Symposium (IGARSS), +23-27 July 2012, p. 5372-5375.

    +

    Brenning, A. 2005. Spatial prediction models for landslide hazards: review, +comparison and evaluation. Natural Hazards and Earth System Sciences, +5(6): 853-862.

    +

    Brenning, A., S. Long & P. Fieguth. Forthcoming. Detecting rock glacier flow +structures using Gabor filters and IKONOS imagery. +Submitted to Remote Sensing of Environment.

    +

    Russ, G. & A. Brenning. 2010a. Data mining in precision agriculture: +Management of spatial information. In 13th International Conference on +Information Processing and Management of Uncertainty, IPMU 2010; Dortmund; +28 June - 2 July 2010. Lecture Notes in Computer Science, 6178 LNAI: 350-359.

    +

    Russ, G. & A. Brenning. 2010b. Spatial variable importance assessment for +yield prediction in Precision Agriculture. In Advances in Intelligent +Data Analysis IX, Proceedings, 9th International Symposium, +IDA 2010, Tucson, AZ, USA, 19-21 May 2010. +Lecture Notes in Computer Science, 6065 LNCS: 184-195.

    + + +

    Examples

    +
    # NOT RUN {
    +##------------------------------------------------------------
    +## Classification tree example using non-spatial partitioning
    +## setup and default parallel mode ("foreach")
    +##------------------------------------------------------------
    +
    +data(ecuador) # Muenchow et al. (2012), see ?ecuador
    +fo <- slides ~ dem + slope + hcurv + vcurv + log.carea + cslope
    +
    +library(rpart)
    +mypred_part <- function(object, newdata) predict(object, newdata)[, 2]
    +ctrl <- rpart.control(cp = 0.005) # show the effects of overfitting
    +fit <- rpart(fo, data = ecuador, control = ctrl)
    +
    +### Non-spatial 5-repeated 10-fold cross-validation:
    +mypred_part <- function(object, newdata) predict(object, newdata)[, 2]
    +par_nsp_res <- sperrorest(data = ecuador, formula = fo,
    +                          model_fun = rpart,
    +                          model_args = list(control = ctrl),
    +                          pred_fun = mypred_part,
    +                          progress = TRUE,
    +                          smp_fun = partition_cv,
    +                          smp_args = list(repetition = 1:5, nfold = 10))
    +summary(par_nsp_res$error_rep)
    +summary(par_nsp_res$error_fold)
    +summary(par_nsp_res$represampling)
    +# plot(par_nsp_res$represampling, ecuador)
    +
    +### Spatial 5-repeated 10-fold spatial cross-validation:
    +par_sp_res <- sperrorest(data = ecuador, formula = fo,
    +                         model_fun = rpart,
    +                         model_args = list(control = ctrl),
    +                         pred_fun = mypred_part,
    +                         progress = TRUE,
    +                         smp_fun = partition_kmeans,
    +                         smp_args = list(repetition = 1:5, nfold = 10))
    +summary(par_sp_res$error_rep)
    +summary(par_sp_res$error_fold)
    +summary(par_sp_res$represampling)
    +# plot(par_sp_res$represampling, ecuador)
    +
    +smry <- data.frame(
    +    nonspat_training = unlist(summary(par_nsp_res$error_rep,
    +                                      level = 1)$train_auroc),
    +    nonspat_test     = unlist(summary(par_nsp_res$error_rep,
    +                                      level = 1)$test_auroc),
    +    spatial_training = unlist(summary(par_sp_res$error_rep,
    +                                      level = 1)$train_auroc),
    +    spatial_test     = unlist(summary(par_sp_res$error_rep,
    +                                     level = 1)$test_auroc))
    +boxplot(smry, col = c('red','red','red','green'),
    +    main = 'Training vs. test, nonspatial vs. spatial',
    +    ylab = 'Area under the ROC curve')
    +
    +##------------------------------------------------------------
    +## Logistic regression example (glm) using partition_kmeans
    +## and computation of permutation based variable importance
    +##------------------------------------------------------------
    +
    +data(ecuador)
    +fo <- slides ~ dem + slope + hcurv + vcurv + log.carea + cslope
    +
    +out <- sperrorest(data = ecuador, formula = fo,
    +                  model_fun = glm,
    +                  model_args = list(family = "binomial"),
    +                  pred_fun = predict,
    +                  pred_args = list(type = "response"),
    +                  smp_fun = partition_cv,
    +                  smp_args = list(repetition = 1:2, nfold = 4),
    +                  par_args = list(par_mode = "future"),
    +                  importance = TRUE, imp_permutations = 10)
    +summary(out$error_rep)
    +summary(out$importance)
    +# }
    +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/summary.represampling.html b/docs/reference/summary.represampling.html new file mode 100644 index 00000000..e58e12b9 --- /dev/null +++ b/docs/reference/summary.represampling.html @@ -0,0 +1,157 @@ + + + + + + + + +Summary statistics for a resampling objects — summary.represampling • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Calculates sample sizes of training and test sets within repetitions and +folds of a resampling or represampling object.

    + + +
    # S3 method for represampling
    +summary(object, ...)
    +
    +# S3 method for resampling
    +summary(object, ...)
    + +

    Arguments

    + + + + + + + + + + +
    object

    A resampling or represampling object.

    ...

    currently ignored.

    + +

    Value

    + +

    A list of data.frames summarizing the sample sizes of training +and test sets in each fold of each repetition.

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/summary.sperrorest.html b/docs/reference/summary.sperrorest.html new file mode 100644 index 00000000..db450c30 --- /dev/null +++ b/docs/reference/summary.sperrorest.html @@ -0,0 +1,191 @@ + + + + + + + + +Summary and print methods for sperrorest results — summary.sperrorestreperror • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    Summary methods provide varying level of detail while print methods +provide full details.

    + + +
    # S3 method for sperrorestreperror
    +summary(object, level = 0, na.rm = TRUE, ...)
    +
    +# S3 method for sperrorest
    +summary(object, ...)
    +
    +# S3 method for sperrorestimportance
    +print(x, ...)
    +
    +# S3 method for sperroresterror
    +print(x, ...)
    +
    +# S3 method for sperrorestreperror
    +print(x, ...)
    +
    +# S3 method for sperrorest
    +print(x, ...)
    +
    +# S3 method for sperrorestbenchmarks
    +print(x, ...)
    +
    +# S3 method for sperrorestpackageversion
    +print(x, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + +
    object

    a sperrorest object

    level

    Level at which errors are summarized: +0: overall; 1: repetition; 2: fold

    na.rm

    Remove NA values? See mean etc.

    ...

    additional arguments for summary.sperroresterror +or summary.sperrorestimportance

    x

    Depending on method, a sperrorest, +sperroresterror or sperrorestimportance object

    + +

    See also

    + +

    sperrorest, +summary.sperroresterror, +summary.sperrorestimportance

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/summary.sperroresterror.html b/docs/reference/summary.sperroresterror.html new file mode 100644 index 00000000..6cec4f93 --- /dev/null +++ b/docs/reference/summary.sperroresterror.html @@ -0,0 +1,202 @@ + + + + + + + + +Summarize error statistics obtained by <code>sperrorest</code> — summary.sperroresterror • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    summary.sperroresterror calculates mean, standard deviation, +median etc. of the calculated error measures at the specified level +(overall, repetition, or fold). +summary.sperrorestreperror does the same with the pooled error, +at the overall or repetition level.

    + + +
    # S3 method for sperroresterror
    +summary(object, level = 0, pooled = TRUE,
    +  na.rm = TRUE, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + +
    object

    sperroresterror resp. sperrorestcombinederror +error object calculated by sperrorest

    level

    Level at which errors are summarized: +0: overall; 1: repetition; 2: fold

    pooled

    If TRUE (default), mean and standard deviation etc are +calculated between fold-level error estimates. If FALSE, +apply first a weighted.mean among folds before calculating +mean, standard deviation etc among repetitions. See also Details.

    na.rm

    Remove NA values? See mean etc.

    ...

    additional arguments (currently ignored)

    + +

    Value

    + +

    Depending on the level of aggregation, a list or +data.frame with mean, and at level 0 also standard deviation, +median and IQR of the error measures.

    + +

    Details

    + +

    Let's use an example to explain the error_rep argument. +E.g., assume we are using 100-repeated 10-fold cross-validation. +If error_rep = TRUE (default), the mean and standard deviation calculated +when summarizing at level = 0 +are calculated across the error estimates obtained for +each of the 100*10 = 1000 folds. +If error_rep = FALSE, mean and standard deviation are calculated across +the 100 repetitions, using the weighted average of the fold-level +errors to calculate an error value for the entire sample. +This will essentially not affect the mean value but of course the +standard deviation of the error. error_rep = FALSE is not recommended, +it is mainly for testing purposes; when the test sets are small +(as in leave-one-out cross-validation, in the extreme case), +consider running sperrorest with error_rep = TRUE and +examine only the error_rep component of its result.

    + +

    See also

    + +

    sperrorest

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/summary.sperrorestimportance.html b/docs/reference/summary.sperrorestimportance.html new file mode 100644 index 00000000..9424050f --- /dev/null +++ b/docs/reference/summary.sperrorestimportance.html @@ -0,0 +1,170 @@ + + + + + + + + +Summarize variable importance statistics obtained by <code>sperrorest</code> — summary.sperrorestimportance • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    summary.sperrorestimportance calculated mean, standard deviation, +median etc. of the calculated error measures at the specified level +(overall, repetition, or fold).

    + + +
    # S3 method for sperrorestimportance
    +summary(object, level = 0, na.rm = TRUE,
    +  which = NULL, ...)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + + + + + +
    object

    sperrorestimportance object calculated by +sperrorest called with argument importance = TRUE

    level

    Level at which errors are summarized: +0: overall; 1: repetition; 2: fold

    na.rm

    Remove NA values? See mean etc.

    which

    optional character vector specifying selected variables for +which the importances should be summarized (to do: check implementation)

    ...

    additional arguments (currently ignored)

    + +

    Value

    + +

    a list or data.frame, depending on the level of aggregation

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/tile_neighbors.html b/docs/reference/tile_neighbors.html new file mode 100644 index 00000000..ed8831b2 --- /dev/null +++ b/docs/reference/tile_neighbors.html @@ -0,0 +1,162 @@ + + + + + + + + +Determine the names of neighbouring tiles in a rectangular pattern — tile_neighbors • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    This based on 'counting' up and down based on the tile name.

    + + +
    tile_neighbors(nm, tileset, iterate = 0, diagonal = FALSE)
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + +
    nm

    Character string or factor: name of a tile, e.g., 'X4:Y6'

    tileset

    Admissible tile names; if missing and nm is a factor +variable, then levels(nm) is used as a default for tileset.

    iterate

    internal - do not change default: to control behaviour in an +interactive call to this function.

    diagonal

    if TRUE, diagonal neighbours are also considered +neighbours.

    + +

    Value

    + +

    Character string.

    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + + diff --git a/docs/reference/transfer_parallel_output.html b/docs/reference/transfer_parallel_output.html new file mode 100644 index 00000000..a8afc033 --- /dev/null +++ b/docs/reference/transfer_parallel_output.html @@ -0,0 +1,132 @@ + + + + + + + + +transfer_parallel_output — transfer_parallel_output • sperrorest + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + +
    + +
    +
    + + + +

    transfers output of parallel calls to runreps

    + + +
    transfer_parallel_output(my_res = NULL, res = NULL, impo = NULL,
    +  pooled_error = NULL)
    + + +
    + +
    + +
    + + +
    +

    Site built with pkgdown.

    +
    + +
    +
    + + +
    +
    + + + +
    + +
    +
    + + + +

    get_small_tiles identifies partitions (tiles) that are too small +according to some defined criterion / criteria (minimum number of samples in +tile and/or minimum fraction of entire dataset).

    + + +
    get_small_tiles(tile, min_n = NULL, min_frac = 0, ignore = c())
    + +

    Arguments

    + + + + + + + + + + + + + + + + + + +
    tile

    factor: tile/partition names for all samples; names must be +coercible to class tilename, i.e. of the form 'X4:Y2' etc.

    min_n

    integer (optional): minimum number of samples per partition_

    min_frac

    numeric >0, <1: minimum relative size of partition as +percentage of sample.

    ignore

    character vector: names of tiles to be ignored, i.e. to be +retained even if the inclusion criteria are not met.

    + +

    Value

    + +

    character vector: names of tiles that are considered 'small' +according to these criteria

    + +

    See also

    + +

    partition_tiles, tilename

    + + +

    Examples

    +
    data(ecuador) # Muenchow et al. (2012), see ?ecuador +# Rectangular partitioning without removal of small tiles: +parti <- partition_tiles(ecuador, nsplit = c(10,10), reassign = FALSE) +summary(parti)
    #> $`1` +#> n.train n.test +#> X1:Y7 688 8 +#> X1:Y8 678 18 +#> X10:Y2 685 11 +#> X10:Y3 688 8 +#> X10:Y4 685 11 +#> X2:Y4 683 13 +#> X2:Y5 690 6 +#> X2:Y6 689 7 +#> X2:Y7 670 26 +#> X2:Y8 674 22 +#> X2:Y9 691 5 +#> X3:Y10 689 7 +#> X3:Y5 675 21 +#> X3:Y6 687 9 +#> X3:Y8 691 5 +#> X3:Y9 676 20 +#> X4:Y10 690 6 +#> X4:Y4 686 10 +#> X4:Y5 685 11 +#> X4:Y6 687 9 +#> X4:Y7 684 12 +#> X4:Y8 690 6 +#> X4:Y9 683 13 +#> X5:Y10 687 9 +#> X5:Y2 689 7 +#> X5:Y3 684 12 +#> X5:Y4 676 20 +#> X5:Y5 691 5 +#> X5:Y6 686 10 +#> X5:Y7 690 6 +#> X5:Y9 689 7 +#> X6:Y1 691 5 +#> X6:Y2 689 7 +#> X6:Y3 685 11 +#> X6:Y4 691 5 +#> X6:Y5 681 15 +#> X6:Y7 689 7 +#> X6:Y8 685 11 +#> X6:Y9 691 5 +#> X7:Y1 687 9 +#> X7:Y10 676 20 +#> X7:Y2 686 10 +#> X7:Y3 688 8 +#> X7:Y4 682 14 +#> X7:Y5 688 8 +#> X7:Y6 687 9 +#> X7:Y7 685 11 +#> X7:Y8 685 11 +#> X7:Y9 687 9 +#> X8:Y1 669 27 +#> X8:Y2 683 13 +#> X8:Y3 684 12 +#> X8:Y4 689 7 +#> X8:Y5 673 23 +#> X8:Y6 685 11 +#> X8:Y7 684 12 +#> X9:Y1 687 9 +#> X9:Y2 690 6 +#> X9:Y3 686 10 +#> X9:Y4 678 18 +#> X9:Y6 685 11 +#> X9:Y7 691 5 +#> X9:Y8 686 10 +#> X9:Y9 689 7 +#>
    length(parti[[1]])
    #> [1] 64
    # Same in factor format for the application of get_small_tiles: +parti_fac <- partition_tiles(ecuador, nsplit = c(10, 10), reassign = FALSE, + return_factor = TRUE) +get_small_tiles(parti_fac[[1]], min_n = 20) # tiles with less than 20 samples
    #> [1] X2:Y9 X3:Y8 X5:Y5 X6:Y1 X6:Y4 X6:Y9 X9:Y7 X2:Y5 X4:Y10 X4:Y8 +#> [11] X5:Y7 X9:Y2 X2:Y6 X3:Y10 X5:Y2 X5:Y9 X6:Y2 X6:Y7 X8:Y4 X9:Y9 +#> [21] X1:Y7 X10:Y3 X7:Y3 X7:Y5 X3:Y6 X4:Y6 X5:Y10 X7:Y1 X7:Y6 X7:Y9 +#> [31] X9:Y1 X4:Y4 X5:Y6 X7:Y2 X9:Y3 X9:Y8 X10:Y2 X10:Y4 X4:Y5 X6:Y3 +#> [41] X6:Y8 X7:Y7 X7:Y8 X8:Y6 X9:Y6 X4:Y7 X5:Y3 X8:Y3 X8:Y7 X2:Y4 +#> [51] X4:Y9 X8:Y2 X7:Y4 X6:Y5 X1:Y8 X9:Y4 +#> 64 Levels: X1:Y7 X1:Y8 X10:Y2 X10:Y3 X10:Y4 X2:Y4 X2:Y5 X2:Y6 X2:Y7 ... X9:Y9
    parti2 <- partition_tiles(ecuador, nsplit = c(10, 10), reassign = TRUE, + min_n = 20, min_frac = 0) +length(parti2[[1]]) # < length(parti[[1]])
    #> [1] 31
    +
    + +
    + + +