Atop Darien

Bee Curiosity

Leave a comment

Native Bee Resources

Want to learn more about our amazing diversity of native bee species. Here is a nice video providing a brief overview of native bees.

Native Bee Pocket Identification Guide: This is an identification guide created by Xerces for the state of Pennsylvannia. It will be quite useful for most bees that you will encounter in Massachusetts. Link:

Bee Basics – An introduction to out native bees: This is an absolutely fantastic and free document that gives an overview of bee biology, conservation, and It also has beautiful artwork and is easy to understand. Link:

Louie Schwartzberg’s incredible film on pollination.


Xerces Foundation: This is a nice page about ways to conserve pollinators.

Xerces Foundation: This is a nice overview of native bee biology.

The Buzz on Native Bees. This is a nice blog post about native bees from 2013. It is from the USGS and their staff scientist Dr. Hannah Hamilton.

Native bee identification adaptive key from Discoverlife: This is an excellent resource to key out native bees to genus or species. With a little bit of knowledge of bee morphology, you can identify most bees in the Northeast US to genus. Link:

USGS Bee Inventory and Monitoring Lab: This site has amazing photographs of native bees and other insects. Sam Droege is also an amazing biologist, scientist, and person. Link:

Here is an example of a few photos that you can find on the website. These photos are all part of the public domain and can be reused for any purpose. See Sam’s flickr page for more details.

Handy Dandy Bee Manual: Fantastic resource and guide useful when doing conservation, research, or monitoring project on native bees. The Handy Dandy Bee manual has the protocols and background material needed to do most types of bee monitoring, including how to process and store specimens. Link:

Bug Guide (Native Bee Photos): This is a terrific website that has a strong community base of naturalists that post and identify photographs of insects taken in the United States.


Wilson, J.S. & Carril O.M. The Bees in your backyard: A Guide to North American’s Bee. Princeton University Press. 2016.

Xerces Foundation. Pollinator Conservation Handbook

Michener, C. Bees of the World. Johns Hopkins University Press. 2000

Leave a comment

The presence of wonder

“Always be on the lookout for the presence of wonder.” E.B. White

Around every corner, underneath every pebble, and surrounding a blade of grass, a magical, wild, wilderness exists, if you only take the time to look and let curiosity guide you. Wonderful moments exists around every corner and, for me, I captured this feeling with this photograph of a spider, staring off into the distance, perched on a leaf of goldenrod, like “stout Cortez…silent, upon a peak in Darien”.


To me, this spider is like

“stout Cortez when with eagle eyes
He star’d at the Pacific — and all his men
Look’d at each other with a wild surmise —
Silent, upon a peak in Darien.”

On First Looking into Chapman’s Homer ~ Keats

Leave a comment

Neck and neck….and neck…and neck

The drought this summer has been so bad in southeastern Massachusetts that the pond at Wheaton Farm in Easton has nearly dried up. On an early Sunday morning in September, I was able to walk out into the middle of the lake and came across a flock of Great Egrets (also know as a “wedge” of egrets) and a single great blue heron.

As I was watching the flock of birds, I was able to capture 4 egrets taking off at the same time in nearly the same position. Here is the photo.


I love how their necks are in almost every position that you would see, some extended, some curved, and the wings are in the middle, up stroke, and down stroke as they take off to fly.

Here are a few other photos of the “wedge” of egrets.


Leave a comment

Essentials of Research Planning

Essentials of Research Planning

Creating mock datasets in R and exporting them as a csv file for use in Excel

Date: October, 2014
Author: Sean Kent

Why would you want to create a mock dataset in the research planning stage?

Properly planning for an experiment is hard, it takes time and forces you to really think about the question you are asking, the hypothesis you are testing, and the data you will be collecting as evidence that will end up supporting or refuting the hypothesis. However, many times the thought and time necessary for properly planning how you will collect and analyze the data is overlooked, causing problems when you start to try to analyze the data. Check out this great page for more background on using R in data planning techniques.

Let’s start by running through the planning process for data collection.

Remember this research is asking if native bee diversity, richness, and abundance decline with distance from native plantings?

Let’s create vectors for the location, replicate, method of collection (bee bowl)


Since we are measuring whether bee diversity declines with distance from native plantings, let create a distance vector. It is good to use simple and descriptive names, so let’s call the vector distance and populate it with the different distances used in the experiments. Bee bowls placed at the edge of the meadow, inside the meadow, and at 20 meter intervals away from the meadow, up to 120 meters away. Here is a picture of the study site.


