Evolutionary Biology Online Journal Club


13 Comments

“World’s First Online Journal Club”

Today Morgan Jackson alerted us to a recent piece in the journal Nature entitled “Online journal club” (Nature 496, 261 – 11 April 2013 – doi:10.1038/nj7444-261c). The main thrust of this short “Career Brief” article is that another group called Fertility and Sterility has recently stated up an online journal club using a platform called Journal Club Live™ (http://journalclublive.com/). This website has created the “world’s first online Cyber-Journal Club™ platform”, which basically does the same thing as we have been doing with G+ Hangouts™ and YouTube™. Devin Drown rightly pointed out that this short blurb in Nature reads like an advertisement for  Journal Club Live™.

I think for most of us the headline in Nature was both exiting and disheartening. We are all happy to see the idea of an online journal club approach gaining more general interest, but it is disappointing to see the high-profile exposure gained by another group for doing essentially the same thing that we have been doing since September 2012 (https://evobiojournalclub.wordpress.com/2012/09/).

However, since September we have grown and matured as a group. We have overcome issues relating to technology, topic selection, discussion format and more. I think we all see the inherent value of an online journal club, and I also see us as people who are uniquely positioned to write a piece on the topic. A few of us have decided that it is worth trying to publish a short paper that explicitly spells out the value of online journals clubs, and the practical steps to implementing one.

If you have any suggestions or comments that you think might be relevant for this paper please feel free to add them in the comment section below. Specifically, what do you think should be in this paper? What are the main strengths & weaknesses of online journal clubs? What are the main technological challenges that need to be overcome?

Advertisements


5 Comments

What is a “Novelty”?

Yesterday we discussed a paper by Hall & Kerney on “Levels of Biological Organization and the Origin of Novelty“. Although I initially didn’t really enjoy the paper, it ended up being quite interesting and it sparked some great discussion (see a video of our chat here).

Many people have shown an interest in continuing our discussion of “novelty”, so perhaps we can use this post to bounce ideas and share other papers on this topic. Some of the key themes/questions we were left wondering about were:

  1. What is a “novel” trait, and how can/should you define it?
  2. Is the classification of a trait as “novel” dependent on scale?
    1. If so, what kinds of scale (e.g., temporal, developmental)?
    2. How do you define scale in a useful way for studying macroevolution?
  3. Can a novel trait really only arise from horizontal gene transfer?
  4. Is there a disconnect between the fields of evo-devo and macroevolution in terms of defining “novelty”?

 

EBJClubber or not, anyone and everyone should feel free to join in this discussion. Leave your comments below!


Leave a comment

Forister et al 2011 Proc B – Paper summary

We talked about adding more content to the blog so I thought I’d start by adding my summary of the paper we read today (Oct 16th 2012). If you have comments or questions please feel free to add them below in the comment thread.

Forister, M.L., Gompert, Z., Nice, C.C., Forister, G.W. and Fordyce, J.A. (2011) Ant association facilitates the evolution of diet breadth in a lycaenid butterfly. Proc Roy Soc B 278: 1539-1547

  • Note that the R code for the simulations can be found in an earlier post HERE

Context:

  • Lycaenidae are a large family of butterflies, more than half of them engage in ant interactions that are mutualistic, commensalistic, or parasitic
  • From an ecological perspective, these interactions are of interest in the context of enemy-free space, b/c ant-association provides caterpillars with protection
  • Evolutionary implications less studied, but it has been predicted that these mutualistic interactions with ants could affect  host-range evolution
  • Generally observed that lycaenid butterflies that have mutualistic relationships with ants have broader host-range
  • Two complimentary mechanisms have been proposed to explain this:
  1. Presence of ants influences adult oviposition decisions such that adults are more likely to lay eggs on plants with ants that are likely to tend/protect their offspring
  2. The presence of ants creates sufficient reduction in predator pressure to facilitate survival on novel hosts.

Question:

  • Can ant protection facilitate larval survival on a novel host such that it facilitates the evolution of diet breadth in Lycaenidae butterfly caterpillars?

System:

Approach:

  • Field study – Goal: Describe and compare abundance and richness of natural enemies, abundance of ants, and abundance of ant-tended Hemiptera
  • Field experiments(2)
    • Goal Exp. 1: Compare caterpillar survival on native and novel host plants with and without ant-interaction permitted
    • Goal Exp. 2: Compare caterpillar survival only on novel host, with and without ant-interaction permitted
  • Simulation modellingusing a stage-structured demographic model.
    • Goal: Explore the role of ant protection in persistence of Lycaeides melissa populations

Main results:

  • Field study:
    • Natural enemies more abundant on native host
    • Enemy richness greater on native host
    • Dominant predators included Geocorus bugs and crab spiders
    • Number of ant individuals higher on novel host
    • Number of Hemiptera higher on novel host
  • Experiment 1:
    • 199/338 caterpillars survived (58.9%)
    • Significant effect of plant species (higher on native host)
    • No effect of ant exclusion
      • But did see an increase in variance of survival for ant-permitted novel host treatment
  • Experiment 2:
    • Presence of ants increased survival significantly
    • Mean survival roughly equivalent to results from Exp. 1 on novel host
    • Protection likely indirect for the early instar caterpillars used in the exp.
  • Simulation:
    • When the proportion of novel host was very high (~1), butterfly population only persists when ant tending also high (i.e., results in a population that is dependent on the presence of ants)
      • This is a consequence of low survival on caterpillars on novel host when ants are lacking
    • Lower prop. of novel host (<0.6) causes persistence of ants to be insensitive to presence of ants
    • When minimum fraction of plants flowering is lowered, there is a greater chance of population extinction (technically, a greater parameter space where populations go extinct)
    • A result of the fact that without flowers the novel host is poor
    • When both hosts lack flower the native host is preferred, but when both hosts flower adults have no preference b/w native and novel host
      • Consequently, when more plants are flowering prop. more eggs are distributed to lower-quality novel host.

Implications:

  • Mutualistic ant association can facilitate use of a novel host by reducing predation – not just by ant-associated oviposition.
  • Quality of novel host is so poor that without buffering against predation populations would not be able to persist solely on novel host
  • Complimentary to previous work on enemy-free space affecting diet breadth
    • Diet breadth may be affected by novel host which provide an escape from predators associated with novel host.


3 Comments

Dr. Matthew Forister provides R code for today’s paper!

I e-mailed Dr. Matthew Forister about getting a copy of the R code he used for his paper that we are discussing today entitled: “Ant association facilitates the evolution of diet breadth in a lycaenid butterfly“. About 1 hour later I got the following response:

Hi Thomas,

Sure, I’m happy to provide the code! See attached. It’s been a while since I looked at this, but I just verified that it does work, and I added a bit of annotation at the top that should help. Please let me know if you or your group has any questions.

thanks for your interest,
Matt

I specifically asked if I could post the code on our blog so our members could run the code and test the simulations. I have posted the code below. You can find out more about Dr. Forister’s research on his faculty webpage, or his lab webpage.

####### Code for running simulations in Forister et al. 2011, "Ant association facilitates..."
## Below there are two functions: runAntsPlants and plotAntsPlants
## After these functions have been loaded, you can run the simulation with defaults thus:
## result <- runAntsPlants()
## Of course parameters can be changed by adding specifications in those parentheses.
## And then time-plots of the results can be generated with:
## plotAntsPlants(result)
##
## Note that there is one external package that needs to be loaded (Hmisc) which provides
## an error bar function for the graphing.

library(Hmisc)
runAntsPlants<-function(nRep=1000,nGen=100,elSurvMin=0.15,elSurvMax=0.65,lpSurvMin=0.1,lpSurvMax=0.55,
paSurvMin=0.35,paSurvMax=0.8,aeMin=10,aeMax=180,AFmin=1,AFmax=1,MFmin=1,MFmax=1,
Tend=1,freqMed=0.5,eggK=50000,startPropK=0.75,astragFlowerFactor=1.95,medQualFactor=0.053,
antFactor=2.32,flowerFactor=7.53,medFecFactorWF=0.67,medFecFactorNF=0.17){
cat(“ants and plants model running \n”)
## set up data objects
eggsMed<-array(dim=c(nRep,nGen))
eggsAst<-array(dim=c(nRep,nGen))
larvaMed<-array(dim=c(nRep,nGen))
larvaAst<-array(dim=c(nRep,nGen))
pupaMed<-array(dim=c(nRep,nGen))
pupaAst<-array(dim=c(nRep,nGen))
adultMed<-array(dim=c(nRep,nGen))
adultAst<-array(dim=c(nRep,nGen))

## row1=median, row2=ub, row3=lb
summaryEM<-array(dim=c(3,nGen))
summaryEA<-array(dim=c(3,nGen))
summaryLM<-array(dim=c(3,nGen))
summaryLA<-array(dim=c(3,nGen))
summaryPM<-array(dim=c(3,nGen))
summaryPA<-array(dim=c(3,nGen))
summaryAM<-array(dim=c(3,nGen))
summaryAA<-array(dim=c(3,nGen))

## vectors for lambda
curLambda<-numeric(nGen-1)
lambda<-numeric(nRep)

## begin simulation and cycle through reps and generations
for (i in 1:nRep){
cat(“rep”,i,”\n”)

## draw AF and MF for initialization
MF<-MFmin + rbeta(1,2,3) * (MFmax – MFmin)
AF<-AFmin + rbeta(1,2,3) * (AFmax – AFmin)

## figure out proportion of eggs on Medicago
regOut<-lm(c(1/astragFlowerFactor,1) ~ c(0,1))
prefMed<-regOut$coefficients[2] * AF + regOut$coefficients[1]
propMed<-freqMed * prefMed

## startPropK gives the ratio of the initial egg population to carrying capacity for eggs
eggsMed[i,1]<-eggK * startPropK * propMed
eggsAst[i,1]<-eggK * startPropK *(1 – propMed)

## begin looping through generations
for (j in 1:nGen){

## draw AF and MF for current generation
MF<-MFmin + rbeta(1,2,3) * (MFmax – MFmin)
AF<-AFmin + rbeta(1,2,3) * (AFmax – AFmin)

## figure out proportion of eggs that will be laid this gen on each host plant
prefMed<-regOut$coefficients[2] * AF + regOut$coefficients[1]
propMed<-freqMed * prefMed

## figure out relatvie larval survival on medicago (based on ants and flower, once per gen)
medSurvival<-medQualFactor * (antFactor * Tend + 1 – Tend) * (flowerFactor * MF + 1 – MF)

## if there is at least one egg go ahead
if (eggsMed[i,j]>=1 | eggsAst[i,j]>=1){

## survival of eggs to newly hatched larvae, host, flowers and ants don’t matter here
if (eggsMed[i,j]>=1) larvaMed[i,j]<-eggsMed[i,j] * (elSurvMin + rbeta(1,2,3) * (elSurvMax – elSurvMin))
else larvaMed[i,j:nGen]<-rep(0,nGen-j+1)
if (eggsAst[i,j]>=1) larvaAst[i,j]<-eggsAst[i,j] * (elSurvMin + rbeta(1,2,3) * (elSurvMax – elSurvMin))
else larvaAst[i,j:nGen]<-rep(0,nGen-j+1)

## survival of newly hatched larvae to pupation, depends on host, and if med, ants and flowers
if (larvaMed[i,j]>=1) pupaMed[i,j]<-medSurvival *
(larvaMed[i,j] * (lpSurvMin + rbeta(1,2,3) * (lpSurvMax – lpSurvMin)))
else pupaMed[i,j:nGen]<-rep(0,nGen-j+1)
if (larvaAst[i,j]>=1) pupaAst[i,j]<-larvaAst[i,j] * (lpSurvMin + rbeta(1,2,3) * (lpSurvMax – lpSurvMin))
else pupaAst[i,j:nGen]<-rep(0,nGen-j+1)

## survival of pupae to adults, host, flowers and andts don’t matter
if (pupaMed[i,j]>=1) adultMed[i,j]<-pupaMed[i,j] * (paSurvMin + rbeta(1,2,3) * (paSurvMax – paSurvMin))
else adultMed[i,j:nGen]<-rep(0,nGen-j+1)
if (pupaAst[i,j]>=1) adultAst[i,j]<-pupaAst[i,j] * (paSurvMin + rbeta(1,2,3) * (paSurvMax – paSurvMin))
else adultAst[i,j:nGen]<-rep(0,nGen-j+1)

## reproduction, requires at least two adults, and doesn’t occur in the last generation
if ((adultMed[i,j] + adultAst[i,j]) >= 2){
if (j < nGen){
astragEggs<-aeMin + rbeta(((adultAst[i,j])/2),2,3) * (aeMax – aeMin)
medWFeggs<-aeMin + rbeta(((adultMed[i,j])/2 * MF),2,3) * ((aeMax * medFecFactorWF) – aeMin)
medNFeggs<-aeMin + rbeta(((adultMed[i,j])/2 * (1 – MF)),2,3) * ((aeMax * medFecFactorNF) – aeMin)
totalEggs<-sum(c(astragEggs,medWFeggs,medNFeggs))
if (totalEggs > eggK) totalEggs<-eggK
eggsMed[i,j+1]<-totalEggs * propMed
eggsAst[i,j+1]<-totalEggs * (1 – propMed)
}
}
else {
eggsMed[i,j:nGen]<-rep(0,nGen-j+1)
eggsAst[i,j:nGen]<-rep(0,nGen-j+1)
larvaMed[i,j:nGen]<-rep(0,nGen-j+1)
larvaAst[i,j:nGen]<-rep(0,nGen-j+1)
pupaMed[i,j:nGen]<-rep(0,nGen-j+1)
pupaAst[i,j:nGen]<-rep(0,nGen-j+1)
adultMed[i,j:nGen]<-rep(0,nGen-j+1)
adultAst[i,j:nGen]<-rep(0,nGen-j+1)
}
}
else {
eggsMed[i,j:nGen]<-rep(0,nGen-j+1)
eggsAst[i,j:nGen]<-rep(0,nGen-j+1)
larvaMed[i,j:nGen]<-rep(0,nGen-j+1)
larvaAst[i,j:nGen]<-rep(0,nGen-j+1)
pupaMed[i,j:nGen]<-rep(0,nGen-j+1)
pupaAst[i,j:nGen]<-rep(0,nGen-j+1)
adultMed[i,j:nGen]<-rep(0,nGen-j+1)
adultAst[i,j:nGen]<-rep(0,nGen-j+1)
}
if (j != 1){
if ((adultMed[i,j-1] + adultAst[i,j-1]) > 0) curLambda[j-1]<-(adultMed[i,j] + adultAst[i,j])/(adultMed[i,j-1] + adultAst[i,j-1])
else curLambda[i]<-NA
}
## end of generation loop
}
lambda[i]<-exp(mean(log(curLambda),na.rm=TRUE))
## end of rep loop
}
## calculate median and quantiles for each generation, I can make this mean and sd if prefered
lb<-0.25
ub<-0.75
for (j in 1:nGen){
summaryEM[,j]<-quantile(eggsMed[,j],prob=c(lb,0.5,ub),na.rm=TRUE)
summaryEA[,j]<-quantile(eggsAst[,j],prob=c(lb,0.5,ub),na.rm=TRUE)
summaryLM[,j]<-quantile(larvaMed[,j],prob=c(lb,0.5,ub),na.rm=TRUE)
summaryLA[,j]<-quantile(larvaAst[,j],prob=c(lb,0.5,ub),na.rm=TRUE)
summaryPM[,j]<-quantile(pupaMed[,j],prob=c(lb,0.5,ub),na.rm=TRUE)
summaryPA[,j]<-quantile(pupaAst[,j],prob=c(lb,0.5,ub),na.rm=TRUE)
summaryAM[,j]<-quantile(adultMed[,j],prob=c(lb,0.5,ub),na.rm=TRUE)
summaryAA[,j]<-quantile(adultAst[,j],prob=c(lb,0.5,ub),na.rm=TRUE)
}
## determine proportion of replicates ending in extinction
propExtinct<-sum((adultMed[,nGen] + adultAst[,nGen]) == 0)/nRep
cat(“Proportion of replicates extinct: “,propExtinct,”\n”)
cat(“lamda: median=”, quantile(lambda,probs=0.5),” lb=”, quantile(lambda,probs=0.025),” ub=”,quantile(lambda,probs=0.975),”\n”)
## make list to be returned
resultsSummary<-list(summaryEM,summaryEA,summaryLM,summaryLA,summaryPM,summaryPA,summaryAM,summaryAA)
names(resultsSummary)<-c(“eggsMed”,”eggsAst”,”larvaMed”,”larvaAst”,”pupaMed”,”pupaAst”,”adultMed”,
“adultAst”)
out<-list(resultsSummary,eggsMed,eggsAst,larvaMed,larvaAst,pupaMed,pupaAst,adultMed,adultAst,
propExtinct,lambda)
names(out)<-c(“summary”,”eggsMed”,”eggsAst”,”larvaMed”,”larvaAst”,”pupaMed”,”pupaAst”,”adultMed”,
“adultAst”,”propExtinct”,”lambda”)
return(out)
## end of function
}
## Hmisc needed for errorbar plots, library location should be adjusted
library(Hmisc,lib.loc=”~/Library/R/2.8/library”)
## this plots the summary data, which is probably the most useful for now
plotAntsPlants<-function(results=NULL,pdf=FALSE,myFile=”./antsPlants.pdf”,myfile2=”./antsPlantsLam.pdf”){
## make errbar plots
if (pdf == TRUE) pdf(file=myFile,width=16,height=11)
else quartz()
par(mfrow=c(2,4))
par(pty=”s”)
errbar(1:dim(results$eggsMed)[2],results$summary$eggsMed[2,],results$summary$eggsMed[3,],results$summary$eggsMed[1,],
xlab=”Generation number”,ylab=”No. eggs on Medicago”)
axis(1)
axis(2)
box()
errbar(1:dim(results$eggsMed)[2],results$summary$eggsAst[2,],results$summary$eggsAst[3,],results$summary$eggsAst[1,],
xlab=”Generation number”,ylab=”No. eggs on Astragalus”)
axis(1)
axis(2)
box()
errbar(1:dim(results$eggsMed)[2],results$summary$larvaMed[2,],results$summary$larvaMed[3,],results$summary$larvaMed[1,],
xlab=”Generation number”,ylab=”No. larva on Medicago”)
axis(1)
axis(2)
box()
errbar(1:dim(results$eggsMed)[2],results$summary$larvaAst[2,],results$summary$larvaAst[3,],results$summary$larvaAst[1,],
xlab=”Generation number”,ylab=”No. larva on Astragalus”)
axis(1)
axis(2)
box()
errbar(1:dim(results$eggsMed)[2],results$summary$pupaMed[2,],results$summary$pupaMed[3,],results$summary$pupaMed[1,],
xlab=”Generation number”,ylab=”No. pupa on Medicago”)
axis(1)
axis(2)
box()
errbar(1:dim(results$eggsMed)[2],results$summary$pupaAst[2,],results$summary$pupaAst[3,],results$summary$pupaAst[1,],
xlab=”Generation number”,ylab=”No. pupa on Astragalus”)
axis(1)
axis(2)
box()
errbar(1:dim(results$eggsMed)[2],results$summary$adultMed[2,],results$summary$adultMed[3,],results$summary$adultMed[1,],
xlab=”Generation number”,ylab=”No. adults from Medicago”)
axis(1)
axis(2)
box()
errbar(1:dim(results$eggsMed)[2],results$summary$adultAst[2,],results$summary$adultAst[3,],results$summary$adultAst[1,],
xlab=”Generation number”,ylab=”No. adults from Astragalus”)
axis(1)
axis(2)
box()
#if (pdf == TRUE) dev.off()
## lambda plot
#if (pdf == TRUE) pdf(file=myFile2,width=16,height=11)
#else quartz()
#boxplot(results$lambda,ylab=”lambda”)
#if(pdf == TRUE) dev.off()


20 Comments

Thoughts for improving our meetings

Now that we have had our first meeting I thought it would be good to start a post about what we thought worked well and what could be improved. Here are my thoughts:

Google + Hangouts:

If you are new to Google Hangouts here is a short intro video.

If you are having trouble joining the Hangout read this.

Hangout Pros:

  • Video chat worked well
  • Recorded session creates a great record of our discussion
  • “Lower Third” app is a great way to add your name and institution to your video window

Hangout Cons:

  • Limited to 10 people
  • There seemed to be some issues with the queuing system
  • Sound quality affected for whole discussion if headphones are not used or microphone is too loud

How can we improve?

1. Headsets:

For those who do not own a headset, look into getting one. Try to find one that has noise-cancelling microphone. There are good headset options that are inexpensive. I picked up a Microsoft LifeChat LX-3000 headset for $15 at Walmart on Monday and I found that it worked quite well. Lots of other options are available including wireless headsets.

2. Lower Third:

Install the Google Hangout “Lower Third” app. This lets people know who you are and where you are from. Also, this provides a great professional-looking nameplate on the video when that can be seen when the recorded chat is posted online.

3. Invite the paper’s Authors!

Let’s consider inviting one or more of the authors of the paper we plan to discuss. Corresponding authors invariably provide a contact e-mail on the first page of their article, and most have their own webpage anyway. I think there is a lot of value-added here. With an author present we can ask for clarification on points that we don’t fully understand, and we can get broader insights about the paper’s significance from an expert in the field! I think we could all benefit from some clarity about the topic and the analyses used. There is also great networking opportunities to be had here, not to mention the added promo for our group! If they don’t have Google + then we could always invite them to our Hangout via telephone.

4. Google Chat:

Don’t forget to open the chat window on the left during the Hangout! People might be making some interesting points about the paper in the chat window, don’t miss out!

What did you think? How did it go? How else might we improve our discussions?