diff --git a/.Rproj.user/8641BD5D/sdb/s-C3ACBEE/449C785F b/.Rproj.user/8641BD5D/sdb/s-C3ACBEE/449C785F index 4dc3ec1..a99d7e9 100644 --- a/.Rproj.user/8641BD5D/sdb/s-C3ACBEE/449C785F +++ b/.Rproj.user/8641BD5D/sdb/s-C3ACBEE/449C785F @@ -1,14 +1,14 @@ { "collab_server" : "", - "contents" : "---\ntitle: \"Foraging Model\"\nauthor: \"Ben Weinstein\"\ndate: \"May 30, 2017\"\noutput: \n html_document:\n toc: true\n number_sections: true\n theme: united\n---\n\n#Abstract\n\nForaging behavior shapes animal health through the balance of the resources expended to obtain nutrients and the energetic rewards of captured resources. The health of individuals will influence reproductive success, fitness and ultimately population viability. Despite the key role of individual health in evolutionary ecology, it can be challenging to connect foraging behavior and energetics in free living marine organisms. Combining data on foraging strategies, feeding behavior and physiology, we estimate body mass for humpback whales as they forage near the Antarctic Peninsula. Humpback whales require extreme energetic storage to facilitate the yearly migration between austral foraging areas to equatorial breeding grounds. Based on tagged individuals, we model the foraging effort, duration and energetics of animals throughout the austral season. We then connect these measurements to studies of whale feeding physiology and biomechanics. While predictive modeling of individual behavior will be naturally complex, we utilize hierarchical Bayesian models to propagate uncertainty throughout the model. By testing a variety of model assumptions surrounding energetics and foraging rate, we can understand the sensitivity of our predictions to parameter bounds. Our model forms the basis for field tests of animal body condition and further exploration of individual behavior and animal health. Future work combining the environmental impacts of changing ocean conditions on foraging success will inform conservation strategies in a changing marine ecosystem.\n\n\n##Time Feeding\n\nThe proportion of time an animal is in a feeding behavioral state.\n\n(@eq1)\n\n\n*Process Model*\n\n$$Y_{i,t+1} \\sim Multivariate Normal(d_{i,t},σ)$$\n\n$$d_{i,t}= Y_{i,t} + γ_(s_(i,g,t) )*T_(i,g,t)*( Y_(i,g,t)- Y_(i,g,t-1) )$$\n\n$$\n\\begin{matrix}\n \\alpha_{i,1,1} & 1-\\alpha_{i,1,1} \\\\\n \\alpha_{i,2,1} & 1-\\alpha_{i,2,1} \\\\\n\\end{matrix}\n$$\n\n\n$$logit(\\phi_{traveling}) = \\alpha_{Behavior_{t-1}}$$\nThe behavior at time t of individual i on track g is a discrete draw.\n$$S_{i,g,t} \\sim Cat(\\phi_{traveling},\\phi_{foraging})$$\n\nDive information is a mixture model based on behavior (S)\n\n$Average dive depth (\\psi)$\n$$ \\psi \\sim Normal(dive_{\\mu_S},dive_{\\tau_S})$$\n\n$\\text{Average number of dives }(\\omega)$\n$$ \\omega \\sim Poisson(\\lambda_S)$$\n\n```{r,echo=F,warning=F,message=F}\nlibrary(tidyr)\nlibrary(ggplot2)\nlibrary(maptools)\nlibrary(raster)\nlibrary(data.table)\n\nlibrary(dplyr)\nlibrary(stringr)\nlibrary(chron)\nlibrary(R2jags)\nlibrary(knitr)\n\nnewModel=T\n\nopts_chunk$set(echo=F,warning=F,message=F,fig.width=11)\n\nmytheme<-theme(axis.text.x=element_blank(),axis.ticks.x=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank(),axis.title.x=element_blank(),axis.title.y=element_blank(),panel.grid=element_blank())\n```\n\n```{r}\n#get dive data\n\nf<-list.files(\"C:/Users/Ben/Dropbox/Whales/Data/Humpback\",pattern=\"Locations\",full.names=T,recursive = T)\n\n#just grab five individuals for now\ngdat<-lapply(f,function(x) read.csv(x,stringsAsFactors=F))\ngdat<-lapply(gdat,function(x){\n x$Quality<-as.character(x$Quality)\n return(x)\n}) \n\ngdat<-bind_rows(gdat)\n\n#timestamp\ngdat$Date<-as.POSIXct(gdat$Date,format=\"%H:%M:%S %d-%b-%Y\",tz=\"Etc/GMT+3\")\n\n#get data files\nf<-list.files(\"C:/Users/Ben/Dropbox/Whales/Data/Humpback/\",pattern=\"Behavior\",full.names=T,recursive = T)\n dat<-bind_rows(lapply(f,read.csv))\n dat$GMTtime<-as.POSIXct(dat$End,format=\"%H:%M:%S %d-%b-%Y\",tz=\"Etc/GMT+3\")\n \n#local time\ndat$timestamp<-as.POSIXct(format(dat$GMTtime,tz=\"Etc/GMT+3\"))\n\ndat$Month<-months(dat$timestamp)\ndat$Month<-factor(dat$Month,levels=month.name)\ndat$Hour<-strftime(dat$timestamp,format=\"%H\")\ndat$Year<-years(dat$timestamp)\n \n#create unique messages\nindices<-which(dat$What==\"Message\")\ncounter=1\ndat$ID<-NA\nfor (x in 1:(length(indices)-1)){\ndat[indices[x]:indices[x+1],\"ID\"]<-counter\ncounter=counter+1\n}\n\ndive<-dat %>% filter(What==\"Dive\")%>% dplyr::select(Animal=Ptt,timestamp,Hour,Month,Year, ID,Start,DepthMax,DepthMin,DurationMax)\ndive<-dive[!is.na(dive$Month),]\n \n#remove duplicate data\ndive<-dive %>% arrange(Animal,timestamp) \ndive<-dive[!duplicated(dive),]\n```\n\n```{r}\n##Merge with geographic data and format for JAGS\nmessages<-dat %>% filter(dat$What==\"Message\")\nmessages$timestamp<-as.POSIXct(messages$End,format=\"%H:%M:%S %d-%b-%Y\",tz=\"Etc/GMT+3\")\n\n#look up the time interval that best fits\nsetDT(gdat) ## convert to data.table by reference\nsetDT(messages) ## same\n\nsetkey(messages, Ptt,timestamp) ## set the column to perform the join on\nsetkey(gdat,Ptt, Date) ## same as above\n\nans = gdat[messages, roll=Inf] ## perform rolling join\nans<-as.data.frame(ans)\n\nmessage_join<-ans %>% select(Date,Animal=Ptt,Date,Quality,Latitude,Longitude,ID)\n\nmdat<-merge(dat,message_join,by=\"ID\")\nmdat<-mdat %>% filter(What==\"Dive\")\n\n#The maxiumum dive depth based on the geographic message\nmdat<-mdat %>% select(ID,Animal,Latitude,Longitude,timestamp,Date,Month,Hour,Year,DepthMax,Quality) \n\nmdat<-mdat %>% group_by(ID,Animal) %>% slice(which.max(DepthMax)) %>% arrange(Animal,timestamp) %>% filter(!is.na(Latitude))\n\n#crop by extent\nd<-SpatialPointsDataFrame(cbind(mdat$Longitude,mdat$Latitude),data=data.frame(mdat),proj4string=CRS(\"+proj=longlat +datum=WGS84\"))\n\ncropoly<-readShapePoly(\"Data/CutPolygon.shp\",proj4string=CRS(\"+proj=longlat +datum=WGS84\"))\n\nb<-d[!is.na(d %over% cropoly)[,2],]\n\nmdat<-b@data\n\n#view data\nggplot(data=mdat)+geom_path(aes(x=Longitude, y=Latitude,group=Animal),size=.5) + geom_point(aes(x=Longitude, y=Latitude,col=DepthMax))+ borders(fill=\"grey90\") + coord_cartesian(ylim = range(mdat$Latitude),xlim=range(mdat$Longitude)) + theme_bw() + mytheme + scale_color_continuous(low=\"blue\",high=\"red\") + labs(col=\"Max Dive Depth(m)\")\n\n##Time is the beginning of the first point.\nstep_length=6\n\nsxy<-split(mdat,mdat$Animal)\n\n#time diff function\ntimed<-function(d,step_length){\n d$j[1]<-0\n for (x in 2:nrow(d)){\n d$j[x]<-as.numeric(difftime(as.POSIXct(d$timestamp[x]),as.POSIXct(d$timestamp[x-1]),units=\"mins\"))/(step_length*60)\n }\n \n #Split out track endings\n ends<-c(1,which(d$j>1),nrow(d))\n\n for(w in 2:length(ends)){\n d[ends[w-1]:ends[w],\"Track\"]<-w-1\n }\n \n #remove tracks that are shorter than three days\n track_time<-d %>% group_by(Track) %>% summarize(mt=difftime(max(as.POSIXct(timestamp)),min(as.POSIXct(timestamp)),units=\"hours\")) %>% filter(mt>=24) %>% .$Track\n \n d<-d[d$Track %in% track_time,]\n \n #renumber the tracks\n d$Track<-as.numeric(as.factor(d$Track))\n return(d)\n }\n\nsxy<-lapply(sxy,timed,step_length=step_length)\n\n#Format matrices for jags\nmdat<-bind_rows(sxy)\n\nsxy<-split(mdat,list(mdat$Animal,mdat$Track),drop=TRUE)\n\nsxy<-lapply(sxy,function(x){\n#How many observations in each step length segment\nx$step<-as.numeric(cut(as.POSIXct(x$timestamp),paste(step_length,\"hours\")))\nreturn(x)\n})\n\nmdat<-bind_rows(sxy)\n\n###################################################\n#filter by two whales for the moment\nmdat<-mdat %>% filter(Animal %in% c(\"131127\",\"131136\"))\n####################################################\n\n#refactor animal\nmdat$Animal<-as.numeric(as.factor(mdat$Animal))\n\n##Split into format for JAGS\n\n#total number of steps per track/animal\nsteps_all<-mdat %>% group_by(Animal,Track) %>% summarize(n=length(unique(step)))\n\n# give each step a label\nmdat<-mdat %>% group_by(Animal,Track,step) %>% mutate(jStep=1:n())\n\n#Cast time array\nj<-reshape2::acast(mdat,Animal~Track~step~jStep,value.var=\"j\")\n\n#how many observations per individual in each step\nmdat$step<-factor(mdat$step,levels=1:max(steps_all$n))\nidx<-reshape2::melt(table(mdat$Animal,mdat$Track,mdat$step))\ncolnames(idx)<-c(\"Animal\",\"Track\",\"step\",\"jStep\")\nidx<-reshape2::acast(data=idx,Animal~Track~step)\n\n#Individuals\nind=length(unique(mdat$Animal))\n\n#tracks per indivudal\ntracks<-mdat %>% group_by(Animal) %>% summarize(tracks=length(unique(Track))) %>% .$tracks\n\n#steps per track\nsteps<-reshape2::acast(steps_all,Animal~Track,value.var=\"n\")\n\n#obs array\nobs<-reshape2::melt(mdat,measure.vars=c(\"Longitude\",\"Latitude\"))\nobs<-reshape2::acast(obs,Animal~Track~step~jStep~variable,fun.aggregate = mean)\n\n#argos class array\nmdat$argos.lc<-factor(mdat$Quality,levels=c(3,2,1,0,\"A\",\"B\"))\nmdat$numargos<-as.numeric(mdat$argos.lc)\nobs_class<-reshape2::acast(mdat,Animal~Track~step~jStep,value.var=\"numargos\",fun.aggregate = min)\n\nobs_class[!is.finite(obs_class)]<-NA\n\n#average dive depth array\nmaxdive<-reshape2::acast(mdat,Animal~Track~step~jStep,value.var=\"DepthMax\",fun.aggregate = mean)\n\n#fill the empty values\nmaxdive[!is.finite(maxdive)]<-NA\n\n#average number of dives\ndivecount<-reshape2::acast(mdat,Animal~Track~step,value.var=\"DepthMax\",fun.aggregate = length)\n\n#no dives, fill empty\ndivecount[divecount==0]<-NA\n\n```\n\n```{r,child=\"Bayesian/Diving.R\",eval=T}\n```\n\n```{r,eval=T}\n#source jags file\nsource(\"Bayesian/Diving.R\")\n\n#prior cov shape\nR <- diag(c(1,1))\ndata=list(divecount=divecount,dive=maxdive,argos=obs,steps=steps,R=R,ind=ind,j=j,idx=idx,tracks=tracks,argos_class=obs_class)\n\n#paramters to track\npt<-c(\"alpha\",\"depth_mu\",\"depth_tau\",\"dive_new\",\"state\",\"lambda\")\n\nif(newModel){\n system.time(diving<-jags.parallel(model.file = \"Bayesian/Diving.jags\",data=data,n.chains=2,parameters.to.save=pt,n.iter=10000,n.burnin=9500,n.thin=2,DIC=FALSE))\n}\n\n```\n\n##Chains\n```{r,eval=T}\n#bind chains\npc_dive<-reshape2::melt(diving$BUGSoutput$sims.array)\ncolnames(pc_dive)<-c(\"Draw\",\"chain\",\"par\",\"value\")\n\n#extract parameter name\npc_dive$parameter<-data.frame(str_match(pc_dive$par,\"(\\\\w+)\"))[,-1]\n\n#Extract index\nsplitpc<-split(pc_dive,pc_dive$parameter)\n\n#single index\nsplitpc[c(\"alpha\",\"depth_mu\",\"depth_tau\",\"lambda\")]<-lapply(splitpc[c(\"alpha\",\"depth_mu\",\"depth_tau\",\"lambda\")],function(x){\n sv<-data.frame(str_match(x$par,\"(\\\\w+)\\\\[(\\\\d+)]\"))[,3]\n pc<-data.frame(x,Behavior=sv)\n return(pc)\n}) \n\n#3 index\nsplitpc[c(\"state\")]<-lapply(splitpc[c(\"state\")],function(x){\n sv<-data.frame(str_match(x$par,\"(\\\\w+)\\\\[(\\\\d+),(\\\\d+),(\\\\d+)\"))[,3:5]\n colnames(sv)<-c(\"Animal\",\"Track\",\"step\")\n pc<-data.frame(x,sv)\n return(pc)\n}) \n\n#4 index\nsplitpc[c(\"dive_new\")]<-lapply(splitpc[c(\"dive_new\")],function(x){\n sv<-data.frame(str_match(x$par,\"(\\\\w+)\\\\[(\\\\d+),(\\\\d+),(\\\\d+),(\\\\d+)]\"))[,3:6]\n colnames(sv)<-c(\"Animal\",\"Track\",\"step\",\"jStep\")\n pc<-data.frame(x,sv)\n return(pc)\n}) \n#bind all matrices back together\npc_dive<-bind_rows(splitpc)\nrm(splitpc)\n\nggplot(pc_dive[!pc_dive$parameter %in% c(\"dive_new\",\"state\"),],aes(x=Draw,y=value,col=as.factor(chain))) + geom_line() + facet_wrap(~par,scales=\"free\")\n\n```\n\n## Empirical distribution of foraging \n\n```{r}\nalpha<-pc_dive %>% filter(parameter==\"alpha\")\nalpha$Behavior<-as.character(alpha$Behavior)\nalpha$Behavior[alpha$Behavior==\"1\"]<-\"Traveling->Traveling\"\nalpha$Behavior[alpha$Behavior==\"2\"]<-\"Foraging->Traveling\"\n\nggplot(alpha,aes(x=value)) + geom_histogram() + facet_wrap(~Behavior) + labs(x=\"Probability of Transition\")\n\n#label previous and prediction state, treat traveling as a success and foraging as a failure in a binomial trial\nalpha[alpha$Behavior==\"Traveling->Traveling\",\"Previous_State\"]<-1\nalpha[alpha$Behavior==\"Foraging->Traveling\",\"Previous_State\"]<-0\n```\n\n### Time foraging as a function of time\n\n* 12 time step\n\n```{r}\nforaging_time<-function(alpha,draws,step){\n states<-c()\n \n #initial state is traveling\n states[1]<-(1)\n \n for(x in 2:draws){\n \n #probability of staying, or switching, to traveling state\n travel_prob=alpha %>% filter(Previous_State==states[x-1]) %>% sample_n(1) %>% .$value\n \n #pick next state\n states[x]<-rbinom(1,1,travel_prob)\n }\n \n #total hours of foraging\n total_foraging<-sum(states==0) * step\nreturn(total_foraging)\n}\n\nstates<-foraging_time(alpha=alpha,draw=20,step=12)\n```\n\nThis allows us to specify the hours foraging while capturing our uncertainty in behavioral states\n\nFor example, if we wanted to know how many hours an animal was predicted to forage on average over a 10 day span. We can draw 100 simulations given the posterior distributions of our empirical model.\n\n```{r}\n\ntest_time<-sapply(1:1000,function(x){\n foraging_time(alpha=alpha,draw=20,step=12)\n})\npaste(\"Mean foraging hours:\", mean(test_time),sep=\" \")\n\nqplot(test_time) +ggtitle(\"Foraging Time (10 Days)\") +xlab(\"Hours\")\n```\n\n\n##Distribution of average max dive depths\n\n```{r}\ndivep<-pc_dive %>% filter(parameter %in% c(\"depth_mu\",\"depth_tau\"))\n\n## Simulate dive depth\ndepth_mu1<-pc_dive %>% filter(parameter %in% c(\"depth_mu\"),Behavior==1)\ndepth_mu2<-pc_dive %>% filter(parameter %in% c(\"depth_mu\"),Behavior==2)\ndepth_tau1<-pc_dive %>% filter(parameter %in% c(\"depth_tau\"),Behavior==1)\ndepth_tau2<-pc_dive %>% filter(parameter %in% c(\"depth_tau\"),Behavior==2)\n\ntravel_dives<-data.frame(MaxDepth=rnorm(1e5,depth_mu1$value,sqrt(1/depth_tau1$value)),Behavior=\"Traveling\")\nforage_dives<-data.frame(MaxDepth=rnorm(1e5,depth_mu2$value,sqrt(1/depth_tau2$value)),Behavior=\"Foraging\")\npred_dives<-bind_rows(travel_dives,forage_dives)\nggplot(pred_dives) + geom_density(alpha=0.5,aes(x=MaxDepth,fill=Behavior)) + geom_density(data=mdat,aes(x=DepthMax),col=\"black\",size=1) + theme_bw() \n\nggplot(pc_dive[pc_dive$parameter==\"dive_new\",])+ geom_density(aes(x=value,fill=par)) + geom_density(data=mdat,aes(x=DepthMax),col=\"black\",size=1.5) + theme_bw() \n```\n\n##Distribution of average dive counts\n\n```{r}\n\n## Simulate dive counts\ncount_lambda1<-pc_dive %>% filter(parameter %in% c(\"lambda\"),Behavior==1)\ncount_lambda2<-pc_dive %>% filter(parameter %in% c(\"lambda\"),Behavior==2)\n\ntravel_counts<-data.frame(Counts=rpois(1e5,count_lambda1$value),Behavior=\"Traveling\")\nforage_counts<-data.frame(Counts=rpois(1e5,count_lambda2$value),Behavior=\"Foraging\")\n\n#calculate observed\nobs_count<-mdat %>% group_by(Animal,Track,step) %>% summarize(Counts=n())\n\npred_counts<-bind_rows(travel_counts,forage_counts)\nggplot(pred_counts) + geom_density(alpha=0.5,aes(x=Counts,fill=Behavior)) + geom_density(data=obs_count,aes(x=Counts),col=\"black\",size=1) + theme_bw() \n```\n\n## Posterior checks\n\n* Compare observed dive depths by inferred behavior against generated data\n\n```{r,eval=F}\npred_dives<-pc_dive %>% filter(parameter==\"dive_new\") %>% group_by(Animal,Track,step,jStep) %>% summarize(Pred_DepthMax=mean(value)) %>% ungroup() %>% mutate(Animal=as.numeric(as.character(Animal)),Track=as.numeric(as.character(Track)),jStep=as.numeric(as.character(jStep)))\n\npredframe<-pred_dives %>% inner_join(mdat,by=c(\"Animal\",\"Track\",\"step\",\"jStep\")) %>% select(Animal,Latitude,Longitude,Track,step,jStep,timestamp,Predicted=Pred_DepthMax,Observed=DepthMax)\n\n#merge with state\npredframe<-pc_dive %>% filter(parameter==\"state\") %>% group_by(Animal,Track,step) %>% summarize(state=names(sort(table(value)))[1]) %>% ungroup() %>% mutate(Animal=as.numeric(as.character(Animal)),Track=as.numeric(as.character(Track))) %>% inner_join(predframe,by=c(\"Animal\",\"Track\",\"step\"))\n\npredframe<-reshape2::melt(predframe, measure.vars=c(\"Predicted\",\"Observed\"),value.name=\"DepthMax\")\n\nggplot(data=predframe) + geom_histogram(aes(x=DepthMax,fill=variable),alpha=0.8) + theme_bw()\n\nggplot(data=predframe) + geom_density(aes(x=DepthMax,fill=variable),alpha=0.8) \n\nggplot(data=predframe) + geom_density(aes(x=DepthMax,fill=variable),alpha=0.8) + facet_wrap(~state) + ggtitle(\"By Behavior\")\n\nggplot(data=predframe) + geom_density(aes(x=DepthMax,fill=variable),alpha=0.8) + facet_wrap(~Animal) + ggtitle(\"By Animal\")\n\n```\n\n```{r}\nsave.image(\"WhalePhys.RData\")\n```\n", + "contents" : "---\ntitle: \"Foraging Model\"\nauthor: \"Ben Weinstein\"\ndate: \"May 30, 2017\"\noutput: \n html_document:\n toc: true\n number_sections: true\n theme: united\n---\n\n#Abstract\n\nForaging behavior shapes animal health through the balance of the resources expended to obtain nutrients and the energetic rewards of captured resources. The health of individuals will influence reproductive success, fitness and ultimately population viability. Despite the key role of individual health in evolutionary ecology, it can be challenging to connect foraging behavior and energetics in free living marine organisms. Combining data on foraging strategies, feeding behavior and physiology, we estimate body mass for humpback whales as they forage near the Antarctic Peninsula. Humpback whales require extreme energetic storage to facilitate the yearly migration between austral foraging areas to equatorial breeding grounds. Based on tagged individuals, we model the foraging effort, duration and energetics of animals throughout the austral season. We then connect these measurements to studies of whale feeding physiology and biomechanics. While predictive modeling of individual behavior will be naturally complex, we utilize hierarchical Bayesian models to propagate uncertainty throughout the model. By testing a variety of model assumptions surrounding energetics and foraging rate, we can understand the sensitivity of our predictions to parameter bounds. Our model forms the basis for field tests of animal body condition and further exploration of individual behavior and animal health. Future work combining the environmental impacts of changing ocean conditions on foraging success will inform conservation strategies in a changing marine ecosystem.\n\n\n##Time Feeding\n\nThe proportion of time an animal is in a feeding behavioral state.\n\n(@eq1)\n\n\n*Process Model*\n\n$$Y_{i,t+1} \\sim Multivariate Normal(d_{i,t},σ)$$\n\n$$d_{i,t}= Y_{i,t} + γ_(s_(i,g,t) )*T_(i,g,t)*( Y_(i,g,t)- Y_(i,g,t-1) )$$\n\n$$\n\\begin{matrix}\n \\alpha_{i,1,1} & 1-\\alpha_{i,1,1} \\\\\n \\alpha_{i,2,1} & 1-\\alpha_{i,2,1} \\\\\n\\end{matrix}\n$$\n\n\n$$logit(\\phi_{traveling}) = \\alpha_{Behavior_{t-1}}$$\nThe behavior at time t of individual i on track g is a discrete draw.\n$$S_{i,g,t} \\sim Cat(\\phi_{traveling},\\phi_{foraging})$$\n\nDive information is a mixture model based on behavior (S)\n\n$Average dive depth (\\psi)$\n$$ \\psi \\sim Normal(dive_{\\mu_S},dive_{\\tau_S})$$\n\n$\\text{Average number of dives }(\\omega)$\n$$ \\omega \\sim Poisson(\\lambda_S)$$\n\n```{r,echo=F,warning=F,message=F}\nlibrary(tidyr)\nlibrary(ggplot2)\nlibrary(maptools)\nlibrary(raster)\nlibrary(data.table)\n\nlibrary(dplyr)\nlibrary(stringr)\nlibrary(chron)\nlibrary(R2jags)\nlibrary(knitr)\n\n\nnewModel=F\n\nopts_chunk$set(echo=F,warning=F,message=F,fig.width=11)\n\nmytheme<-theme(axis.text.x=element_blank(),axis.ticks.x=element_blank(),axis.text.y=element_blank(),axis.ticks.y=element_blank(),axis.title.x=element_blank(),axis.title.y=element_blank(),panel.grid=element_blank())\n```\n\n```{r}\n\nif(!newModel){\n load(\"WhalePhys.RData\")\n}\n\n#get dive data\n\nf<-list.files(\"C:/Users/Ben/Dropbox/Whales/Data/Humpback\",pattern=\"Locations\",full.names=T,recursive = T)\n\n#just grab five individuals for now\ngdat<-lapply(f,function(x) read.csv(x,stringsAsFactors=F))\ngdat<-lapply(gdat,function(x){\n x$Quality<-as.character(x$Quality)\n return(x)\n}) \n\ngdat<-bind_rows(gdat)\n\n#timestamp\ngdat$Date<-as.POSIXct(gdat$Date,format=\"%H:%M:%S %d-%b-%Y\",tz=\"Etc/GMT+3\")\n\n#get data files\nf<-list.files(\"C:/Users/Ben/Dropbox/Whales/Data/Humpback/\",pattern=\"Behavior\",full.names=T,recursive = T)\n dat<-bind_rows(lapply(f,read.csv))\n dat$GMTtime<-as.POSIXct(dat$End,format=\"%H:%M:%S %d-%b-%Y\",tz=\"Etc/GMT+3\")\n \n#local time\ndat$timestamp<-as.POSIXct(format(dat$GMTtime,tz=\"Etc/GMT+3\"))\n\ndat$Month<-months(dat$timestamp)\ndat$Month<-factor(dat$Month,levels=month.name)\ndat$Hour<-strftime(dat$timestamp,format=\"%H\")\ndat$Year<-years(dat$timestamp)\n \n#create unique messages\nindices<-which(dat$What==\"Message\")\ncounter=1\ndat$ID<-NA\nfor (x in 1:(length(indices)-1)){\ndat[indices[x]:indices[x+1],\"ID\"]<-counter\ncounter=counter+1\n}\n\ndive<-dat %>% filter(What==\"Dive\")%>% dplyr::select(Animal=Ptt,timestamp,Hour,Month,Year, ID,Start,DepthMax,DepthMin,DurationMax)\ndive<-dive[!is.na(dive$Month),]\n \n#remove duplicate data\ndive<-dive %>% arrange(Animal,timestamp) \ndive<-dive[!duplicated(dive),]\n```\n\n```{r}\n##Merge with geographic data and format for JAGS\nmessages<-dat %>% filter(dat$What==\"Message\")\nmessages$timestamp<-as.POSIXct(messages$End,format=\"%H:%M:%S %d-%b-%Y\",tz=\"Etc/GMT+3\")\n\n#look up the time interval that best fits\nsetDT(gdat) ## convert to data.table by reference\nsetDT(messages) ## same\n\nsetkey(messages, Ptt,timestamp) ## set the column to perform the join on\nsetkey(gdat,Ptt, Date) ## same as above\n\nans = gdat[messages, roll=Inf] ## perform rolling join\nans<-as.data.frame(ans)\n\nmessage_join<-ans %>% select(Date,Animal=Ptt,Date,Quality,Latitude,Longitude,ID)\n\nmdat<-merge(dat,message_join,by=\"ID\")\nmdat<-mdat %>% filter(What==\"Dive\")\n\n#The maxiumum dive depth based on the geographic message\nmdat<-mdat %>% select(ID,Animal,Latitude,Longitude,timestamp,Date,Month,Hour,Year,DepthMax,Quality) \n\nmdat<-mdat %>% group_by(ID,Animal) %>% slice(which.max(DepthMax)) %>% arrange(Animal,timestamp) %>% filter(!is.na(Latitude))\n\n#crop by extent\nd<-SpatialPointsDataFrame(cbind(mdat$Longitude,mdat$Latitude),data=data.frame(mdat),proj4string=CRS(\"+proj=longlat +datum=WGS84\"))\n\ncropoly<-readShapePoly(\"Data/CutPolygon.shp\",proj4string=CRS(\"+proj=longlat +datum=WGS84\"))\n\nb<-d[!is.na(d %over% cropoly)[,2],]\n\nmdat<-b@data\n\n#view data\nggplot(data=mdat)+geom_path(aes(x=Longitude, y=Latitude,group=Animal),size=.5) + geom_point(aes(x=Longitude, y=Latitude,col=DepthMax))+ borders(fill=\"grey90\") + coord_cartesian(ylim = range(mdat$Latitude),xlim=range(mdat$Longitude)) + theme_bw() + mytheme + scale_color_continuous(low=\"blue\",high=\"red\") + labs(col=\"Max Dive Depth(m)\")\n\n##Time is the beginning of the first point.\nstep_length=6\n\nsxy<-split(mdat,mdat$Animal)\n\n#time diff function\ntimed<-function(d,step_length){\n d$j[1]<-0\n for (x in 2:nrow(d)){\n d$j[x]<-as.numeric(difftime(as.POSIXct(d$timestamp[x]),as.POSIXct(d$timestamp[x-1]),units=\"mins\"))/(step_length*60)\n }\n \n #Split out track endings\n ends<-c(1,which(d$j>1),nrow(d))\n\n for(w in 2:length(ends)){\n d[ends[w-1]:ends[w],\"Track\"]<-w-1\n }\n \n #remove tracks that are shorter than three days\n track_time<-d %>% group_by(Track) %>% summarize(mt=difftime(max(as.POSIXct(timestamp)),min(as.POSIXct(timestamp)),units=\"hours\")) %>% filter(mt>=24) %>% .$Track\n \n d<-d[d$Track %in% track_time,]\n \n #renumber the tracks\n d$Track<-as.numeric(as.factor(d$Track))\n return(d)\n }\n\nsxy<-lapply(sxy,timed,step_length=step_length)\n\n#Format matrices for jags\nmdat<-bind_rows(sxy)\n\nsxy<-split(mdat,list(mdat$Animal,mdat$Track),drop=TRUE)\n\nsxy<-lapply(sxy,function(x){\n#How many observations in each step length segment\nx$step<-as.numeric(cut(as.POSIXct(x$timestamp),paste(step_length,\"hours\")))\nreturn(x)\n})\n\nmdat<-bind_rows(sxy)\n\n###################################################\n#filter by two whales for the moment\nmdat<-mdat %>% filter(Animal %in% c(\"131127\",\"131136\"))\n####################################################\n\n#refactor animal\nmdat$Animal<-as.numeric(as.factor(mdat$Animal))\n\n##Split into format for JAGS\n\n#total number of steps per track/animal\nsteps_all<-mdat %>% group_by(Animal,Track) %>% summarize(n=length(unique(step)))\n\n# give each step a label\nmdat<-mdat %>% group_by(Animal,Track,step) %>% mutate(jStep=1:n())\n\n#Cast time array\nj<-reshape2::acast(mdat,Animal~Track~step~jStep,value.var=\"j\")\n\n#how many observations per individual in each step\nmdat$step<-factor(mdat$step,levels=1:max(steps_all$n))\nidx<-reshape2::melt(table(mdat$Animal,mdat$Track,mdat$step))\ncolnames(idx)<-c(\"Animal\",\"Track\",\"step\",\"jStep\")\nidx<-reshape2::acast(data=idx,Animal~Track~step)\n\n#Individuals\nind=length(unique(mdat$Animal))\n\n#tracks per indivudal\ntracks<-mdat %>% group_by(Animal) %>% summarize(tracks=length(unique(Track))) %>% .$tracks\n\n#steps per track\nsteps<-reshape2::acast(steps_all,Animal~Track,value.var=\"n\")\n\n#obs array\nobs<-reshape2::melt(mdat,measure.vars=c(\"Longitude\",\"Latitude\"))\nobs<-reshape2::acast(obs,Animal~Track~step~jStep~variable,fun.aggregate = mean)\n\n#argos class array\nmdat$argos.lc<-factor(mdat$Quality,levels=c(3,2,1,0,\"A\",\"B\"))\nmdat$numargos<-as.numeric(mdat$argos.lc)\nobs_class<-reshape2::acast(mdat,Animal~Track~step~jStep,value.var=\"numargos\",fun.aggregate = min)\n\nobs_class[!is.finite(obs_class)]<-NA\n\n#average dive depth array\nmaxdive<-reshape2::acast(mdat,Animal~Track~step~jStep,value.var=\"DepthMax\",fun.aggregate = mean)\n\n#fill the empty values\nmaxdive[!is.finite(maxdive)]<-NA\n\n#average number of dives\ndivecount<-reshape2::acast(mdat,Animal~Track~step,value.var=\"DepthMax\",fun.aggregate = length)\n\n#no dives, fill empty\ndivecount[divecount==0]<-NA\n\n```\n\n```{r,child=\"Bayesian/Diving.R\",eval=T}\n```\n\n```{r,eval=T}\n#source jags file\nsource(\"Bayesian/Diving.R\")\n\n#prior cov shape\nR <- diag(c(1,1))\ndata=list(divecount=divecount,dive=maxdive,argos=obs,steps=steps,R=R,ind=ind,j=j,idx=idx,tracks=tracks,argos_class=obs_class)\n\n#paramters to track\npt<-c(\"alpha\",\"depth_mu\",\"depth_tau\",\"dive_new\",\"state\",\"lambda\")\n\nif(newModel){\n system.time(diving<-jags.parallel(model.file = \"Bayesian/Diving.jags\",data=data,n.chains=2,parameters.to.save=pt,n.iter=10000,n.burnin=9500,n.thin=2,DIC=FALSE))\n}\n\n```\n\n##Chains\n```{r,eval=T}\n#bind chains\npc_dive<-reshape2::melt(diving$BUGSoutput$sims.array)\ncolnames(pc_dive)<-c(\"Draw\",\"chain\",\"par\",\"value\")\n\n#extract parameter name\npc_dive$parameter<-data.frame(str_match(pc_dive$par,\"(\\\\w+)\"))[,-1]\n\n#Extract index\nsplitpc<-split(pc_dive,pc_dive$parameter)\n\n#single index\nsplitpc[c(\"alpha\",\"depth_mu\",\"depth_tau\",\"lambda\")]<-lapply(splitpc[c(\"alpha\",\"depth_mu\",\"depth_tau\",\"lambda\")],function(x){\n sv<-data.frame(str_match(x$par,\"(\\\\w+)\\\\[(\\\\d+)]\"))[,3]\n pc<-data.frame(x,Behavior=sv)\n return(pc)\n}) \n\n#3 index\nsplitpc[c(\"state\")]<-lapply(splitpc[c(\"state\")],function(x){\n sv<-data.frame(str_match(x$par,\"(\\\\w+)\\\\[(\\\\d+),(\\\\d+),(\\\\d+)\"))[,3:5]\n colnames(sv)<-c(\"Animal\",\"Track\",\"step\")\n pc<-data.frame(x,sv)\n return(pc)\n}) \n\n#4 index\nsplitpc[c(\"dive_new\")]<-lapply(splitpc[c(\"dive_new\")],function(x){\n sv<-data.frame(str_match(x$par,\"(\\\\w+)\\\\[(\\\\d+),(\\\\d+),(\\\\d+),(\\\\d+)]\"))[,3:6]\n colnames(sv)<-c(\"Animal\",\"Track\",\"step\",\"jStep\")\n pc<-data.frame(x,sv)\n return(pc)\n}) \n#bind all matrices back together\npc_dive<-bind_rows(splitpc)\nrm(splitpc)\n\nggplot(pc_dive[!pc_dive$parameter %in% c(\"dive_new\",\"state\"),],aes(x=Draw,y=value,col=as.factor(chain))) + geom_line() + facet_wrap(~par,scales=\"free\")\n\n```\n\n## Empirical distribution of foraging \n\n```{r}\nalpha<-pc_dive %>% filter(parameter==\"alpha\")\nalpha$Behavior<-as.character(alpha$Behavior)\nalpha$Behavior[alpha$Behavior==\"1\"]<-\"Traveling->Traveling\"\nalpha$Behavior[alpha$Behavior==\"2\"]<-\"Foraging->Traveling\"\n\nggplot(alpha,aes(x=value)) + geom_histogram() + facet_wrap(~Behavior) + labs(x=\"Probability of Transition\")\n\n#label previous and prediction state, treat traveling as a success and foraging as a failure in a binomial trial\nalpha[alpha$Behavior==\"Traveling->Traveling\",\"Previous_State\"]<-1\nalpha[alpha$Behavior==\"Foraging->Traveling\",\"Previous_State\"]<-0\n```\n\n### Time foraging as a function of time\n\n* 12 time step\n\n```{r}\nforaging_time<-function(alpha,draws,step){\n states<-c()\n \n #initial state is traveling\n states[1]<-(1)\n \n for(x in 2:draws){\n \n #probability of staying, or switching, to traveling state\n travel_prob=alpha %>% filter(Previous_State==states[x-1]) %>% sample_n(1) %>% .$value\n \n #pick next state\n states[x]<-rbinom(1,1,travel_prob)\n }\n \n #total hours of foraging\n total_foraging<-sum(states==0) * step\nreturn(total_foraging)\n}\n\nstates<-foraging_time(alpha=alpha,draw=20,step=12)\n```\n\nThis allows us to specify the hours foraging while capturing our uncertainty in behavioral states\n\nFor example, if we wanted to know how many hours an animal was predicted to forage on average over a 10 day span. We can draw 100 simulations given the posterior distributions of our empirical model.\n\n```{r}\n\ntest_time<-sapply(1:1000,function(x){\n foraging_time(alpha=alpha,draw=20,step=12)\n})\npaste(\"Mean foraging hours:\", mean(test_time),sep=\" \")\n\nqplot(test_time) +ggtitle(\"Foraging Time (10 Days)\") +xlab(\"Hours\")\n```\n\n\n##Distribution of average max dive depths\n\n```{r}\ndivep<-pc_dive %>% filter(parameter %in% c(\"depth_mu\",\"depth_tau\"))\n\n## Simulate dive depth\ndepth_mu1<-pc_dive %>% filter(parameter %in% c(\"depth_mu\"),Behavior==1)\ndepth_mu2<-pc_dive %>% filter(parameter %in% c(\"depth_mu\"),Behavior==2)\ndepth_tau1<-pc_dive %>% filter(parameter %in% c(\"depth_tau\"),Behavior==1)\ndepth_tau2<-pc_dive %>% filter(parameter %in% c(\"depth_tau\"),Behavior==2)\n\n#how many of each state to draw?\nstatecount<-pc_dive %>% filter(parameter==\"state\") %>% group_by(Animal,Track,step) %>% summarize(state=names(sort(table(value)))[1]) %>% group_by(state) %>% summarize(n=n()) %>% data.frame()\n\ntravel_dives<-data.frame(MaxDepth=rnorm(statecount[1,\"n\"],depth_mu1$value,sqrt(1/depth_tau1$value)),Behavior=\"Traveling\")\nforage_dives<-data.frame(MaxDepth=rnorm(statecount[2,\"n\"],depth_mu2$value,sqrt(1/depth_tau2$value)),Behavior=\"Foraging\")\npred_dives<-bind_rows(travel_dives,forage_dives)\nggplot(pred_dives) + geom_density(alpha=0.5,aes(x=MaxDepth,fill=Behavior)) + geom_density(data=mdat,aes(x=DepthMax),col=\"black\",size=1) + theme_bw() \n\nggplot(pc_dive[pc_dive$parameter==\"dive_new\",])+ geom_density(aes(x=value),col=\"red\") + geom_density(data=mdat,aes(x=DepthMax),col=\"black\",size=1.5) + theme_bw() \n```\n\n##Distribution of average dive counts\n\n```{r}\n\n## Simulate dive counts\ncount_lambda1<-pc_dive %>% filter(parameter %in% c(\"lambda\"),Behavior==1)\ncount_lambda2<-pc_dive %>% filter(parameter %in% c(\"lambda\"),Behavior==2)\n\nstatecount<-pc_dive %>% filter(parameter==\"state\") %>% group_by(Animal,Track,step) %>% summarize(state=names(sort(table(value)))[1]) %>% group_by(state) %>% summarize(n=n()) %>% data.frame()\n\ntravel_counts<-data.frame(Counts=rpois(statecount[1,\"n\"],count_lambda1$value),Behavior=\"Traveling\")\nforage_counts<-data.frame(Counts=rpois(statecount[2,\"n\"],count_lambda2$value),Behavior=\"Foraging\")\n\n#calculate observed\nobs_count<-mdat %>% group_by(Animal,Track,step) %>% summarize(Counts=n())\n\npred_counts<-bind_rows(travel_counts,forage_counts)\nggplot(pred_counts) + geom_density(alpha=0.5,aes(x=Counts,fill=Behavior)) + geom_density(data=obs_count,aes(x=Counts),col=\"black\",size=1) + theme_bw() \n```\n\n## Posterior checks\n\n* Compare observed dive depths by inferred behavior against generated data\n\n```{r,eval=F}\npred_dives<-pc_dive %>% filter(parameter==\"dive_new\") %>% group_by(Animal,Track,step,jStep) %>% summarize(Pred_DepthMax=mean(value)) %>% ungroup() %>% mutate(Animal=as.numeric(as.character(Animal)),Track=as.numeric(as.character(Track)),jStep=as.numeric(as.character(jStep)))\n\npredframe<-pred_dives %>% inner_join(mdat,by=c(\"Animal\",\"Track\",\"step\",\"jStep\")) %>% select(Animal,Latitude,Longitude,Track,step,jStep,timestamp,Predicted=Pred_DepthMax,Observed=DepthMax)\n\n#merge with state\npredframe<-pc_dive %>% filter(parameter==\"state\") %>% group_by(Animal,Track,step) %>% summarize(state=names(sort(table(value)))[1]) %>% ungroup() %>% mutate(Animal=as.numeric(as.character(Animal)),Track=as.numeric(as.character(Track))) %>% inner_join(predframe,by=c(\"Animal\",\"Track\",\"step\"))\n\npredframe<-reshape2::melt(predframe, measure.vars=c(\"Predicted\",\"Observed\"),value.name=\"DepthMax\")\n\nggplot(data=predframe) + geom_histogram(aes(x=DepthMax,fill=variable),alpha=0.8) + theme_bw()\n\nggplot(data=predframe) + geom_density(aes(x=DepthMax,fill=variable),alpha=0.8) \n\nggplot(data=predframe) + geom_density(aes(x=DepthMax,fill=variable),alpha=0.8) + facet_wrap(~state) + ggtitle(\"By Behavior\")\n\nggplot(data=predframe) + geom_density(aes(x=DepthMax,fill=variable),alpha=0.8) + facet_wrap(~Animal) + ggtitle(\"By Animal\")\n\n```\n\n```{r}\nsave.image(\"WhalePhys.RData\")\n```\n", "created" : 1496200015945.000, "dirty" : false, "encoding" : "UTF-8", "folds" : "", - "hash" : "2874219066", + "hash" : "1129738221", "id" : "449C785F", - "lastKnownWriteTime" : 1496785911, - "last_content_update" : 1496785911480, + "lastKnownWriteTime" : 1496803268, + "last_content_update" : 1496803268262, "path" : "~/WhalePhys/RunModel.Rmd", "project_path" : "RunModel.Rmd", "properties" : { diff --git a/.gitignore b/.gitignore index 45225f3..0769a39 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.RData +.Rproj.user diff --git a/RunModel.Rmd b/RunModel.Rmd index d2e7df5..153e872 100644 --- a/RunModel.Rmd +++ b/RunModel.Rmd @@ -60,7 +60,8 @@ library(chron) library(R2jags) library(knitr) -newModel=T + +newModel=F opts_chunk$set(echo=F,warning=F,message=F,fig.width=11) @@ -68,6 +69,11 @@ mytheme<-theme(axis.text.x=element_blank(),axis.ticks.x=element_blank(),axis.tex ``` ```{r} + +if(!newModel){ + load("WhalePhys.RData") +} + #get dive data f<-list.files("C:/Users/Ben/Dropbox/Whales/Data/Humpback",pattern="Locations",full.names=T,recursive = T) @@ -385,12 +391,15 @@ depth_mu2<-pc_dive %>% filter(parameter %in% c("depth_mu"),Behavior==2) depth_tau1<-pc_dive %>% filter(parameter %in% c("depth_tau"),Behavior==1) depth_tau2<-pc_dive %>% filter(parameter %in% c("depth_tau"),Behavior==2) -travel_dives<-data.frame(MaxDepth=rnorm(1e5,depth_mu1$value,sqrt(1/depth_tau1$value)),Behavior="Traveling") -forage_dives<-data.frame(MaxDepth=rnorm(1e5,depth_mu2$value,sqrt(1/depth_tau2$value)),Behavior="Foraging") +#how many of each state to draw? +statecount<-pc_dive %>% filter(parameter=="state") %>% group_by(Animal,Track,step) %>% summarize(state=names(sort(table(value)))[1]) %>% group_by(state) %>% summarize(n=n()) %>% data.frame() + +travel_dives<-data.frame(MaxDepth=rnorm(statecount[1,"n"],depth_mu1$value,sqrt(1/depth_tau1$value)),Behavior="Traveling") +forage_dives<-data.frame(MaxDepth=rnorm(statecount[2,"n"],depth_mu2$value,sqrt(1/depth_tau2$value)),Behavior="Foraging") pred_dives<-bind_rows(travel_dives,forage_dives) ggplot(pred_dives) + geom_density(alpha=0.5,aes(x=MaxDepth,fill=Behavior)) + geom_density(data=mdat,aes(x=DepthMax),col="black",size=1) + theme_bw() -ggplot(pc_dive[pc_dive$parameter=="dive_new",])+ geom_density(aes(x=value,fill=par)) + geom_density(data=mdat,aes(x=DepthMax),col="black",size=1.5) + theme_bw() +ggplot(pc_dive[pc_dive$parameter=="dive_new",])+ geom_density(aes(x=value),col="red") + geom_density(data=mdat,aes(x=DepthMax),col="black",size=1.5) + theme_bw() ``` ##Distribution of average dive counts @@ -401,8 +410,10 @@ ggplot(pc_dive[pc_dive$parameter=="dive_new",])+ geom_density(aes(x=value,fill= count_lambda1<-pc_dive %>% filter(parameter %in% c("lambda"),Behavior==1) count_lambda2<-pc_dive %>% filter(parameter %in% c("lambda"),Behavior==2) -travel_counts<-data.frame(Counts=rpois(1e5,count_lambda1$value),Behavior="Traveling") -forage_counts<-data.frame(Counts=rpois(1e5,count_lambda2$value),Behavior="Foraging") +statecount<-pc_dive %>% filter(parameter=="state") %>% group_by(Animal,Track,step) %>% summarize(state=names(sort(table(value)))[1]) %>% group_by(state) %>% summarize(n=n()) %>% data.frame() + +travel_counts<-data.frame(Counts=rpois(statecount[1,"n"],count_lambda1$value),Behavior="Traveling") +forage_counts<-data.frame(Counts=rpois(statecount[2,"n"],count_lambda2$value),Behavior="Foraging") #calculate observed obs_count<-mdat %>% group_by(Animal,Track,step) %>% summarize(Counts=n()) diff --git a/RunModel.html b/RunModel.html index b3da0f6..3a59950 100644 --- a/RunModel.html +++ b/RunModel.html @@ -127,16 +127,13 @@
\[logit(\phi_{traveling}) = \alpha_{Behavior_{t-1}}\]
- - -sink(“Bayesian/Foraging.jags”) cat(" model{
-#Constants
-pi <- 3.141592653589
-
-#for each if 6 argos class observation error
-
-for(x in 1:6){
-
-##argos observation error##
-argos_prec[x,1:2,1:2] <- argos_cov[x,,]
-
-#Constructing the covariance matrix
-argos_cov[x,1,1] <- argos_sigma[x]
-argos_cov[x,1,2] <- 0
-argos_cov[x,2,1] <- 0
-argos_cov[x,2,2] <- argos_alpha[x]
-}
-
-for(i in 1:ind){
-for(g in 1:tracks[i]){
-
-## Priors for first true location
-#for lat long
-y[i,g,1,1:2] ~ dmnorm(argos[i,g,1,1,1:2],argos_prec[1,1:2,1:2])
-
-#First movement - random walk.
-y[i,g,2,1:2] ~ dmnorm(y[i,g,1,1:2],iSigma)
-
-###First Behavioral State###
-state[i,g,1] ~ dcat(lambda[]) ## assign state for first obs
-
-#Process Model for movement
-for(t in 2:(steps[i,g]-1)){
-
-#Behavioral State at time T
-phi[i,g,t,1] <- alpha[state[i,g,t-1]]
-phi[i,g,t,2] <- 1-phi[i,g,t,1]
-state[i,g,t] ~ dcat(phi[i,g,t,])
-
-#Turning covariate
-#Transition Matrix for turning angles
-T[i,g,t,1,1] <- cos(theta[state[i,g,t]])
-T[i,g,t,1,2] <- (-sin(theta[state[i,g,t]]))
-T[i,g,t,2,1] <- sin(theta[state[i,g,t]])
-T[i,g,t,2,2] <- cos(theta[state[i,g,t]])
-
-#Correlation in movement change
-d[i,g,t,1:2] <- y[i,g,t,] + gamma[state[i,g,t]] * T[i,g,t,,] %*% (y[i,g,t,1:2] - y[i,g,t-1,1:2])
-
-#Gaussian Displacement
-y[i,g,t+1,1:2] ~ dmnorm(d[i,g,t,1:2],iSigma)
-}
-
-#Final behavior state
-phi[i,g,steps[i,g],1] <- alpha[state[i,g,steps[i,g]-1]]
-phi[i,g,steps[i,g],2] <- 1-phi[i,g,steps[i,g],1]
-state[i,g,steps[i,g]] ~ dcat(phi[i,g,steps[i,g],])
-
-## Measurement equation - irregular observations
-# loops over regular time intervals (t)
-
-for(t in 2:steps[i,g]){
-
-# loops over observed locations within interval t
-for(u in 1:idx[i,g,t]){
-zhat[i,g,t,u,1:2] <- (1-j[i,g,t,u]) * y[i,g,t-1,1:2] + j[i,g,t,u] * y[i,g,t,1:2]
-
-#for each lat and long
-#argos error
-
-argos[i,g,t,u,1:2] ~ dmnorm(zhat[i,g,t,u,1:2],argos_prec[argos_class[i,g,t,u],1:2,1:2])
-}
-}
-}
-}
-###Priors###
-
-#Process Variance
-iSigma ~ dwish(R,2)
-Sigma <- inverse(iSigma)
-
-##Mean Angle
-tmp[1] ~ dbeta(10, 10)
-tmp[2] ~ dbeta(10, 10)
-
-# prior for theta in 'traveling state'
-theta[1] <- (2 * tmp[1] - 1) * pi
-
-# prior for theta in 'foraging state'
-theta[2] <- (tmp[2] * pi * 2)
-
-##Move persistance
-# prior for gamma (autocorrelation parameter)
-#from jonsen 2016
-
-##Behavioral States
-
-gamma[1] ~ dbeta(3,2) ## gamma for state 1
-dev ~ dbeta(1,1) ## a random deviate to ensure that gamma[1] > gamma[2]
-gamma[2] <- gamma[1] * dev
-
-#Intercepts
-alpha[1] ~ dbeta(1,1)
-alpha[2] ~ dbeta(1,1)
-
-#Probability of behavior switching
-lambda[1] ~ dbeta(1,1)
-lambda[2] <- 1 - lambda[1]
-
-##Argos priors##
-#longitudinal argos precision, from Jonsen 2005, 2016, represented as precision not sd
-
-#by argos class
-argos_sigma[1] <- 11.9016
-argos_sigma[2] <- 10.2775
-argos_sigma[3] <- 1.228984
-argos_sigma[4] <- 2.162593
-argos_sigma[5] <- 3.885832
-argos_sigma[6] <- 0.0565539
-
-#latitidunal argos precision, from Jonsen 2005, 2016
-argos_alpha[1] <- 67.12537
-argos_alpha[2] <- 14.73474
-argos_alpha[3] <- 4.718973
-argos_alpha[4] <- 0.3872023
-argos_alpha[5] <- 3.836444
-argos_alpha[6] <- 0.1081156
-
-}"
-,fill=TRUE)
-sink()
-## user system elapsed
-## 0.04 0.03 1052.08
-This allows us to specify the hours foraging while capturing our uncertainty in behavioral states
-For example, if we wanted to know how many hours an animal was predicted to forage on average over a 10 day span. We can draw 100 simulations given the posterior distributions of our empirical model.
-## [1] "Mean foraging hours: 211.98"
-When feeding, what depth do animals dive?
-\(Y_i \sim Multinomial(M)\)
-\(M=[m_1,m_2…m_n ]\)
-$M dirichlet(ρ_i) $
-## DeployID Ptt Instr Date Type Quality Latitude
-## 1 131111 131111 Mk10 2016-03-23 01:01:25 Argos B -64.139
-## 2 131111 131111 Mk10 2016-03-23 01:49:33 Argos B -64.139
-## 3 131111 131111 Mk10 2016-03-23 02:33:29 Argos B -64.137
-## 4 131111 131111 Mk10 2016-03-23 02:44:34 Argos B -64.136
-## 5 131111 131111 Mk10 2016-03-23 02:47:02 Argos B -64.137
-## 6 131111 131111 Mk10 2016-03-23 03:34:08 Argos B -64.132
-## 7 131111 131111 Mk10 2016-03-23 04:22:22 Argos B -64.130
-## 8 131111 131111 Mk10 2016-03-23 04:22:22 Argos B -64.130
-## 9 131111 131111 Mk10 2016-03-23 04:27:37 Argos B -64.121
-## 10 131111 131111 Mk10 2016-03-23 05:13:33 Argos B -64.118
-## 11 131111 131111 Mk10 2016-03-23 05:32:43 Argos B -64.122
-## 12 131111 131111 Mk10 2016-03-23 06:06:10 Argos B -64.117
-## 13 131111 131111 Mk10 2016-03-23 06:56:51 Argos B -64.117
-## 14 131111 131111 Mk10 2016-03-23 07:16:50 Argos B -64.115
-## 15 131111 131111 Mk10 2016-03-23 07:34:51 Argos B -64.114
-## 16 131111 131111 Mk10 2016-03-23 07:47:21 Argos B -64.107
-## 17 131111 131111 Mk10 2016-03-23 08:35:42 Argos B -64.106
-## 18 131111 131111 Mk10 2016-03-23 08:54:33 Argos A -64.117
-## 19 131111 131111 Mk10 2016-03-23 09:12:06 Argos B -64.110
-## 20 131111 131111 Mk10 2016-03-23 10:18:47 Argos A -64.134
-## 21 131111 131111 Mk10 2016-03-23 10:33:01 Argos A -64.138
-## 22 131111 131111 Mk10 2016-03-23 10:59:42 Argos B -64.132
-## 23 131111 131111 Mk10 2016-03-23 10:59:42 Argos B -64.130
-## 24 131111 131111 Mk10 2016-03-23 11:45:28 Argos B -64.135
-## 25 131111 131111 Mk10 2016-03-23 12:00:28 Argos B -64.136
-## 26 131111 131111 Mk10 2016-03-23 12:37:46 Argos A -64.143
-## 27 131111 131111 Mk10 2016-03-23 15:12:42 Argos B -64.167
-## 28 131111 131111 Mk10 2016-03-23 15:12:42 Argos B -64.151
-## 29 131111 131111 Mk10 2016-03-23 16:34:21 Argos B -64.146
-## 30 131111 131111 Mk10 2016-03-23 21:42:11 Argos B -64.142
-## 31 131111 131111 Mk10 2016-03-23 21:44:24 Argos A -64.106
-## 32 131111 131111 Mk10 2016-03-23 22:35:05 Argos A -64.113
-## 33 131111 131111 Mk10 2016-03-23 23:10:47 Argos B -64.112
-## 34 131111 131111 Mk10 2016-03-23 23:31:10 Argos B -64.120
-## 35 131111 131111 Mk10 2016-03-24 01:37:06 Argos B -64.128
-## 36 131111 131111 Mk10 2016-03-24 02:33:56 Argos B -64.123
-## 37 131111 131111 Mk10 2016-03-24 03:11:56 Argos B -64.113
-## 38 131111 131111 Mk10 2016-03-24 03:28:57 Argos B -64.124
-## 39 131111 131111 Mk10 2016-03-24 04:03:14 Argos B -64.123
-## 40 131111 131111 Mk10 2016-03-24 04:03:46 Argos B -64.122
-## 41 131111 131111 Mk10 2016-03-24 04:14:58 Argos 1 -64.119
-## 42 131111 131111 Mk10 2016-03-24 05:15:48 Argos B -64.117
-## 43 131111 131111 Mk10 2016-03-24 05:47:22 Argos B -64.117
-## 44 131111 131111 Mk10 2016-03-24 06:00:21 Argos B -64.116
-## 45 131111 131111 Mk10 2016-03-24 06:34:59 Argos A -64.009
-## 46 131111 131111 Mk10 2016-03-24 06:50:53 Argos B -64.099
-## 47 131111 131111 Mk10 2016-03-24 07:22:17 Argos A -64.103
-## 48 131111 131111 Mk10 2016-03-24 07:22:35 Argos B -64.103
-## 49 131111 131111 Mk10 2016-03-24 08:12:03 Argos B -64.097
-## 50 131111 131111 Mk10 2016-03-24 08:29:58 Argos B -64.101
-## 51 131111 131111 Mk10 2016-03-24 09:01:37 Argos B -64.111
-## 52 131111 131111 Mk10 2016-03-24 09:45:51 Argos B -64.109
-## 53 131111 131111 Mk10 2016-03-24 09:47:57 Argos B -64.109
-## 54 131111 131111 Mk10 2016-03-24 10:41:19 Argos 1 -64.113
-## 55 131111 131111 Mk10 2016-03-24 11:31:02 Argos B -64.104
-## 56 131111 131111 Mk10 2016-03-24 12:20:20 Argos B -64.108
-## 57 131111 131111 Mk10 2016-03-24 14:51:26 Argos B -64.098
-## 58 131111 131111 Mk10 2016-03-24 16:24:59 Argos B -64.098
-## 59 131111 131111 Mk10 2016-03-24 21:13:13 Argos B -64.091
-## 60 131111 131111 Mk10 2016-03-24 21:14:40 Argos B -64.101
-## 61 131111 131111 Mk10 2016-03-24 21:28:16 Argos A -64.100
-## 62 131111 131111 Mk10 2016-03-24 22:07:06 Argos A -64.111
-## 63 131111 131111 Mk10 2016-03-24 22:52:12 Argos B -64.096
-## 64 131111 131111 Mk10 2016-03-24 22:52:12 Argos B -64.101
-## 65 131111 131111 Mk10 2016-03-24 23:08:03 Argos B -64.091
-## 66 131111 131111 Mk10 2016-03-25 01:25:40 Argos B -64.083
-## 67 131111 131111 Mk10 2016-03-25 02:06:02 Argos A -64.113
-## 68 131111 131111 Mk10 2016-03-25 02:18:59 Argos B -64.104
-## 69 131111 131111 Mk10 2016-03-25 02:49:41 Argos A -64.112
-## 70 131111 131111 Mk10 2016-03-25 03:04:39 Argos B -64.115
-## 71 131111 131111 Mk10 2016-03-25 04:02:44 Argos B -64.123
-## 72 131111 131111 Mk10 2016-03-25 04:29:41 Argos B -64.106
-## 73 131111 131111 Mk10 2016-03-25 04:47:25 Argos A -64.100
-## 74 131111 131111 Mk10 2016-03-25 05:25:54 Argos B -64.097
-## 75 131111 131111 Mk10 2016-03-25 05:34:24 Argos B -64.122
-## 76 131111 131111 Mk10 2016-03-25 05:42:08 Argos B -64.099
-## 77 131111 131111 Mk10 2016-03-25 06:12:56 Argos A -64.101
-## 78 131111 131111 Mk10 2016-03-25 06:29:34 Argos 0 -64.106
-## 79 131111 131111 Mk10 2016-03-25 07:01:33 Argos B -64.100
-## 80 131111 131111 Mk10 2016-03-25 07:16:29 Argos A -64.072
-## 81 131111 131111 Mk10 2016-03-25 07:47:47 Argos B -64.117
-## 82 131111 131111 Mk10 2016-03-25 08:03:27 Argos 1 -64.103
-## 83 131111 131111 Mk10 2016-03-25 08:49:20 Argos A -64.100
-## 84 131111 131111 Mk10 2016-03-25 09:14:37 Argos B -64.100
-## 85 131111 131111 Mk10 2016-03-25 09:28:32 Argos A -64.108
-## 86 131111 131111 Mk10 2016-03-25 09:43:37 Argos B -64.114
-## 87 131111 131111 Mk10 2016-03-25 10:40:12 Argos B -64.125
-## 88 131111 131111 Mk10 2016-03-25 10:57:55 Argos 1 -64.107
-## 89 131111 131111 Mk10 2016-03-25 11:09:49 Argos B -64.109
-## 90 131111 131111 Mk10 2016-03-25 11:24:53 Argos 0 -64.145
-## 91 131111 131111 Mk10 2016-03-25 12:37:00 Argos B -64.120
-## 92 131111 131111 Mk10 2016-03-25 12:41:47 Argos B -64.113
-## 93 131111 131111 Mk10 2016-03-25 14:27:38 Argos 2 -64.102
-## 94 131111 131111 Mk10 2016-03-25 21:05:34 Argos B -64.086
-## 95 131111 131111 Mk10 2016-03-25 21:19:09 Argos 3 -64.099
-## 96 131111 131111 Mk10 2016-03-25 21:44:17 Argos B -64.104
-## 97 131111 131111 Mk10 2016-03-25 22:21:43 Argos B -64.107
-## 98 131111 131111 Mk10 2016-03-25 22:39:32 Argos 0 -64.100
-## 99 131111 131111 Mk10 2016-03-25 22:56:25 Argos B -64.101
-## 100 131111 131111 Mk10 2016-03-25 23:10:50 Argos B -64.101
-## 101 131111 131111 Mk10 2016-03-25 23:26:49 Argos A -64.103
-## 102 131111 131111 Mk10 2016-03-26 01:05:33 Argos A -64.110
-## 103 131111 131111 Mk10 2016-03-26 01:46:58 Argos B -64.097
-## 104 131111 131111 Mk10 2016-03-26 02:02:15 Argos A -64.108
-## 105 131111 131111 Mk10 2016-03-26 02:18:07 Argos B -64.122
-## 106 131111 131111 Mk10 2016-03-26 02:33:05 Argos B -64.121
-## 107 131111 131111 Mk10 2016-03-26 02:45:27 Argos B -64.123
-## 108 131111 131111 Mk10 2016-03-26 03:27:32 Argos A -64.115
-## 109 131111 131111 Mk10 2016-03-26 03:41:39 Argos A -64.114
-## 110 131111 131111 Mk10 2016-03-26 03:55:37 Argos B -64.110
-## 111 131111 131111 Mk10 2016-03-26 04:11:25 Argos 2 -64.098
-## 112 131111 131111 Mk10 2016-03-26 05:20:41 Argos B -64.120
-## 113 131111 131111 Mk10 2016-03-26 05:35:59 Argos 1 -64.094
-## 114 131111 131111 Mk10 2016-03-26 05:53:04 Argos A -64.095
-## 115 131111 131111 Mk10 2016-03-26 06:58:05 Argos A -64.097
-## 116 131111 131111 Mk10 2016-03-26 07:12:59 Argos B -64.102
-## 117 131111 131111 Mk10 2016-03-26 07:38:48 Argos A -64.112
-## 118 131111 131111 Mk10 2016-03-26 08:42:34 Argos B -64.111
-## 119 131111 131111 Mk10 2016-03-26 08:43:36 Argos A -64.108
-## 120 131111 131111 Mk10 2016-03-26 09:00:52 Argos B -64.106
-## 121 131111 131111 Mk10 2016-03-26 09:17:21 Argos B -64.102
-## 122 131111 131111 Mk10 2016-03-26 10:20:09 Argos 1 -64.090
-## 123 131111 131111 Mk10 2016-03-26 10:21:48 Argos 1 -64.102
-## 124 131111 131111 Mk10 2016-03-26 10:51:31 Argos B -64.102
-## 125 131111 131111 Mk10 2016-03-26 10:55:18 Argos A -64.096
-## 126 131111 131111 Mk10 2016-03-26 12:06:27 Argos B -64.092
-## 127 131111 131111 Mk10 2016-03-26 12:31:01 Argos B -64.095
-## 128 131111 131111 Mk10 2016-03-26 14:09:18 Argos B -64.099
-## 129 131111 131111 Mk10 2016-03-26 15:22:21 Argos B -64.107
-## 130 131111 131111 Mk10 2016-03-26 16:57:20 Argos B -64.108
-## 131 131111 131111 Mk10 2016-03-26 21:06:44 Argos A -64.092
-## 132 131111 131111 Mk10 2016-03-26 21:53:01 Argos B -64.106
-## 133 131111 131111 Mk10 2016-03-26 22:33:13 Argos B -64.104
-## 134 131111 131111 Mk10 2016-03-26 22:43:58 Argos 0 -64.101
-## 135 131111 131111 Mk10 2016-03-26 23:02:54 Argos B -64.105
-## 136 131111 131111 Mk10 2016-03-27 01:20:48 Argos B -64.109
-## 137 131111 131111 Mk10 2016-03-27 01:51:24 Argos 0 -64.101
-## 138 131111 131111 Mk10 2016-03-27 02:04:27 Argos 2 -64.117
-## 139 131111 131111 Mk10 2016-03-27 02:13:32 Argos 1 -64.108
-## 140 131111 131111 Mk10 2016-03-27 02:19:34 Argos 1 -64.125
-## 141 131111 131111 Mk10 2016-03-27 03:30:28 Argos B -64.094
-## 142 131111 131111 Mk10 2016-03-27 03:42:36 Argos 1 -64.106
-## 143 131111 131111 Mk10 2016-03-27 03:51:45 Argos 3 -64.114
-## 144 131111 131111 Mk10 2016-03-27 03:51:45 Argos 3 -64.114
-## 145 131111 131111 Mk10 2016-03-27 05:09:04 Argos A -64.056
-## 146 131111 131111 Mk10 2016-03-27 05:18:41 Argos 1 -64.149
-## 147 131111 131111 Mk10 2016-03-27 05:31:44 Argos A -64.135
-## 148 131111 131111 Mk10 2016-03-27 05:40:36 Argos B -64.135
-## 149 131111 131111 Mk10 2016-03-27 06:49:27 Argos A -64.185
-## 150 131111 131111 Mk10 2016-03-27 07:01:11 Argos 2 -64.205
-## 151 131111 131111 Mk10 2016-03-27 07:08:45 Argos A -64.216
-## 152 131111 131111 Mk10 2016-03-27 07:14:26 Argos 2 -64.203
-## 153 131111 131111 Mk10 2016-03-27 08:33:03 Argos 0 -64.207
-## 154 131111 131111 Mk10 2016-03-27 08:45:10 Argos B -64.207
-## 155 131111 131111 Mk10 2016-03-27 08:50:05 Argos B -64.211
-## 156 131111 131111 Mk10 2016-03-27 08:50:05 Argos B -64.217
-## 157 131111 131111 Mk10 2016-03-27 09:54:38 Argos 2 -64.272
-## 158 131111 131111 Mk10 2016-03-27 10:08:49 Argos 2 -64.280
-## 159 131111 131111 Mk10 2016-03-27 10:25:54 Argos 3 -64.282
-## 160 131111 131111 Mk10 2016-03-27 10:35:41 Argos A -64.278
-## 161 131111 131111 Mk10 2016-03-27 11:21:06 Argos B -64.305
-## 162 131111 131111 Mk10 2016-03-27 11:32:05 Argos B -64.299
-## 163 131111 131111 Mk10 2016-03-27 12:04:36 Argos B -64.303
-## 164 131111 131111 Mk10 2016-03-27 12:55:40 Argos B -64.320
-## 165 131111 131111 Mk10 2016-03-27 14:39:06 Argos B -64.354
-## 166 131111 131111 Mk10 2016-03-27 14:52:00 Argos A -64.367
-## 167 131111 131111 Mk10 2016-03-27 15:24:25 Argos A -64.375
-## 168 131111 131111 Mk10 2016-03-27 16:25:20 Argos B -64.390
-## 169 131111 131111 Mk10 2016-03-27 21:21:39 Argos 1 -64.332
-## 170 131111 131111 Mk10 2016-03-27 22:22:47 Argos B -64.342
-## 171 131111 131111 Mk10 2016-03-27 22:37:25 Argos B -64.350
-## 172 131111 131111 Mk10 2016-03-27 22:37:25 Argos B -64.317
-## 173 131111 131111 Mk10 2016-03-27 23:02:57 Argos B -64.319
-## Longitude Error.radius Error.Semi.major.axis Error.Semi.minor.axis
-## 1 -61.012 NA NA NA
-## 2 -61.008 NA NA NA
-## 3 -61.007 NA NA NA
-## 4 -61.013 NA NA NA
-## 5 -60.991 NA NA NA
-## 6 -61.002 NA NA NA
-## 7 -61.008 NA NA NA
-## 8 -61.003 NA NA NA
-## 9 -60.997 NA NA NA
-## 10 -60.969 NA NA NA
-## 11 -60.990 NA NA NA
-## 12 -60.967 NA NA NA
-## 13 -60.966 NA NA NA
-## 14 -60.962 NA NA NA
-## 15 -60.964 NA NA NA
-## 16 -60.977 NA NA NA
-## 17 -60.975 NA NA NA
-## 18 -60.950 NA NA NA
-## 19 -60.982 NA NA NA
-## 20 -60.986 NA NA NA
-## 21 -60.967 NA NA NA
-## 22 -60.950 NA NA NA
-## 23 -60.952 NA NA NA
-## 24 -60.954 NA NA NA
-## 25 -60.955 NA NA NA
-## 26 -60.953 NA NA NA
-## 27 -60.953 NA NA NA
-## 28 -60.966 NA NA NA
-## 29 -60.955 NA NA NA
-## 30 -61.005 NA NA NA
-## 31 -60.968 NA NA NA
-## 32 -60.933 NA NA NA
-## 33 -60.970 NA NA NA
-## 34 -60.961 NA NA NA
-## 35 -60.964 NA NA NA
-## 36 -60.963 NA NA NA
-## 37 -60.963 NA NA NA
-## 38 -60.963 NA NA NA
-## 39 -60.977 NA NA NA
-## 40 -60.976 NA NA NA
-## 41 -60.929 NA NA NA
-## 42 -60.950 NA NA NA
-## 43 -60.951 NA NA NA
-## 44 -60.955 NA NA NA
-## 45 -60.925 NA NA NA
-## 46 -60.946 NA NA NA
-## 47 -60.992 NA NA NA
-## 48 -60.992 NA NA NA
-## 49 -61.000 NA NA NA
-## 50 -60.993 NA NA NA
-## 51 -60.988 NA NA NA
-## 52 -61.017 NA NA NA
-## 53 -60.986 NA NA NA
-## 54 -60.971 NA NA NA
-## 55 -60.954 NA NA NA
-## 56 -60.974 NA NA NA
-## 57 -60.948 NA NA NA
-## 58 -60.944 NA NA NA
-## 59 -60.956 NA NA NA
-## 60 -60.965 NA NA NA
-## 61 -60.965 NA NA NA
-## 62 -60.969 NA NA NA
-## 63 -60.967 NA NA NA
-## 64 -60.981 NA NA NA
-## 65 -60.951 NA NA NA
-## 66 -61.004 NA NA NA
-## 67 -60.953 NA NA NA
-## 68 -60.998 NA NA NA
-## 69 -60.955 NA NA NA
-## 70 -60.940 NA NA NA
-## 71 -60.944 NA NA NA
-## 72 -60.978 NA NA NA
-## 73 -61.002 NA NA NA
-## 74 -61.014 NA NA NA
-## 75 -60.999 NA NA NA
-## 76 -60.999 NA NA NA
-## 77 -60.963 NA NA NA
-## 78 -60.969 NA NA NA
-## 79 -60.959 NA NA NA
-## 80 -61.020 NA NA NA
-## 81 -60.910 NA NA NA
-## 82 -60.971 NA NA NA
-## 83 -61.004 NA NA NA
-## 84 -61.007 NA NA NA
-## 85 -61.002 NA NA NA
-## 86 -60.983 NA NA NA
-## 87 -60.938 NA NA NA
-## 88 -60.985 NA NA NA
-## 89 -60.973 NA NA NA
-## 90 -60.954 NA NA NA
-## 91 -60.905 NA NA NA
-## 92 -60.937 NA NA NA
-## 93 -60.989 NA NA NA
-## 94 -60.859 NA NA NA
-## 95 -61.075 NA NA NA
-## 96 -61.061 NA NA NA
-## 97 -61.045 NA NA NA
-## 98 -60.990 NA NA NA
-## 99 -60.980 NA NA NA
-## 100 -60.978 NA NA NA
-## 101 -60.943 NA NA NA
-## 102 -61.008 NA NA NA
-## 103 -60.844 NA NA NA
-## 104 -60.996 NA NA NA
-## 105 -61.099 NA NA NA
-## 106 -61.129 NA NA NA
-## 107 -61.097 NA NA NA
-## 108 -61.020 NA NA NA
-## 109 -61.025 NA NA NA
-## 110 -61.024 NA NA NA
-## 111 -60.996 NA NA NA
-## 112 -60.972 NA NA NA
-## 113 -61.020 NA NA NA
-## 114 -61.005 NA NA NA
-## 115 -61.040 NA NA NA
-## 116 -61.034 NA NA NA
-## 117 -60.994 NA NA NA
-## 118 -60.992 NA NA NA
-## 119 -60.993 NA NA NA
-## 120 -60.989 NA NA NA
-## 121 -60.989 NA NA NA
-## 122 -60.999 NA NA NA
-## 123 -61.007 NA NA NA
-## 124 -61.007 NA NA NA
-## 125 -61.009 NA NA NA
-## 126 -61.016 NA NA NA
-## 127 -61.011 NA NA NA
-## 128 -61.007 NA NA NA
-## 129 -60.993 NA NA NA
-## 130 -61.005 NA NA NA
-## 131 -60.976 NA NA NA
-## 132 -60.932 NA NA NA
-## 133 -60.922 NA NA NA
-## 134 -60.924 NA NA NA
-## 135 -60.923 NA NA NA
-## 136 -60.921 NA NA NA
-## 137 -60.880 NA NA NA
-## 138 -60.951 NA NA NA
-## 139 -60.948 NA NA NA
-## 140 -60.948 NA NA NA
-## 141 -60.976 NA NA NA
-## 142 -60.997 NA NA NA
-## 143 -61.013 NA NA NA
-## 144 -61.013 NA NA NA
-## 145 -60.979 NA NA NA
-## 146 -60.940 NA NA NA
-## 147 -61.091 NA NA NA
-## 148 -61.087 NA NA NA
-## 149 -61.174 NA NA NA
-## 150 -61.138 NA NA NA
-## 151 -61.146 NA NA NA
-## 152 -61.144 NA NA NA
-## 153 -61.262 NA NA NA
-## 154 -61.261 NA NA NA
-## 155 -61.271 NA NA NA
-## 156 -61.240 NA NA NA
-## 157 -61.172 NA NA NA
-## 158 -61.189 NA NA NA
-## 159 -61.166 NA NA NA
-## 160 -61.177 NA NA NA
-## 161 -61.181 NA NA NA
-## 162 -61.209 NA NA NA
-## 163 -61.206 NA NA NA
-## 164 -61.205 NA NA NA
-## 165 -61.200 NA NA NA
-## 166 -61.238 NA NA NA
-## 167 -61.273 NA NA NA
-## 168 -61.235 NA NA NA
-## 169 -61.381 NA NA NA
-## 170 -61.391 NA NA NA
-## 171 -61.308 NA NA NA
-## 172 -61.374 NA NA NA
-## 173 -61.278 NA NA NA
-## Error.Ellipse.orientation Offset Offset.orientation GPE.MSD GPE.U
-## 1 NA NA NA NA NA
-## 2 NA NA NA NA NA
-## 3 NA NA NA NA NA
-## 4 NA NA NA NA NA
-## 5 NA NA NA NA NA
-## 6 NA NA NA NA NA
-## 7 NA NA NA NA NA
-## 8 NA NA NA NA NA
-## 9 NA NA NA NA NA
-## 10 NA NA NA NA NA
-## 11 NA NA NA NA NA
-## 12 NA NA NA NA NA
-## 13 NA NA NA NA NA
-## 14 NA NA NA NA NA
-## 15 NA NA NA NA NA
-## 16 NA NA NA NA NA
-## 17 NA NA NA NA NA
-## 18 NA NA NA NA NA
-## 19 NA NA NA NA NA
-## 20 NA NA NA NA NA
-## 21 NA NA NA NA NA
-## 22 NA NA NA NA NA
-## 23 NA NA NA NA NA
-## 24 NA NA NA NA NA
-## 25 NA NA NA NA NA
-## 26 NA NA NA NA NA
-## 27 NA NA NA NA NA
-## 28 NA NA NA NA NA
-## 29 NA NA NA NA NA
-## 30 NA NA NA NA NA
-## 31 NA NA NA NA NA
-## 32 NA NA NA NA NA
-## 33 NA NA NA NA NA
-## 34 NA NA NA NA NA
-## 35 NA NA NA NA NA
-## 36 NA NA NA NA NA
-## 37 NA NA NA NA NA
-## 38 NA NA NA NA NA
-## 39 NA NA NA NA NA
-## 40 NA NA NA NA NA
-## 41 NA NA NA NA NA
-## 42 NA NA NA NA NA
-## 43 NA NA NA NA NA
-## 44 NA NA NA NA NA
-## 45 NA NA NA NA NA
-## 46 NA NA NA NA NA
-## 47 NA NA NA NA NA
-## 48 NA NA NA NA NA
-## 49 NA NA NA NA NA
-## 50 NA NA NA NA NA
-## 51 NA NA NA NA NA
-## 52 NA NA NA NA NA
-## 53 NA NA NA NA NA
-## 54 NA NA NA NA NA
-## 55 NA NA NA NA NA
-## 56 NA NA NA NA NA
-## 57 NA NA NA NA NA
-## 58 NA NA NA NA NA
-## 59 NA NA NA NA NA
-## 60 NA NA NA NA NA
-## 61 NA NA NA NA NA
-## 62 NA NA NA NA NA
-## 63 NA NA NA NA NA
-## 64 NA NA NA NA NA
-## 65 NA NA NA NA NA
-## 66 NA NA NA NA NA
-## 67 NA NA NA NA NA
-## 68 NA NA NA NA NA
-## 69 NA NA NA NA NA
-## 70 NA NA NA NA NA
-## 71 NA NA NA NA NA
-## 72 NA NA NA NA NA
-## 73 NA NA NA NA NA
-## 74 NA NA NA NA NA
-## 75 NA NA NA NA NA
-## 76 NA NA NA NA NA
-## 77 NA NA NA NA NA
-## 78 NA NA NA NA NA
-## 79 NA NA NA NA NA
-## 80 NA NA NA NA NA
-## 81 NA NA NA NA NA
-## 82 NA NA NA NA NA
-## 83 NA NA NA NA NA
-## 84 NA NA NA NA NA
-## 85 NA NA NA NA NA
-## 86 NA NA NA NA NA
-## 87 NA NA NA NA NA
-## 88 NA NA NA NA NA
-## 89 NA NA NA NA NA
-## 90 NA NA NA NA NA
-## 91 NA NA NA NA NA
-## 92 NA NA NA NA NA
-## 93 NA NA NA NA NA
-## 94 NA NA NA NA NA
-## 95 NA NA NA NA NA
-## 96 NA NA NA NA NA
-## 97 NA NA NA NA NA
-## 98 NA NA NA NA NA
-## 99 NA NA NA NA NA
-## 100 NA NA NA NA NA
-## 101 NA NA NA NA NA
-## 102 NA NA NA NA NA
-## 103 NA NA NA NA NA
-## 104 NA NA NA NA NA
-## 105 NA NA NA NA NA
-## 106 NA NA NA NA NA
-## 107 NA NA NA NA NA
-## 108 NA NA NA NA NA
-## 109 NA NA NA NA NA
-## 110 NA NA NA NA NA
-## 111 NA NA NA NA NA
-## 112 NA NA NA NA NA
-## 113 NA NA NA NA NA
-## 114 NA NA NA NA NA
-## 115 NA NA NA NA NA
-## 116 NA NA NA NA NA
-## 117 NA NA NA NA NA
-## 118 NA NA NA NA NA
-## 119 NA NA NA NA NA
-## 120 NA NA NA NA NA
-## 121 NA NA NA NA NA
-## 122 NA NA NA NA NA
-## 123 NA NA NA NA NA
-## 124 NA NA NA NA NA
-## 125 NA NA NA NA NA
-## 126 NA NA NA NA NA
-## 127 NA NA NA NA NA
-## 128 NA NA NA NA NA
-## 129 NA NA NA NA NA
-## 130 NA NA NA NA NA
-## 131 NA NA NA NA NA
-## 132 NA NA NA NA NA
-## 133 NA NA NA NA NA
-## 134 NA NA NA NA NA
-## 135 NA NA NA NA NA
-## 136 NA NA NA NA NA
-## 137 NA NA NA NA NA
-## 138 NA NA NA NA NA
-## 139 NA NA NA NA NA
-## 140 NA NA NA NA NA
-## 141 NA NA NA NA NA
-## 142 NA NA NA NA NA
-## 143 NA NA NA NA NA
-## 144 NA NA NA NA NA
-## 145 NA NA NA NA NA
-## 146 NA NA NA NA NA
-## 147 NA NA NA NA NA
-## 148 NA NA NA NA NA
-## 149 NA NA NA NA NA
-## 150 NA NA NA NA NA
-## 151 NA NA NA NA NA
-## 152 NA NA NA NA NA
-## 153 NA NA NA NA NA
-## 154 NA NA NA NA NA
-## 155 NA NA NA NA NA
-## 156 NA NA NA NA NA
-## 157 NA NA NA NA NA
-## 158 NA NA NA NA NA
-## 159 NA NA NA NA NA
-## 160 NA NA NA NA NA
-## 161 NA NA NA NA NA
-## 162 NA NA NA NA NA
-## 163 NA NA NA NA NA
-## 164 NA NA NA NA NA
-## 165 NA NA NA NA NA
-## 166 NA NA NA NA NA
-## 167 NA NA NA NA NA
-## 168 NA NA NA NA NA
-## 169 NA NA NA NA NA
-## 170 NA NA NA NA NA
-## 171 NA NA NA NA NA
-## 172 NA NA NA NA NA
-## 173 NA NA NA NA NA
-## Comment Errorradius Count
-## 1 NA NA
-## 2 NA NA
-## 3 NA NA
-## 4 NA NA
-## 5 NA NA
-## 6 NA NA
-## 7 NA NA
-## 8 NA NA
-## 9 NA NA
-## 10 NA NA
-## 11 NA NA
-## 12 NA NA
-## 13 NA NA
-## 14 NA NA
-## 15 NA NA
-## 16 NA NA
-## 17 NA NA
-## 18 NA NA
-## 19 NA NA
-## 20 NA NA
-## 21 NA NA
-## 22 NA NA
-## 23 NA NA
-## 24 NA NA
-## 25 NA NA
-## 26 NA NA
-## 27 NA NA
-## 28 NA NA
-## 29 NA NA
-## 30 NA NA
-## 31 NA NA
-## 32 NA NA
-## 33 NA NA
-## 34 NA NA
-## 35 NA NA
-## 36 NA NA
-## 37 NA NA
-## 38 NA NA
-## 39 NA NA
-## 40 NA NA
-## 41 NA NA
-## 42 NA NA
-## 43 NA NA
-## 44 NA NA
-## 45 Lat > 4 deviations from mean NA NA
-## 46 NA NA
-## 47 NA NA
-## 48 NA NA
-## 49 NA NA
-## 50 NA NA
-## 51 NA NA
-## 52 NA NA
-## 53 NA NA
-## 54 NA NA
-## 55 NA NA
-## 56 NA NA
-## 57 NA NA
-## 58 NA NA
-## 59 NA NA
-## 60 NA NA
-## 61 NA NA
-## 62 NA NA
-## 63 NA NA
-## 64 NA NA
-## 65 NA NA
-## 66 NA NA
-## 67 NA NA
-## 68 NA NA
-## 69 NA NA
-## 70 NA NA
-## 71 NA NA
-## 72 NA NA
-## 73 NA NA
-## 74 NA NA
-## 75 NA NA
-## 76 NA NA
-## 77 NA NA
-## 78 NA NA
-## 79 NA NA
-## 80 NA NA
-## 81 NA NA
-## 82 NA NA
-## 83 NA NA
-## 84 NA NA
-## 85 NA NA
-## 86 NA NA
-## 87 NA NA
-## 88 NA NA
-## 89 NA NA
-## 90 NA NA
-## 91 NA NA
-## 92 NA NA
-## 93 NA NA
-## 94 NA NA
-## 95 NA NA
-## 96 NA NA
-## 97 NA NA
-## 98 NA NA
-## 99 NA NA
-## 100 NA NA
-## 101 NA NA
-## 102 NA NA
-## 103 NA NA
-## 104 NA NA
-## 105 NA NA
-## 106 NA NA
-## 107 NA NA
-## 108 NA NA
-## 109 NA NA
-## 110 NA NA
-## 111 NA NA
-## 112 NA NA
-## 113 NA NA
-## 114 NA NA
-## 115 NA NA
-## 116 NA NA
-## 117 NA NA
-## 118 NA NA
-## 119 NA NA
-## 120 NA NA
-## 121 NA NA
-## 122 NA NA
-## 123 NA NA
-## 124 NA NA
-## 125 NA NA
-## 126 NA NA
-## 127 NA NA
-## 128 NA NA
-## 129 NA NA
-## 130 NA NA
-## 131 NA NA
-## 132 NA NA
-## 133 NA NA
-## 134 NA NA
-## 135 NA NA
-## 136 NA NA
-## 137 NA NA
-## 138 NA NA
-## 139 NA NA
-## 140 NA NA
-## 141 NA NA
-## 142 NA NA
-## 143 NA NA
-## 144 NA NA
-## 145 NA NA
-## 146 NA NA
-## 147 NA NA
-## 148 NA NA
-## 149 NA NA
-## 150 NA NA
-## 151 NA NA
-## 152 NA NA
-## 153 NA NA
-## 154 NA NA
-## 155 NA NA
-## 156 NA NA
-## 157 NA NA
-## 158 NA NA
-## 159 NA NA
-## 160 NA NA
-## 161 NA NA
-## 162 NA NA
-## 163 NA NA
-## 164 NA NA
-## 165 NA NA
-## 166 NA NA
-## 167 NA NA
-## 168 NA NA
-## 169 NA NA
-## 170 NA NA
-## 171 NA NA
-## 172 NA NA
-## 173 NA NA
-## ID DeployID Ptt DepthSensor Source Instr Count
-## 1 1 131111 131111 0.5 Transmission Mk10 1
-## 2 1 131111 131111 0.5 Transmission Mk10 1
-## 3 1 131111 131111 0.5 Transmission Mk10 1
-## 4 1 131111 131111 0.5 Transmission Mk10 1
-## 5 1 131111 131111 0.5 Transmission Mk10 1
-## Start End What Number Shape DepthMin
-## 1 23:47:00 21-Mar-2016 23:49:10 21-Mar-2016 Dive 1 U 19.5
-## 2 23:52:58 21-Mar-2016 23:59:32 21-Mar-2016 Dive 1 U 284.0
-## 3 23:51:04 21-Mar-2016 23:52:30 21-Mar-2016 Dive 1 U 26.5
-## 4 00:10:44 22-Mar-2016 00:12:16 22-Mar-2016 Dive 1 U 20.0
-## 5 00:04:00 22-Mar-2016 00:08:50 22-Mar-2016 Dive 1 U 25.5
-## DepthMax DurationMin DurationMax Number.1 Shape.1 DepthMin.1 DepthMax.1
-## 1 19.5 129 131 NA NA NA NA
-## 2 291.5 393 395 NA NA NA NA
-## 3 27.0 85 87 NA NA NA NA
-## 4 20.0 91 93 NA NA NA NA
-## 5 26.0 289 291 NA NA NA NA
-## DurationMin.1 DurationMax.1 Number.2 Shape.2 DepthMin.2 DepthMax.2
-## 1 NA NA NA NA NA NA
-## 2 NA NA NA NA NA NA
-## 3 NA NA NA NA NA NA
-## 4 NA NA NA NA NA NA
-## 5 NA NA NA NA NA NA
-## DurationMin.2 DurationMax.2 Shallow Deep GMTtime
-## 1 NA NA NA NA 2016-03-21 23:49:10
-## 2 NA NA NA NA 2016-03-21 23:59:32
-## 3 NA NA NA NA 2016-03-21 23:52:30
-## 4 NA NA NA NA 2016-03-22 00:12:16
-## 5 NA NA NA NA 2016-03-22 00:08:50
-## timestamp Month Hour Year Date Animal Quality
-## 1 2016-03-21 23:49:10 March 23 2016 2016-03-22 00:13:20 131111 <NA>
-## 2 2016-03-21 23:59:32 March 23 2016 2016-03-22 00:13:20 131111 <NA>
-## 3 2016-03-21 23:52:30 March 23 2016 2016-03-22 00:13:20 131111 <NA>
-## 4 2016-03-22 00:12:16 March 00 2016 2016-03-22 00:13:20 131111 <NA>
-## 5 2016-03-22 00:08:50 March 00 2016 2016-03-22 00:13:20 131111 <NA>
-## Latitude Longitude
-## 1 NA NA
-## 2 NA NA
-## 3 NA NA
-## 4 NA NA
-## 5 NA NA
-## DeployID Ptt DepthSensor Source Instr Count
-## 1 131111 131111 0.5 Transmission Mk10 1
-## Start End What Number Shape DepthMin
-## 1 23:47:00 21-Mar-2016 00:13:20 22-Mar-2016 Message 10 NA
-## DepthMax DurationMin DurationMax Number.1 Shape.1 DepthMin.1 DepthMax.1
-## 1 NA 1570 1590 NA NA NA NA
-## DurationMin.1 DurationMax.1 Number.2 Shape.2 DepthMin.2 DepthMax.2
-## 1 NA NA NA NA NA NA
-## DurationMin.2 DurationMax.2 Shallow Deep GMTtime
-## 1 NA NA NA NA 2016-03-22 00:13:20
-## timestamp Month Hour Year ID
-## 1 2016-03-22 00:13:20 March 00 2016 1
+\[logit(\phi_{traveling}) = \alpha_{Behavior_{t-1}}\] The behavior at time t of individual i on track g is a discrete draw. \[S_{i,g,t} \sim Cat(\phi_{traveling},\phi_{foraging})\]
+Dive information is a mixture model based on behavior (S)
+\(Average dive depth (\psi)\) \[ \psi \sim Normal(dive_{\mu_S},dive_{\tau_S})\]
+\(\text{Average number of dives }(\omega)\) \[ \omega \sim Poisson(\lambda_S)\]
sink(“Bayesian/Diving.jags”) cat(" model{
pi <- 3.141592653589
@@ -1126,6 +212,9 @@ 2.4 Distribution of dive depths
#Gaussian Displacement in location
y[i,g,t+1,1:2] ~ dmnorm(d[i,g,t,1:2],iSigma)
+#number of dives
+divecount[i,g,t] ~ dpois(lambda_count[state[i,g,t]])
+
}
#Final behavior state
@@ -1191,8 +280,8 @@ 2.4 Distribution of dive depths
lambda[1] ~ dbeta(1,1)
lambda[2] <- 1 - lambda[1]
-#Depth Priors
-#average depth
+#Dive Priors
+#average max depth
depth_mu[1] ~ dnorm(0,0.0001)
#we know that foraging dives are deeper
@@ -1203,6 +292,10 @@ 2.4 Distribution of dive depths
depth_tau[1] ~ dgamma(0.0001,0.0001)
depth_tau[2] ~ dgamma(0.0001,0.0001)
+#Dive counts, there can't be more than about 20 dives in a 6 hour period.
+lambda_count[1] ~ dunif(0,20)
+lambda_count[2] ~ dunif(0,20)
+
##Argos priors##
#longitudinal argos precision, from Jonsen 2005, 2016, represented as precision not sd
@@ -1226,26 +319,39 @@ 2.4 Distribution of dive depths
,fill=TRUE)
sink()
## user system elapsed
-## 9.68 1.89 730.33
+## 8.43 1.36 1457.82
+This allows us to specify the hours foraging while capturing our uncertainty in behavioral states
+For example, if we wanted to know how many hours an animal was predicted to forage on average over a 10 day span. We can draw 100 simulations given the posterior distributions of our empirical model.
+## [1] "Mean foraging hours: 116.616"
+