To combined different values (numbers, strings, etc) we use the c() function, think of it as combining or concatenating.

Distance <- c("EdgeAdmin(0m)", "MeadowAdmin(20m)", "FarMeadow(20m)", "FarEdge(0m)", "20m", "40m", "60m", "80m", "100m","120m")
##  [1] "EdgeAdmin(0m)"    "MeadowAdmin(20m)" "FarMeadow(20m)"  
##  [4] "FarEdge(0m)"      "20m"              "40m"             
##  [7] "60m"              "80m"              "100m"            
## [10] "120m"

Wait, that’s not exactly what we wanted, there are only 10 values in the distance vector, but to properly test the validity of our hypothesis we need to make sure we have adequate replication, not just a single sample for each distance. However, we are not just creating a single category for each distance, but we are placing 15 bee bowls down at each location, meaning we are creating 15 entries for each distance. Typing in each distance 15 times (150 times total) is labor intensive, tedious, and prone to errors, so lets use the rep() function to speed up the process. I’ve also created two ways to make the vector as well, using the c() and rep() for Distance and Distance 1 respectively.

Distance <- rep(c("EdgeAdmin(0m)", "MeadowAdmin(20m)", "FarMeadow(20m)", "FarEdge(0m)", "20m", "40m", "60m", "80m", "100m","120m"), c(15,15,15,15,15,15,15,15,15,15))

Distance1 <- rep(c("EdgeAdmin(0m)", "MeadowAdmin(20m)", "FarMeadow(20m)", "FarEdge(0m)", "20m", "40m", "60m", "80m", "100m","120m"), rep(15))

Bee Bowls

Good, now we have 150 values in the distance vector. Next, we need to create a vector for our method of collection, bee bowls, specifically the color of the bee bowl.

BowlColor <- rep(c("Blue", "Yellow", "White"), 50) #Create the bowl color variable, 150 records
BowlColor[1:15] #Looks good, notice how it repeats in groups of three.
##  [1] "Blue"   "Yellow" "White"  "Blue"   "Yellow" "White"  "Blue"  
##  [8] "Yellow" "White"  "Blue"   "Yellow" "White"  "Blue"   "Yellow"
## [15] "White"

Looks good, now lets create the vector for replicate. For each transect, we have 5 total replicates, but we have replicated the color at each location. What I mean is that there is a replicate 1 for the blue, yellow, and white bee bowl. Therefore, we need to have a 3 values for replicate 1, instead of just 1 value. Plus, we need to have replicate 1 for each distance treatment (20m, 40m and so on), so the replicates need to be repeated 10 times. I’ve create the replicate vector in two ways to show you two different ways to do it.

Replicate <- rep(c("1", "1", "1", "2", "2", "2", "3", "3", "3", "4", "4", "4", "5", "5", "5"), 10)
Replicate1 <- rep(c(rep(1,3), rep(2,3), rep(3,3), rep(4,3), rep(5,3)),10)
Bee Abundance

Let’s create an empty vector for bee abundance

BeeAbundance <- vector(mode = 'numeric', length = length(Distance))

We need to take each separate vector and combine them into a dataframe. To do that, we will use the data.frame() function. Great, now lets create a comma separated file (can be used as a spreadsheet in excel). To export the file, we use the write.csv() function.

DistanceExperiment <- data.frame(Distance, BowlColor, Replicate,BeeAbundance)
write.csv(DistanceExperiment, "BeeAbundanceDistanceExperiment.csv")
Tada a nice clean spreadsheet


Leave a comment

Munch, munch, munch

As caterpillars, monarch butterflies need to eat milkweed plants to thrive. Milkweed plants are quite toxic to most insects and monarch butterflies have evolved the ability to sequester the cardiac glycoside toxin within milkweed and ways to circumvent the gooey latex that comes out of the leaf. The plant uses latex to glue an unlucky insects mouth shut. Here are a few pictures from the past week of some large monarch caterpillars.


5th instar monarch on common milkweed

Evidence that a monarch caterpillar sniped the milkweed vein to prevent latex from flowing

Gooey Latex from milkweed

This slideshow requires JavaScript.

More monarch caterpillars

This slideshow requires JavaScript.

Leave a comment

Essentials of Research Planning: Data Collection

Essentials of Research Planning

Massasoit Land Use Research and Data Collection Planning

Date: October, 2014
Author: Sean Kent
Using R to plan out the collection of aquatic invertebrates and water samples

