<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Ecology in silico]]></title>
  <link href="http://mbjoseph.github.com/atom.xml" rel="self"/>
  <link href="http://mbjoseph.github.com/"/>
  <updated>2013-04-23T15:12:44-06:00</updated>
  <id>http://mbjoseph.github.com/</id>
  <author>
    <name><![CDATA[Maxwell B. Joseph]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Agent-based modeling in R - habitat diversity and species richness]]></title>
    <link href="http://mbjoseph.github.com/blog/2013/04/20/allouche/"/>
    <updated>2013-04-20T00:00:00-06:00</updated>
    <id>http://mbjoseph.github.com/blog/2013/04/20/allouche</id>
    <content type="html"><![CDATA[<p>How does habitat diversity affect species richness? Perhaps intuition 
suggests that habitat diversity increases 
species richness by facilitating niche or resource partitioning among 
species. But, for a fixed 
area, as habitat heterogeneity increases, the area that can be allocated to each 
habitat type decreases. In a recent paper, 
<a href="http://www.pnas.org/content/109/43/17495.abstract">Allouche and colleagues (2012)</a> 
provide a theoretical and empirical treatment of the habitat 
area-heterogeneity trade-off’s consequences for species richness. Both 
treatments of the subject indicated that the relationship between 
habitat heterogeneity and species richness may be unimodal, rather than 
strictly increasing. </p>

<p align="center">
  <img src="http://mbjoseph.github.com/images/heterogeneity_richness.png" />
</p>

<p>Conceptually, this is expected to occur when on the left side of the curve, 
increasing habitat heterogeneity opens up new regions in niche space, 
facilitating colonization by new species. However, as heterogeneity 
continues to increase, each species has fewer habitat patches to utilize,
population sizes decrease, and local extinction risk increases 
due to demographic stochasticity. To explore this idea theoretically, 
Allouche et al. (2012) developed an individually based model using
a continuous time Markov process. The details of their modeling approach 
can be found in 
<a href="http://www.pnas.org/content/suppl/2012/10/04/1208652109.DCSupplemental/sapp.pdf">the supplementary material</a> 
to <a href="http://www.pnas.org/content/109/43/17495">their article</a>, 
which I recommend. In this post, I’ll 
demonstrate how to implement a discrete time version of their model in R. 
Thanks to the agent-based modeling 
working group at the University of Colorado for providing motivation to 
code up model in R.</p>

<h4 id="model-structure">Model structure</h4>
<p>This model is spatially implicit, with <em>A</em> equally connected sites. 
Each site falls on an environmental condition axis, receiving 
some value <em>E</em> that characterizes local conditions. The environmental 
conditions for each site are uniformly distributed between two values that
dictate the range of environmental conditions in a focal area. The 
local range of environmental conditions is 
a subset of some global range. There are <em>N</em> species 
in the regional pool that can colonize habitat patches. Each species has 
some environmental optimum <script type="math/tex">\mu_i</script>, and some niche width <script type="math/tex">\sigma_i</script>, 
which together define a Gaussian function for the probability of 
establishment given a colonization attempt and a habitat patch 
environmental condition <em>E</em>.</p>

<p align="center">
  <img src="http://mbjoseph.github.com/images/niches.png" />
</p>

<p>The image above illustrates the probability of establishing for five 
species across the global range of environmental conditions possible. 
For any focal area, the realized 
range of environmental conditions is some subset of this global range.</p>

<p>It is assumed that all individuals that occupy a patch have the same 
per-timestep probabilities 
of death and reproduction. If an individual reproduces, the number of 
offspring it produces is a Poisson distributed random variable, and each 
individual offspring attempts to colonize one randomly selected site. 
At each time-step, every site has an equal probability of a colonization 
attempt by an individual from each species in the regional pool. Every 
habitat patch holds only one individual. </p>

<p>Offspring and immigrants from 
the regional pool do not displace individuals from habitat patches when 
they attempt to colonize. In empty sites, offspring receive 
colonization priority, 
with regional colonization occurring after breeding. When multiple 
offspring or immigrants from the regional pool could establish in 
an empty site, one successful individual is randomly chosen to establish 
regardless of species identity. </p>

<h4 id="parameters">Parameters</h4>
<p>The following parameters are supplied to the function 
<code>alloucheIBM()</code>:</p>

<p><code>A</code> = number of sites;
<code>N</code> = number of species in the regional pool;
<code>ERmin</code> = global environmental conditions minimum;
<code>ERmax</code> = global environmental conditions maximum;
<code>Emin</code> = local environmental minimum;
<code>Emax</code> = local environmental maximum;
<code>sig</code> = niche width standard deviation for all species;
<code>pM</code> = per timestep probability of mortality;
<code>pR</code> = per timestep probability of reproduction;
<code>R</code> = per capita expected number of offspring; and 
<code>I</code> = per timestep probability of attempted colonization by an immigrant 
from the regional pool for each patch.</p>

<h4 id="implementation-in-r">Implementation in R</h4>
<p>The function <code>alloucheIBM()</code> does the majority of work for this model:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
<span class="line-number">51</span>
<span class="line-number">52</span>
<span class="line-number">53</span>
<span class="line-number">54</span>
<span class="line-number">55</span>
<span class="line-number">56</span>
<span class="line-number">57</span>
<span class="line-number">58</span>
<span class="line-number">59</span>
<span class="line-number">60</span>
<span class="line-number">61</span>
<span class="line-number">62</span>
<span class="line-number">63</span>
<span class="line-number">64</span>
<span class="line-number">65</span>
<span class="line-number">66</span>
<span class="line-number">67</span>
<span class="line-number">68</span>
<span class="line-number">69</span>
<span class="line-number">70</span>
<span class="line-number">71</span>
<span class="line-number">72</span>
<span class="line-number">73</span>
<span class="line-number">74</span>
<span class="line-number">75</span>
<span class="line-number">76</span>
<span class="line-number">77</span>
<span class="line-number">78</span>
<span class="line-number">79</span>
<span class="line-number">80</span>
<span class="line-number">81</span>
<span class="line-number">82</span>
<span class="line-number">83</span>
<span class="line-number">84</span>
<span class="line-number">85</span>
<span class="line-number">86</span>
<span class="line-number">87</span>
<span class="line-number">88</span>
<span class="line-number">89</span>
<span class="line-number">90</span>
<span class="line-number">91</span>
<span class="line-number">92</span>
<span class="line-number">93</span>
<span class="line-number">94</span>
<span class="line-number">95</span>
<span class="line-number">96</span>
<span class="line-number">97</span>
<span class="line-number">98</span>
<span class="line-number">99</span>
<span class="line-number">100</span>
<span class="line-number">101</span>
<span class="line-number">102</span>
<span class="line-number">103</span>
<span class="line-number">104</span>
<span class="line-number">105</span>
<span class="line-number">106</span>
<span class="line-number">107</span>
<span class="line-number">108</span>
<span class="line-number">109</span>
<span class="line-number">110</span>
<span class="line-number">111</span>
<span class="line-number">112</span>
<span class="line-number">113</span>
<span class="line-number">114</span>
<span class="line-number">115</span>
<span class="line-number">116</span>
<span class="line-number">117</span>
<span class="line-number">118</span>
<span class="line-number">119</span>
<span class="line-number">120</span>
<span class="line-number">121</span>
<span class="line-number">122</span>
<span class="line-number">123</span>
<span class="line-number">124</span>
<span class="line-number">125</span>
<span class="line-number">126</span>
<span class="line-number">127</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">alloucheIBM <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>A<span class="o">=</span><span class="m">100</span><span class="p">,</span> N<span class="o">=</span><span class="m">100</span><span class="p">,</span> ERmin<span class="o">=</span><span class="m">-30</span><span class="p">,</span> ERmax<span class="o">=</span><span class="m">30</span><span class="p">,</span> Emin<span class="o">=</span><span class="m">-30</span><span class="p">,</span> Emax<span class="o">=</span><span class="m">30</span><span class="p">,</span>
</span><span class="line">                    sig<span class="o">=</span><span class="m">5</span><span class="p">,</span> timesteps<span class="o">=</span><span class="m">1000</span><span class="p">,</span> pM<span class="o">=</span><span class="m">.1</span><span class="p">,</span> pR<span class="o">=</span><span class="m">1</span><span class="p">,</span> R<span class="o">=</span><span class="m">2</span><span class="p">,</span> I<span class="o">=</span><span class="m">0.1</span><span class="p">){</span>
</span><span class="line">  E <span class="o">&lt;-</span> runif<span class="p">(</span>A<span class="p">,</span> Emin<span class="p">,</span> Emax<span class="p">)</span> <span class="c1"># habitat patch environment type</span>
</span><span class="line">  mu.i <span class="o">&lt;-</span> runif<span class="p">(</span>N<span class="p">,</span> ERmin<span class="p">,</span> ERmax<span class="p">)</span> <span class="c1"># optimum environment</span>
</span><span class="line">  sigma <span class="o">&lt;-</span> rep<span class="p">(</span>sig<span class="p">,</span> N<span class="p">)</span> <span class="c1"># niche width</span>
</span><span class="line">  Z <span class="o">&lt;-</span> array<span class="p">(</span>dim<span class="o">=</span>c<span class="p">(</span>N<span class="p">))</span> <span class="c1"># normalization constant</span>
</span><span class="line">
</span><span class="line">  <span class="c1"># Z ensures all species have equal Pr(establishment) in regional pool</span>
</span><span class="line">  <span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>N<span class="p">){</span>
</span><span class="line">    integrand <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>E<span class="p">)</span> <span class="p">{</span>
</span><span class="line">      exp<span class="p">(</span><span class="o">-</span><span class="p">((</span>E <span class="o">-</span> mu.i<span class="p">[</span>i<span class="p">])</span> <span class="o">^</span> <span class="m">2</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="m">2</span> <span class="o">*</span> sigma<span class="p">[</span>i<span class="p">]</span> <span class="o">^</span> <span class="m">2</span><span class="p">))</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    res <span class="o">&lt;-</span> integrate<span class="p">(</span>integrand<span class="p">,</span> lower<span class="o">=</span>ERmin<span class="p">,</span> upper<span class="o">=</span>ERmax<span class="p">)</span>
</span><span class="line">    Z<span class="p">[</span>i<span class="p">]</span> <span class="o">&lt;-</span> <span class="m">1</span> <span class="o">/</span> res<span class="o">$</span>value
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line">  <span class="c1"># probability of establishment|colonization attempt</span>
</span><span class="line">  Pcol <span class="o">&lt;-</span> array<span class="p">(</span>dim<span class="o">=</span>c<span class="p">(</span>A<span class="p">,</span> N<span class="p">))</span>
</span><span class="line">  <span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>A<span class="p">){</span>
</span><span class="line">    <span class="kr">for</span> <span class="p">(</span>j <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>N<span class="p">){</span>
</span><span class="line">      Pcol<span class="p">[</span>i<span class="p">,</span> j<span class="p">]</span> <span class="o">&lt;-</span> Z<span class="p">[</span>j<span class="p">]</span> <span class="o">*</span> exp<span class="p">(</span><span class="o">-</span><span class="p">((</span>E<span class="p">[</span>i<span class="p">]</span> <span class="o">-</span> mu.i<span class="p">[</span>j<span class="p">])</span> <span class="o">^</span> <span class="m">2</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="m">2</span><span class="o">*</span>sigma<span class="p">[</span>j<span class="p">]</span> <span class="o">^</span> <span class="m">2</span><span class="p">))</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line">  <span class="c1"># store niche data</span>
</span><span class="line">  species <span class="o">&lt;-</span> rep<span class="p">(</span><span class="m">1</span><span class="o">:</span>N<span class="p">,</span> each<span class="o">=</span>A<span class="p">)</span>
</span><span class="line">  E <span class="o">&lt;-</span> rep<span class="p">(</span>E<span class="p">,</span> N<span class="p">)</span>
</span><span class="line">  Pr.estab <span class="o">&lt;-</span> c<span class="p">(</span>Pcol<span class="p">)</span>
</span><span class="line">  niche.d <span class="o">&lt;-</span> data.frame<span class="p">(</span>species<span class="p">,</span> E<span class="p">,</span> Pr.estab<span class="p">)</span>
</span><span class="line">  niche.d <span class="o">&lt;-</span> niche.d<span class="p">[</span>with<span class="p">(</span>niche.d<span class="p">,</span> order<span class="p">(</span>species<span class="p">,</span> E<span class="p">)),]</span>
</span><span class="line">
</span><span class="line">  <span class="c1"># initialize output</span>
</span><span class="line">  state <span class="o">&lt;-</span> array<span class="p">(</span><span class="m">0</span><span class="p">,</span> dim<span class="o">=</span>c<span class="p">(</span>timesteps<span class="p">,</span> A<span class="p">,</span> N<span class="p">))</span>
</span><span class="line">  richness <span class="o">&lt;-</span> rep<span class="p">(</span><span class="kc">NA</span><span class="p">,</span> timesteps<span class="p">)</span>
</span><span class="line">  richness<span class="p">[</span><span class="m">1</span><span class="p">]</span> <span class="o">&lt;-</span> <span class="m">0</span>
</span><span class="line">  p.occ <span class="o">&lt;-</span> rep<span class="p">(</span><span class="kc">NA</span><span class="p">,</span> timesteps<span class="p">)</span>
</span><span class="line">  p.occ<span class="p">[</span><span class="m">1</span><span class="p">]</span> <span class="o">&lt;-</span> <span class="m">0</span>
</span><span class="line">
</span><span class="line">  <span class="kr">for</span> <span class="p">(</span>t <span class="kr">in</span> <span class="m">2</span><span class="o">:</span>timesteps<span class="p">){</span>
</span><span class="line">    state<span class="p">[</span>t<span class="p">,,]</span> <span class="o">&lt;-</span> state<span class="p">[</span>t<span class="m">-1</span><span class="p">,,]</span>
</span><span class="line">
</span><span class="line">    <span class="c1">## DEATHS ##</span>
</span><span class="line">    deaths <span class="o">&lt;-</span> array<span class="p">(</span>rbinom<span class="p">(</span>A<span class="o">*</span>N<span class="p">,</span> <span class="m">1</span><span class="p">,</span> c<span class="p">(</span>state<span class="p">[</span>t<span class="p">,,])</span><span class="o">*</span>pM<span class="p">),</span> dim<span class="o">=</span>c<span class="p">(</span>A<span class="p">,</span> N<span class="p">))</span>
</span><span class="line">    state<span class="p">[</span>t<span class="p">,,]</span> <span class="o">&lt;-</span> state<span class="p">[</span>t<span class="p">,,]</span> <span class="o">-</span> deaths
</span><span class="line">
</span><span class="line">    <span class="c1">## BIRTHS ##</span>
</span><span class="line">    pot.fecundity <span class="o">&lt;-</span> array<span class="p">(</span>rpois<span class="p">(</span>A <span class="o">*</span> N<span class="p">,</span> lambda <span class="o">=</span> c<span class="p">(</span>state<span class="p">[</span>t<span class="p">,,]</span> <span class="o">*</span> R<span class="p">)),</span> dim<span class="o">=</span>c<span class="p">(</span>A<span class="p">,</span> N<span class="p">))</span>
</span><span class="line">    repro <span class="o">&lt;-</span> array<span class="p">(</span>rbinom<span class="p">(</span>A<span class="o">*</span>N<span class="p">,</span> <span class="m">1</span><span class="p">,</span> pR<span class="p">),</span> dim<span class="o">=</span>c<span class="p">(</span>A<span class="p">,</span> N<span class="p">))</span>
</span><span class="line">    fecundity <span class="o">&lt;-</span> repro <span class="o">*</span> pot.fecundity
</span><span class="line">    sum.fec <span class="o">&lt;-</span> apply<span class="p">(</span>fecundity<span class="p">,</span> <span class="m">2</span><span class="p">,</span> sum<span class="p">)</span> <span class="c1"># number of offspring per species</span>
</span><span class="line">
</span><span class="line">    <span class="c1">## OFFSPRING COLONIZE ##</span>
</span><span class="line">    occupancy <span class="o">&lt;-</span> apply<span class="p">(</span>state<span class="p">[</span>t<span class="p">,,],</span> <span class="m">1</span><span class="p">,</span> max<span class="p">)</span>
</span><span class="line">    <span class="kr">if</span> <span class="p">(</span>sum<span class="p">(</span>occupancy<span class="p">)</span> <span class="o">&lt;</span> A <span class="o">&amp;</span> sum<span class="p">(</span>sum.fec<span class="p">)</span> <span class="o">&gt;</span> <span class="m">0</span><span class="p">){</span> <span class="c1"># if empty sites &amp; new offspring</span>
</span><span class="line">      empty.sites <span class="o">&lt;-</span> which<span class="p">(</span>occupancy <span class="o">==</span> <span class="m">0</span><span class="p">)</span>
</span><span class="line">      occ.sites <span class="o">&lt;-</span> which<span class="p">(</span>occupancy <span class="o">==</span> <span class="m">1</span><span class="p">)</span>
</span><span class="line">      <span class="c1"># randomly assign sites (empty &amp; filled) to each offspring individual</span>
</span><span class="line">      col.sites <span class="o">&lt;-</span> sample<span class="p">(</span><span class="m">1</span><span class="o">:</span>A<span class="p">,</span> sum<span class="p">(</span>sum.fec<span class="p">),</span> replace<span class="o">=</span><span class="k-Variable">T</span><span class="p">)</span>
</span><span class="line">      col.spec <span class="o">&lt;-</span> rep<span class="p">(</span><span class="m">1</span><span class="o">:</span>N<span class="p">,</span> times<span class="o">=</span>sum.fec<span class="p">)</span> <span class="c1"># how many of each species colonizing</span>
</span><span class="line">      colonizing.offspring <span class="o">&lt;-</span> array<span class="p">(</span><span class="m">0</span><span class="p">,</span> dim<span class="o">=</span>c<span class="p">(</span>A<span class="p">,</span> N<span class="p">))</span>
</span><span class="line">      <span class="kr">for</span><span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>length<span class="p">(</span>col.sites<span class="p">)){</span>
</span><span class="line">        colonizing.offspring<span class="p">[</span>col.sites<span class="p">[</span>i<span class="p">],</span> col.spec<span class="p">[</span>i<span class="p">]]</span> <span class="o">&lt;-</span>
</span><span class="line">          colonizing.offspring<span class="p">[</span>col.sites<span class="p">[</span>i<span class="p">],</span> col.spec<span class="p">[</span>i<span class="p">]]</span> <span class="o">+</span> <span class="m">1</span>
</span><span class="line">      <span class="p">}</span>
</span><span class="line">      <span class="c1"># offspring attempting to colonize occupied sites fail to displace</span>
</span><span class="line">      colonizing.offspring<span class="p">[</span>occ.sites<span class="p">,]</span> <span class="o">&lt;-</span> <span class="m">0</span>
</span><span class="line">
</span><span class="line">      <span class="c1"># which colonizing offspring can actually establish?</span>
</span><span class="line">      binom.mat <span class="o">&lt;-</span> ifelse<span class="p">(</span>colonizing.offspring <span class="o">&gt;</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> <span class="m">0</span><span class="p">)</span>
</span><span class="line">      colonists <span class="o">&lt;-</span> array<span class="p">(</span>rbinom<span class="p">(</span>n <span class="o">=</span> A <span class="o">*</span> N<span class="p">,</span>
</span><span class="line">                                size <span class="o">=</span> c<span class="p">(</span>colonizing.offspring<span class="p">),</span>
</span><span class="line">                                prob <span class="o">=</span> c<span class="p">(</span>binom.mat <span class="o">*</span> Pcol<span class="p">)),</span>
</span><span class="line">                         dim<span class="o">=</span>c<span class="p">(</span>A<span class="p">,</span> N<span class="p">))</span>
</span><span class="line">
</span><span class="line">      <span class="c1"># are there colonization conflicts (&gt; 1 individual trying to colonize each site?)</span>
</span><span class="line">      attempting <span class="o">&lt;-</span> apply<span class="p">(</span>colonists<span class="p">,</span> <span class="m">1</span><span class="p">,</span> sum<span class="p">)</span>
</span><span class="line">      <span class="kr">if</span> <span class="p">(</span>any<span class="p">(</span>attempting <span class="o">&gt;</span> <span class="m">1</span><span class="p">)){</span>
</span><span class="line">        <span class="c1"># resolve colonization conflicts</span>
</span><span class="line">        conflicts <span class="o">&lt;-</span> which<span class="p">(</span>attempting <span class="o">&gt;</span> <span class="m">1</span><span class="p">)</span> <span class="c1"># which sites have conflicts</span>
</span><span class="line">        <span class="kr">for</span> <span class="p">(</span>k <span class="kr">in</span> conflicts<span class="p">){</span> <span class="c1"># for each conflict</span>
</span><span class="line">          <span class="c1"># how many indiv&#39;s of each spp attempting to simultaneously colonize?</span>
</span><span class="line">          n.attempting <span class="o">&lt;-</span> rep<span class="p">(</span><span class="m">1</span><span class="o">:</span>N<span class="p">,</span> times <span class="o">=</span> colonists<span class="p">[</span>k<span class="p">,])</span>
</span><span class="line">          <span class="c1"># randomly select one successful from those attempting</span>
</span><span class="line">          successful <span class="o">&lt;-</span> sample<span class="p">(</span>n.attempting<span class="p">,</span> size<span class="o">=</span><span class="m">1</span><span class="p">)</span>
</span><span class="line">          new.row <span class="o">&lt;-</span> rep<span class="p">(</span><span class="m">0</span><span class="p">,</span> length.out<span class="o">=</span>N<span class="p">)</span>
</span><span class="line">          new.row<span class="p">[</span>successful<span class="p">]</span> <span class="o">&lt;-</span> <span class="m">1</span>
</span><span class="line">          colonists<span class="p">[</span>k<span class="p">,]</span> <span class="o">&lt;-</span> new.row <span class="c1"># individual becomes the only colonist</span>
</span><span class="line">        <span class="p">}</span>
</span><span class="line">      <span class="p">}</span>
</span><span class="line">      <span class="c1"># add successful colonists</span>
</span><span class="line">      state<span class="p">[</span>t<span class="p">,,]</span> <span class="o">&lt;-</span> state<span class="p">[</span>t<span class="p">,,]</span> <span class="o">+</span> colonists
</span><span class="line">    <span class="p">}</span>
</span><span class="line">
</span><span class="line">    <span class="c1">## IMMIGRANTS COLONIZE ##</span>
</span><span class="line">    occupancy <span class="o">&lt;-</span> apply<span class="p">(</span>state<span class="p">[</span>t<span class="p">,,],</span> <span class="m">1</span><span class="p">,</span> max<span class="p">)</span>
</span><span class="line">    <span class="kr">if</span><span class="p">(</span>sum<span class="p">(</span>occupancy<span class="p">)</span> <span class="o">&lt;</span> A<span class="p">){</span>
</span><span class="line">      empty.sites <span class="o">&lt;-</span> which<span class="p">(</span>occupancy <span class="o">==</span> <span class="m">0</span><span class="p">)</span>
</span><span class="line">      <span class="c1"># which species immigrate to each site?</span>
</span><span class="line">      immigration <span class="o">&lt;-</span> array<span class="p">(</span>rbinom<span class="p">(</span>length<span class="p">(</span>empty.sites<span class="p">)</span><span class="o">*</span>N<span class="p">,</span>
</span><span class="line">                                  <span class="m">1</span><span class="p">,</span> I<span class="p">),</span> dim<span class="o">=</span>c<span class="p">(</span>length<span class="p">(</span>empty.sites<span class="p">),</span> N<span class="p">))</span>
</span><span class="line">      <span class="c1"># which immigrants establish?</span>
</span><span class="line">      Pest <span class="o">&lt;-</span> immigration <span class="o">*</span> Pcol<span class="p">[</span>empty.sites<span class="p">,</span> <span class="p">]</span>
</span><span class="line">      establishment <span class="o">&lt;-</span> array<span class="p">(</span>rbinom<span class="p">(</span>length<span class="p">(</span>Pest<span class="p">),</span> <span class="m">1</span><span class="p">,</span> c<span class="p">(</span>Pest<span class="p">)),</span>
</span><span class="line">                             dim<span class="o">=</span>c<span class="p">(</span>length<span class="p">(</span>empty.sites<span class="p">),</span> N<span class="p">))</span>
</span><span class="line">
</span><span class="line">      <span class="c1"># resolve conflicts arising from simultaneous colonization</span>
</span><span class="line">      col.attempts <span class="o">&lt;-</span> apply<span class="p">(</span>establishment<span class="p">,</span> <span class="m">1</span><span class="p">,</span> sum<span class="p">)</span>
</span><span class="line">      <span class="kr">if</span> <span class="p">(</span>any<span class="p">(</span>col.attempts <span class="o">&gt;</span> <span class="m">1</span><span class="p">)){</span> <span class="c1"># if individuals are trying to simultaneously colonize</span>
</span><span class="line">        conflicts <span class="o">&lt;-</span> which<span class="p">(</span>col.attempts <span class="o">&gt;</span> <span class="m">1</span><span class="p">)</span> <span class="c1"># which empty sites have conflicts</span>
</span><span class="line">        <span class="kr">for</span> <span class="p">(</span>k <span class="kr">in</span> conflicts<span class="p">){</span> <span class="c1"># for each conflict</span>
</span><span class="line">          <span class="c1"># how many of individuals of each species are attempting to simultaneously colonize?</span>
</span><span class="line">          attempting <span class="o">&lt;-</span> rep<span class="p">(</span><span class="m">1</span><span class="o">:</span>N<span class="p">,</span> times <span class="o">=</span> establishment<span class="p">[</span>k<span class="p">,])</span>
</span><span class="line">          <span class="c1"># successful individual randomly selected from those attempting</span>
</span><span class="line">          successful <span class="o">&lt;-</span> sample<span class="p">(</span>attempting<span class="p">,</span> size<span class="o">=</span><span class="m">1</span><span class="p">)</span>
</span><span class="line">          new.row <span class="o">&lt;-</span> rep<span class="p">(</span><span class="m">0</span><span class="p">,</span> length.out<span class="o">=</span>N<span class="p">)</span>
</span><span class="line">          new.row<span class="p">[</span>successful<span class="p">]</span> <span class="o">&lt;-</span> <span class="m">1</span>
</span><span class="line">          establishment<span class="p">[</span>k<span class="p">,]</span> <span class="o">&lt;-</span> new.row
</span><span class="line">        <span class="p">}</span>
</span><span class="line">      <span class="p">}</span>
</span><span class="line">      <span class="c1"># add successful immigrants</span>
</span><span class="line">      state<span class="p">[</span>t<span class="p">,</span> empty.sites<span class="p">,</span> <span class="p">]</span> <span class="o">&lt;-</span> state<span class="p">[</span>t<span class="p">,</span> empty.sites<span class="p">,]</span> <span class="o">+</span> establishment
</span><span class="line">    <span class="p">}</span>
</span><span class="line">    richness<span class="p">[</span>t<span class="p">]</span> <span class="o">&lt;-</span> sum<span class="p">(</span>apply<span class="p">(</span>state<span class="p">[</span>t<span class="p">,,],</span> <span class="m">2</span><span class="p">,</span> max<span class="p">))</span>
</span><span class="line">    p.occ<span class="p">[</span>t<span class="p">]</span> <span class="o">&lt;-</span> length<span class="p">(</span>which<span class="p">(</span>state<span class="p">[</span>t<span class="p">,,]</span> <span class="o">==</span> <span class="m">1</span><span class="p">))</span> <span class="o">/</span> A
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="kr">return</span><span class="p">(</span>list<span class="p">(</span>richness<span class="o">=</span>richness<span class="p">,</span> p.occ <span class="o">=</span> p.occ<span class="p">,</span> state<span class="o">=</span>state<span class="p">,</span> niche.d<span class="o">=</span>niche.d<span class="p">))</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The function returns a list containing a vector of species richness at 
each timestep, the proportion of sites occupied at each timestep,
 a state array containing all occupancy information for each patch, 
species, and timestep, and lastly 
a dataframe containing information on the niches of each species in 
the regional pool.</p>

<p>Using this function we can begin to explore the dynamics of the model 
through time:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">out <span class="o">&lt;-</span> alloucheIBM<span class="p">(</span>pM<span class="o">=</span><span class="m">.1</span><span class="p">,</span> Emin<span class="o">=</span><span class="m">-30</span><span class="p">,</span> Emax<span class="o">=</span><span class="m">30</span><span class="p">,</span> sig<span class="o">=</span><span class="m">8</span><span class="p">,</span> R<span class="o">=</span><span class="m">8</span><span class="p">,</span> N<span class="o">=</span><span class="m">100</span><span class="p">,</span> A<span class="o">=</span><span class="m">300</span><span class="p">,</span> I<span class="o">=</span><span class="m">.01</span><span class="p">,</span> timesteps<span class="o">=</span><span class="m">1000</span><span class="p">)</span>
</span><span class="line">plot<span class="p">(</span>out<span class="o">$</span>richness<span class="p">,</span> type<span class="o">=</span><span class="s">&quot;l&quot;</span><span class="p">,</span> xlab<span class="o">=</span><span class="s">&quot;Timestep&quot;</span><span class="p">,</span> ylab<span class="o">=</span><span class="s">&quot;Species richness&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Repeating this process a few times, we can get a picture of the 
expected species richness and it’s variance for some set of parameters.</p>

<p align="center">
  <img src="http://mbjoseph.github.com/images/richness_trajectory.png" />
</p>

<p>Finally, we can address the issue of habitat heterogeneity and its 
effect on species richness. There are many ways to approach this issue, 
and many parameter combinations to consider. Allouche et al. (2012) 
provides a thorough treatment of the subject; I’ll 
demonstrate just one result: that under certain conditions, species 
richness 
peaks at intermediate levels of habitat heterogeneity.</p>

<p>To construct a range of habitat heterogeneity values, let’s construct 
an interval and take subsequently narrower intervals centered around the 
middle of the original interval.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">ERmin <span class="o">&lt;-</span> <span class="m">-50</span>
</span><span class="line">ERmax <span class="o">&lt;-</span> <span class="m">50</span>
</span><span class="line">global.median <span class="o">&lt;-</span> median<span class="p">(</span>c<span class="p">(</span>ERmin<span class="p">,</span> ERmax<span class="p">))</span>
</span><span class="line">n.intervals <span class="o">&lt;-</span> <span class="m">30</span>
</span><span class="line">lower.limits <span class="o">&lt;-</span> seq<span class="p">(</span>ERmin<span class="p">,</span> global.median<span class="m">-.5</span><span class="p">,</span> length.out<span class="o">=</span>n.intervals<span class="p">)</span>
</span><span class="line">upper.limits <span class="o">&lt;-</span> seq<span class="p">(</span>ERmax<span class="p">,</span> global.median<span class="p">,</span> length.out<span class="o">=</span>n.intervals<span class="p">)</span>
</span><span class="line">hab.het <span class="o">&lt;-</span> upper.limits <span class="o">-</span> lower.limits <span class="c1"># habitat heterogeneity</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>Here are the intervals:</p>

<p align="center">
  <img src="http://mbjoseph.github.com/images/envhet.png" />
</p>

<p>Now, for each interval, we can iteratively run the model and track 
species richness. Because species richness tends to vary through time, 
let’s take the mean of the final 100 timesteps as a measure of species 
richness for each model run, and record the standard deviation to track 
variability. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">n.iter <span class="o">&lt;-</span> <span class="m">3</span> <span class="c1"># number of iterations per interval</span>
</span><span class="line">sd.rich <span class="o">&lt;-</span> array<span class="p">(</span><span class="kc">NA</span><span class="p">,</span> dim<span class="o">=</span>c<span class="p">(</span>n.intervals<span class="p">,</span> n.iter<span class="p">))</span>
</span><span class="line">end.rich <span class="o">&lt;-</span> array<span class="p">(</span><span class="kc">NA</span><span class="p">,</span> dim<span class="o">=</span>c<span class="p">(</span>n.intervals<span class="p">,</span> n.iter<span class="p">))</span>
</span><span class="line"><span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>n.intervals<span class="p">){</span>
</span><span class="line">  <span class="kr">for</span> <span class="p">(</span>iter <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>n.iter<span class="p">){</span>
</span><span class="line">    Emin <span class="o">&lt;-</span> lower.limits<span class="p">[</span>i<span class="p">]</span>
</span><span class="line">    Emax <span class="o">&lt;-</span> upper.limits<span class="p">[</span>i<span class="p">]</span>
</span><span class="line">    out <span class="o">&lt;-</span> alloucheIBM<span class="p">(</span>pM<span class="o">=</span><span class="m">.9</span><span class="p">,</span> Emin<span class="o">=</span>Emin<span class="p">,</span> Emax<span class="o">=</span>Emax<span class="p">,</span> sig<span class="o">=</span><span class="m">10</span><span class="p">,</span> pR<span class="o">=</span><span class="m">1</span><span class="p">,</span> R<span class="o">=</span><span class="m">1</span><span class="p">,</span>
</span><span class="line">                   N<span class="o">=</span><span class="m">100</span><span class="p">,</span> A<span class="o">=</span><span class="m">100</span><span class="p">,</span> I<span class="o">=</span><span class="m">.9</span><span class="p">,</span> timesteps<span class="o">=</span><span class="m">300</span><span class="p">)</span>
</span><span class="line">    timesteps <span class="o">&lt;-</span> length<span class="p">(</span>out<span class="o">$</span>richness<span class="p">)</span>
</span><span class="line">    end.rich<span class="p">[</span>i<span class="p">,</span> iter<span class="p">]</span> <span class="o">&lt;-</span> mean<span class="p">(</span>out<span class="o">$</span>richness<span class="p">[</span>timesteps<span class="m">-100</span><span class="o">:</span>timesteps<span class="p">])</span>
</span><span class="line">    sd.rich<span class="p">[</span>i<span class="p">,</span> iter<span class="p">]</span> <span class="o">&lt;-</span> sd<span class="p">(</span>out<span class="o">$</span>richness<span class="p">[</span>timesteps<span class="m">-100</span><span class="o">:</span>timesteps<span class="p">])</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line">end.richness <span class="o">&lt;-</span> c<span class="p">(</span>t<span class="p">(</span>end.rich<span class="p">))</span>
</span><span class="line">end.sd <span class="o">&lt;-</span> c<span class="p">(</span>t<span class="p">(</span>sd.rich<span class="p">))</span>
</span><span class="line">interval <span class="o">&lt;-</span> rep<span class="p">(</span>hab.het<span class="p">,</span> each<span class="o">=</span>n.iter<span class="p">)</span>
</span><span class="line">plot.d <span class="o">&lt;-</span> data.frame<span class="p">(</span>interval<span class="p">,</span> end.richness<span class="p">,</span> end.sd<span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="c1"># visualize the results</span>
</span><span class="line">require<span class="p">(</span>ggplot2<span class="p">)</span>
</span><span class="line">range <span class="o">&lt;-</span> aes<span class="p">(</span>ymax<span class="o">=</span>end.richness <span class="o">+</span> end.sd<span class="p">,</span> ymin<span class="o">=</span>end.richness <span class="o">-</span> end.sd<span class="p">)</span>
</span><span class="line">ggplot<span class="p">(</span>plot.d<span class="p">,</span> aes<span class="p">(</span>x<span class="o">=</span>interval<span class="p">,</span> y<span class="o">=</span>end.richness<span class="p">))</span> <span class="o">+</span>
</span><span class="line">  geom_point<span class="p">(</span>shape<span class="o">=</span><span class="m">1</span><span class="p">,</span> size<span class="o">=</span><span class="m">2</span><span class="p">)</span> <span class="o">+</span> geom_errorbar<span class="p">(</span>range<span class="p">)</span> <span class="o">+</span>
</span><span class="line">  theme_classic<span class="p">()</span> <span class="o">+</span>
</span><span class="line">  xlab<span class="p">(</span><span class="s">&quot;Habitat heterogeneity&quot;</span><span class="p">)</span> <span class="o">+</span> ylab<span class="p">(</span><span class="s">&quot;Species richness&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p align="center">
  <img src="http://mbjoseph.github.com/images/final.svg" />
</p>

<p>Of course, the shape of this relationship is sensitive to the parameters. 
As an example, changing niche width to increase or decrease niche overlap 
will mediate the strength of interspecific competition for space. 
Also, increasing reproductive rates may buffer each species from 
stochastic extinction so that the relationship between environmental 
heterogeneity and richness is monotonically increasing. Furthermore, 
here I centered all intervals around the same value, but the exact 
position of the environmental heterogeneity interval will affect the net 
establishment probability for each site, depending on how the interval 
relates to species niches. The parameter space is yours to explore. </p>

<p>These types of stochastic simulation models are fairly 
straightforward to implement in R. Indeed there’s a package 
dedicated to facilitating the implementation of such models: 
<a href="http://simecol.r-forge.r-project.org/">simecol</a>. There’s even a book:
<a href="http://books.google.com/books/about/A_Practical_Guide_to_Ecological_Modellin.html?id=aVjDtSmJqhAC"><em>A Practical Guide to Ecological Modelling: Using R as a Simulation Platform</em></a>.</p>

<h4 id="full-reference">Full reference</h4>
<p>Allouche O, Kalyuzhny M, Moreno-Rueda G, Pizarro M, &amp; Kadmon R. (2012) 
Area-heterogeneity tradeoff and the diversity of ecological communities. 
Proceedings of the National Academy of Sciences of the United States of 
America, 109 (43): 17495-17500.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Multi-species dynamic occupancy model with R and JAGS]]></title>
    <link href="http://mbjoseph.github.com/blog/2013/02/24/com_occ/"/>
    <updated>2013-02-24T00:00:00-07:00</updated>
    <id>http://mbjoseph.github.com/blog/2013/02/24/com_occ</id>
    <content type="html"><![CDATA[<p>This post is intended to provide a simple example of how to construct 
and make inferences on a multi-species multi-year occupancy model using 
R, JAGS, and the ‘rjags’ package. This is not intended to be a 
standalone tutorial on dynamic community occupancy modeling. Useful 
primary literature references include MacKenzie et al. (2002), Kery and 
Royle (2007), Royle and Kery (2007), Russell et al. (2009), and Dorazio 
et al. (2010). Royle and Dorazio’s <em>Heirarchichal Modeling and 
Inference in Ecology</em> also provides a clear explanation of simple one 
species occupancy models, multispecies occupancy models, and dynamic 
(multiyear) occupancy models, among other things. There’s also a wealth 
of code provided 
<a href="https://sites.google.com/site/communitymodeling/">here</a> by 
Elise Zipkin, J. Andrew Royle, and others.</p>

<p>Before getting started, we can define two convenience functions:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">logit <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>x<span class="p">)</span> <span class="p">{</span>
</span><span class="line">    log<span class="p">(</span>x<span class="o">/</span><span class="p">(</span><span class="m">1</span> <span class="o">-</span> x<span class="p">))</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line">antilogit <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>x<span class="p">)</span> <span class="p">{</span>
</span><span class="line">    exp<span class="p">(</span>x<span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="m">1</span> <span class="o">+</span> exp<span class="p">(</span>x<span class="p">))</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then, initializing the number of sites, species, years, and repeat surveys (i.e. surveys within years, where the occupancy status of a site
is assumed to be constant),</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">nsite <span class="o">&lt;-</span> <span class="m">150</span>
</span><span class="line">nspec <span class="o">&lt;-</span> <span class="m">6</span>
</span><span class="line">nyear <span class="o">&lt;-</span> <span class="m">4</span>
</span><span class="line">nrep <span class="o">&lt;-</span> <span class="m">3</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>we can begin to consider occupancy. We’re interested in making 
inferences about the rates of colonization and population persistence 
for each species in a community, while estimating and accounting for 
imperfect detection.</p>

<p>Occupancy status at site <script type="math/tex">j</script>, by species <script type="math/tex">i</script>, in year <script type="math/tex">t</script> is 
represented by <script type="math/tex">z(j, i, t)</script>. For occupied sites <script type="math/tex">z=1</script>; for 
unoccupied sites <script type="math/tex">z=0</script>.  However, <script type="math/tex">z</script> is incompletely observed: it 
is possible that a species <script type="math/tex">i</script> is present at a site <script type="math/tex">j</script> in some year 
 <script type="math/tex">t</script> (<script type="math/tex">z(j, i, t) = 1</script>) but species <script type="math/tex">i</script> was never 
seen at at site <script type="math/tex">j</script> in year <script type="math/tex">t</script> across all <script type="math/tex">k</script> repeat
surveys because of imperfect detection. These observations
are represented by <script type="math/tex">x(j, i, t, k)</script>. Here we assume that there are no 
“false positive” observations.  In other words, if 
<script type="math/tex">\sum_{1}^{k}x(j, i, t, k) >0\</script>, then <script type="math/tex">z(j, i, t) = 1</script>. If a site is
 occupied, the probability that <script type="math/tex">x(j, i, t, k) = 1</script> is represented as 
 a Bernoulli trial with probability of 
detection <script type="math/tex">p(j, i, t, k)</script>, such that </p>

<script type="math/tex; mode=display">
x(j, i, t, k) \sim Bernoulli(z(j, i, t)p(j, i, t, k))
</script>

<p>The occupancy status <script type="math/tex">z</script> of species <script type="math/tex">i</script> at site <script type="math/tex">j</script> in year <script type="math/tex">t</script> 
is modeled as a Markov Bernoulli trial. In other words whether a species
 is present at a site in year <script type="math/tex">t</script> is influenced by whether it was 
 present at year <script type="math/tex">t-1</script>.</p>

<script type="math/tex; mode=display">
z(j, i, t) \sim Bernoulli(\psi_{j, i, t})
</script>

<p>where for <script type="math/tex">t > 1</script></p>

<script type="math/tex; mode=display">
logit(\psi_{j, i, t}) = \beta_i + \rho_iz(i, j, t-1)
</script>

<p>and in year one <script type="math/tex">(t = 1)</script></p>

<script type="math/tex; mode=display">
logit(\psi_{j, i, 1}) = \beta_i + \rho_iz_0(i, j)
</script>

<p>where the occupancy status in year 0, 
<script type="math/tex">z_{0}(i, j) \sim Bernoulli(\rho_{0i})</script>, and 
<script type="math/tex">\rho_{0i} \sim Uniform(0, 1)</script>. <script type="math/tex">\beta_i</script> and <script type="math/tex">\rho_i</script> are 
parameters that control the probabilities of colonization and 
persistence. If a site was unoccupied by species <script type="math/tex">i</script> in a previous 
year <script type="math/tex">z(i, j, t-1) = 0</script>, then the probability of colonization is 
given by the antilogit of <script type="math/tex">\beta_i</script>. If a site was previously 
occupied <script type="math/tex">z(i, j, t-1) = 1</script>, the probability of population 
persistence is given by the anitlogit of <script type="math/tex">\beta_i + \rho_i</script>. We 
assume that the distributions of species specific parameters are 
defined by community level hyperparameters such that 
<script type="math/tex">\beta_i \sim Normal(\mu_{\beta}, \sigma_\beta^2)</script> and 
<script type="math/tex">\rho_i \sim Normal(\mu_{\rho}, \sigma_\rho^2)</script>. We can generate 
occupancy data as follows:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
</pre></td><td class="code"><pre><code class="r"><span class="line"><span class="c1"># community level hyperparameters</span>
</span><span class="line">p_beta <span class="o">=</span> <span class="m">0.7</span>
</span><span class="line">mubeta <span class="o">&lt;-</span> logit<span class="p">(</span>p_beta<span class="p">)</span>
</span><span class="line">sdbeta <span class="o">&lt;-</span> <span class="m">2</span>
</span><span class="line">
</span><span class="line">p_rho <span class="o">&lt;-</span> <span class="m">0.8</span>
</span><span class="line">murho <span class="o">&lt;-</span> logit<span class="p">(</span>p_rho<span class="p">)</span>
</span><span class="line">sdrho <span class="o">&lt;-</span> <span class="m">1</span>
</span><span class="line">
</span><span class="line"><span class="c1"># species specific random effects</span>
</span><span class="line">set.seed<span class="p">(</span><span class="m">1</span><span class="p">)</span>  <span class="c1"># for reproducibility</span>
</span><span class="line">beta <span class="o">&lt;-</span> rnorm<span class="p">(</span>nspec<span class="p">,</span> mubeta<span class="p">,</span> sdbeta<span class="p">)</span>
</span><span class="line">set.seed<span class="p">(</span><span class="m">1008</span><span class="p">)</span>
</span><span class="line">rho <span class="o">&lt;-</span> rnorm<span class="p">(</span>nspec<span class="p">,</span> murho<span class="p">,</span> sdrho<span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="c1"># initial occupancy states</span>
</span><span class="line">set.seed<span class="p">(</span><span class="m">237</span><span class="p">)</span>
</span><span class="line">rho0 <span class="o">&lt;-</span> runif<span class="p">(</span>nspec<span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span>
</span><span class="line">z0 <span class="o">&lt;-</span> array<span class="p">(</span>dim <span class="o">=</span> c<span class="p">(</span>nsite<span class="p">,</span> nspec<span class="p">))</span>
</span><span class="line"><span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nspec<span class="p">)</span> <span class="p">{</span>
</span><span class="line">    z0<span class="p">[,</span> i<span class="p">]</span> <span class="o">&lt;-</span> rbinom<span class="p">(</span>nsite<span class="p">,</span> <span class="m">1</span><span class="p">,</span> rho0<span class="p">[</span>i<span class="p">])</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="c1"># subsequent occupancy</span>
</span><span class="line">z <span class="o">&lt;-</span> array<span class="p">(</span>dim <span class="o">=</span> c<span class="p">(</span>nsite<span class="p">,</span> nspec<span class="p">,</span> nyear<span class="p">))</span>
</span><span class="line">lpsi <span class="o">&lt;-</span> array<span class="p">(</span>dim <span class="o">=</span> c<span class="p">(</span>nsite<span class="p">,</span> nspec<span class="p">,</span> nyear<span class="p">))</span>
</span><span class="line">psi <span class="o">&lt;-</span> array<span class="p">(</span>dim <span class="o">=</span> c<span class="p">(</span>nsite<span class="p">,</span> nspec<span class="p">,</span> nyear<span class="p">))</span>
</span><span class="line"><span class="kr">for</span> <span class="p">(</span>j <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nsite<span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nspec<span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="kr">for</span> <span class="p">(</span>t <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nyear<span class="p">)</span> <span class="p">{</span>
</span><span class="line">            <span class="kr">if</span> <span class="p">(</span>t <span class="o">==</span> <span class="m">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">                lpsi<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">]</span> <span class="o">&lt;-</span> beta<span class="p">[</span>i<span class="p">]</span> <span class="o">+</span> rho<span class="p">[</span>i<span class="p">]</span> <span class="o">*</span> z0<span class="p">[</span>j<span class="p">,</span> i<span class="p">]</span>
</span><span class="line">                psi<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">]</span> <span class="o">&lt;-</span> antilogit<span class="p">(</span>lpsi<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">])</span>
</span><span class="line">                z<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">]</span> <span class="o">&lt;-</span> rbinom<span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> psi<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">])</span>
</span><span class="line">            <span class="p">}</span> <span class="kr">else</span> <span class="p">{</span>
</span><span class="line">                lpsi<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">]</span> <span class="o">&lt;-</span> beta<span class="p">[</span>i<span class="p">]</span> <span class="o">+</span> rho<span class="p">[</span>i<span class="p">]</span> <span class="o">*</span> z<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t <span class="o">-</span> <span class="m">1</span><span class="p">]</span>
</span><span class="line">                psi<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">]</span> <span class="o">&lt;-</span> antilogit<span class="p">(</span>lpsi<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">])</span>
</span><span class="line">                z<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">]</span> <span class="o">&lt;-</span> rbinom<span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> psi<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">])</span>
</span><span class="line">            <span class="p">}</span>
</span><span class="line">        <span class="p">}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>For simplicity, we’ll assume that there are no differences in species detectability among sites, years, or repeat surveys, but that detectability varies among species. We’ll again use hyperparameters to specify a distribution of detection probabilities in our community, such that $logit(p_i) \sim Normal(\mu_p, \sigma_p^2)$.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">p_p <span class="o">&lt;-</span> <span class="m">0.7</span>
</span><span class="line">mup <span class="o">&lt;-</span> logit<span class="p">(</span>p_p<span class="p">)</span>
</span><span class="line">sdp <span class="o">&lt;-</span> <span class="m">1.5</span>
</span><span class="line">set.seed<span class="p">(</span><span class="m">222</span><span class="p">)</span>
</span><span class="line">lp <span class="o">&lt;-</span> rnorm<span class="p">(</span>nspec<span class="p">,</span> mup<span class="p">,</span> sdp<span class="p">)</span>
</span><span class="line">p <span class="o">&lt;-</span> antilogit<span class="p">(</span>lp<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We can now generate our observations based on occupancy states and 
detection probabilities. Although this could be vectorized for speed, 
let’s stick with nested for loops in the interest of clarity.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">x <span class="o">&lt;-</span> array<span class="p">(</span>dim <span class="o">=</span> c<span class="p">(</span>nsite<span class="p">,</span> nspec<span class="p">,</span> nyear<span class="p">,</span> nrep<span class="p">))</span>
</span><span class="line"><span class="kr">for</span> <span class="p">(</span>j <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nsite<span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nspec<span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="kr">for</span> <span class="p">(</span>t <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nyear<span class="p">)</span> <span class="p">{</span>
</span><span class="line">            <span class="kr">for</span> <span class="p">(</span>k <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nrep<span class="p">)</span> <span class="p">{</span>
</span><span class="line">                x<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">,</span> k<span class="p">]</span> <span class="o">&lt;-</span> rbinom<span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">,</span> p<span class="p">[</span>i<span class="p">]</span> <span class="o">*</span> z<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">])</span>
</span><span class="line">            <span class="p">}</span>
</span><span class="line">        <span class="p">}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now that we’ve collected some data, we can specify our model:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
<span class="line-number">51</span>
<span class="line-number">52</span>
<span class="line-number">53</span>
<span class="line-number">54</span>
<span class="line-number">55</span>
<span class="line-number">56</span>
<span class="line-number">57</span>
<span class="line-number">58</span>
<span class="line-number">59</span>
<span class="line-number">60</span>
<span class="line-number">61</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">cat<span class="p">(</span><span class="s">&quot;</span>
</span><span class="line"><span class="s">model{</span>
</span><span class="line"><span class="s">  #### priors</span>
</span><span class="line"><span class="s">  # beta hyperparameters</span>
</span><span class="line"><span class="s">  p_beta ~ dbeta(1, 1)</span>
</span><span class="line"><span class="s">	mubeta &lt;- log(p_beta / (1 - p_beta))</span>
</span><span class="line"><span class="s">  sigmabeta ~ dunif(0, 10)</span>
</span><span class="line"><span class="s">  taubeta &lt;- (1 / (sigmabeta * sigmabeta))</span>
</span><span class="line">
</span><span class="line"><span class="s">  # rho hyperparameters</span>
</span><span class="line"><span class="s">  p_rho ~ dbeta(1, 1)</span>
</span><span class="line"><span class="s">	murho &lt;- log(p_rho / (1 - p_rho))</span>
</span><span class="line"><span class="s">	sigmarho~dunif(0,10)</span>
</span><span class="line"><span class="s">	taurho&lt;-1/(sigmarho*sigmarho)</span>
</span><span class="line">
</span><span class="line"><span class="s">  # p hyperparameters</span>
</span><span class="line"><span class="s">  p_p ~ dbeta(1, 1)</span>
</span><span class="line"><span class="s">  mup &lt;- log(p_p / (1 - p_p))</span>
</span><span class="line"><span class="s">  sigmap ~ dunif(0,10)</span>
</span><span class="line"><span class="s">  taup &lt;- (1 / (sigmap * sigmap))</span>
</span><span class="line">
</span><span class="line"><span class="s">  #### occupancy model</span>
</span><span class="line"><span class="s">  # species specific random effects</span>
</span><span class="line"><span class="s">  for (i in 1:(nspec)) {</span>
</span><span class="line"><span class="s">    rho0[i] ~ dbeta(1, 1)</span>
</span><span class="line"><span class="s">    beta[i] ~ dnorm(mubeta, taubeta)</span>
</span><span class="line"><span class="s">    rho[i] ~ dnorm(murho, taurho)</span>
</span><span class="line"><span class="s">  }</span>
</span><span class="line"><span class="s">  </span>
</span><span class="line"><span class="s">  # occupancy states</span>
</span><span class="line"><span class="s">  for (j in 1:nsite) {</span>
</span><span class="line"><span class="s">    for (i in 1:nspec) {</span>
</span><span class="line"><span class="s">      z0[j, i] ~ dbern(rho0[i])</span>
</span><span class="line"><span class="s">      logit(psi[j, i, 1]) &lt;- beta[i] + rho[i] * z0[j, i] </span>
</span><span class="line"><span class="s">      z[j, i, 1] ~ dbern(psi[j, i, 1]) </span>
</span><span class="line"><span class="s">      for (t in 2:nyear) {</span>
</span><span class="line"><span class="s">        logit(psi[j, i, t]) &lt;- beta[i] + rho[i] * z[j, i, t-1]</span>
</span><span class="line"><span class="s">        z[j, i, t] ~ dbern(psi[j, i, t])</span>
</span><span class="line"><span class="s">      }</span>
</span><span class="line"><span class="s">    }</span>
</span><span class="line"><span class="s">  }</span>
</span><span class="line">
</span><span class="line"><span class="s">  #### detection model</span>
</span><span class="line"><span class="s">	for(i in 1:nspec){ </span>
</span><span class="line"><span class="s">		lp[i] ~ dnorm(mup, taup)</span>
</span><span class="line"><span class="s">		p[i] &lt;- (exp(lp[i])) / (1 + exp(lp[i]))</span>
</span><span class="line"><span class="s">	}</span>
</span><span class="line"><span class="s">	</span>
</span><span class="line"><span class="s">  #### observation model</span>
</span><span class="line"><span class="s">  for (j in 1:nsite){</span>
</span><span class="line"><span class="s">    for (i in 1:nspec){</span>
</span><span class="line"><span class="s">      for (t in 1:nyear){</span>
</span><span class="line"><span class="s">        mu[j, i, t] &lt;- z[j, i, t] * p[i] </span>
</span><span class="line"><span class="s">        for (k in 1:nrep){</span>
</span><span class="line"><span class="s">          x[j, i, t, k] ~ dbern(mu[j, i, t])</span>
</span><span class="line"><span class="s">        }</span>
</span><span class="line"><span class="s">      }</span>
</span><span class="line"><span class="s">    }</span>
</span><span class="line"><span class="s">  }</span>
</span><span class="line"><span class="s">}</span>
</span><span class="line"><span class="s">&quot;</span><span class="p">,</span> fill<span class="o">=</span><span class="kc">TRUE</span><span class="p">,</span> file<span class="o">=</span><span class="s">&quot;com_occ.txt&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Next, bundle up the data.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">data <span class="o">&lt;-</span> list<span class="p">(</span>x <span class="o">=</span> x<span class="p">,</span> nrep <span class="o">=</span> nrep<span class="p">,</span> nsite <span class="o">=</span> nsite<span class="p">,</span> nspec <span class="o">=</span> nspec<span class="p">,</span> nyear <span class="o">=</span> nyear<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Provide initial values. </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">zinit <span class="o">&lt;-</span> array<span class="p">(</span>dim <span class="o">=</span> c<span class="p">(</span>nsite<span class="p">,</span> nspec<span class="p">,</span> nyear<span class="p">))</span>
</span><span class="line"><span class="kr">for</span> <span class="p">(</span>j <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nsite<span class="p">)</span> <span class="p">{</span>
</span><span class="line">    <span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nspec<span class="p">)</span> <span class="p">{</span>
</span><span class="line">        <span class="kr">for</span> <span class="p">(</span>t <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>nyear<span class="p">)</span> <span class="p">{</span>
</span><span class="line">            zinit<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">]</span> <span class="o">&lt;-</span> max<span class="p">(</span>x<span class="p">[</span>j<span class="p">,</span> i<span class="p">,</span> t<span class="p">,</span> <span class="p">])</span>
</span><span class="line">        <span class="p">}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line">inits <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">    list<span class="p">(</span>p_beta <span class="o">=</span> runif<span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">),</span> p_rho <span class="o">=</span> runif<span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">),</span> sigmarho <span class="o">=</span> runif<span class="p">(</span><span class="m">1</span><span class="p">,</span>
</span><span class="line">        <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">),</span> sigmap <span class="o">=</span> runif<span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">10</span><span class="p">),</span> sigmabeta <span class="o">=</span> runif<span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">10</span><span class="p">),</span> z <span class="o">=</span> zinit<span class="p">)</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>As a side note, it is helpful in JAGS to provide initial values for the incompletely observed occupancy state $z$ that are consistent with observed presences, as provided in this example with <code>zinit</code>. In other words if $x(j, i, t, k)=1$, provide an intial value of $1$ for $z(j, i, t)$. Unlike WinBUGS and OpenBUGS, if you do not do this, you’ll often (but not always) encounter an error message such as:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="r"><span class="line"><span class="c1"># Error in jags.model(file = &#39;com_occ.txt&#39;, data = data, n.chains = 3) :</span>
</span><span class="line"><span class="c1"># Error in node x[1,1,2,3] Observed node inconsistent with unobserved</span>
</span><span class="line"><span class="c1"># parents at initialization</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now we’re ready to monitor and make inferences about some parameters of interest using JAGS.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">params <span class="o">&lt;-</span> c<span class="p">(</span><span class="s">&quot;lp&quot;</span><span class="p">,</span> <span class="s">&quot;beta&quot;</span><span class="p">,</span> <span class="s">&quot;rho&quot;</span><span class="p">)</span>
</span><span class="line">
</span><span class="line">require<span class="p">(</span>rjags<span class="p">)</span>
</span><span class="line">ocmod <span class="o">&lt;-</span> jags.model<span class="p">(</span>file <span class="o">=</span> <span class="s">&quot;com_occ.txt&quot;</span><span class="p">,</span> inits <span class="o">=</span> inits<span class="p">,</span> data <span class="o">=</span> data<span class="p">,</span> n.chains <span class="o">=</span> <span class="m">3</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">nburn <span class="o">&lt;-</span> <span class="m">2000</span>
</span><span class="line">update<span class="p">(</span>ocmod<span class="p">,</span> n.iter <span class="o">=</span> nburn<span class="p">)</span>
</span><span class="line">out <span class="o">&lt;-</span> coda.samples<span class="p">(</span>ocmod<span class="p">,</span> n.iter <span class="o">=</span> <span class="m">17000</span><span class="p">,</span> variable.names <span class="o">=</span> params<span class="p">)</span>
</span><span class="line">summary<span class="p">(</span>out<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
</pre></td><td class="code"><pre><code class="r"><span class="line"><span class="c1">## </span>
</span><span class="line"><span class="c1">## Iterations = 3001:20000</span>
</span><span class="line"><span class="c1">## Thinning interval = 1 </span>
</span><span class="line"><span class="c1">## Number of chains = 3 </span>
</span><span class="line"><span class="c1">## Sample size per chain = 17000 </span>
</span><span class="line"><span class="c1">## </span>
</span><span class="line"><span class="c1">## 1. Empirical mean and standard deviation for each variable,</span>
</span><span class="line"><span class="c1">##    plus standard error of the mean:</span>
</span><span class="line"><span class="c1">## </span>
</span><span class="line"><span class="c1">##            Mean     SD Naive SE Time-series SE</span>
</span><span class="line"><span class="c1">## beta[1] -0.4539 0.1629 0.000721       0.002140</span>
</span><span class="line"><span class="c1">## beta[2]  0.9986 0.4274 0.001893       0.011038</span>
</span><span class="line"><span class="c1">## beta[3] -0.9036 0.1157 0.000513       0.001006</span>
</span><span class="line"><span class="c1">## beta[4]  4.7439 2.5492 0.011288       0.050756</span>
</span><span class="line"><span class="c1">## beta[5]  1.5512 0.3251 0.001440       0.007095</span>
</span><span class="line"><span class="c1">## beta[6] -0.8833 0.3021 0.001338       0.005858</span>
</span><span class="line"><span class="c1">## lp[1]    3.0660 0.1400 0.000620       0.000782</span>
</span><span class="line"><span class="c1">## lp[2]    0.8533 0.0580 0.000257       0.000409</span>
</span><span class="line"><span class="c1">## lp[3]    2.9045 0.2007 0.000889       0.001160</span>
</span><span class="line"><span class="c1">## lp[4]    0.3773 0.0491 0.000217       0.000315</span>
</span><span class="line"><span class="c1">## lp[5]    1.2224 0.0635 0.000281       0.000407</span>
</span><span class="line"><span class="c1">## lp[6]    0.4881 0.0615 0.000272       0.000551</span>
</span><span class="line"><span class="c1">## rho[1]   1.8640 0.2200 0.000974       0.002691</span>
</span><span class="line"><span class="c1">## rho[2]   2.6201 0.6009 0.002661       0.011576</span>
</span><span class="line"><span class="c1">## rho[3]  -0.0766 0.2229 0.000987       0.002010</span>
</span><span class="line"><span class="c1">## rho[4]   2.6567 2.2459 0.009945       0.035121</span>
</span><span class="line"><span class="c1">## rho[5]   1.1056 0.4091 0.001812       0.007679</span>
</span><span class="line"><span class="c1">## rho[6]   3.4425 0.4591 0.002033       0.009132</span>
</span><span class="line"><span class="c1">## </span>
</span><span class="line"><span class="c1">## 2. Quantiles for each variable:</span>
</span><span class="line"><span class="c1">## </span>
</span><span class="line"><span class="c1">##           2.5%    25%     50%    75%  97.5%</span>
</span><span class="line"><span class="c1">## beta[1] -0.777 -0.564 -0.4515 -0.343 -0.139</span>
</span><span class="line"><span class="c1">## beta[2]  0.168  0.707  0.9975  1.288  1.833</span>
</span><span class="line"><span class="c1">## beta[3] -1.132 -0.981 -0.9028 -0.826 -0.679</span>
</span><span class="line"><span class="c1">## beta[4]  1.117  3.206  4.3157  5.732 11.010</span>
</span><span class="line"><span class="c1">## beta[5]  0.896  1.338  1.5590  1.770  2.174</span>
</span><span class="line"><span class="c1">## beta[6] -1.509 -1.077 -0.8699 -0.675 -0.327</span>
</span><span class="line"><span class="c1">## lp[1]    2.803  2.970  3.0630  3.159  3.348</span>
</span><span class="line"><span class="c1">## lp[2]    0.740  0.814  0.8535  0.892  0.967</span>
</span><span class="line"><span class="c1">## lp[3]    2.528  2.766  2.8992  3.035  3.316</span>
</span><span class="line"><span class="c1">## lp[4]    0.282  0.344  0.3771  0.410  0.474</span>
</span><span class="line"><span class="c1">## lp[5]    1.100  1.179  1.2216  1.265  1.348</span>
</span><span class="line"><span class="c1">## lp[6]    0.369  0.446  0.4877  0.529  0.610</span>
</span><span class="line"><span class="c1">## rho[1]   1.439  1.714  1.8611  2.011  2.301</span>
</span><span class="line"><span class="c1">## rho[2]   1.504  2.205  2.5972  3.013  3.843</span>
</span><span class="line"><span class="c1">## rho[3]  -0.516 -0.226 -0.0747  0.074  0.359</span>
</span><span class="line"><span class="c1">## rho[4]  -0.928  1.270  2.3693  3.688  8.060</span>
</span><span class="line"><span class="c1">## rho[5]   0.319  0.831  1.1003  1.380  1.920</span>
</span><span class="line"><span class="c1">## rho[6]   2.601  3.123  3.4209  3.741  4.390</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">plot<span class="p">(</span>out<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><img src="http://www.colorado.edu/ebio/gradstudents/joseph/figure/unnamed-chunk-101.png" alt="plot of chunk unnamed-chunk-10" /> 
<img src="http://www.colorado.edu/ebio/gradstudents/joseph/figure/unnamed-chunk-102.png" alt="plot of chunk unnamed-chunk-10" /> 
<img src="http://www.colorado.edu/ebio/gradstudents/joseph/figure/unnamed-chunk-103.png" alt="plot of chunk unnamed-chunk-10" /> 
<img src="http://www.colorado.edu/ebio/gradstudents/joseph/figure/unnamed-chunk-104.png" alt="plot of chunk unnamed-chunk-10" /> 
<img src="http://www.colorado.edu/ebio/gradstudents/joseph/figure/unnamed-chunk-105.png" alt="plot of chunk unnamed-chunk-10" /> </p>

<p>At this point, you’ll want to run through the usual MCMC diagnostics to 
check for convergence and adjust the burn-in or number of iterations 
accordingly. Once satisfied, we can check to see how well our model 
performed based on our known parameter values.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">require<span class="p">(</span>mcmcplots<span class="p">)</span>
</span><span class="line">caterplot<span class="p">(</span>out<span class="p">,</span> <span class="s">&quot;beta&quot;</span><span class="p">,</span> style <span class="o">=</span> <span class="s">&quot;plain&quot;</span><span class="p">)</span>
</span><span class="line">caterpoints<span class="p">(</span>beta<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><img src="http://www.colorado.edu/ebio/gradstudents/joseph/figure/unnamed-chunk-111.png" alt="plot of chunk unnamed-chunk-11" /> </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">caterplot<span class="p">(</span>out<span class="p">,</span> <span class="s">&quot;lp&quot;</span><span class="p">,</span> style <span class="o">=</span> <span class="s">&quot;plain&quot;</span><span class="p">)</span>
</span><span class="line">caterpoints<span class="p">(</span>lp<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><img src="http://www.colorado.edu/ebio/gradstudents/joseph/figure/unnamed-chunk-112.png" alt="plot of chunk unnamed-chunk-11" /> </p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="r"><span class="line">caterplot<span class="p">(</span>out<span class="p">,</span> <span class="s">&quot;rho&quot;</span><span class="p">,</span> style <span class="o">=</span> <span class="s">&quot;plain&quot;</span><span class="p">)</span>
</span><span class="line">caterpoints<span class="p">(</span>rho<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p><img src="http://www.colorado.edu/ebio/gradstudents/joseph/figure/unnamed-chunk-113.png" alt="plot of chunk unnamed-chunk-11" /> </p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Interactive two-host SIR model]]></title>
    <link href="http://mbjoseph.github.com/blog/2013/02/20/SIR/"/>
    <updated>2013-02-20T00:00:00-07:00</updated>
    <id>http://mbjoseph.github.com/blog/2013/02/20/SIR</id>
    <content type="html"><![CDATA[<p>This is an example of interfacing R, shiny, and deSolve to produce an interactive environment where users can explore model behavior by altering parameters in an easy to use GUI. </p>

<p>The model tracks the number of susceptible, infectious, and recovered individuals in two co-occuring host species. The rates of change for each class are represented as a system of differential equations:</p>

<script type="math/tex; mode=display">
\frac{dS_{1}}{dt} = N_{1}(b_{1} - \delta_{1}N_{1}) - d_{1}S_{1} - S_{1}(\beta_{11}I_{1} + \beta_{12}I_{2})\\
</script>

<script type="math/tex; mode=display">
\frac{dI_{1}}{dt} = S_{1}(\beta_{11}I_{1} + \beta_{12}I_{2}) - I_{1}(d_{1} + \alpha_{1} + \sigma_{1})\\
</script>

<script type="math/tex; mode=display">
\frac{dR_{1}}{dt} = \sigma_{1}I_{1} - d_{1}R_{1}\\
</script>

<script type="math/tex; mode=display">
\frac{dS_{2}}{dt} = N_{2}(b_{2} - \delta_{2}N_{2}) - d_{2}S_{2} - S_{2}(\beta_{22}I_{2} + \beta_{21}I_{1})\\
</script>

<script type="math/tex; mode=display">
\frac{dI_{2}}{dt} = S_{2}(\beta_{22}I_{2} + \beta_{21}I_{1}) - I_{2}(d_{2} + \alpha_{2} + \sigma_{2})\\
</script>

<script type="math/tex; mode=display">
\frac{dR_{2}}{dt} = \sigma_{2}I_{2} - d_{2}R_{2}
</script>

<p>Where <script type="math/tex"> S_{i} </script>, <script type="math/tex"> I_{i} </script>, and <script type="math/tex"> R_{i} </script> represent the density of 
susceptible, infectious, and recovered individuals respectively of 
species $i$. The total number of individuals of each species is <script type="math/tex">N_{i}</script>. 
Per capita birth and death rates are represented by <script type="math/tex">b_{i}</script> and <script type="math/tex">d_{i}</script>, 
and the strength of density dependence in population growth is 
<script type="math/tex">\delta_{i}</script>. Transmission rates from species <script type="math/tex">j</script> to species <script type="math/tex">i</script> are 
given by <script type="math/tex">\beta_{ij}</script>. The pathogen imposes additional mortality for 
infected individuals at rate <script type="math/tex">\alpha_{i}</script>, and infected individuals 
recover at rate <script type="math/tex">\sigma_{i}</script> so that the average infectious period is 
<script type="math/tex">\frac{1}{\sigma_{i}}</script>. Here, it is assumed that the pathogen does not 
castrate its hosts. Thus, susceptible, infectious, and recovered 
individuals reproduce at the same rate. </p>

<p>Epidemiological models often differentiate between two transmission dynamics. With <strong>density-dependent transmission</strong>, the number of host contacts and transmission events increases with the density of individuals (as shown in the above system of equations). In contrast, with <strong>frequency-dependent transmission</strong>, hosts have a constant contact rate so that the transmission rate depends on the relative proportion of infectious individuals. As an example, models of sexually transmitted infections often assume frequency dependent transmission, implying that the number of sexual partners one has is independent of population density. To incorporate frequency dependent transmission into the above model, it is necessary to divide the transmission term $S\sum(\beta I)$ by $N$.</p>

<p>Based on this system of equations, a criterion for pathogen invasion 
called <script type="math/tex">R_{0}</script> can be derived based on the dominant eigenvalue of the 
next generation matrix (Dobson 2004). If <script type="math/tex">% &lt;![CDATA[
R_{0} < 1 %]]&gt;</script>, the pathogen 
does not invade; if <script type="math/tex">R_{0} > 1</script>, the pathogen invades. </p>

<h4 id="building-the-r-shiny-app">Building the R shiny app</h4>
<p>Shiny requires two files to run: a file containing all of the calculations, plotting functionality, etc., and a file defining a user interface. </p>

<p><a href="https://github.com/mbjoseph/2hostSIR/blob/master/server.R">Here</a> is the file defining what you want the server to do. Note the use of ifelse() to have either density- or frequency-dependent transmission. </p>

<p><a href="https://github.com/mbjoseph/2hostSIR/blob/master/ui.R">Here</a> is the file defining the user interface.</p>

<p><a href="http://glimmer.rstudio.com/mbjoseph/2spSIR/">Here</a> is the resulting graphical user interface for the model. </p>

<p>Feel free to clone the repository or alter the code to suit your own needs. Shiny seems like a tool with great potential to make some mathematical models more accessible (at some level). For instance, something like this could be used in an ecology class to demonstrate the different ways that pathogens can regulate host populations.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Interactive stage-structured population model]]></title>
    <link href="http://mbjoseph.github.com/blog/2013/02/16/leslie/"/>
    <updated>2013-02-16T00:00:00-07:00</updated>
    <id>http://mbjoseph.github.com/blog/2013/02/16/leslie</id>
    <content type="html"><![CDATA[<p>This is an example of interfacing R and shiny to allow users to explore 
a biological model often encountered in an introductory ecology class. 
We are interested the growth of a population that is composed of multiple, 
discrete stages or age classes. Patrick H. Leslie provides an in-depth 
derivation of the model in his 1945 paper 
“<a href="http://www.colorado.edu/eeb/gradstudents
/joseph/Leslie_1945.pdf">On the use of matrices in certain population mathematics</a>”. </p>

<p>The population at time <script type="math/tex">t</script> is represented by a vector <script type="math/tex">\bar{x}_{t}</script>, 
where each element of the vector represents the number of individulas 
in each age class (e.g. if a population has <script type="math/tex">n</script> age classes, then 
<script type="math/tex">\bar{x}_{t}</script> has <script type="math/tex">n</script> elements). Time is considered discrete and we 
assume that the population is censused prior to breeding. We assume 
that individuals within each age class are identical, and that each 
has some probability of maturing to the next age class, surviving 
(staying in the same age class), and reproduction. Changes in the 
population from one timestep to another are represented as:</p>

<script type="math/tex; mode=display">
\bar{x}_{t + 1} = L \bar{x}_{t}
</script>

<p>where <script type="math/tex">L</script> is an <script type="math/tex">n</script> x <script type="math/tex">n</script> Leslie matrix (or more generally, a 
projection matrix) that describes the contribution of each age class to 
the population at time <script type="math/tex">t + 1</script>. </p>

<p>Suppose we are tasked with modeling the annual dynamics of a population 
with four age classes, and $t$ represents years. For simplicity, we 
model only females and assume that plenty of males are available for 
breeding. Individuals in the first age class survive to class 2 with 
probability 0.1, class 2 individuals survive to class 3 with probability
 0.5, class 3 individuals survive to class 4 with probability 0.9, and 
 class four individuals survive each year with probability 0.7. Only the
  fourth age class is reproductive, with individuals producing 100 class
   1 individuals per year. We can represent this population graphically as:</p>

<p align="center">
  <img src="http://mbjoseph.github.com/images/cycle.svg" />
</p>

<p>Equivalently, as a Leslie matrix:</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
 
L = \begin{bmatrix} 
0 & 0 & 0 & 100 \cr 
.1 & 0 & 0 & 0 \cr 
0 & .5 &  0 & 0 \cr 
0 & 0 & .9 & .7 
\end{bmatrix}
 %]]&gt;</script>

<p>The long term population growth rate is related to the dominant 
eigenvalue <script type="math/tex">\lambda_{1}</script> of <script type="math/tex">L</script>. If <script type="math/tex">% &lt;![CDATA[
\lambda_{1} < 1 %]]&gt;</script> the population 
eventually declines to extinction, and if <script type="math/tex">\lambda_{1} > 1</script>, the 
population increases.</p>

<p>From a management perspective, it is often useful to know how limited 
resources may be allocated to increase population growth or prevent 
extinction. In other words, if an element <script type="math/tex">l_{ij}</script> such as fecundity or 
survival could be manipulated by managers, how much would the long term 
population growth rate change? To this end, one can calculate the 
<em>sensitivity</em> of the dominant eigenvalue (<script type="math/tex">\lambda_{1}</script>) to small 
changes in <script type="math/tex">l_{ij}</script>: </p>

<script type="math/tex; mode=display">
\frac{\partial  \lambda_{1}}{\partial  l_{ij}} = \frac{(w_{1})_{i} (v_{1})_{j}}{\bar{w}_{1}^{T} \bar{v}_{1}},
</script>

<p>where <script type="math/tex">\bar{w}_{1}</script> and <script type="math/tex">\bar{v}_{1}</script> are left and right 
eigenvectors, respectively, associated with the dominant eigenvalue. 
Because survival and fecundity are on different scales, sensitivity is 
often scaled by a factor of <script type="math/tex">\frac{L_{ij}}{\lambda_{1}}</script> for a measure
 of <em>elasticity</em>. </p>

<h4 id="building-the-r-shiny-app">Building the R shiny app</h4>

<p>Files are accessible in <a href="https://github.com/mbjoseph/leslie">this</a> repository. Please feel free to clone for your own use and/or contribute. </p>

<p><a href="http://glimmer.rstudio.com/mbjoseph/leslie/">Here</a> is the resulting graphical user interface for the model.</p>
]]></content>
  </entry>
  
</feed>
