Jekyll2024-01-10T19:28:19+00:00https://davidhope.ca/blog/feed.xmlHope thoughtsA randomly generated hot take for my own amusment.David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopePhD Graduand2018-12-20T00:00:00+00:002018-12-20T00:00:00+00:00https://davidhope.ca/blog/thesis/thesis<blockquote>
<p>Just get finished</p>
</blockquote>
<p class="full"><img src="https://davidhope.ca/blog/assets/images/dr_office.jpg" alt="alt" /></p>
<p>It feels weird to be on this side of my defence. For so long (sooo long), it felt like I’d never get a document that my committee would look at as a thesis and then the transition from thesis to defence flew by. Between having a version that my supervisor could strong arm the committee into approving and the main event, I got a job, interviewed for several others, and was busier than I had been for much of my thesis. I had to push the preparations for the actual defence into the evenings after the rest of my life had calmed down.</p>
<p>I was pretty worried when I stepped into that room, particularily as I’d received only a little feedback on two of my chapters. But it was a blast! Really, how often do you get to be the centre of attention for 2.5 hours while people talk about your work? I enjoyed my MSc defence also, but this one was fun!</p>
<p>Luckily the revisions were minor, mostly errors in grammar (see examples in this text), and so I can get it away with 2018 stamped on the thesis, despite a tight schedule between the defence and deadline (more job interviews, final exams to mark, jobs to complete).</p>
<p>Now, the big question of what comes next. I’m lucky enough to have some work to transition me out of school. However, the job market looms. I’m looking forward to being paid for my work, but I’ll miss the freedom of graduate school and my 10 minute walking commute.</p>
<p>If I have any advice for future students is just write the damn thing. As my kid’s teacher might ask, “Is this your best work, soon to be Dr. Hope?” Probably not, but that didn’t seem to make the defence any more difficult and it sure is easier to move on with your life with an imperfect thesis than with an unwritten thesis.</p>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeJust get finishedDon’t update!!!2018-09-18T00:00:00+00:002018-09-18T00:00:00+00:00https://davidhope.ca/blog/linux/broken<blockquote>
<p>Don’t update unless you must!</p>
</blockquote>
<p class="full"><img src="https://media.giphy.com/media/11kEuHSQAXXiGQ/giphy.gif" alt="argh" /></p>
<p>I do this far too much. I see there is a new update for a software or package and I can’t wait to download and install it. I’m not sure why this is. I’ve had so many bad experiences in the past from updates that I should have learned, but once again this week I took the dive into <code class="language-plaintext highlighter-rouge">R3.5</code>. This version has been around for a while, but it is not an automatic upgrade on my system mostly because R is starting to force byte-compiling of all packages. I was warned about this by lab mates and held off from updating. Not long enough apparently. The upgrade broke most of my packages, which is what I’d expected, but then the dependencies were also broken, so I ended up having to compile my entire R package library again. Not unexpected so far. Unfortunately, <code class="language-plaintext highlighter-rouge">lme4</code> failed to compile. This is a fairly critical package for my work. The problem was found in a package called <code class="language-plaintext highlighter-rouge">nloptr</code>. I spent too many hours banging my head against the wall trying to get it to compile to no avail. I even created a <a href="https://github.com/jyypma/nloptr/issues/48">GitHub issue</a> and posted on my OS’s message boards about it. No dice.</p>
<p>The sad solution was to restore my OS. Fortunately this was easier than many of the hacks I’d been trying and after everything was backed up and restored the packages loaded. In the end a happy story, but I mostly put this post here as a reminder to myself to stay away from the update button until I need to (excluding security updates of course) or I’ve confirmed it is not going to brick my computer.</p>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeDon’t update unless you must! I do this far too much. I see there is a new update for a software or package and I can’t wait to download and install it. I’m not sure why this is. I’ve had so many bad experiences in the past from updates that I should have learned, but once again this week I took the dive into R3.5. This version has been around for a while, but it is not an automatic upgrade on my system mostly because R is starting to force byte-compiling of all packages. I was warned about this by lab mates and held off from updating. Not long enough apparently. The upgrade broke most of my packages, which is what I’d expected, but then the dependencies were also broken, so I ended up having to compile my entire R package library again. Not unexpected so far. Unfortunately, lme4 failed to compile. This is a fairly critical package for my work. The problem was found in a package called nloptr. I spent too many hours banging my head against the wall trying to get it to compile to no avail. I even created a GitHub issue and posted on my OS’s message boards about it. No dice. The sad solution was to restore my OS. Fortunately this was easier than many of the hacks I’d been trying and after everything was backed up and restored the packages loaded. In the end a happy story, but I mostly put this post here as a reminder to myself to stay away from the update button until I need to (excluding security updates of course) or I’ve confirmed it is not going to brick my computer.IOC review2018-09-09T00:00:00+00:002018-09-09T00:00:00+00:00https://davidhope.ca/blog/conferences/iocreport<p><em>In Development</em></p>
<h1 id="the-delights-of-the-international-ornithological-congress">The delights of the International Ornithological Congress</h1>
<figure class="third full">
<img src="https://davidhope.ca/blog/assets/images/ioc/MyPoster.jpg" alt="My poster" />
<img src="https://davidhope.ca/blog/assets/images/ioc/pigeon.jpg" alt="When no one asks about your great research" />
<img src="https://davidhope.ca/blog/assets/images/ioc/Posterbest.jpg" alt="Simplicity" />
<img src="https://davidhope.ca/blog/assets/images/ioc/poster2.jpg" alt="Conferring on the results" />
<img src="https://davidhope.ca/blog/assets/images/ioc/RichardTalk.jpg" alt="Captive audience" />
<img src="https://davidhope.ca/blog/assets/images/ioc/poster1.jpg" alt="ECCC's Charles Francis" />
<figcaption>Some highlights from the IOC poster session
</figcaption>
</figure>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeIn DevelopmentCombining thesis chapters2018-09-08T00:00:00+00:002018-09-08T00:00:00+00:00https://davidhope.ca/blog/thesis%20code/import<blockquote>
<p>How to prevent building every chapter again when I combine them.</p>
</blockquote>
<p class="full"><img src="https://media.giphy.com/media/Y6YWPgjBFA5i0/giphy.gif" alt="argh" /></p>
<p>I’m pulling together the chapters of my thesis. They’ve each been written separately with <code class="language-plaintext highlighter-rouge">knitr</code> in different folders. I’ve been struggling to pull them all together into the SFU thesis format as each file has intro and discussion as LaTeX files. I stumbled across the solution. It is not quite working, but this is due to my including appendices and backmatter in each chapter. The solution is the package <code class="language-plaintext highlighter-rouge">import</code>. By adding <code class="language-plaintext highlighter-rouge">\usepackage{import}</code> in the preamble I can add the following:</p>
<div class="language-latex highlighter-rouge"><div class="highlight"><pre class="highlight"><code>import<span class="p">{</span>/path/to/chapter/<span class="p">}{</span>chaptertexfile<span class="p">}</span>
</code></pre></div></div>
<p>instead of</p>
<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o"><<</span><span class="n">ch2</span><span class="p">,</span><span class="w"> </span><span class="n">child</span><span class="o">=</span><span class="s2">"/path/to/chapter/chapterrnwfile.Rnw"</span><span class="p">,</span><span class="w"> </span><span class="n">include</span><span class="o">=</span><span class="nb">T</span><span class="p">,</span><span class="w"> </span><span class="n">eval</span><span class="o">=</span><span class="nb">T</span><span class="o">>>=</span><span class="w">
</span><span class="o">@</span><span class="w">
</span></code></pre></div></div>
<p>which builds the chapter again in the thesis chapter, which will be fairly time insensitive for a lot of my larger chapters. This way each chapter builds using <code class="language-plaintext highlighter-rouge">knitr</code> and <code class="language-plaintext highlighter-rouge">bibtex</code> then imports together into a final thesis document. Sometimes the simplest is the best way.</p>
<p><strong>Update:</strong> So I finally pulled my thesis together and have decided import is terrible and if I use child documents and set the cache path it won’t rebuild every time.</p>
<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o"><<</span><span class="n">ch2</span><span class="p">,</span><span class="w"> </span><span class="n">child</span><span class="o">=</span><span class="s2">"/path/to/chapter/chapterrnwfile.Rnw"</span><span class="p">,</span><span class="w"> </span><span class="n">include</span><span class="o">=</span><span class="nb">T</span><span class="p">,</span><span class="w"> </span><span class="n">eval</span><span class="o">=</span><span class="nb">T</span><span class="p">,</span><span class="w"> </span><span class="n">cache.path</span><span class="o">=</span><span class="s1">'/path/to/chapter/cache/'</span><span class="o">>>=</span><span class="w">
</span><span class="o">@</span><span class="w">
</span></code></pre></div></div>
<p>also, with <code class="language-plaintext highlighter-rouge">R3.5</code> things run much faster though that’s another story.</p>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeHow to prevent building every chapter again when I combine them. I’m pulling together the chapters of my thesis. They’ve each been written separately with knitr in different folders. I’ve been struggling to pull them all together into the SFU thesis format as each file has intro and discussion as LaTeX files. I stumbled across the solution. It is not quite working, but this is due to my including appendices and backmatter in each chapter. The solution is the package import. By adding \usepackage{import} in the preamble I can add the following: import{/path/to/chapter/}{chaptertexfile} instead of <<ch2, child="/path/to/chapter/chapterrnwfile.Rnw", include=T, eval=T>>= @ which builds the chapter again in the thesis chapter, which will be fairly time insensitive for a lot of my larger chapters. This way each chapter builds using knitr and bibtex then imports together into a final thesis document. Sometimes the simplest is the best way. Update: So I finally pulled my thesis together and have decided import is terrible and if I use child documents and set the cache path it won’t rebuild every time. <<ch2, child="/path/to/chapter/chapterrnwfile.Rnw", include=T, eval=T, cache.path='/path/to/chapter/cache/'>>= @ also, with R3.5 things run much faster though that’s another story.Off to the IOC2018-08-21T00:00:00+00:002018-08-21T00:00:00+00:00https://davidhope.ca/blog/conferences/ioc2018<blockquote>
<p>I’ll be fighting my introversion this week</p>
</blockquote>
<p class="full"><img src="https://davidhope.ca/blog/assets/images/Lone_Peep.jpg" alt="alt" /></p>
<p>I’m off to the <a href="http://www.iocongress2018.com">International Ornithological Congress</a> this week just down the road. It will probably be my last conference as a grad student. I probably should be putting effort into finding a postdoc or job and I’m hopeful something will come up, but I really find the schmoozing aspect of such encounters difficult. It is a sign of my privilege that I haven’t had to do anything like that in the past. Finding a job with a PhD is a daunting task, but I’m hoping talking to those who have passed on before me will make the path easier.</p>
<p>Anyway, I’m presenting a poster at the conference on Wednesday, but you can have a sneak peak by downloading it from the website here: <a href="http://i.sfu.ca/RNRdFn">http://i.sfu.ca/RNRdFn</a> or scan the code below.</p>
<p><img src="https://davidhope.ca/blog/assets/images/frame.png" alt="http://i.sfu.ca/RNRdFn" /></p>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeI’ll be fighting my introversion this week I’m off to the International Ornithological Congress this week just down the road. It will probably be my last conference as a grad student. I probably should be putting effort into finding a postdoc or job and I’m hopeful something will come up, but I really find the schmoozing aspect of such encounters difficult. It is a sign of my privilege that I haven’t had to do anything like that in the past. Finding a job with a PhD is a daunting task, but I’m hoping talking to those who have passed on before me will make the path easier. Anyway, I’m presenting a poster at the conference on Wednesday, but you can have a sneak peak by downloading it from the website here: http://i.sfu.ca/RNRdFn or scan the code below.Purrr or not2018-08-13T00:00:00+00:002018-08-13T00:00:00+00:00https://davidhope.ca/blog/coding%20examples/purrr<blockquote>
<p>What’s an hour
in the life of a graduate student?</p>
</blockquote>
<p class="full"><img src="https://davidhope.ca/blog/assets/images/Flock_close.jpg" alt="alt" /></p>
<p>I initially resisted functions in <code class="language-plaintext highlighter-rouge">R</code>. I started out using for loops. Looping back it feels like the craziest thing I could think of, but I for some reason couldn’t get my head around the function. Now I write functions for just about anything I use more than twice. I used <code class="language-plaintext highlighter-rouge">apply</code> for a long time, but then I started using <code class="language-plaintext highlighter-rouge">map</code> from <code class="language-plaintext highlighter-rouge">purrr</code> a lot. After reading some of the posts at <a href="https://jennybc.github.io">jennybc.github.io</a> I’ve gotten more comfortable using <code class="language-plaintext highlighter-rouge">purrr</code> for a lot of things.</p>
<p>If I have more than one file to load I use <code class="language-plaintext highlighter-rouge">purrr</code>:</p>
<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="n">dat</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">map_df</span><span class="p">(</span><span class="n">list.of.files</span><span class="p">[</span><span class="n">grep</span><span class="p">(</span><span class="n">scenario</span><span class="p">,</span><span class="w"> </span><span class="n">list.of.files</span><span class="p">)],</span><span class="w"> </span><span class="n">read_tsv</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>
<p>So I can search through a list of files and load just the ones I want.</p>
<p>I’ve used it a lot to run bootstraps on custom functions</p>
<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">scen_prod</span><span class="w"> </span><span class="o"><-</span><span class="w">
</span><span class="n">pred_mass</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">Month</span><span class="o">=</span><span class="n">month</span><span class="p">(</span><span class="n">md</span><span class="p">),</span><span class="w"> </span><span class="n">Day</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">day</span><span class="p">(</span><span class="n">md</span><span class="p">))</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Month</span><span class="w"> </span><span class="o">!=</span><span class="m">6</span><span class="w"> </span><span class="o">&</span><span class="c1"># Age %in% c("A", "J", "U") &</span><span class="w">
</span><span class="p">((</span><span class="n">Month</span><span class="w"> </span><span class="o">==</span><span class="m">7</span><span class="w"> </span><span class="o">&</span><span class="n">Day</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="m">25</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="w">
</span><span class="p">(</span><span class="n">Month</span><span class="o">==</span><span class="m">8</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="n">Day</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="m">5</span><span class="p">)</span><span class="w"> </span><span class="p">))</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">rerun</span><span class="p">(</span><span class="n">.n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">nboot</span><span class="p">,</span><span class="w"> </span><span class="n">sample_i</span><span class="w"> </span><span class="o">=</span><span class="n">mod.dat.sample</span><span class="p">(</span><span class="n">dat</span><span class="o">=</span><span class="n">.</span><span class="p">,</span><span class="w"> </span><span class="n">catch_n</span><span class="o">=</span><span class="n">dailycatch</span><span class="p">))</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">map_df</span><span class="p">(</span><span class="o">~</span><span class="n">sumModDat</span><span class="p">(</span><span class="n">.x</span><span class="o">$</span><span class="n">sample_i</span><span class="p">,</span><span class="w"> </span><span class="n">scen</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">T</span><span class="p">))</span><span class="w">
</span></code></pre></div></div>
<p>Here I’m resampling data generated from a model to match the structure of capture data from the field.</p>
<p>Most recently I’m moving to what I feel is the most programmer way of doing things and the furthest out of my comfort zone, in using map on nested data frames. Nested data frames, like functions are just something I had a hard time getting comfortable with. I’ll admit I don’t always see the benefit to using them, but I’m getting in the habit of trying them out when it seems to make some sense.</p>
<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">modelRuns</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">tibble</span><span class="p">(</span><span class="w">
</span><span class="n">dat</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">map_df</span><span class="p">(</span><span class="nf">list</span><span class="p">(</span><span class="n">ressurvey</span><span class="p">,</span><span class="w"> </span><span class="n">falcon_arrival</span><span class="p">,</span><span class="n">falc_inc</span><span class="p">,</span><span class="w"> </span><span class="n">decline_f</span><span class="p">,</span><span class="w"> </span><span class="n">decline_f</span><span class="p">,</span><span class="w"> </span><span class="n">decline</span><span class="p">,</span><span class="w"> </span><span class="n">stable</span><span class="p">,</span><span class="w"> </span><span class="n">inc</span><span class="p">),</span><span class="n">nest</span><span class="p">)</span><span class="o">$</span><span class="n">data</span><span class="p">,</span><span class="w">
</span><span class="n">mod_dat</span><span class="o">=</span><span class="w"> </span><span class="n">map_df</span><span class="p">(</span><span class="nf">list</span><span class="p">(</span><span class="n">falc_arrival</span><span class="p">,</span><span class="w"> </span><span class="n">falc_arrival</span><span class="p">,</span><span class="w"> </span><span class="n">falc_pop</span><span class="p">,</span><span class="w"> </span><span class="n">wesa_mass</span><span class="p">,</span><span class="w"> </span><span class="n">wesa_food</span><span class="p">,</span><span class="w"> </span><span class="n">wesa_pop</span><span class="p">,</span><span class="n">wesa_pop</span><span class="p">,</span><span class="n">wesa_pop</span><span class="p">),</span><span class="w"> </span><span class="n">nest</span><span class="p">)</span><span class="o">$</span><span class="n">data</span><span class="p">,</span><span class="w">
</span><span class="n">bringyourowndat</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="nb">T</span><span class="p">,</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="nb">F</span><span class="p">,</span><span class="m">7</span><span class="p">))</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">propPlots</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pmap</span><span class="p">(</span><span class="n">.</span><span class="p">,</span><span class="w"> </span><span class="n">predictandplot</span><span class="p">,</span><span class="w"> </span><span class="n">returnType</span><span class="o">=</span><span class="s2">"plot"</span><span class="p">,</span><span class="w"> </span><span class="n">sepPlots</span><span class="o">=</span><span class="nb">T</span><span class="p">,</span><span class="w"> </span><span class="n">relAbundace</span><span class="o">=</span><span class="nb">F</span><span class="p">))</span><span class="w">
</span></code></pre></div></div>
<p>Here I’m creating a nested dataframe of different model scenarios and real life data and then generating a nested column of plots. Total overkill I know, but hopfully I learned something here.</p>
<p>I know I’m not yet posting reproducible code. I’ll try to post examples from the <code class="language-plaintext highlighter-rouge">r</code> datasets to make them more than just me reflecting on the code I wrote that makes no sense to anyone but me.</p>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeWhat’s an hour in the life of a graduate student? I initially resisted functions in R. I started out using for loops. Looping back it feels like the craziest thing I could think of, but I for some reason couldn’t get my head around the function. Now I write functions for just about anything I use more than twice. I used apply for a long time, but then I started using map from purrr a lot. After reading some of the posts at jennybc.github.io I’ve gotten more comfortable using purrr for a lot of things. If I have more than one file to load I use purrr: dat <- map_df(list.of.files[grep(scenario, list.of.files)], read_tsv) So I can search through a list of files and load just the ones I want. I’ve used it a lot to run bootstraps on custom functions scen_prod <- pred_mass %>% mutate(Month=month(md), Day = day(md)) %>% filter(Month !=6 &# Age %in% c("A", "J", "U") & ((Month ==7 &Day < 25) | (Month==8 & Day > 5) )) %>% rerun(.n = nboot, sample_i =mod.dat.sample(dat=., catch_n=dailycatch)) %>% map_df(~sumModDat(.x$sample_i, scen = T)) Here I’m resampling data generated from a model to match the structure of capture data from the field. Most recently I’m moving to what I feel is the most programmer way of doing things and the furthest out of my comfort zone, in using map on nested data frames. Nested data frames, like functions are just something I had a hard time getting comfortable with. I’ll admit I don’t always see the benefit to using them, but I’m getting in the habit of trying them out when it seems to make some sense. modelRuns <- tibble( dat = map_df(list(ressurvey, falcon_arrival,falc_inc, decline_f, decline_f, decline, stable, inc),nest)$data, mod_dat= map_df(list(falc_arrival, falc_arrival, falc_pop, wesa_mass, wesa_food, wesa_pop,wesa_pop,wesa_pop), nest)$data, bringyourowndat = c(T, rep(F,7)) ) %>% mutate(propPlots = pmap(., predictandplot, returnType="plot", sepPlots=T, relAbundace=F)) Here I’m creating a nested dataframe of different model scenarios and real life data and then generating a nested column of plots. Total overkill I know, but hopfully I learned something here. I know I’m not yet posting reproducible code. I’ll try to post examples from the r datasets to make them more than just me reflecting on the code I wrote that makes no sense to anyone but me.ggplot maps2018-08-09T00:00:00+00:002018-08-09T00:00:00+00:00https://davidhope.ca/blog/coding%20examples/mapt<blockquote>
<p>Tick tock, tick tock</p>
</blockquote>
<p>I’ve been a bit distracted with writing words in an actual document this week, but I got excited today when I found this piece <a href="https://github.com/tidyverse/ggplot2/wiki/plotting-polygon-shapefiles">here</a> on plotting maps in <code class="language-plaintext highlighter-rouge">ggplot2</code>. I’ve used a raster to extract habitat information based on a cell’s location in the past, but over the scale of Atlantic Canada, this is very time and CPU consuming. I needed to plot my results for an upcoming poster and wanted to redo an example map I’d used in a presentation before.</p>
<p>Here’s the code that made the new version</p>
<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">library</span><span class="p">(</span><span class="n">sp</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rgdal</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rgeos</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">maptools</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">raster</span><span class="p">)</span><span class="w">
</span><span class="n">require</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">require</span><span class="p">(</span><span class="n">cowplot</span><span class="p">)</span><span class="w">
</span><span class="c1">### Ignore this, its just loding and setting up the data</span><span class="w">
</span><span class="n">source</span><span class="p">(</span><span class="s1">'prepareNewSiteData.r'</span><span class="p">)</span><span class="w">
</span><span class="n">points.layer</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">dat</span><span class="w">
</span><span class="n">fixR</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">d</span><span class="o">=</span><span class="m">150</span><span class="p">)</span><span class="w"> </span><span class="n">ifelse</span><span class="p">(</span><span class="nf">is.na</span><span class="p">(</span><span class="n">x</span><span class="p">),</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">ifelse</span><span class="p">(</span><span class="n">x</span><span class="o">></span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">))</span><span class="w">
</span><span class="n">fixA</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="n">ifelse</span><span class="p">(</span><span class="o">!</span><span class="nf">is.na</span><span class="p">(</span><span class="n">x</span><span class="p">),</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w">
</span><span class="n">utm.proj</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"+proj=utm +zone="</span><span class="p">,</span><span class="w"> </span><span class="n">utm</span><span class="p">,</span><span class="w"> </span><span class="s2">" +north +ellps=GRS80 +units=m +no_defs "</span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="w"> </span><span class="o">=</span><span class="s2">""</span><span class="p">)</span><span class="w">
</span><span class="n">P.utm.utm</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">readOGR</span><span class="p">(</span><span class="s2">"../GIS/"</span><span class="p">,</span><span class="n">layer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paste0</span><span class="p">(</span><span class="s2">"UTM"</span><span class="p">,</span><span class="w"> </span><span class="n">utm</span><span class="p">,</span><span class="w"> </span><span class="s2">"Intertidal_dist"</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">sep</span><span class="w"> </span><span class="o">=</span><span class="s2">""</span><span class="p">))</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">spTransform</span><span class="p">(</span><span class="n">.</span><span class="p">,</span><span class="w"> </span><span class="n">CRS</span><span class="p">(</span><span class="n">utm.proj</span><span class="p">))</span><span class="w">
</span><span class="n">P.utm.utm</span><span class="o">$</span><span class="n">distanceD150</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">fixR</span><span class="p">(</span><span class="n">P.utm.utm</span><span class="o">$</span><span class="n">distance</span><span class="p">)</span><span class="w">
</span><span class="n">P.utm.utm</span><span class="o">$</span><span class="n">distanceA</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">fixA</span><span class="p">(</span><span class="n">P.utm.utm</span><span class="o">$</span><span class="n">distance</span><span class="p">)</span><span class="w">
</span><span class="c1"># Here's the key I didn't realize about fortifying my data</span><span class="w">
</span><span class="n">extent_r</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">extent</span><span class="p">(</span><span class="n">matrix</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="m">367012.3</span><span class="p">,</span><span class="m">5061473</span><span class="p">,</span><span class="m">373081.6</span><span class="w"> </span><span class="p">,</span><span class="m">5069023</span><span class="w"> </span><span class="p">),</span><span class="w"> </span><span class="n">nrow</span><span class="o">=</span><span class="m">2</span><span class="p">))</span><span class="w">
</span><span class="n">pointsPolygon</span><span class="o">@</span><span class="n">data</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">as.data.frame</span><span class="p">(</span><span class="n">pointsPolygon</span><span class="o">@</span><span class="n">data</span><span class="p">)</span><span class="w">
</span><span class="n">buffg</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">gBuffer</span><span class="p">(</span><span class="n">pointsPolygon</span><span class="p">,</span><span class="n">byid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">T</span><span class="p">,</span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2500</span><span class="p">)</span><span class="w">
</span><span class="n">buffg</span><span class="o">@</span><span class="n">data</span><span class="o">$</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rownames</span><span class="p">(</span><span class="n">buffg</span><span class="o">@</span><span class="n">data</span><span class="p">)</span><span class="w">
</span><span class="n">buffg.points</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fortify</span><span class="p">(</span><span class="n">buffg</span><span class="p">,</span><span class="w"> </span><span class="n">region</span><span class="o">=</span><span class="s2">"id"</span><span class="p">)</span><span class="w">
</span><span class="n">buffg.points.df</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">plyr</span><span class="o">::</span><span class="n">join</span><span class="p">(</span><span class="n">buffg.points</span><span class="p">,</span><span class="w"> </span><span class="n">buffg</span><span class="o">@</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="o">=</span><span class="s2">"id"</span><span class="p">)</span><span class="o">%>%</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">Locality</span><span class="o">==</span><span class="s2">"Mary's Point"</span><span class="p">)</span><span class="w">
</span><span class="n">P.utm.utm.crop</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">crop</span><span class="p">(</span><span class="n">P.utm.utm</span><span class="p">,</span><span class="w"> </span><span class="n">extent_r</span><span class="p">)</span><span class="w">
</span><span class="n">P.utm.utm.crop</span><span class="o">@</span><span class="n">data</span><span class="o">$</span><span class="n">id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rownames</span><span class="p">(</span><span class="n">P.utm.utm.crop</span><span class="o">@</span><span class="n">data</span><span class="p">)</span><span class="w">
</span><span class="n">P.utm.utm.crop.points</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fortify</span><span class="p">(</span><span class="n">P.utm.utm.crop</span><span class="p">,</span><span class="w"> </span><span class="n">region</span><span class="o">=</span><span class="s2">"id"</span><span class="p">)</span><span class="w">
</span><span class="n">P.utm.utm.crop.df</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">plyr</span><span class="o">::</span><span class="n">join</span><span class="p">(</span><span class="n">P.utm.utm.crop.points</span><span class="p">,</span><span class="w"> </span><span class="n">P.utm.utm.crop</span><span class="o">@</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="o">=</span><span class="s2">"id"</span><span class="p">)</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">d150</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ifelse</span><span class="p">(</span><span class="n">distance</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">150</span><span class="p">,</span><span class="w"> </span><span class="s2">"High"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Low"</span><span class="p">))</span><span class="w">
</span><span class="c1"># Here's the easy ggplot. </span><span class="w">
</span><span class="n">mapt_plt</span><span class="w"> </span><span class="o"><-</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">P.utm.utm.crop.df</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">aes</span><span class="p">(</span><span class="n">long</span><span class="p">,</span><span class="n">lat</span><span class="p">,</span><span class="n">group</span><span class="o">=</span><span class="n">group</span><span class="p">,</span><span class="n">fill</span><span class="o">=</span><span class="n">as.factor</span><span class="p">(</span><span class="n">d150</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_polygon</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_polygon</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">buffg.points.df</span><span class="p">,</span><span class="w"> </span><span class="n">aes</span><span class="p">(</span><span class="n">fill</span><span class="o">=</span><span class="kc">NA</span><span class="p">),</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'black'</span><span class="p">)</span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">points.layer.points</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'black'</span><span class="p">,</span><span class="w">
</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="o">=</span><span class="n">y</span><span class="p">,</span><span class="n">group</span><span class="o">=</span><span class="kc">NULL</span><span class="p">,</span><span class="n">fill</span><span class="o">=</span><span class="kc">NULL</span><span class="p">),</span><span class="w"> </span><span class="n">size</span><span class="o">=</span><span class="m">3</span><span class="p">)</span><span class="o">+</span><span class="w">
</span><span class="n">coord_equal</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_fill_brewer</span><span class="p">(</span><span class="n">type</span><span class="o">=</span><span class="s1">'qual'</span><span class="p">,</span><span class="w"> </span><span class="n">palette</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Set1'</span><span class="p">,</span><span class="w">
</span><span class="n">direction</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="s2">"Predation Danger"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">legend.position</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'None'</span><span class="p">,</span><span class="w"> </span><span class="n">axis.ticks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">axis.text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w">
</span><span class="n">axis.line</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">())</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="s2">""</span><span class="p">,</span><span class="n">y</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="m">372000</span><span class="p">,</span><span class="w"> </span><span class="m">5063000</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Mary's Point, NB"</span><span class="w"> </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>
<p>Here’s the original (left) and final map (right):</p>
<figure class="half">
<a href="/blog/assets/images/MP1.png"><img src="/blog/assets/images/MP1.png" /></a>
<a href="/blog/assets/images/MAPT_example.png"><img src="/blog/assets/images/MAPT_example.png" /></a>
<figcaption>Map of Mary's Point, NB showing intertidal designated high (red) and low (blue) danger. Left shows map made with a raster in base R. Right shows the version described above with ggplot2.</figcaption>
</figure>
<p><em>Much nicer I think. And several hours faster</em></p>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeTick tock, tick tock I’ve been a bit distracted with writing words in an actual document this week, but I got excited today when I found this piece here on plotting maps in ggplot2. I’ve used a raster to extract habitat information based on a cell’s location in the past, but over the scale of Atlantic Canada, this is very time and CPU consuming. I needed to plot my results for an upcoming poster and wanted to redo an example map I’d used in a presentation before. Here’s the code that made the new version library(sp) library(rgdal) library(rgeos) library(maptools) library(raster) require(tidyverse) require(cowplot) ### Ignore this, its just loding and setting up the data source('prepareNewSiteData.r') points.layer <- dat fixR <- function(x, d=150) ifelse(is.na(x), x, ifelse(x>d, 0, 1)) fixA <- function(x) ifelse(!is.na(x), 1, x) utm.proj <- paste0("+proj=utm +zone=", utm, " +north +ellps=GRS80 +units=m +no_defs ", sep ="") P.utm.utm <- readOGR("../GIS/",layer = paste0("UTM", utm, "Intertidal_dist" , sep ="")) %>% spTransform(., CRS(utm.proj)) P.utm.utm$distanceD150 <- fixR(P.utm.utm$distance) P.utm.utm$distanceA <- fixA(P.utm.utm$distance) # Here's the key I didn't realize about fortifying my data extent_r <- extent(matrix(c(367012.3,5061473,373081.6 ,5069023 ), nrow=2)) pointsPolygon@data <- as.data.frame(pointsPolygon@data) buffg <- gBuffer(pointsPolygon,byid = T,width = 2500) buffg@data$id = rownames(buffg@data) buffg.points = fortify(buffg, region="id") buffg.points.df = plyr::join(buffg.points, buffg@data, by="id")%>% filter(Locality=="Mary's Point") P.utm.utm.crop <- crop(P.utm.utm, extent_r) P.utm.utm.crop@data$id = rownames(P.utm.utm.crop@data) P.utm.utm.crop.points = fortify(P.utm.utm.crop, region="id") P.utm.utm.crop.df = plyr::join(P.utm.utm.crop.points, P.utm.utm.crop@data, by="id") %>% mutate(d150 = ifelse(distance == 150, "High", "Low")) # Here's the easy ggplot. mapt_plt <- ggplot(P.utm.utm.crop.df) + aes(long,lat,group=group,fill=as.factor(d150)) + geom_polygon() + geom_polygon(data=buffg.points.df, aes(fill=NA), colour = 'black')+ geom_point(data=points.layer.points, colour = 'black', aes(x=x,y=y,group=NULL,fill=NULL), size=3)+ coord_equal() + scale_fill_brewer(type='qual', palette = 'Set1', direction = 1,"Predation Danger") + theme(legend.position = 'None', axis.ticks = element_blank(), axis.text = element_blank(), axis.line = element_blank()) + labs(x="",y="") + annotate("text",372000, 5063000, label = "Mary's Point, NB" ) Here’s the original (left) and final map (right): Map of Mary's Point, NB showing intertidal designated high (red) and low (blue) danger. Left shows map made with a raster in base R. Right shows the version described above with ggplot2. Much nicer I think. And several hours fasterOne piece of code2018-07-31T00:00:00+00:002018-07-31T00:00:00+00:00https://davidhope.ca/blog/coding%20examples/code<blockquote>
<p>What’s an hour
in the life of a graduate student?</p>
</blockquote>
<p class="full"><img src="https://davidhope.ca/blog/assets/images/LoneWalker.jpg" alt="alt" /></p>
<p>Well time certainly does fly. I’m currently wrapping up the monster of a thesis,
but I thought that I should get into the habit of sharing something of my work and
what I’m working on.</p>
<p>My thesis is developing into a <code class="language-plaintext highlighter-rouge">knitr</code> knightmare, but I’ve learned a lot a long the way.
I’ve also learned to use <code class="language-plaintext highlighter-rouge">c++</code>, <code class="language-plaintext highlighter-rouge">python</code>, and become an <code class="language-plaintext highlighter-rouge">r</code> person to the degree that I can
suggest code for a program off the top of my head.</p>
<p>All this to say I have spent most of my time in front of a computer working on some piece of code.</p>
<p>I thought as much as I can I’ll try sharing a piece that was useful to me. I’ll try to make it
reproducible, but we shall see.</p>
<p>Today I mostly worked on developing a method for optimizing a model in relation to a
particular parameter and survey results.</p>
<p>This will not be reproducible, but I’m pretty excited that I found a way to automate model fitting.</p>
<p>First here is the code:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span><span class="p">(</span><span class="n">pIdealFound</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">i</span><span class="p">;</span> <span class="kt">int</span> <span class="n">prev_birds</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
<span class="n">delta_T</span> <span class="o">=</span> <span class="n">survey_total</span><span class="o">-</span><span class="n">totalBirds</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="n">date</span><span class="o"><</span><span class="mi">42</span><span class="p">)</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">else</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">currentbirds</span> <span class="o">=</span> <span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span> <span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*=</span> <span class="mf">1.2</span><span class="p">;</span>
<span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">abs</span><span class="p">(</span><span class="n">delta_T</span><span class="p">)</span><span class="o"><</span><span class="mi">10</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">idealN_found</span><span class="o">=</span><span class="nb">true</span><span class="p">;</span>
<span class="n">finalNumbers</span> <span class="o">=</span><span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<span class="p">}</span><span class="k">else</span>
<span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">SameSign_i</span><span class="p">(</span><span class="n">prev_delta_total</span><span class="p">,</span> <span class="n">delta_T</span><span class="p">))</span>
<span class="p">{</span> <span class="c1">//cout << "WTF" << endl;</span>
<span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">prev_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="n">currentbirds</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span> <span class="p">;</span>
<span class="p">}</span> <span class="k">else</span>
<span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="n">delta_T</span><span class="o"><</span><span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="n">abs</span><span class="p">(</span><span class="n">prev_delta_total</span><span class="p">)</span><span class="o">></span><span class="n">abs</span><span class="p">(</span><span class="n">delta_T</span><span class="p">))</span> <span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">/=</span><span class="mi">2</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="n">abs</span><span class="p">(</span><span class="n">prev_delta_total</span><span class="p">)</span><span class="o"><</span><span class="n">abs</span><span class="p">(</span><span class="n">delta_T</span><span class="p">))</span> <span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">prev_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">if</span><span class="p">(</span><span class="n">delta_T</span><span class="o">></span><span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="n">abs</span><span class="p">(</span><span class="n">prev_delta_total</span><span class="p">)</span><span class="o">></span><span class="n">abs</span><span class="p">(</span><span class="n">delta_T</span><span class="p">))</span> <span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*=</span><span class="mi">2</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="n">abs</span><span class="p">(</span><span class="n">prev_delta_total</span><span class="p">)</span><span class="o"><</span><span class="n">abs</span><span class="p">(</span><span class="n">delta_T</span><span class="p">))</span> <span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="mi">2</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">if</span><span class="p">(</span><span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o"><</span> <span class="mi">100</span><span class="p">)</span> <span class="n">number_birds</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>I used a function from <a href="https://stackoverflow.com/questions/1284940/check-if-numbers-have-the-same-sign">here</a> to check if two numbers are the same sign, but otherwise this mess is my own creation. The goal is to find the number of birds in a population that minimizes the difference between observed counts and the model output for a given date.</p>
<p>There are a lot of <code class="language-plaintext highlighter-rouge">if</code> and <code class="language-plaintext highlighter-rouge">else</code> in there, but the aim is to jump up or down until you are jumping back and forth between the optimum until you get your model outputted count to within 10 birds of the observed count.</p>
<p>The next step is to check this code, but it seems to work for now. If you see a new commit tommorrow you’ll know I’ve found a mistake.</p>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeWhat’s an hour in the life of a graduate student? Well time certainly does fly. I’m currently wrapping up the monster of a thesis, but I thought that I should get into the habit of sharing something of my work and what I’m working on. My thesis is developing into a knitr knightmare, but I’ve learned a lot a long the way. I’ve also learned to use c++, python, and become an r person to the degree that I can suggest code for a program off the top of my head. All this to say I have spent most of my time in front of a computer working on some piece of code. I thought as much as I can I’ll try sharing a piece that was useful to me. I’ll try to make it reproducible, but we shall see. Today I mostly worked on developing a method for optimizing a model in relation to a particular parameter and survey results. This will not be reproducible, but I’m pretty excited that I found a way to automate model fitting. First here is the code: if(pIdealFound) { int i; int prev_birds[2]; delta_T = survey_total-totalBirds; if(date<42) i = 0; else i = 1; int currentbirds = number_birds[i]; if(k==0) number_birds[i] *= 1.2; else if(abs(delta_T)<10) { idealN_found=true; finalNumbers =number_birds[i]; }else { if(!SameSign_i(prev_delta_total, delta_T)) { //cout << "WTF" << endl; number_birds[i] = (prev_birds[i]+currentbirds)/2 ; } else { if(delta_T<0) { if(abs(prev_delta_total)>abs(delta_T)) number_birds[i] /=2; if(abs(prev_delta_total)<abs(delta_T)) number_birds[i] = prev_birds[i]/2; } if(delta_T>0) { if(abs(prev_delta_total)>abs(delta_T)) number_birds[i] *=2; if(abs(prev_delta_total)<abs(delta_T)) number_birds[i] = number_birds[i]*2; } } if(number_birds[i] < 100) number_birds[i] = 10000; } } I used a function from here to check if two numbers are the same sign, but otherwise this mess is my own creation. The goal is to find the number of birds in a population that minimizes the difference between observed counts and the model output for a given date. There are a lot of if and else in there, but the aim is to jump up or down until you are jumping back and forth between the optimum until you get your model outputted count to within 10 birds of the observed count. The next step is to check this code, but it seems to work for now. If you see a new commit tommorrow you’ll know I’ve found a mistake.An introduction2017-05-31T00:00:00+00:002017-05-31T00:00:00+00:00https://davidhope.ca/blog/intro/bio/intro<p>Hi there,</p>
<p>Welcome to the unvisited corner of the internet where unread blogs live. I don’t quite know how you stubbled apon my blog, but I’m just getting started so please do excuse the rough nature of my work. I’m still not sure where I’d like to go with my writing, but there are a few things going on in my life that could inspire me to pull open a page and write.</p>
<ol>
<li>My thesis – I’m writing a long boring document and a break to rant about something else might inspire me to jump back into thesis writing.</li>
<li>Coding – I’ve learned a lot about R, Python amongst other things. I’ve found the most useful pages on the internet are those that describe a very simple proceedure well. They’re often overlooked by experience programmers, but it’d be great if I can help out another noob.</li>
<li>Politics – I’ll try to restrain myself.</li>
</ol>
<p>Beyond that I don’t really know where I’m going, but stay tuned.</p>
<p>What am I working on today?</p>
<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">adjustBiasSites</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">pbiased</span><span class="p">,</span><span class="w"> </span><span class="n">meanBias</span><span class="p">,</span><span class="w"> </span><span class="n">nsites</span><span class="o">=</span><span class="m">30</span><span class="p">,</span><span class="w"> </span><span class="n">pars</span><span class="p">){</span><span class="w">
</span><span class="n">pars</span><span class="o">$</span><span class="n">nsites</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">nsites</span><span class="w">
</span><span class="n">pars</span><span class="o">$</span><span class="n">pbiased</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">pbiased</span><span class="w">
</span><span class="n">pars</span><span class="o">$</span><span class="n">biasD</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">meanBias</span><span class="w">
</span><span class="n">result.df</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">map_df</span><span class="p">(</span><span class="n">seeds</span><span class="p">,</span><span class="w"> </span><span class="n">randomSim</span><span class="p">,</span><span class="w"> </span><span class="n">pars</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pars</span><span class="p">,</span><span class="w"> </span><span class="n">rsim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'biased'</span><span class="p">)</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">nsites</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">nsites</span><span class="p">,</span><span class="w"> </span><span class="n">pbiased</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pbiased</span><span class="p">,</span><span class="w"> </span><span class="n">meanBias</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">meanBias</span><span class="p">)</span><span class="w">
</span><span class="nf">return</span><span class="p">(</span><span class="n">result.df</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>Simulating biases within survey data! Yeah its the good life. Now waiting for some simulations to finish….</p>David Hopemail@davidhope.cahttps://www.sfu.ca/~dhopeHi there,