Overarching research question: How does land use and sustainable landscaping influence ecosystem services and native biodiversity?

Last week, we examined how to create a mock dataset to plan out the experiment that examined how large the impact of sustainable landscaping was on essential pollinators, native bees, specifically by asking “Does native bee diversity, richness, and abundance decline with distance from the native plantings?”. Check out this great page for more background on using R in data planning techniques. Here, you will need to create the following variables (if necessary, create other variables that are not on this list)

  1. Study Site
  2. Date
  3. Replicate
  4. Variable(s) for the water quality parameters you will be testing
  5. Variable(s) for the aquatic and soil invertebrates that you will be collecting
Review: How do you create a variable?

Recall from last week, to create a variable for the location of bee bowls in the distance experiment, the following code in R was used. We had 10 different locations and 15 bowls placed at each location.

Location <- rep(c("EdgeAdmin(0m)", "MeadowAdmin(20m)", "FarMeadow(20m)", "FarEdge(0m)", "20m", "40m", "60m", "80m", "100m","120m"), c(15,15,15,15,15,15,15,15,15,15))

How do you create a variable filled with random numbers?

Let’s take a look at how to create a vector filled with random numbers

WaterTemperature <- rnorm(150, mean = 25, sd = 10)

The WaterTemperature” vector will have a lenght of 150 with values that have a mean of 25 and standard deviation of 10. Use this example code to create and fill up vectors to plan out the water quality and biodiversity data collection.

Review: How do you create an empty vector?

Let’s say you want to create an vector that is empty (no values), you can use the following code example. Notice how I the lenght of the vector isn’t directly identified, ie. “length = 150”, but is “length = length(Location) ”, which makes sure that the lenght of this vector is as long as another vector that you are using.

WaterTemperature1 <- vector(mode = 'numeric', length = length(Location))

We need to take each separate vector and combine them into a dataframe. To do that, we will use the data.frame() function. Here is a quick example of how to create a dataframe of two vectors.

a <- c(1,2,3,4)
b <- c("Yes", "Yes", "No", "No")
DataFrame <- data.frame(a,b)
## [1] 1 2 3 4
## [1] "Yes" "Yes" "No"  "No"
##   a   b
## 1 1 Yes
## 2 2 Yes
## 3 3  No
## 4 4  No

To export the file, we use the write.csv() function.

DataFrame <- data.frame(a,b)
write.csv(DataFrame, "DataFrameExample.csv")

Leave a comment

“Using subset() and the plyr package in R to summarize the native bee datasets: Part 2”

“Using subset() and the plyr package in R to summarize the native bee datasets”

Our dataset contains both collection methods, aerial netting and bee bowls (pan traps), but for one analysis we only want to examine the bees collected in bee bowls among sites.

Example of a bee bowl

Example of a bee bowl used in the data collection.

Now, we could manually cut and paste all the aerial net data from our dataset, but that is laborious, annoying, and is prone to creating errors #ExcelStinks, especially if we were dealing with very large datasets. Instead, let’s use R to create a dataset that only has the native bees collected by bee bowls. We will use the subset() function to create a dataset that only has native bees that were collected by bee bowls.

In the last post, I went over how to use the PLYR package in R to summarize entire bee dataset into manageable chunks.

How can we create a new dataset that just has the native bees collected in bee bowls?
  • Use the subset() function in R.
  • What are the names of the different levels in the CollectionMethod factor?
    Use the levels() function, which tells us that the two levels are “PanTrap” and “AerialNet”.
levels(Bees.df$CollectionMethod) #What are the factor names used to describe the method of collecting bees
## [1] "AerialNet" "PanTrap"
Next, use the subset() function to create a new data frame that contains records that only contain the term “PanTrap” in the CollectionMethod Column
BeeBowl.df <- subset(Bees.df, Bees.df$CollectionMethod == "PanTrap")

Take a second to appreciate how much time that saves you, that one line of code just create a new data frame (dataset) with exactly what you wanted, no cutting and pasting, or any other error prone method.

Before moving on and summarizing the data, we need to check the new data frame to make sure that it only contains what we want it to contain.

