I am trying to run the code below. It is a population model for given life history traits in Elk. It starts with 100 elk who then have calves that are listed on the same row. At the end of each yearly cycle those calves that survive are given their own row in the data frame as yearlings. Yearlings are converted to adults the following year. Those adults the don't make it are deleted.
The code is a bit ugly so I apologize. I am still trying to rough things out. I'll pretty-fy it once it is running.
So when I run the code about half of the time it gives me the following error:
Error in `$<-.data.frame`(`*tmp*`, "Age", value = NA) :
replacement has 1 row, data has 0
I have a feeling this occurs when no calves make it through winter so there is nothing to be added to the data frame. But I am not sure and if it is I do not know how to fix it.
Thanks for your help...
Marc
library("dplyr")
num.years=30; #number of cycles (years) the model with run
start.cows=100; #set initial population of female elk
pop.list=list() #create an empty list to store the end results for each year
annual.pop=as.vector(start.cows)
growth.dat=setNames(data.frame(matrix(data = NA, nrow = num.years, ncol = 10)), c("Total_Population","Total_Females","Total_Males","Total_Calves","Total_Mortality","Female_Mortality","Male_Mortality","Calf_Mortality","Lambda","Winter_Length"))
lambda=as.vector(0)
winterlength=rbeta(num.years,2,2.5)*122
#create Matrix with header labels
pop.mat=setNames(data.frame(matrix(data = NA, nrow = start.cows, ncol = 19)), c("Age","Sex", "Spring_Condition","Calf","DoB", "Birth_Mass","Survive_to_Winter", "Gest_Energy", "Lact_Energy","Calf_Growth_Rate","Condition_Change","Winter_Condition","Winter_Survival","Eary_Winter_Calf_Mass","Calf_Winter_Survival","w","x","y","z"))
pop.mat$Age = "A"; # set all initial animals as adult
pop.mat$Sex = "F"; # set all initial animals as female
for(j in 1:num.years) { #loop population through chosen number of years
num.elk=nrow(pop.mat); #recounts number of elk (rows)
pop.mat$Elk
WL=winterlength[j]
#set inital sping body condition
pop.mat$Spring_Condition=rweibull(num.elk,3.871341,6.146970) #selects random body condition from disribution above #rnorm(1000,5.253205,1.910929)
# pregnancy and sex of calves
pop.mat$w=runif(num.elk,0,1)
pop.mat$Calf=ifelse(pop.mat$Age=="A" & pop.mat$w <= 0.425 & pop.mat$Sex=="F", "F",
ifelse(pop.mat$Age=="A" & pop.mat$w >0.425 & pop.mat$w <=0.85 & pop.mat$Sex=="F","M",
ifelse(pop.mat$Age=="Y" & pop.mat$w <= 0.05 & pop.mat$Sex=="F","F",
ifelse(pop.mat$Age=="Y" & pop.mat$w >0.05 & pop.mat$w<=0.1 & pop.mat$Sex=="F", "M","N"))))
#DOB and Birth Mass
DoBstoch=rnorm(num.elk,0,9.236958)
BMstoch=rnorm(num.elk,0, 2.577775)
pop.mat$DoB=ifelse(pop.mat$Calf=="N", NA,(pop.mat$Spring_Condition*-2.485+163.11+DoBstoch))
pop.mat$Birth_Mass=ifelse(pop.mat$Calf=="N",0, pop.mat$DoB*0.128-2.145+BMstoch)
#Calf Survival to early winter
pop.mat$x=runif(num.elk,0,1)
pop.mat$Survive_to_Winter=ifelse((pop.mat$Calf=="F" & pop.mat$x <= (-0.0101*pop.mat$Birth_Mass^2 + 0.4127*pop.mat$Birth_Mass-3.2477))|(pop.mat$Calf=="M" & pop.mat$x <= (-0.0016*pop.mat$Birth_Mass^3 + 0.0823*pop.mat$Birth_Mass^2-1.2594*pop.mat$Birth_Mass + 6.048)),TRUE,FALSE)
# Additional energy devoted to gestation
pop.mat$Gest_Energy=ifelse(pop.mat$Birth_Mass > 0,((pop.mat$Birth_Mass-12.0354)*12937),0)
# Energy invested in lactation
pop.mat$Lact_Energy=ifelse(pop.mat$Birth_Mass > 0,((pop.mat$Gest_Energy*-5.552)+3000000),0)
#Calf growth rate
CGStoch=rnorm(num.elk,0, 0.03592153)
pop.mat$Calf_Growth_Rate=ifelse(pop.mat$Birth_Mass > 0, pop.mat$Lact_Energy*(10^-7)+0.117+CGStoch,0)
#Change in dam over summer
pop.mat$Condition_Change=ifelse(pop.mat$Birth_Mass > 0, (pop.mat$Spring_Condition*-0.7)-(pop.mat$Calf_Growth_Rate*6.297)+8.423, (pop.mat$Spring_Condition*-0.7)+8.423)
#Early Winter Conditon
pop.mat$Winter_Condition=mapply(sum,pop.mat$Spring_Condition,pop.mat$Condition_Change)
#Adult male harvest
pop.mat$y=runif(num.elk,0,1)
pop.mat$Winter_Survival=ifelse(pop.mat$Age=="A" & pop.mat$y >= 0.56 & pop.mat$Sex=="M",FALSE,TRUE)
#Adult survival through winter
pop.mat$z=runif(num.elk,0,1)
pop.mat$Winter_Survival=ifelse(pop.mat$z<=(exp(-4.717+0.955*pop.mat$Winter_Condition))/(1+exp(-4.717+0.955*pop.mat$Winter_Condition)) & pop.mat$Winter_Survival!=FALSE,TRUE,FALSE)
#Early Winter Calf Mass
WMStoch=rnorm(num.elk,3.019996, 4.869422)
pop.mat$Eary_Winter_Calf_Mass=ifelse(pop.mat$Birth_Mass > 0,pop.mat$Calf_Growth_Rate*193.13+25.398+WMStoch,0)
#Calf survival through winter
pop.mat$Calf_Winter_Survival=ifelse((-0.0120088*(pop.mat$Eary_Winter_Calf_Mass^2)+3.1656*pop.mat$Eary_Winter_Calf_Mass-109.9) >WL,TRUE,FALSE)
# Save old data frame in list
old.dat=pop.mat
#assign(paste("Old.pop", j, sep = ""), pop.mat)
old.pop=nrow(pop.mat)
pop.list[[j]]<-pop.mat
# Create a dataframe for calves that survie winter to become yearlings
calf.mat = subset(pop.mat[,4], pop.mat[,15] == TRUE)
no.babies=length(calf.mat)
calf.temp=setNames(data.frame(matrix(data = NA, nrow = no.babies, ncol = 19)),c("Age","Sex", "Spring_Condition","Calf","DoB", "Birth_Mass","Survive_to_Winter", "Gest_Energy", "Lact_Energy","Calf_Growth_Rate","Condition_Change","Winter_Condition","Winter_Survival","Eary_Winter_Calf_Mass","Calf_Winter_Survival","w","x","y","z"))
calf.temp$Age=ifelse(no.babies>0,"Y",calf.temp$Age)
calf.temp$Sex=ifelse(no.babies>0,calf.mat,calf.temp$Sex)
# Delete rows W/ dead yearlings and adults from main data frame
pop.mat <- filter(pop.mat, pop.mat$Winter_Survival == TRUE)
# Set all yearlings as adults
pop.mat$Age=ifelse(pop.mat$Age=="Y","A","A")
# Merge adult and calf data frames
pop.mat=rbind(pop.mat,calf.temp)
# Create a vetor for the population at the end of year
new.pop=nrow(pop.mat)
annual.pop=c(annual.pop,nrow(pop.mat))
# create a vector for the lambda at the end of each year
L=new.pop/old.pop
lambda=c(lambda,L)
#create dataframe for population demographics if through years
growth.dat[j,1]=new.pop
growth.dat[j,2]=nrow(subset(pop.mat, old.dat[,2]=="F"))
growth.dat[j,3]=nrow(subset(pop.mat, old.dat[,2]=="M"))
growth.dat[j,4]=no.babies
growth.dat[j,5]=nrow(subset(pop.mat, old.dat[,13]==FALSE))
growth.dat[j,6]=nrow(subset(pop.mat, old.dat[,13]==FALSE & old.dat[,2]=="F"))
growth.dat[j,7]=nrow(subset(pop.mat, old.dat[,13]==FALSE & old.dat[,2]=="M"))
growth.dat[j,8]=nrow(subset(pop.mat, old.dat[,15]==FALSE))
growth.dat[j,9]=L
growth.dat[j,10]=winterlength[j]
# Create a first line
x=1:num.years
plot(x, growth.dat[,1], type = "b", frame = FALSE, pch = 19,
col = "black", xlab = "Year", ylab = "Population")
# Add a second line
lines(x, growth.dat[,2], pch = 18, col = "blue", type = "b", lty = 2)
lines(x, growth.dat[,3], pch = 17, col = "green", type = "b", lty = 2)
lines(x, growth.dat[,4], pch = 16, col = "red", type = "b", lty = 2)
# Add a legend to the plot
legend("topleft", legend=c("Total", "Females","Males","Calves"),
col=c("black", "blue","green","red"), lty = 1:2, cex=0.8)
}
growth.dat