{"id":3932,"date":"2026-07-05T03:53:32","date_gmt":"2026-07-05T11:53:32","guid":{"rendered":"https:\/\/bien.nceas.ucsb.edu\/bien\/?page_id=3932"},"modified":"2026-07-08T01:50:19","modified_gmt":"2026-07-08T09:50:19","slug":"why-use-bien","status":"publish","type":"page","link":"https:\/\/bien.nceas.ucsb.edu\/bien\/why-use-bien\/","title":{"rendered":"Why Use BIEN Data? A Tutorial on Flags &#038; Data Augmentation"},"content":{"rendered":"<style>\n\/* Scoped styling for the BIEN tutorial page. Safe inside a WordPress Custom HTML block. *\/\n.bien-tut { line-height: 1.6; }\n.bien-tut h2 { margin-top: 1.6em; }\n.bien-tut h3 { margin-top: 1.4em; }\n.bien-tut .lead { font-size: 1.08em; }\n.bien-tut .callout {\n  border-left: 4px solid #4a7c59; background: #f3f7f4;\n  padding: 0.75em 1em; margin: 1.2em 0; border-radius: 4px;\n}\n.bien-tut .callout.warn { border-left-color: #b5651d; background: #fbf4ec; }\n.bien-tut details {\n  border: 1px solid #d8ddd6; border-radius: 6px; margin: 1em 0; background: #fafbfa;\n}\n.bien-tut details > summary {\n  cursor: pointer; padding: 0.7em 1em; font-weight: 600;\n  background: #eef3ee; border-radius: 6px; list-style: none;\n}\n.bien-tut details[open] > summary { border-bottom: 1px solid #d8ddd6; border-radius: 6px 6px 0 0; }\n.bien-tut details > summary::before { content: \"\\25B6  \"; color: #4a7c59; font-size: 0.85em; }\n.bien-tut details[open] > summary::before { content: \"\\25BC  \"; }\n.bien-tut pre {\n  background: #1e2a24; color: #eef3ee; padding: 1em; overflow-x: auto;\n  border-radius: 0 0 6px 6px; font-size: 0.9em; margin: 0;\n}\n.bien-tut pre code { background: none; color: inherit; }\n.bien-tut table.flags { width: 100%; border-collapse: collapse; margin: 1.2em 0; font-size: 0.95em; }\n.bien-tut table.flags th, .bien-tut table.flags td {\n  border: 1px solid #d8ddd6; padding: 0.55em 0.7em; text-align: left; vertical-align: top;\n}\n.bien-tut table.flags th { background: #eef3ee; }\n.bien-tut table.flags code { background: #eef3ee; padding: 0 3px; border-radius: 3px; }\n.bien-tut .out {\n  background: #f6f6f4; border: 1px solid #e0e0da; border-radius: 6px;\n  padding: 0.5em 1em; overflow-x: auto; font-family: ui-monospace, Menlo, Consolas, monospace;\n  font-size: 0.82em; white-space: pre;\n}\n.bien-tut .steps { counter-reset: bstep; list-style: none; padding-left: 0; }\n.bien-tut .steps > li { counter-increment: bstep; position: relative; padding-left: 2.4em; margin: 0.8em 0; }\n.bien-tut .steps > li::before {\n  content: counter(bstep); position: absolute; left: 0; top: 0;\n  width: 1.7em; height: 1.7em; line-height: 1.7em; text-align: center;\n  background: #4a7c59; color: #fff; border-radius: 50%; font-weight: 700; font-size: 0.85em;\n}\n<\/style>\n<div class=\"bien-tut\">\n<h2>Why Use BIEN Data? A Tutorial on Flags &amp; Data Augmentation<\/h2>\n<p class=\"lead\">\n  Most raw botanical records&mdash;herbarium specimens, vegetation plots, and<br \/>\n  observations&mdash;contain at least one issue that can affect analysis: names may be misspelled,<br \/>\n  outdated, synonymous, or ambiguous; coordinates may be imprecise, misplaced, or assigned to centroids;<br \/>\n  and cultivated or non-native individuals may be mixed with wild native occurrences.<br \/>\n  <strong>BIEN<\/strong> (the Botanical Information and Ecology Network) does not just<br \/>\n  <em>store<\/em> plant data&mdash;it <strong>augments every record<\/strong> so that you can<br \/>\n  filter, subset, and defend your data for reproducible science. This tutorial shows you<br \/>\n  how that augmentation works, how to read key flags and fields, and how to turn augmented data<br \/>\n  into answers for real ecological questions.\n<\/p>\n<div class=\"callout\">\n  <strong>What you will learn.<\/strong><br \/>\n  (1) Why raw biodiversity data need cleaning; (2) how BIEN's validation services add<br \/>\n  <strong>50+ flags and fields<\/strong> to each record; (3) the key flags and fields you will use most;<br \/>\n  (4) two complementary filtering strategies; and (5) copy-paste R recipes that map BIEN fields<br \/>\n  to specific research questions. Every code block is hidden behind a<br \/>\n  <em>&ldquo;Show R script&rdquo;<\/em> toggle&mdash;click to reveal it.\n<\/div>\n<h2>1. The problem: raw plant data are messy<\/h2>\n<p>\n  Before any analysis, it helps to know how much cleaning botanical data actually need.<br \/>\n  In the BIEN reference paper (Enquist et al. 2026), across the full pool of processed records:\n<\/p>\n<ul>\n<li><strong>65.4&ndash;72.5%<\/strong> of taxonomic names had an issue (for example, misspelling, ambiguity, or synonymy).<\/li>\n<li>Of all observation records whose name could be parsed,<br \/>\n      <strong>159,189,390 (55.96%)<\/strong> had an issue with <em>taxonomy or coordinate location<\/em>.<\/li>\n<li>Roughly <strong>half<\/strong> of biodiversity records do not meet rigorous criteria for<br \/>\n      species distribution modelling (SDM) because of various errors and biases.<\/li>\n<\/ul>\n<p>\n  This is the core motivation for data augmentation: if you cannot <em>see<\/em> which records<br \/>\n  are problematic, you cannot build a reproducible, defensible dataset. BIEN makes the problems<br \/>\n  visible&mdash;and filterable.\n<\/p>\n<h2>2. How BIEN augments each record<\/h2>\n<p>\n  Every observation that passes through BIEN's validation services is augmented with flags and fields<br \/>\n  that encode quality, geographic relevance, taxonomic accuracy, and record metadata. Four services do the work:\n<\/p>\n<ul>\n<li><strong>TNRS<\/strong> &mdash; Taxonomic Name Resolution Service: standardizes and resolves plant names.<\/li>\n<li><strong>GNRS<\/strong> &mdash; Geographic Name Resolution Service: standardizes political\/place names.<\/li>\n<li><strong>GVS<\/strong> &mdash; the geocoordinate validation service: checks that coordinates are plausible and match stated localities.<\/li>\n<li><strong>NSR<\/strong> &mdash; the native-status resolver: determines native vs. introduced status by region.<\/li>\n<\/ul>\n<div class=\"callout\">\n  A record that passes through all BIEN data services is augmented with<br \/>\n  <strong>more than 50 distinct flags and fields<\/strong> (documented in Tables S1&ndash;S4 of the reference paper).<br \/>\n  You rarely need all of them&mdash;the rest of this tutorial focuses on the ones that matter most.\n<\/div>\n<h2>3. Try it: download BIEN data in R<\/h2>\n<p>\n  The <a href=\"https:\/\/cran.r-project.org\/package=BIEN\" target=\"_blank\" rel=\"noopener\">BIEN R package<\/a><br \/>\n  is the easiest way to pull augmented records. The script below downloads occurrence records for a<br \/>\n  single, deliberately tricky species&mdash;<em>Xanthium strumarium<\/em> (common cocklebur), which is<br \/>\n  widely introduced&mdash;and asks BIEN to return the augmentation columns alongside the coordinates.\n<\/p>\n<details>\n<summary>Show R script &mdash; download augmented BIEN occurrences<\/summary>\n<pre><code># install.packages(\"BIEN\")   # first time only\r\nlibrary(BIEN)\r\nlibrary(dplyr)\r\n\r\n# Ask BIEN to RETURN the augmentation columns (flags and fields; they are optional arguments).\r\n# By default some services are summarized away; set them to TRUE to see the returned fields.\r\nocc &lt;- BIEN_occurrence_species(\r\n  species              = \"Xanthium strumarium\",\r\n  cultivated           = TRUE,   # include + flag cultivated records (is_cultivated)\r\n  only.geovalid        = FALSE,  # RETURN non-geovalid rows too, so you can SEE\/filter is_geovalid\r\n  new.world            = NULL,   # R NULL here means \"do not restrict by New vs. Old World\" (not the same as NA in returned columns)\r\n  all.taxonomy         = TRUE,   # full TNRS taxonomy incl. scrubbed_species_binomial\r\n  native.status        = TRUE,   # NSR native\/introduced flags (is_introduced, native_status)\r\n  natives.only         = FALSE,  # KEEP introduced records (default TRUE would drop them)\r\n  observation.type     = TRUE,   # plot \/ specimen \/ literature \/ checklist\r\n  political.boundaries = TRUE,   # country \/ state \/ county from GNRS\r\n  collection.info      = TRUE    # collector, catalog number, date\r\n)\r\n\r\n# Peek at the augmentation columns most useful for filtering:\r\nocc %&gt;%\r\n  select(scrubbed_species_binomial, latitude, longitude,\r\n         is_cultivated, is_introduced, is_geovalid, is_centroid,\r\n         higher_plant_group, observation_type) %&gt;%\r\n  head(8)\r\n\r\n# Tip: run ?BIEN_occurrence_species to see every argument and returned column\r\n# for YOUR installed package version. Returned columns can differ by version.\r\n<\/code><\/pre>\n<\/details>\n<h3>What the output looks like<\/h3>\n<p>\n  A schematic view of the returned data frame (values illustrative; real queries return<br \/>\n  hundreds to thousands of rows):\n<\/p>\n<div class=\"out\">scrubbed_species_binomial  latitude  longitude  is_cultivated  is_introduced  is_geovalid  is_centroid  higher_plant_group  observation_type<br \/>\nXanthium strumarium         40.10    -88.20        0              0             1            0           flowering plants     specimen<br \/>\nXanthium strumarium         48.85      2.35        0              1             1            0           flowering plants     specimen<br \/>\nXanthium strumarium         51.51     -0.13        1             NA             1            0           flowering plants     specimen<br \/>\nXanthium strumarium        -33.87    145.00        0              1             0           NA           flowering plants     plot<br \/>\nXanthium strumarium         19.43    -99.13        0              1             1            1           flowering plants     specimen<br \/>\nXanthium strumarium         35.68    139.69       NA             NA             0            0           flowering plants     literature<\/div>\n<p>\n  <strong>Does BIEN use <code>0<\/code>, <code>NULL<\/code>, <code>NA<\/code>, and <code>FALSE<\/code> to mean the same thing?<\/strong><br \/>\n  <strong>No.<\/strong> BIEN does not treat <code>0<\/code>, SQL <code>NULL<\/code>, R <code>NA<\/code>, R <code>NULL<\/code>, and<br \/>\n  <code>FALSE<\/code> as equivalent.\n<\/p>\n<p>\n  A BIEN flag is a yes\/no\/unknown indicator about a record. Other BIEN fields store resolved names,<br \/>\n  source type, taxonomy, geography, or metadata. For flag fields, the mental model is simple:<br \/>\n  <strong>yes<\/strong>, <strong>no<\/strong>, or <strong>unknown<\/strong>. Is this record introduced? Is it<br \/>\n  cultivated? Did this coordinate pass geovalidation? BIEN keeps those answers separate.<br \/>\n  This matters because <strong>unknown is not the same as no<\/strong>.\n<\/p>\n<table class=\"flags\">\n<thead>\n<tr>\n<th>Beginner answer<\/th>\n<th>BIEN\/R value<\/th>\n<th>Plain meaning<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Yes<\/td>\n<td><code>1<\/code><\/td>\n<td>BIEN flagged, detected, or confirmed the condition, depending on the column.<\/td>\n<\/tr>\n<tr>\n<td>No<\/td>\n<td><code>0<\/code><\/td>\n<td>BIEN did not flag the condition, or recorded a negative result, depending on the column.<\/td>\n<\/tr>\n<tr>\n<td>Unknown<\/td>\n<td>SQL <code>NULL<\/code> \/ R <code>NA<\/code><\/td>\n<td>Unknown, missing, or not determined.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\n  For example, in R output:\n<\/p>\n<table class=\"flags\">\n<thead>\n<tr>\n<th><code>is_introduced<\/code> value<\/th>\n<th>Meaning<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>1<\/code><\/td>\n<td>BIEN treats the record as introduced or non-native.<\/td>\n<\/tr>\n<tr>\n<td><code>0<\/code><\/td>\n<td>BIEN did not flag the record as introduced.<\/td>\n<\/tr>\n<tr>\n<td><code>NA<\/code><\/td>\n<td>BIEN did not determine introduced\/native status.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\n  An <code>NA<\/code> in <code>is_introduced<\/code> does <strong>not<\/strong> mean native. It also does <strong>not<\/strong><br \/>\n  mean introduced. It means unknown.\n<\/p>\n<p>\n  The confusing part is that databases and R use different words for missing values. In the BIEN<br \/>\n  database, missing or undetermined values are stored as SQL <code>NULL<\/code>. When those data are returned<br \/>\n  to R, they usually appear as <code>NA<\/code>.\n<\/p>\n<p>\n  R also has its own object called <code>NULL<\/code>. That is different. In a BIEN query argument,<br \/>\n  <code>new.world = NULL<\/code> means \"do not apply a New World \/ Old World restriction.\" It is an<br \/>\n  instruction about the query, not a missing value in an output column.\n<\/p>\n<p>\n  The practical rule is simple:\n<\/p>\n<table class=\"flags\">\n<thead>\n<tr>\n<th>Value<\/th>\n<th>How to read it<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>1<\/code><\/td>\n<td>detected, flagged, or passed, depending on the column definition<\/td>\n<\/tr>\n<tr>\n<td><code>0<\/code><\/td>\n<td>not flagged, negative, or failed, depending on the column definition<\/td>\n<\/tr>\n<tr>\n<td><code>NA<\/code> in R output<\/td>\n<td>unknown or missing<\/td>\n<\/tr>\n<tr>\n<td>SQL <code>NULL<\/code> in the database<\/td>\n<td>unknown or missing<\/td>\n<\/tr>\n<tr>\n<td>R <code>NULL<\/code> in function arguments<\/td>\n<td>no object or argument supplied<\/td>\n<\/tr>\n<tr>\n<td><code>FALSE<\/code><\/td>\n<td>a logical value; not a BIEN missing-value code<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\n  Always interpret <code>1<\/code> and <code>0<\/code> relative to the specific BIEN field definition. Some fields<br \/>\n  encode detected problems, while others encode passed checks or accepted status. The main decision for<br \/>\n  users is how to treat unknown values.\n<\/p>\n<h2>4. Seven key BIEN flags and fields<\/h2>\n<p>\n  BIEN augments records with 50+ flags and fields, but these seven do most of the work in day-to-day analysis.\n<\/p>\n<table class=\"flags\">\n<thead>\n<tr>\n<th>Field<\/th>\n<th>What it tells you<\/th>\n<th>Values<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>is_cultivated<\/code><\/td>\n<td>Whether the record is a cultivated (planted\/garden) specimen rather than a wild individual.<\/td>\n<td><code>1<\/code> = cultivated; <code>0<\/code> = not flagged as cultivated; SQL <code>NULL<\/code> (R <code>NA<\/code>) = undetermined.<\/td>\n<\/tr>\n<tr>\n<td><code>is_introduced<\/code><\/td>\n<td>Flags observations of non-native (exotic) species in that region (from the NSR). Used to exclude exotics from native-range analyses.<\/td>\n<td><code>1<\/code> = introduced or treated as non-native; <code>0<\/code> = not flagged as introduced; SQL <code>NULL<\/code> (R <code>NA<\/code>) = undetermined.<\/td>\n<\/tr>\n<tr>\n<td><code>observation_type<\/code><\/td>\n<td>The record's source, so you can filter by data type to match your study.<\/td>\n<td><code>plot<\/code>, <code>specimen<\/code>, <code>literature<\/code>, <code>checklist<\/code>.<\/td>\n<\/tr>\n<tr>\n<td><code>is_geovalid<\/code><\/td>\n<td>Whether the geographic coordinates pass BIEN geovalidation and are plausible (from the GVS).<\/td>\n<td><code>1<\/code> = passes BIEN geovalidation; <code>0<\/code> = fails BIEN geovalidation; SQL <code>NULL<\/code> (R <code>NA<\/code>) = geovalidation could not be assessed.<\/td>\n<\/tr>\n<tr>\n<td><code>higher_plant_group<\/code><\/td>\n<td>Taxonomic group, letting you keep target plants and exclude algae, fungi, bacteria, etc.<\/td>\n<td>e.g. <code>flowering plants<\/code>, <code>ferns and allies<\/code>, <code>bryophytes<\/code>.<\/td>\n<\/tr>\n<tr>\n<td><code>is_centroid<\/code><\/td>\n<td>Whether the point is georeferenced to an administrative centroid (country\/state center) rather than a true locality.<\/td>\n<td><code>1<\/code> = likely administrative centroid; <code>0<\/code> = not flagged as centroid; SQL <code>NULL<\/code> (R <code>NA<\/code>) = centroid status unavailable.<\/td>\n<\/tr>\n<tr>\n<td><code>scrubbed_species_binomial<\/code><\/td>\n<td>The standardized, TNRS-resolved name&mdash;reduces ambiguity and keeps names consistent across datasets.<\/td>\n<td>Resolved <em>Genus species<\/em> string.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li><code>is_introduced = 1<\/code>: introduced or treated as non-native.<\/li>\n<li><code>is_introduced = 0<\/code>: not flagged as introduced; for filtering, typically retained as native\/present without evidence of introduction (not definitive proof of native status).<\/li>\n<li><code>is_introduced = NA<\/code> in R: introduced\/native status unknown.<\/li>\n<li><code>is_cultivated = 1<\/code>: cultivated.<\/li>\n<li><code>is_cultivated = 0<\/code>: not flagged as cultivated.<\/li>\n<li><code>is_cultivated = NA<\/code> in R: cultivation status unknown.<\/li>\n<li><code>is_geovalid = 1<\/code>: passes BIEN geovalidation.<\/li>\n<li><code>is_geovalid = 0<\/code>: fails BIEN geovalidation.<\/li>\n<li><code>is_geovalid = NA<\/code> in R: geovalidation could not be assessed.<\/li>\n<\/ul>\n<div class=\"callout warn\">\n  <strong>Read missing values carefully.<\/strong> SQL <code>NULL<\/code> in BIEN appears as R <code>NA<\/code> in returned<br \/>\n  data frames. Missing\/undetermined values are not equivalent to <code>0<\/code> or <code>FALSE<\/code>. For<br \/>\n  <code>is_geovalid<\/code>, treat <code>0<\/code> as failed validation and <code>NA<\/code> as unknown validation status.<br \/>\n  For <code>is_cultivated<\/code> and <code>is_introduced<\/code>, <code>NA<\/code> means status was undetermined.<br \/>\n  Note too that <code>is_geovalid == 1<\/code> means coordinates are plausible and consistent with the stated<br \/>\n  locality&mdash;not that they are precise&mdash;and <code>is_centroid == 0<\/code> means only \"not flagged as a<br \/>\n  centroid,\" not verified as an accurate point.\n<\/div>\n<p>\n  <strong>Final rule:<\/strong> <code>1<\/code> and <code>0<\/code> must be read in relation to the specific field definition.<br \/>\n  SQL <code>NULL<\/code> \/ R <code>NA<\/code> means missing or undetermined. R <code>NULL<\/code> is different.<br \/>\n  <code>FALSE<\/code> is not a BIEN missing-value code.\n<\/p>\n<h2>5. Two ways to filter and subset<\/h2>\n<p>\n  BIEN gives you two complementary strategies. Most rigorous workflows combine them.\n<\/p>\n<ol class=\"steps\">\n<li>\n    <strong>Flag and field filtering.<\/strong> Select or exclude records based on BIEN fields&mdash;for example, drop<br \/>\n    cultivated and introduced individuals, keep only geovalid points, and remove centroids.\n  <\/li>\n<li>\n    <strong>Geographic &amp; political filtering.<\/strong> Subset by bounding box, polygon, or political<br \/>\n    division (country\/state\/county) to focus on your region of interest.\n  <\/li>\n<\/ol>\n<details>\n<summary>Show R script &mdash; an example broad-use clean plant filter<\/summary>\n<pre><code>library(dplyr)\r\n\r\nclean &lt;- occ %&gt;%\r\n  filter(\r\n    higher_plant_group == \"flowering plants\",   # target group only\r\n    !is.na(is_geovalid) &amp; is_geovalid == 1,      # keep records that pass BIEN geovalidation; NA (unknown) dropped explicitly\r\n    is.na(is_centroid) | is_centroid == 0,       # drop known centroid points; keep unknowns\r\n    is.na(is_cultivated) | is_cultivated == 0,   # drop known cultivated records; keep unknowns\r\n    !is.na(scrubbed_species_binomial)            # keep only resolved names\r\n  )\r\n\r\n# CONSERVATIVE native-only set: also require is_introduced == 0 (drops NA)\r\nnative_conservative &lt;- clean %&gt;% filter(is_introduced == 0)   # keep only records NOT flagged introduced\r\n\r\n# LIBERAL native-ish set: keep records not flagged introduced AND undetermined (0 or NA), drop only known exotics\r\nnative_liberal &lt;- clean %&gt;% filter(is_introduced == 0 | is.na(is_introduced))\r\n\r\nnrow(occ); nrow(clean); nrow(native_conservative); nrow(native_liberal)\r\n<\/code><\/pre>\n<\/details>\n<p>\n  This example uses a liberal treatment of <code>is_centroid<\/code> and <code>is_cultivated<\/code> by keeping<br \/>\n  records with unknown status. For finer-scale spatial analyses, users may choose a stricter filter.\n<\/p>\n<p>\n  Some BIEN filters keep both <code>0<\/code> and missing values. This does not mean they are equivalent.<br \/>\n  It is a liberal filtering choice. For example, keeping <code>is_introduced == 0 | is.na(is_introduced)<\/code><br \/>\n  means \"drop known introduced records, but keep records where introduced\/native status is unknown.\" A<br \/>\n  conservative filter would keep only <code>is_introduced == 0<\/code>, dropping unknowns. Conservative means<br \/>\n  stricter filtering, not necessarily less biased.\n<\/p>\n<pre><code># Liberal filter: drop known introduced records, keep unknown introduced\/native status\r\ndat |&gt;\r\n  dplyr::filter(is_introduced == 0 | is.na(is_introduced))\r\n\r\n# Conservative filter: keep only records not flagged as introduced, dropping unknowns\r\ndat |&gt;\r\n  dplyr::filter(is_introduced == 0)\r\n<\/code><\/pre>\n<p>\n  The liberal filter keeps both <code>0<\/code> and <code>NA<\/code>, but it does not treat them as the same value.<br \/>\n  It treats them as different evidence classes that the user has chosen to retain.\n<\/p>\n<p>\n  This contrast only bites when <code>is_introduced<\/code> is genuinely <code>NA<\/code>. Some records instead carry an<br \/>\n  explicit native-status category (for example a <code>native_status<\/code> value of \"unknown\"), which is not the<br \/>\n  same as <code>NA<\/code>. Check how your returned columns encode undetermined status&mdash;with<br \/>\n  <code>table(native_status, is_introduced, useNA = \"always\")<\/code>&mdash;before assuming the two filters differ.\n<\/p>\n<details>\n<summary>Show R script &mdash; geographic \/ political subsetting<\/summary>\n<pre><code>library(dplyr)\r\n\r\n# (a) Political: keep only records BIEN placed in a chosen country\r\nusa &lt;- clean %&gt;% filter(country == \"United States\")\r\n\r\n# (b) Bounding box: a rough spatial window (min\/max lon &amp; lat)\r\nbbox &lt;- clean %&gt;%\r\n  filter(longitude &gt;= -125, longitude &lt;= -66,\r\n         latitude  &gt;=   24, latitude  &lt;=  50)\r\n\r\n# (c) Region-first at download time is often faster than filtering afterward:\r\n#     BIEN_occurrence_box(min.lat, max.lat, min.long, max.long, cultivated = TRUE,\r\n#                         native.status = TRUE, natives.only = FALSE,\r\n#                         only.geovalid = FALSE, observation.type = TRUE)\r\n<\/code><\/pre>\n<\/details>\n<h2>6. Winnowing: liberal vs. conservative thresholds<\/h2>\n<p>\n  Building a high-confidence dataset is a <em>sequential<\/em> process. Following the BIEN<br \/>\n  workflow for species distribution modelling (Figure 4 of the reference paper), records are<br \/>\n  progressively winnowed:\n<\/p>\n<ol class=\"steps\">\n<li><strong>All records &rarr; geovalidated.<\/strong> Apply GNRS and GVS so geographic metadata are standardized and coordinates can be tested. Keep records with is_geovalid == 1, meaning they pass BIEN geovalidation.<\/li>\n<li><strong>Exclude cultivated records &amp; centroids.<\/strong> Use BIEN fields to drop records flagged as cultivated and points flagged as administrative centroids.<\/li>\n<li><strong>Choose a taxonomic\/native threshold.<\/strong> The <em>liberal<\/em> threshold keeps TNRS \"No opinion\" names and records with missing introduced status (R <code>NA<\/code>; SQL <code>NULL<\/code> in BIEN db), while the <em>conservative<\/em> threshold keeps only records explicitly not flagged as introduced (<code>is_introduced == 0<\/code>).<\/li>\n<\/ol>\n<div class=\"callout\">\n  In the BIEN reference workflow, roughly <strong>half<\/strong> of records may not survive SDM-grade filtering,<br \/>\n  depending on the chosen thresholds. That is not a flaw in BIEN&mdash;it is BIEN making an<br \/>\n  otherwise invisible problem explicit and reproducible. Always report which threshold you used.\n<\/div>\n<div class=\"callout warn\">\n  <strong>Missingness is usually not random.<\/strong> Because NSR native-status coverage is densest in the<br \/>\n  New World, <code>is_introduced = NA<\/code> is more common in some regions than others. Liberal and<br \/>\n  conservative filters therefore change not just sample size but the geographic and environmental composition<br \/>\n  of the retained records, which can bias SDMs and range estimates. Compare both filters as a sensitivity<br \/>\n  check rather than assuming either is unbiased.\n<\/div>\n<p>\n  The R recipes above vary only the <em>native-status<\/em> half of this decision<br \/>\n  (<code>is_introduced<\/code>). The <em>taxonomic<\/em> half&mdash;whether to keep TNRS<br \/>\n  &ldquo;No opinion&rdquo; names&mdash;is controlled through the resolved-name and taxonomic-status<br \/>\n  columns (e.g. <code>scrubbed_taxonomic_status<\/code>); the liberal path keeps them and the<br \/>\n  conservative path excludes them. Decide both halves explicitly.\n<\/p>\n<h2>7. From BIEN fields to science questions<\/h2>\n<p>\n  The same augmented dataset supports many questions&mdash;you simply change which fields you filter on.<br \/>\n  A few worked examples:\n<\/p>\n<h3>7a. Species distribution modelling (native range)<\/h3>\n<p>\n  For native-range SDMs, a common high-confidence starting point is a conservative filter emphasizing<br \/>\n  records that pass BIEN geovalidation, excluding known cultivated records and centroids, and using<br \/>\n  <code>is_introduced == 0<\/code> as a threshold appropriate to the question.\n<\/p>\n<details>\n<summary>Show R script &mdash; SDM-ready native points<\/summary>\n<pre><code>sdm_points &lt;- occ %&gt;%\r\n  dplyr::filter(\r\n    !is.na(is_geovalid) &amp; is_geovalid == 1,   # keep geovalidated only; NA (unknown) dropped explicitly\r\n    is.na(is_centroid) | is_centroid == 0,     # drop known centroid points; keep unknowns\r\n    is.na(is_cultivated) | is_cultivated == 0, # drop known cultivated records; keep unknowns\r\n    is_introduced == 0,                     # conservative: exclude records flagged introduced\r\n    !is.na(scrubbed_species_binomial)\r\n  ) %&gt;%\r\n  dplyr::distinct(scrubbed_species_binomial, longitude, latitude)\r\n\r\n# sdm_points now holds de-duplicated (exact-coordinate) native, geovalid points.\r\n# distinct() is NOT spatial thinning: before modelling, apply distance-based\r\n# thinning (e.g. spThin) to reduce sampling-bias pseudoreplication, and evaluate\r\n# with spatial\/blocked cross-validation (random CV leaks under spatial autocorrelation).\r\n<\/code><\/pre>\n<\/details>\n<h3>7b. Invasion \/ non-native biogeography<\/h3>\n<p>\n  Here the \"exotics\" are the point of the study&mdash;so you <em>keep<\/em> introduced records instead of<br \/>\n  discarding them.\n<\/p>\n<details>\n<summary>Show R script &mdash; introduced-range occurrences<\/summary>\n<pre><code>introduced &lt;- occ %&gt;%\r\n  dplyr::filter(is_introduced == 1, !is.na(is_geovalid) &amp; is_geovalid == 1) %&gt;%\r\n  dplyr::select(scrubbed_species_binomial, country, latitude, longitude)\r\n<\/code><\/pre>\n<\/details>\n<h3>7c. Regional checklist \/ floristic inventory<\/h3>\n<p>\n  Checklists are highly sensitive to synonyms. Standardize names, subset to your region, and<br \/>\n  reduce to a unique accepted-name list&mdash;then verify names against original submissions (see caveats).\n<\/p>\n<details>\n<summary>Show R script &mdash; a regional species checklist<\/summary>\n<pre><code>checklist &lt;- occ %&gt;%\r\n  dplyr::filter(country == \"Mexico\",\r\n                !is.na(is_geovalid) &amp; is_geovalid == 1,\r\n                is.na(is_cultivated) | is_cultivated == 0, # drop known cultivated records; keep unknowns\r\n                !is.na(scrubbed_species_binomial)) %&gt;%\r\n  dplyr::distinct(scrubbed_species_binomial) %&gt;%\r\n  dplyr::arrange(scrubbed_species_binomial)\r\n<\/code><\/pre>\n<\/details>\n<h3>7d. Trait&ndash;environment &amp; macroecology<\/h3>\n<p>\n  Join clean occurrences to trait data (via <code>BIEN_trait_species()<\/code>), keeping source and<br \/>\n  unit metadata so the merge stays auditable. Match on the standardized<br \/>\n  <code>scrubbed_species_binomial<\/code> to avoid silent name mismatches. <code>BIEN_trait_species()<\/code><br \/>\n  returns <em>long<\/em> data (one row per trait measurement), so aggregate to one row per<br \/>\n  species&thinsp;&times;&thinsp;trait before joining&mdash;otherwise the join is many-to-many and multiplies your<br \/>\n  occurrence rows.\n<\/p>\n<details>\n<summary>Show R script &mdash; occurrences joined to traits<\/summary>\n<pre><code>traits &lt;- BIEN_trait_species(\r\n  species        = \"Xanthium strumarium\",\r\n  source.citation = TRUE   # request source\/citation columns (off by default)\r\n)  # returns trait_name, trait_value, unit, plus source\/citation columns\r\n\r\n# Aggregate numeric traits first: one row per species x trait (keeps unit + evidence count).\r\n# This example uses a mean for numeric traits only.\r\n# Categorical traits require a different summary rule.\r\n# Check that units are harmonized before averaging trait values.\r\ntrait_summ &lt;- traits %&gt;%\r\n  dplyr::mutate(trait_value_numeric = suppressWarnings(as.numeric(trait_value))) %&gt;%\r\n  dplyr::filter(!is.na(trait_value_numeric)) %&gt;%\r\n  dplyr::group_by(scrubbed_species_binomial, trait_name) %&gt;%\r\n  dplyr::summarise(mean_value = mean(trait_value_numeric, na.rm = TRUE),\r\n                   n_trait_values = dplyr::n(),\r\n                   unit = dplyr::first(unit), .groups = \"drop\")\r\n\r\n# Now the join is intentional and will not inflate occurrence rows.\r\njoined &lt;- clean %&gt;%\r\n  dplyr::left_join(trait_summ, by = \"scrubbed_species_binomial\")\r\n<\/code><\/pre>\n<\/details>\n<div class=\"callout\">\n  <strong>Reproducibility habit.<\/strong> Whatever the question, record these with your results:<br \/>\n  (1) the access date, (2) the query scope, (3) the exact flag filters you applied,<br \/>\n  (4) the BIEN db \/ package versions and the TNRS\/GNRS\/NSR service versions, (5) any random seed<br \/>\n  (SDM background\/pseudo-absence and cross-validation folds are stochastic), and (6) a saved data snapshot<br \/>\n  or per-step record counts, since re-querying a live database may not return byte-identical results.<br \/>\n  That paragraph makes your dataset re-buildable by anyone.\n<\/div>\n<h2>8. Caveats &amp; best practice for names<\/h2>\n<ul>\n<li>\n    <strong>Some names still need human review.<\/strong> Any name service is several years behind the<br \/>\n    current literature; recent synonymy changes or newly described species may not be resolved<br \/>\n    correctly by TNRS. For extensive biodiversity studies this is usually acceptable; for a checklist<br \/>\n    it may not be.\n  <\/li>\n<li>\n    <strong>Compare accepted names with original names.<\/strong> For synonym-sensitive lists, cross-check<br \/>\n    each accepted name against its originally submitted name so nothing is silently merged or missed.\n  <\/li>\n<li>\n    <strong>Follow links for verification.<\/strong> Use <code>Name_matched_url<\/code> and<br \/>\n    <code>Accepted_name_url<\/code> to inspect matched or accepted names in linked taxonomic resources.<br \/>\n    See the<br \/>\n    <a href=\"https:\/\/tnrs.biendata.org\/instructions\/\" target=\"_blank\" rel=\"noopener\">TNRS instructions<\/a><br \/>\n    for interpreting output and best practices.\n  <\/li>\n<li>\n    <strong>Missing values require decisions.<\/strong> Decide&mdash;and document&mdash;whether you keep or<br \/>\n    drop missing values, which appear as SQL <code>NULL<\/code> in the BIEN database and R <code>NA<\/code> in returned data.\n  <\/li>\n<\/ul>\n<h2>9. Learn more &amp; how to cite<\/h2>\n<ul>\n<li>\n    <strong>Reference paper (cite when using BIEN flags\/augmentation):<\/strong><br \/>\n    Enquist BJ, Boyle B, Maitner BS, et al. (2026). BIEN: A biodiversity informatics ecosystem<br \/>\n    advancing open and reproducible workflows for plant observation, plot and trait data.<br \/>\n    <em>Methods in Ecology and Evolution<\/em>, 17(5), 1556&ndash;1584.<br \/>\n    <a href=\"https:\/\/doi.org\/10.1111\/2041-210X.70274\" target=\"_blank\" rel=\"noopener\">doi:10.1111\/2041-210X.70274<\/a><br \/>\n    &mdash; see Sections 3.2&ndash;3.4 and Supporting Information S3.2, Tables S1&ndash;S4.\n  <\/li>\n<li>\n    <strong>BIEN R package:<\/strong><br \/>\n    Maitner BS, et al. (2018). The BIEN R package. <em>Methods in Ecology and Evolution<\/em>, 9(2),<br \/>\n    373&ndash;379.<br \/>\n    <a href=\"https:\/\/doi.org\/10.1111\/2041-210X.12861\" target=\"_blank\" rel=\"noopener\">doi:10.1111\/2041-210X.12861<\/a>\n  <\/li>\n<li>\n    <strong>TNRS:<\/strong><br \/>\n    <a href=\"https:\/\/tnrs.biendata.org\/instructions\/\" target=\"_blank\" rel=\"noopener\">tnrs.biendata.org\/instructions<\/a>\n  <\/li>\n<li>\n    <strong>Explore occurrences interactively:<\/strong><br \/>\n    <a href=\"https:\/\/biendata.org\/\" target=\"_blank\" rel=\"noopener\">biendata.org<\/a>\n  <\/li>\n<\/ul>\n<hr \/>\n<p style=\"font-size: 0.9em;\">\n  <strong>Note.<\/strong> The R output shown above is schematic to illustrate flag structure; the exact<br \/>\n  columns returned depend on your query arguments and on the installed BIEN db and R package versions.<br \/>\n  Run <code>?BIEN_occurrence_species<\/code> to confirm available arguments and returned fields, and<br \/>\n  always report the access date, query scope, filters, and versions used so your dataset is reproducible.\n<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Why Use BIEN Data? A Tutorial on Flags &amp; Data Augmentation Most raw botanical records&mdash;herbarium specimens, vegetation plots, and observations&mdash;contain at least one issue that can affect analysis: names may be misspelled, outdated, synonymous, or ambiguous; coordinates may be imprecise, misplaced, or assigned to centroids; and cultivated or non-native individuals may be mixed with wild [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"class_list":["post-3932","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bien.nceas.ucsb.edu\/bien\/wp-json\/wp\/v2\/pages\/3932"}],"collection":[{"href":"https:\/\/bien.nceas.ucsb.edu\/bien\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bien.nceas.ucsb.edu\/bien\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bien.nceas.ucsb.edu\/bien\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/bien.nceas.ucsb.edu\/bien\/wp-json\/wp\/v2\/comments?post=3932"}],"version-history":[{"count":12,"href":"https:\/\/bien.nceas.ucsb.edu\/bien\/wp-json\/wp\/v2\/pages\/3932\/revisions"}],"predecessor-version":[{"id":4020,"href":"https:\/\/bien.nceas.ucsb.edu\/bien\/wp-json\/wp\/v2\/pages\/3932\/revisions\/4020"}],"wp:attachment":[{"href":"https:\/\/bien.nceas.ucsb.edu\/bien\/wp-json\/wp\/v2\/media?parent=3932"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}