## 'data.frame':    76 obs. of  14 variables:
##  $ SpeciesID       : int  2014037 2014043 2014045 2014046 2014047 2014033 2014042 2014044 2014035 2014041 ...
##  $ Replicate       : Factor w/ 7 levels "1","2","3","4",..: 5 5 2 2 5 6 1 2 6 5 ...
##  $ Collector       : Factor w/ 13 levels " Haskell, D. ",..: 11 11 11 11 11 11 11 11 11 11 ...
##  $ State           : Factor w/ 1 level "Massachusetts": 1 1 1 1 1 1 1 1 1 1 ...
##  $ County          : Factor w/ 2 levels "Bristol","Plymouth": 2 2 2 2 2 2 2 2 2 2 ...
##  $ City            : Factor w/ 3 levels "Brockton","E. Bridgewater",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Location        : Factor w/ 6 levels "BeaverBrook",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Latitude        : num  42.1 42.1 42.1 42.1 42.1 ...
##  $ Longitude       : num  71 71 71 71 71 ...
##  $ Date            : Factor w/ 5 levels "7/17/14","7/18/14",..: 5 5 5 5 5 4 5 5 4 5 ...
##  $ CollectionMethod: Factor w/ 2 levels "AerialNet","PanTrap": 2 2 2 2 2 2 2 2 2 2 ...
##  $ Bowl_Color      : Factor w/ 5 levels "Blue","None",..: 4 1 4 1 1 5 4 1 1 5 ...
##  $ Genus           : Factor w/ 14 levels "Agapostemon",..: 1 1 1 1 1 5 5 5 6 7 ...
##  $ Species         : Factor w/ 11 levels "","Andreniformis",..: 9 9 9 1 9 3 3 3 1 2 ...

76 observations, yes that checks out because that’s how many bee specimens were collected in bee bowls. Unless I am mistaken, everything else checks out too.

Using the head() function, Let’s take a look at the first 6 rows of dataset
##   SpeciesID Replicate                        Collector         State
## 1   2014037         5 Schoener, D. & Massasoit Interns Massachusetts
## 2   2014043         5 Schoener, D. & Massasoit Interns Massachusetts
## 3   2014045         2 Schoener, D. & Massasoit Interns Massachusetts
## 4   2014046         2 Schoener, D. & Massasoit Interns Massachusetts
## 5   2014047         5 Schoener, D. & Massasoit Interns Massachusetts
## 6   2014033         6 Schoener, D. & Massasoit Interns Massachusetts
##     County     City    Location Latitude Longitude    Date
## 1 Plymouth Brockton BeaverBrook    42.08     70.99  7/8/14
## 2 Plymouth Brockton BeaverBrook    42.08     70.99  7/8/14
## 3 Plymouth Brockton BeaverBrook    42.08     70.99  7/8/14
## 4 Plymouth Brockton BeaverBrook    42.08     70.99  7/8/14
## 5 Plymouth Brockton BeaverBrook    42.08     70.99  7/8/14
## 6 Plymouth Brockton BeaverBrook    42.08     70.99 7/23/14
##   CollectionMethod Bowl_Color          Genus   Species
## 1          PanTrap      White    Agapostemon Virescens
## 2          PanTrap       Blue    Agapostemon Virescens
## 3          PanTrap      White    Agapostemon Virescens
## 4          PanTrap       Blue    Agapostemon          
## 5          PanTrap       Blue    Agapostemon Virescens
## 6          PanTrap     Yellow Augochlorella     aurata

The only records are bees collected in bee bowls, so we should be good to go. Now, let’s use the plyr package to summarize the data.

BeeBowl.sum <- ddply(BeeBowl.df, .(Location, Bowl_Color, Replicate, Genus), summarise, # summarize total abundance of bees for each genera
                  TotalBees = length(Genus)) #By using the length function, this will count up each time a genus is found in each location, collection method, bowl color, and replicate

Let’s review how we used the ddply() function to summarise the data. We used the subsetted data frame (BeeBowl.df) to create a new dataframe with the following columns: Location, Bowl_Color, Replicate, Genus, and Total Bees from Each Genus.

##      Location Bowl_Color Replicate          Genus TotalBees
## 1 BeaverBrook       Blue         2    Agapostemon         1
## 2 BeaverBrook       Blue         2 Augochlorella          1
## 3 BeaverBrook       Blue         5    Agapostemon         2
## 4 BeaverBrook       Blue         6         Bombus         1
## 5 BeaverBrook      White         1 Augochlorella          1
## 6 BeaverBrook      White         2    Agapostemon         1

Since the summarized dataset is what we want, remember we use the write.csv() function to export the data back into a comma separated file (.csv) that can be opened in excel, text editor, or spreadsheet software like google spreadsheets.

write.csv(BeeBowl.sum, "BeeBowlSummer2014.csv") #export the summarized bee file as a comma separated value (.csv) file that can be opened in excel or any text editor.