<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Michael Branion-Calles</title><link>https://mbcalles.github.io/</link><atom:link href="https://mbcalles.github.io/index.xml" rel="self" type="application/rss+xml"/><description>Michael Branion-Calles</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Tue, 02 Sep 2025 00:00:00 +0000</lastBuildDate><image><url>https://mbcalles.github.io/media/icon_hu_cc610732c99915fd.png</url><title>Michael Branion-Calles</title><link>https://mbcalles.github.io/</link></image><item><title>Example Talk</title><link>https://mbcalles.github.io/event/example/</link><pubDate>Sat, 01 Jun 2030 13:00:00 +0000</pubDate><guid>https://mbcalles.github.io/event/example/</guid><description>&lt;div class="flex px-4 py-3 mb-6 rounded-md bg-primary-100 dark:bg-primary-900">
&lt;span class="pr-3 pt-1 text-primary-600 dark:text-primary-300">
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m11.25 11.25l.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0a9 9 0 0 1 18 0m-9-3.75h.008v.008H12z"/>&lt;/svg>
&lt;/span>
&lt;span class="dark:text-neutral-300">Click on the &lt;strong>Slides&lt;/strong> button above to view the built-in slides feature.&lt;/span>
&lt;/div>
&lt;p>Slides can be added in a few ways:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Create&lt;/strong> slides using Hugo Blox Builder&amp;rsquo;s
feature and link using the &lt;code>slides&lt;/code> parameter in the front matter of the talk file&lt;/li>
&lt;li>&lt;strong>Upload&lt;/strong> an existing slide deck to this page bundle and link it using &lt;code>links: [{ type: slides, url: path/to/file } ]&lt;/code> in front matter&lt;/li>
&lt;li>&lt;strong>Embed&lt;/strong> your slides (e.g. Google Slides) or presentation video on this page using
.&lt;/li>
&lt;/ul>
&lt;p>Further event details, including
such as image galleries, can be added to the body of this page.&lt;/p></description></item><item><title>Projects</title><link>https://mbcalles.github.io/projects/</link><pubDate>Thu, 04 Sep 2025 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/projects/</guid><description/></item><item><title>Spatial Analysis of Social Inequalities in Road Traffic Injury</title><link>https://mbcalles.github.io/project/ses/</link><pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/project/ses/</guid><description>&lt;p>This ongoing project maps how &lt;strong>social inequalities&lt;/strong> shape the risk of &lt;strong>road traffic injuries&lt;/strong> across neighborhoods in British Columbia. By combining census data, crash records, and spatial modeling, it highlights patterns of deprivation and injury risk—especially for &lt;strong>pedestrians and cyclists&lt;/strong>—to inform safer and more equitable urban planning.&lt;/p>
&lt;p>&lt;strong>Impact:&lt;/strong> Provides evidence of strong socioeconomic gradient across all regions of the province, a first step to creating and evaluating equitable &lt;strong>transportation safety policies&lt;/strong>.&lt;/p>
&lt;p>&lt;strong>Tech Stack:&lt;/strong> R (INLA, tidyverse, sf), GIS, Bayesian spatial modeling&lt;/p></description></item><item><title>Fantasy Hockey ELO</title><link>https://mbcalles.github.io/project/shinyapphockey/</link><pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/project/shinyapphockey/</guid><description>&lt;p>A fun and interactive &lt;strong>Shiny app&lt;/strong> that tracks and visualizes &lt;strong>ELO scores over 11 seasons of fantasy hockey&lt;/strong> for participants in a head-to-head league among friends.&lt;/p>
&lt;p>&lt;strong>Impact:&lt;/strong> Makes competitive tracking intuitive and enjoyable for everyone in the league.&lt;/p>
&lt;p>&lt;strong>Tech Stack:&lt;/strong> R, Shiny, ELO algorithm, data visualization&lt;/p></description></item><item><title>Comparing pedestrian and cyclist injuries from falls and collisions in British Columbia, Canada: Frequencies and population characteristics</title><link>https://mbcalles.github.io/publication/pedestrian-falls-bc/</link><pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/pedestrian-falls-bc/</guid><description/></item><item><title>Underreporting and selection bias of serious road traffic injuries in auto insurance claims and police reports in British Columbia, Canada</title><link>https://mbcalles.github.io/publication/underreporting-trip/</link><pubDate>Thu, 06 Mar 2025 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/underreporting-trip/</guid><description/></item><item><title>Ascertainment and description of pedestrian and bicycling injuries and fatalities in Ontario from administrative health records 2003–2017: contributions of non-collision falls and crashes</title><link>https://mbcalles.github.io/publication/pedestrian-falls-ontario/</link><pubDate>Thu, 11 Jul 2024 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/pedestrian-falls-ontario/</guid><description/></item><item><title>Risk Factors and Inequities in Transportation Injury and Mortality in the Canadian Census Health and Environment Cohorts (CanCHECs)</title><link>https://mbcalles.github.io/publication/canchec-inequity/</link><pubDate>Fri, 01 Mar 2024 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/canchec-inequity/</guid><description/></item><item><title>Experience</title><link>https://mbcalles.github.io/experience/</link><pubDate>Tue, 24 Oct 2023 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/experience/</guid><description/></item><item><title>Learn JavaScript</title><link>https://mbcalles.github.io/teaching/js/</link><pubDate>Tue, 24 Oct 2023 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/teaching/js/</guid><description>&lt;p>
is designed to give technical content creators a seamless experience. You can focus on the content and the Hugo Blox Builder which this template is built upon handles the rest.&lt;/p>
&lt;p>&lt;strong>Embed videos, podcasts, code, LaTeX math, and even test students!&lt;/strong>&lt;/p>
&lt;p>On this page, you&amp;rsquo;ll find some examples of the types of technical content that can be rendered with Hugo Blox.&lt;/p>
&lt;h2 id="video">Video&lt;/h2>
&lt;p>Teach your course by sharing videos with your students. Choose from one of the following approaches:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/D2vj0WcvH5c?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video">&lt;/iframe>
&lt;/div>
&lt;p>&lt;strong>Youtube&lt;/strong>:&lt;/p>
&lt;pre>&lt;code>{{&amp;lt; youtube w7Ft2ymGmfc &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Bilibili&lt;/strong>:&lt;/p>
&lt;pre>&lt;code>{{&amp;lt; bilibili id=&amp;quot;BV1WV4y1r7DF&amp;quot; &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Video file&lt;/strong>&lt;/p>
&lt;p>Videos may be added to a page by either placing them in your &lt;code>assets/media/&lt;/code> media library or in your
, and then embedding them with the &lt;em>video&lt;/em> shortcode:&lt;/p>
&lt;pre>&lt;code>{{&amp;lt; video src=&amp;quot;my_video.mp4&amp;quot; controls=&amp;quot;yes&amp;quot; &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;h2 id="podcast">Podcast&lt;/h2>
&lt;p>You can add a podcast or music to a page by placing the MP3 file in the page&amp;rsquo;s folder or the media library folder and then embedding the audio on your page with the &lt;em>audio&lt;/em> shortcode:&lt;/p>
&lt;pre>&lt;code>{{&amp;lt; audio src=&amp;quot;ambient-piano.mp3&amp;quot; &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;p>Try it out:&lt;/p>
&lt;audio controls >
&lt;source src="https://mbcalles.github.io/teaching/js/ambient-piano.mp3" type="audio/mpeg">
&lt;/audio>
&lt;h2 id="test-students">Test students&lt;/h2>
&lt;p>Provide a simple yet fun self-assessment by revealing the solutions to challenges with the &lt;code>spoiler&lt;/code> shortcode:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">spoiler&lt;/span> &lt;span class="na">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;👉 Click to view the solution&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">You found me!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">spoiler&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>renders as&lt;/p>
&lt;details class="spoiler " id="spoiler-2">
&lt;summary class="cursor-pointer">👉 Click to view the solution&lt;/summary>
&lt;div class="rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2">
You found me 🎉
&lt;/div>
&lt;/details>
&lt;h2 id="math">Math&lt;/h2>
&lt;p>Hugo Blox Builder supports a Markdown extension for $\LaTeX$ math. You can enable this feature by toggling the &lt;code>math&lt;/code> option in your &lt;code>config/_default/params.yaml&lt;/code> file.&lt;/p>
&lt;p>To render &lt;em>inline&lt;/em> or &lt;em>block&lt;/em> math, wrap your LaTeX math with &lt;code>{{&amp;lt; math &amp;gt;}}$...${{&amp;lt; /math &amp;gt;}}&lt;/code> or &lt;code>{{&amp;lt; math &amp;gt;}}$$...$${{&amp;lt; /math &amp;gt;}}&lt;/code>, respectively.&lt;/p>
&lt;div class="flex px-4 py-3 mb-6 rounded-md bg-primary-100 dark:bg-primary-900">
&lt;span class="pr-3 pt-1 text-primary-600 dark:text-primary-300">
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m11.25 11.25l.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0a9 9 0 0 1 18 0m-9-3.75h.008v.008H12z"/>&lt;/svg>
&lt;/span>
&lt;span class="dark:text-neutral-300">We wrap the LaTeX math in the Hugo Blox &lt;em>math&lt;/em> shortcode to prevent Hugo rendering our math as Markdown.&lt;/span>
&lt;/div>
&lt;p>Example &lt;strong>math block&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-latex" data-lang="latex">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">{{&lt;/span>&amp;lt; math &amp;gt;&lt;span class="nb">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">$$&lt;/span>&lt;span class="nb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">&lt;/span>&lt;span class="nv">\gamma&lt;/span>&lt;span class="nb">_{n} &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\frac&lt;/span>&lt;span class="nb">{ &lt;/span>&lt;span class="nv">\left&lt;/span>&lt;span class="nb"> | &lt;/span>&lt;span class="nv">\left&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb"> x_{n} &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb"> x_{n&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="nb">} &lt;/span>&lt;span class="nv">\right&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb">^T &lt;/span>&lt;span class="nv">\left&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="nv">\nabla&lt;/span>&lt;span class="nb"> F &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb"> x_{n}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\nabla&lt;/span>&lt;span class="nb"> F &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb"> x_{n&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="nb">}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\right&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\right&lt;/span>&lt;span class="nb"> |}{&lt;/span>&lt;span class="nv">\left&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\|\nabla&lt;/span>&lt;span class="nb"> F&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb">{x}_{n}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\nabla&lt;/span>&lt;span class="nb"> F&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb">{x}_{n&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="nb">}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\right&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\|&lt;/span>&lt;span class="nb">^&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="nb">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">&lt;/span>&lt;span class="s">$$&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">{{&lt;/span>&amp;lt; /math &amp;gt;&lt;span class="nb">}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>renders as&lt;/p>
$$\gamma_{n} = \frac{ \left | \left (\mathbf x_{n} - \mathbf x_{n-1} \right )^T \left [\nabla F (\mathbf x_{n}) - \nabla F (\mathbf x_{n-1}) \right ] \right |}{\left \|\nabla F(\mathbf{x}_{n}) - \nabla F(\mathbf{x}_{n-1}) \right \|^2}$$
&lt;p>Example &lt;strong>inline math&lt;/strong> &lt;code>{{&amp;lt; math &amp;gt;}}$\nabla F(\mathbf{x}_{n})${{&amp;lt; /math &amp;gt;}}&lt;/code> renders as $\nabla F(\mathbf{x}_{n})$
.&lt;/p>
&lt;p>Example &lt;strong>multi-line math&lt;/strong> using the math linebreak (&lt;code>\\&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-latex" data-lang="latex">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">{{&lt;/span>&amp;lt; math &amp;gt;&lt;span class="nb">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">$$&lt;/span>&lt;span class="nb">f&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nb">k;p_{&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="nb">}^{&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nb">}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\begin&lt;/span>&lt;span class="nb">{cases}p_{&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="nb">}^{&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nb">} &amp;amp; &lt;/span>&lt;span class="nv">\text&lt;/span>&lt;span class="nb">{if }k&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="nb">, &lt;/span>&lt;span class="nv">\\&lt;/span>&lt;span class="nb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nb">p_{&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="nb">}^{&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nb">} &amp;amp; &lt;/span>&lt;span class="nv">\text&lt;/span>&lt;span class="nb">{if }k&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="nb">.&lt;/span>&lt;span class="nv">\end&lt;/span>&lt;span class="nb">{cases}&lt;/span>&lt;span class="s">$$&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">{{&lt;/span>&amp;lt; /math &amp;gt;&lt;span class="nb">}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>renders as&lt;/p>
$$
f(k;p_{0}^{*}) = \begin{cases}p_{0}^{*} &amp; \text{if }k=1, \\
1-p_{0}^{*} &amp; \text{if }k=0.\end{cases}
$$
&lt;h2 id="code">Code&lt;/h2>
&lt;p>Hugo Blox Builder utilises Hugo&amp;rsquo;s Markdown extension for highlighting code syntax. The code theme can be selected in the &lt;code>config/_default/params.yaml&lt;/code> file.&lt;/p>
&lt;pre>&lt;code>```python
import pandas as pd
data = pd.read_csv(&amp;quot;data.csv&amp;quot;)
data.head()
```
&lt;/code>&lt;/pre>
&lt;p>renders as&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read_csv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;data.csv&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="inline-images">Inline Images&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&amp;lt;&lt;/span> &lt;span class="nx">icon&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="s">&amp;#34;python&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;}}&lt;/span> &lt;span class="nx">Python&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>renders as&lt;/p>
&lt;p>
&lt;span class="inline-block pr-1">
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 448 512" fill="currentColor">&lt;path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z"/>&lt;/svg>
&lt;/span> Python&lt;/p>
&lt;h2 id="did-you-find-this-page-helpful-consider-sharing-it-">Did you find this page helpful? Consider sharing it 🙌&lt;/h2></description></item><item><title>Learn Python</title><link>https://mbcalles.github.io/teaching/python/</link><pubDate>Tue, 24 Oct 2023 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/teaching/python/</guid><description>&lt;p>
is designed to give technical content creators a seamless experience. You can focus on the content and the Hugo Blox Builder which this template is built upon handles the rest.&lt;/p>
&lt;p>&lt;strong>Embed videos, podcasts, code, LaTeX math, and even test students!&lt;/strong>&lt;/p>
&lt;p>On this page, you&amp;rsquo;ll find some examples of the types of technical content that can be rendered with Hugo Blox.&lt;/p>
&lt;h2 id="video">Video&lt;/h2>
&lt;p>Teach your course by sharing videos with your students. Choose from one of the following approaches:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/D2vj0WcvH5c?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video">&lt;/iframe>
&lt;/div>
&lt;p>&lt;strong>Youtube&lt;/strong>:&lt;/p>
&lt;pre>&lt;code>{{&amp;lt; youtube w7Ft2ymGmfc &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Bilibili&lt;/strong>:&lt;/p>
&lt;pre>&lt;code>{{&amp;lt; bilibili id=&amp;quot;BV1WV4y1r7DF&amp;quot; &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Video file&lt;/strong>&lt;/p>
&lt;p>Videos may be added to a page by either placing them in your &lt;code>assets/media/&lt;/code> media library or in your
, and then embedding them with the &lt;em>video&lt;/em> shortcode:&lt;/p>
&lt;pre>&lt;code>{{&amp;lt; video src=&amp;quot;my_video.mp4&amp;quot; controls=&amp;quot;yes&amp;quot; &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;h2 id="podcast">Podcast&lt;/h2>
&lt;p>You can add a podcast or music to a page by placing the MP3 file in the page&amp;rsquo;s folder or the media library folder and then embedding the audio on your page with the &lt;em>audio&lt;/em> shortcode:&lt;/p>
&lt;pre>&lt;code>{{&amp;lt; audio src=&amp;quot;ambient-piano.mp3&amp;quot; &amp;gt;}}
&lt;/code>&lt;/pre>
&lt;p>Try it out:&lt;/p>
&lt;audio controls >
&lt;source src="https://mbcalles.github.io/teaching/python/ambient-piano.mp3" type="audio/mpeg">
&lt;/audio>
&lt;h2 id="test-students">Test students&lt;/h2>
&lt;p>Provide a simple yet fun self-assessment by revealing the solutions to challenges with the &lt;code>spoiler&lt;/code> shortcode:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="nt">spoiler&lt;/span> &lt;span class="na">text&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;👉 Click to view the solution&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">You found me!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">{{&lt;span class="p">&amp;lt;&lt;/span> &lt;span class="p">/&lt;/span>&lt;span class="nt">spoiler&lt;/span> &lt;span class="p">&amp;gt;&lt;/span>}}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>renders as&lt;/p>
&lt;details class="spoiler " id="spoiler-2">
&lt;summary class="cursor-pointer">👉 Click to view the solution&lt;/summary>
&lt;div class="rounded-lg bg-neutral-50 dark:bg-neutral-800 p-2">
You found me 🎉
&lt;/div>
&lt;/details>
&lt;h2 id="math">Math&lt;/h2>
&lt;p>Hugo Blox Builder supports a Markdown extension for $\LaTeX$ math. You can enable this feature by toggling the &lt;code>math&lt;/code> option in your &lt;code>config/_default/params.yaml&lt;/code> file.&lt;/p>
&lt;p>To render &lt;em>inline&lt;/em> or &lt;em>block&lt;/em> math, wrap your LaTeX math with &lt;code>{{&amp;lt; math &amp;gt;}}$...${{&amp;lt; /math &amp;gt;}}&lt;/code> or &lt;code>{{&amp;lt; math &amp;gt;}}$$...$${{&amp;lt; /math &amp;gt;}}&lt;/code>, respectively.&lt;/p>
&lt;div class="flex px-4 py-3 mb-6 rounded-md bg-primary-100 dark:bg-primary-900">
&lt;span class="pr-3 pt-1 text-primary-600 dark:text-primary-300">
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m11.25 11.25l.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0a9 9 0 0 1 18 0m-9-3.75h.008v.008H12z"/>&lt;/svg>
&lt;/span>
&lt;span class="dark:text-neutral-300">We wrap the LaTeX math in the Hugo Blox &lt;em>math&lt;/em> shortcode to prevent Hugo rendering our math as Markdown.&lt;/span>
&lt;/div>
&lt;p>Example &lt;strong>math block&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-latex" data-lang="latex">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">{{&lt;/span>&amp;lt; math &amp;gt;&lt;span class="nb">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">$$&lt;/span>&lt;span class="nb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">&lt;/span>&lt;span class="nv">\gamma&lt;/span>&lt;span class="nb">_{n} &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\frac&lt;/span>&lt;span class="nb">{ &lt;/span>&lt;span class="nv">\left&lt;/span>&lt;span class="nb"> | &lt;/span>&lt;span class="nv">\left&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb"> x_{n} &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb"> x_{n&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="nb">} &lt;/span>&lt;span class="nv">\right&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb">^T &lt;/span>&lt;span class="nv">\left&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="nv">\nabla&lt;/span>&lt;span class="nb"> F &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb"> x_{n}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\nabla&lt;/span>&lt;span class="nb"> F &lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb"> x_{n&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="nb">}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\right&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\right&lt;/span>&lt;span class="nb"> |}{&lt;/span>&lt;span class="nv">\left&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\|\nabla&lt;/span>&lt;span class="nb"> F&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb">{x}_{n}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\nabla&lt;/span>&lt;span class="nb"> F&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nv">\mathbf&lt;/span>&lt;span class="nb">{x}_{n&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="nb">}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\right&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\|&lt;/span>&lt;span class="nb">^&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="nb">}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">&lt;/span>&lt;span class="s">$$&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">{{&lt;/span>&amp;lt; /math &amp;gt;&lt;span class="nb">}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>renders as&lt;/p>
$$\gamma_{n} = \frac{ \left | \left (\mathbf x_{n} - \mathbf x_{n-1} \right )^T \left [\nabla F (\mathbf x_{n}) - \nabla F (\mathbf x_{n-1}) \right ] \right |}{\left \|\nabla F(\mathbf{x}_{n}) - \nabla F(\mathbf{x}_{n-1}) \right \|^2}$$
&lt;p>Example &lt;strong>inline math&lt;/strong> &lt;code>{{&amp;lt; math &amp;gt;}}$\nabla F(\mathbf{x}_{n})${{&amp;lt; /math &amp;gt;}}&lt;/code> renders as $\nabla F(\mathbf{x}_{n})$
.&lt;/p>
&lt;p>Example &lt;strong>multi-line math&lt;/strong> using the math linebreak (&lt;code>\\&lt;/code>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-latex" data-lang="latex">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">{{&lt;/span>&amp;lt; math &amp;gt;&lt;span class="nb">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sb">$$&lt;/span>&lt;span class="nb">f&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nb">k;p_{&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="nb">}^{&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nb">}&lt;/span>&lt;span class="o">)&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nb"> &lt;/span>&lt;span class="nv">\begin&lt;/span>&lt;span class="nb">{cases}p_{&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="nb">}^{&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nb">} &amp;amp; &lt;/span>&lt;span class="nv">\text&lt;/span>&lt;span class="nb">{if }k&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="nb">, &lt;/span>&lt;span class="nv">\\&lt;/span>&lt;span class="nb">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nb">p_{&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="nb">}^{&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nb">} &amp;amp; &lt;/span>&lt;span class="nv">\text&lt;/span>&lt;span class="nb">{if }k&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="nb">.&lt;/span>&lt;span class="nv">\end&lt;/span>&lt;span class="nb">{cases}&lt;/span>&lt;span class="s">$$&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">{{&lt;/span>&amp;lt; /math &amp;gt;&lt;span class="nb">}}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>renders as&lt;/p>
$$
f(k;p_{0}^{*}) = \begin{cases}p_{0}^{*} &amp; \text{if }k=1, \\
1-p_{0}^{*} &amp; \text{if }k=0.\end{cases}
$$
&lt;h2 id="code">Code&lt;/h2>
&lt;p>Hugo Blox Builder utilises Hugo&amp;rsquo;s Markdown extension for highlighting code syntax. The code theme can be selected in the &lt;code>config/_default/params.yaml&lt;/code> file.&lt;/p>
&lt;pre>&lt;code>```python
import pandas as pd
data = pd.read_csv(&amp;quot;data.csv&amp;quot;)
data.head()
```
&lt;/code>&lt;/pre>
&lt;p>renders as&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read_csv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;data.csv&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="inline-images">Inline Images&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{{&amp;lt;&lt;/span> &lt;span class="nx">icon&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="p">=&lt;/span>&lt;span class="s">&amp;#34;python&amp;#34;&lt;/span> &lt;span class="p">&amp;gt;}}&lt;/span> &lt;span class="nx">Python&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>renders as&lt;/p>
&lt;p>
&lt;span class="inline-block pr-1">
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 0 448 512" fill="currentColor">&lt;path d="M439.8 200.5c-7.7-30.9-22.3-54.2-53.4-54.2h-40.1v47.4c0 36.8-31.2 67.8-66.8 67.8H172.7c-29.2 0-53.4 25-53.4 54.3v101.8c0 29 25.2 46 53.4 54.3 33.8 9.9 66.3 11.7 106.8 0 26.9-7.8 53.4-23.5 53.4-54.3v-40.7H226.2v-13.6h160.2c31.1 0 42.6-21.7 53.4-54.2 11.2-33.5 10.7-65.7 0-108.6zM286.2 404c11.1 0 20.1 9.1 20.1 20.3 0 11.3-9 20.4-20.1 20.4-11 0-20.1-9.2-20.1-20.4.1-11.3 9.1-20.3 20.1-20.3zM167.8 248.1h106.8c29.7 0 53.4-24.5 53.4-54.3V91.9c0-29-24.4-50.7-53.4-55.6-35.8-5.9-74.7-5.6-106.8.1-45.2 8-53.4 24.7-53.4 55.6v40.7h106.9v13.6h-147c-31.1 0-58.3 18.7-66.8 54.2-9.8 40.7-10.2 66.1 0 108.6 7.6 31.6 25.7 54.2 56.8 54.2H101v-48.8c0-35.3 30.5-66.4 66.8-66.4zm-6.7-142.6c-11.1 0-20.1-9.1-20.1-20.3.1-11.3 9-20.4 20.1-20.4 11 0 20.1 9.2 20.1 20.4s-9 20.3-20.1 20.3z"/>&lt;/svg>
&lt;/span> Python&lt;/p>
&lt;h2 id="did-you-find-this-page-helpful-consider-sharing-it-">Did you find this page helpful? Consider sharing it 🙌&lt;/h2></description></item><item><title>Active Transportation Safety and Road Traffic Injury in British Columbia</title><link>https://mbcalles.github.io/project/pcss/</link><pubDate>Thu, 31 Aug 2023 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/project/pcss/</guid><description>&lt;p>This report was prepared for &lt;strong>decision makers and policy makers in the provincial government&lt;/strong> to support goals of increasing active transportation while striving for &lt;strong>Vision Zero&lt;/strong>. It uses linked datasets encompassing &lt;strong>insurance claims, police reports, hospital admissions, and sociodemographic information&lt;/strong> to describe changes in road traffic injury rates over time, identify population groups with higher rates, and discern factors that influence injury severity.&lt;/p>
&lt;p>&lt;strong>Key findings:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Insurance claims miss &lt;strong>just over 25%&lt;/strong> of injuries requiring hospital admission for pedestrians, cyclists, and drivers.&lt;/li>
&lt;li>&lt;strong>Falls on public roadways&lt;/strong> (including sidewalks) are an important and increasing source of injuries for pedestrians and cyclists but are not captured by auto-insurance claims or police collision data.&lt;/li>
&lt;li>&lt;strong>Cyclists and pedestrians&lt;/strong> face a disproportionately higher risk of injury and death compared to motor vehicle occupants. Reductions over time are primarily from fewer motor-vehicle collisions, while &lt;strong>pedestrian falls and single-bicycle crashes are increasing&lt;/strong>.&lt;/li>
&lt;li>&lt;strong>Inequalities&lt;/strong> exist: lower-income individuals and those in less wealthy neighborhoods face higher injury rates; &lt;strong>older age&lt;/strong> is associated with a higher proportion of fall-related traffic injuries.&lt;/li>
&lt;li>&lt;strong>Speed limits &amp;gt;30 km/hr&lt;/strong> and &lt;strong>heavier vehicles&lt;/strong> are associated with higher risk of fatal injury for all road users, with a greater effect on pedestrians and cyclists.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Considerations:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Stratify road safety goals by &lt;strong>road user type, population groups, and crash types&lt;/strong>.&lt;/li>
&lt;li>Expand the definition of &lt;strong>pedestrian injuries to include falls on roadways&lt;/strong> (including sidewalks).&lt;/li>
&lt;li>Manage kinetic energy via &lt;strong>speed management and physical separation&lt;/strong> as part of a &lt;strong>Safe Systems&lt;/strong> approach.&lt;/li>
&lt;li>A &lt;strong>provincial travel survey&lt;/strong> is needed to accurately assess pedestrian and cyclist risk.&lt;/li>
&lt;li>Improve &lt;strong>emergency department data collection&lt;/strong> on mechanisms of injury (including minor injuries) to enhance surveillance, risk-factor analysis, and severity assessment.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Publications:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;em>Underreporting and selection bias of serious road traffic injuries in auto insurance claims and police reports in British Columbia, Canada.&lt;/em> (Transportation Research Interdisciplinary Perspectives, 2025).&lt;/li>
&lt;li>&lt;em>Comparing pedestrian and cyclist injuries from falls and collisions in British Columbia, Canada: Frequencies and population characteristics.&lt;/em> (Journal of Transport &amp;amp; Health, 2025).&lt;/li>
&lt;/ul></description></item><item><title>Crowdsourced bicycling crashes and near misses: trends in Canadian cities</title><link>https://mbcalles.github.io/publication/bikemaps-canada/</link><pubDate>Fri, 13 Aug 2021 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/bikemaps-canada/</guid><description/></item><item><title>Estimating walking and bicycling in Canada and their road collision fatality risks: The need for a national household travel survey</title><link>https://mbcalles.github.io/publication/walking-bicycling-national-survey/</link><pubDate>Tue, 01 Jun 2021 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/walking-bicycling-national-survey/</guid><description/></item><item><title>Translating risk to preventable burden by estimating numbers of bicycling injuries preventable by separated infrastructure on a Toronto, Ontario corridor</title><link>https://mbcalles.github.io/publication/injuries-prevented-seperated-lane/</link><pubDate>Wed, 26 May 2021 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/injuries-prevented-seperated-lane/</guid><description/></item><item><title>Who Bikes? An Assessment of Leisure and Commuting Bicycling from the Canadian Community Health Survey</title><link>https://mbcalles.github.io/publication/who-bikes-cchs/</link><pubDate>Sat, 01 May 2021 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/who-bikes-cchs/</guid><description/></item><item><title>Changes in Commute Mode Attributed to COVID-19 Risk in Canadian National Survey Data</title><link>https://mbcalles.github.io/publication/commute-change-covid/</link><pubDate>Fri, 12 Feb 2021 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/commute-change-covid/</guid><description/></item><item><title>Kernel Density Estimation of Point Processes in Network Space in R</title><link>https://mbcalles.github.io/post/kernel-density-estimation-in-network-space/</link><pubDate>Fri, 22 Jan 2021 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/post/kernel-density-estimation-in-network-space/</guid><description>&lt;h1 id="kernel-density-estimation-of-point-processes-in-network-space-in-r">Kernel Density Estimation of Point Processes in Network Space in R&lt;/h1>
&lt;ul>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;ul>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;ul>
&lt;li>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Update (September 2025):&lt;/strong> This was a blog post originally from January 2021 where I implemented a network-based KDE in R based on the algorithm outlined in
. At the time there was not a ton of R functionality for network analysis; packages like &lt;code>sfnetworks&lt;/code> did not yet exist and neither did &lt;code>spNetwork&lt;/code> to conduct network-based KDE. A much more thorough examination of network-based KDEs and their implementation in R (current as of 2025) can be found here:
. I have updated this post slightly (including code for extracting police data and using &lt;code>stplanr&lt;/code> for network cleaning). Most of the code still holds up as it relied on igraph and tidygraph directly. While likely not of particular use anymore given the advanced functionality found in &lt;code>spNetwork&lt;/code>, this little post can stand as a relic of its time.&lt;/p>
&lt;p>The network KDE is a 1-D version of the planar kernel density estimator, with $\tau$ (bandwidth) based on network distances rather than Euclidean distances, and the output is based on &lt;em>lixels&lt;/em> (a 1-D version of pixels) rather than pixels across 2-D Euclidean space.&lt;/p>
&lt;p>To produce kernel density estimates (KDE) of point processes in a linear network:&lt;/p>
$$
\lambda(z)= \sum_{i=1}^{n} \frac{1}{\tau}\, k\!\left(\frac{d_{iz}}{\tau}\right) y_i
$$&lt;p>Where,&lt;/p>
&lt;ul>
&lt;li>$\lambda(z)$ is the density at location $z$;&lt;/li>
&lt;li>$\tau$ is the bandwidth (linear network distance);&lt;/li>
&lt;li>$k$ is the kernel function, typically a function of the ratio of $d_{iz}$ to $\tau$;&lt;/li>
&lt;li>$d_{iz}$ is the linear network distance from event $i$ to location $z$.&lt;/li>
&lt;/ul>
&lt;p>I wanted to implement a network-based KDE in R based on the algorithm outlined in
. The network KDE is a 1-D version of the planar kernel density estimator, with $\tau$ (bandwidth) based on network distances rather than Euclidean distances, and the output is based on &lt;em>lixels&lt;/em> (a 1-D version of pixels) rather than pixels across 2-D Euclidean space.&lt;/p>
&lt;p>In this post I use data from Vancouver, BC as a case study for implementing a network kernel density estimator of points in a network in R.&lt;/p>
&lt;h1 id="set-up">Set Up&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tidygraph&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">igraph&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stplanr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cancensus&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">osmdata&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dplyr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sfnetworks&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ggplot2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stringr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="getting-the-example-data">Getting the example data&lt;/h1>
&lt;p>The first step is to load example data.&lt;/p>
&lt;h2 id="study-area-extent">Study Area Extent&lt;/h2>
&lt;p>I use the &lt;code>get_census&lt;/code> function from the
package to extract a &lt;code>sf&lt;/code> object with &lt;code>POLYGON&lt;/code> geometries, representing the study extent: the City of Vancouver.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">study_area&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">get_census&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dataset&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;CA16&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">regions&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">CSD&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;5915&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">level&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;CSD&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">use_cache&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">geo_format&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;sf&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="s">&amp;#34;Vancouver (CY)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">26910&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">study_area&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">coord_sf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-3-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="road-network-data">Road Network Data&lt;/h2>
&lt;p>Next I use the &lt;code>osmdata&lt;/code> package to download street network files for the City of Vancouver. The &lt;code>getbb()&lt;/code> function defines a bounding box for the City of Vancouver.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">bbx&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">getbb&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Vancouver, BC&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Next we use the &lt;code>opq()&lt;/code> and &lt;code>add_osm_feature&lt;/code> functions to obtain open street map road network data. The &lt;code>osmdata_sf()&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">streets&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">bbx&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">opq&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_osm_feature&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;highway&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">value&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;residential&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;living_street&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;service&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;unclassified&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;pedestrian&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;footway&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;track&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;path&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;motorway&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;trunk&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;primary&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;secondary&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;tertiary&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;motorway_link&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;trunk_link&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;primary_link&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;secondary_link&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;tertiary_link&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">osmdata_sf&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">streets_sf&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">streets&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">osm_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">crs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">26910&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_intersection&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">.,st_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">study_area&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;MULTILINESTRING&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;LINESTRING&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">streets_sf&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">highway&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">size&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">.4&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alpha&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">.65&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-5-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="police-report-data">Police Report Data&lt;/h2>
&lt;p>Finally I get point data of police reports in Vancouver from the City of Vancouver. I subset the data to only include vehicle collisions reported to police in 2018 (last full year of data available).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># core base + tidy read&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">url&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="s">&amp;#34;https://geodash.vpd.ca/opendata/crimedata_download/crimedata_csv_all_years.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">zipf&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">tempfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fileext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;.zip&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">csvd&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">tempfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fileext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;.csv&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">download.file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">destfile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">zipf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;wb&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">csv_name&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">unzip&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">zipf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">list&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">Name&lt;/span>&lt;span class="nf">[grepl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;\\.csv$&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">unzip&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">zipf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">list&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">TRUE&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">Name&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">unzip&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">zipf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">files&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">csv_name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exdir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">csvd&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">file.rename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">file.path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">csvd&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">csv_name&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">csvd&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>[1] TRUE
&lt;/code>&lt;/pre>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># fast, friendly read&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">readr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">crime&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">readr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">read_csv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">csvd&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">show_col_types&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dplyr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">glimpse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crime&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>Rows: 925,938
Columns: 10
$ TYPE &amp;lt;chr&amp;gt; &amp;quot;Break and Enter Commercial&amp;quot;, &amp;quot;Break and Enter Commercia…
$ YEAR &amp;lt;dbl&amp;gt; 2022, 2022, 2023, 2022, 2022, 2022, 2022, 2022, 2022, 20…
$ MONTH &amp;lt;dbl&amp;gt; 1, 1, 9, 6, 3, 3, 2, 2, 4, 8, 9, 2, 4, 4, 5, 2, 4, 10, 8…
$ DAY &amp;lt;dbl&amp;gt; 5, 3, 14, 17, 15, 19, 23, 25, 30, 2, 11, 24, 1, 28, 11, …
$ HOUR &amp;lt;dbl&amp;gt; 7, 16, 3, 5, 5, 6, 23, 10, 22, 15, 0, 4, 4, 12, 18, 22, …
$ MINUTE &amp;lt;dbl&amp;gt; 34, 19, 30, 16, 14, 42, 0, 15, 45, 31, 5, 8, 7, 5, 0, 5,…
$ HUNDRED_BLOCK &amp;lt;chr&amp;gt; &amp;quot;10XX ALBERNI ST&amp;quot;, &amp;quot;10XX ALBERNI ST&amp;quot;, &amp;quot;10XX ALBERNI ST&amp;quot;,…
$ NEIGHBOURHOOD &amp;lt;chr&amp;gt; &amp;quot;West End&amp;quot;, &amp;quot;West End&amp;quot;, &amp;quot;West End&amp;quot;, &amp;quot;West End&amp;quot;, &amp;quot;West En…
$ X &amp;lt;dbl&amp;gt; 491015.9, 491036.1, 491065.3, 491067.3, 491102.2, 491102…
$ Y &amp;lt;dbl&amp;gt; 5459166, 5459146, 5459130, 5459115, 5459092, 5459092, 54…
&lt;/code>&lt;/pre>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">collisions&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">crime&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">YEAR&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="m">2025&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="nf">str_detect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TYPE&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Vehicle Collision&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="o">!=&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_as_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.,coords&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;X&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Y&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">crs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">26910&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Locations of police reported vehicle collisions are below.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collisions&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">coord_sf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-7-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>Now we have the data we need to try and estimate the density of police-reported collisions or “hotspots” in the City of Vancouver.&lt;/p>
&lt;p>NOTE: These data do not differentiate between different types of collisions between road users, and police road collision data consistently miss out on the majority of crashes that occur to active transport users (bicyclists and pedestrians).&lt;/p>
&lt;h1 id="prepare-the-network-data">Prepare the network data&lt;/h1>
&lt;p>In the algorithm outlined in
the resulting density estimates on a network are based on a spatial unit of analysis they term a &lt;em>lixel&lt;/em>. &lt;em>Lixels&lt;/em> are basically the 1-D version of a pixel, and refer to how long the segments in our network are from which we calculate densities of events.&lt;/p>
&lt;p>To create a &lt;em>lixelized&lt;/em> network I combine the &lt;code>split_lines()&lt;/code> and the &lt;code>lixelize network()&lt;/code> functions.&lt;/p>
&lt;p>The &lt;code>split_lines()&lt;/code> function has three arguments:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>input_lines&lt;/strong>: &lt;code>sf&lt;/code> object with &lt;code>LINSETRING&lt;/code> or &lt;code>MULTILINESTRING&lt;/code> geometry&lt;/li>
&lt;li>&lt;strong>max_length&lt;/strong>: the &lt;em>lixel&lt;/em> size, defined by the maximum length of an individual linestring in the data.&lt;/li>
&lt;li>&lt;strong>id&lt;/strong>: a unique id for each line segment in the &lt;code>sf&lt;/code> object&lt;/li>
&lt;/ul>
&lt;p>The &lt;code>split_lines()&lt;/code> function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">input_lines&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">geom_column&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;sf_column&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_crs&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[geom_column]]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;units&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kc">NULL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">as.numeric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_short&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_column&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">geom_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_long&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_column&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># just to control memory usage in case this is big.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_long&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pieces&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ceiling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_len&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">geom_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_points&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_set_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">NULL&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="nf">[rep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">seq_len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">too_long[[&lt;/span>&lt;span class="s">&amp;#34;pieces&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">]&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">pieces&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_points&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">split_fID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">row.names&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">piece&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">n&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">piece&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">piece&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_line&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lwgeom&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_linesubstring&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">too_long[[geom_column]][i]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">from&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[[1]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">apply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="nf">[c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;fID&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">new_line&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;fID&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="nf">[c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">geometry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_sfc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">crs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">input_crs&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">rbind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">too_short&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">row_number&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The second function needed to prepare the network data is the &lt;code>lixelize_network&lt;/code> function. This takes two arguments, an &lt;code>sf&lt;/code> object with &lt;code>LINESTRING&lt;/code> or &lt;code>MULTILINESTRING&lt;/code> geometry and the lixel_length argument. This function will create two lixelized networks: 1) the output network where the line data are &lt;em>lixelized&lt;/em> and no segment is larger than the a given pixel size and 2) a shortest distance network which will be used to calculate road network lengths in our network kernel density estimates that we will dive into shortly.&lt;/p>
&lt;p>The lixelize network function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">lixelize_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_network&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_lixel_length&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">uid&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Splitting input spatial lines by lixel length...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">split_lines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sf_network&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">max_lixel_length&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">uid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Create corresponding shortest distance network...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">split_lines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">max_lixel_length&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">uid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Our approach varies from Xie and Yan (2008) in that we define a “maximum” length for lixels based on the &lt;code>split_lines()&lt;/code> function, and segments that are larger than the specified length are split into equal sized lixels. Instead of having $n$ lixels with 1 extra “residual lixel” we instead have $n$+1 lixels of equal length, under the lixel limit. For example a 45m segment with a maximum lixel length of 10m would be split into 5 segments of 9m instead of 4 lixels of 10m and a residual lixel of 5m.&lt;/p>
&lt;p>Now we have the data we need to try and estimate the density of police-reported collisions or “hotspots” in the City of Vancouver.&lt;/p>
&lt;p>NOTE: These data do not differentiate between different types of collisions between road users, and police road collision data consistently miss out on the majority of crashes that occur to active transport users (bicyclists and pedestrians).&lt;/p>
&lt;h1 id="prepare-the-network-data-1">Prepare the network data&lt;/h1>
&lt;p>In the algorithm outlined in
the resulting density estimates on a network are based on a spatial unit of analysis they term a &lt;em>lixel&lt;/em>. &lt;em>Lixels&lt;/em> are basically the 1-D version of a pixel, and refer to how long the segments in our network are from which we calculate densities of events.&lt;/p>
&lt;p>To create a &lt;em>lixelized&lt;/em> network I combine the &lt;code>split_lines()&lt;/code> and the &lt;code>lixelize network()&lt;/code> functions.&lt;/p>
&lt;p>The &lt;code>split_lines()&lt;/code> function has three arguments:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>input_lines&lt;/strong>: &lt;code>sf&lt;/code> object with &lt;code>LINSETRING&lt;/code> or &lt;code>MULTILINESTRING&lt;/code> geometry&lt;/li>
&lt;li>&lt;strong>max_length&lt;/strong>: the &lt;em>lixel&lt;/em> size, defined by the maximum length of an individual linestring in the data.&lt;/li>
&lt;li>&lt;strong>id&lt;/strong>: a unique id for each line segment in the &lt;code>sf&lt;/code> object&lt;/li>
&lt;/ul>
&lt;p>The &lt;code>split_lines()&lt;/code> function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">input_lines&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">geom_column&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;sf_column&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_crs&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[geom_column]]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;units&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kc">NULL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">as.numeric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_short&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_column&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">geom_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_long&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_column&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># just to control memory usage in case this is big.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_long&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pieces&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ceiling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_len&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">geom_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_points&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_set_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">NULL&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="nf">[rep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">seq_len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">too_long[[&lt;/span>&lt;span class="s">&amp;#34;pieces&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">]&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">pieces&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_points&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">split_fID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">row.names&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">piece&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">n&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">piece&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">piece&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_line&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lwgeom&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_linesubstring&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">too_long[[geom_column]][i]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">from&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[[1]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">apply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="nf">[c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;fID&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">new_line&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;fID&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="nf">[c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">geometry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_sfc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">crs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">input_crs&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">rbind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">too_short&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">row_number&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The second function needed to prepare the network data is the &lt;code>lixelize_network&lt;/code> function. This takes two arguments, an &lt;code>sf&lt;/code> object with &lt;code>LINESTRING&lt;/code> or &lt;code>MULTILINESTRING&lt;/code> geometry and the lixel_length argument. This function will create two lixelized networks: 1) the output network where the line data are &lt;em>lixelized&lt;/em> and no segment is larger than the a given pixel size and 2) a shortest distance network which will be used to calculate road network lengths in our network kernel density estimates that we will dive into shortly.&lt;/p>
&lt;p>The lixelize network function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">lixelize_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_network&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_lixel_length&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">uid&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Splitting input spatial lines by lixel length...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">split_lines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sf_network&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">max_lixel_length&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">uid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Create corresponding shortest distance network...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">split_lines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">max_lixel_length&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">uid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Our approach varies from Xie and Yan (2008) in that we define a “maximum” length for lixels based on the &lt;code>split_lines()&lt;/code> function, and segments that are larger than the specified length are split into equal sized lixels. Instead of having $n$ lixels with 1 extra “residual lixel” we instead have $n$+1 lixels of equal length, under the lixel limit. For example a 45m segment with a maximum lixel length of 10m would be split into 5 segments of 9m instead of 4 lixels of 10m and a residual lixel of 5m.&lt;/p>
&lt;h2 id="lixelize-the-cleaned-network">Lixelize the cleaned network&lt;/h2>
&lt;p>Next step is to lixelize the cleaned network. I choose a 25m maximum lixel length (e.g. every linear segment in the network will be 25m or under. This function may take some time to run.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">lixel_list_25m&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">lixelize_network&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sf_network&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">streets_sf&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_lixel_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">25&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;osm_id&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>[1] &amp;quot;Splitting input spatial lines by lixel length...&amp;quot;
[1] &amp;quot;Create corresponding shortest distance network...&amp;quot;
&lt;/code>&lt;/pre>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list_25m&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>List of 2
$ target_lixel : sf [224,904 × 3] (S3: sf/tbl_df/tbl/data.frame)
..$ osm_id : chr [1:224904] &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; ...
..$ geometry:sfc_LINESTRING of length 224904; first list element: 'XY' num [1:2, 1:2] 487849 487873 5455038 5455039
..$ LIXID : int [1:224904] 1 2 3 4 5 6 7 8 9 10 ...
..- attr(*, &amp;quot;sf_column&amp;quot;)= chr &amp;quot;geometry&amp;quot;
..- attr(*, &amp;quot;agr&amp;quot;)= Factor w/ 3 levels &amp;quot;constant&amp;quot;,&amp;quot;aggregate&amp;quot;,..: NA NA
.. ..- attr(*, &amp;quot;names&amp;quot;)= chr [1:2] &amp;quot;osm_id&amp;quot; &amp;quot;LIXID&amp;quot;
$ shortest_distance_network: sf [436,612 × 3] (S3: sf/tbl_df/tbl/data.frame)
..$ osm_id : chr [1:436612] &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; ...
..$ geometry:sfc_LINESTRING of length 436612; first list element: 'XY' num [1:2, 1:2] 487849 487861 5455038 5455039
..$ LIXID : int [1:436612] 1 2 3 4 5 6 7 8 9 10 ...
..- attr(*, &amp;quot;sf_column&amp;quot;)= chr &amp;quot;geometry&amp;quot;
..- attr(*, &amp;quot;agr&amp;quot;)= Factor w/ 3 levels &amp;quot;constant&amp;quot;,&amp;quot;aggregate&amp;quot;,..: NA NA
.. ..- attr(*, &amp;quot;names&amp;quot;)= chr [1:2] &amp;quot;osm_id&amp;quot; &amp;quot;LIXID&amp;quot;
&lt;/code>&lt;/pre>
&lt;h1 id="prepare-the-point-data">Prepare the point data&lt;/h1>
&lt;p>Here I need to ensure that the point data are lined up with the cleaned network data. I use a function called &lt;code>st_snap_points&lt;/code> which “snaps” the points to the location of the nearest road segment within a specified distance tolerance. The function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">st_snap_points&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">inherits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;sf&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">inherits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;sfc&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">do.call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">seq&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nrst&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_nearest_points&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">st_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[i]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nrst_len&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nrst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nrst_mn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">which.min&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nrst_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">as.vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nrst_len[nrst_mn]&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">max_dist&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">st_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[i]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">st_cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nrst[nrst_mn]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;POINT&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[2]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We snap the points to our road network with a 20m tolerance:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">coll_snp&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_snap_points&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collisions&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">streets_sf&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">20&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#this only returns the geometry - doesn&amp;#39;t preserve attributes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">coll_snp&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collisions&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_drop_geometry&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">coll_snp&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="c1">#rerturn the attributes to the snapped locations&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="calculate-network-kernel-density">Calculate Network Kernel Density&lt;/h1>
&lt;p>The function I have created here for calculating density of events on a network follows the algorithm outline in Xie and Yan (2008) and takes advantage of functionality from &lt;code>sf&lt;/code>, &lt;code>igraph&lt;/code> and &lt;code>tidygraph&lt;/code> to to calculate shortest distances from each lixel in our network to the point processes we specify. Much of the code in this function is adapted from an excellent resource on using these packages for network analysis:
&lt;/p>
&lt;p>The &lt;code>network_kde()&lt;/code> function is defined below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#function for calculating the centre of &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">st_line_midpoints&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_lines&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g_mids&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">coords&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">as.matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># this is just a copypaste of maptools:::getMidpoints()):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_mids&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">coords&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">sqrt&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nf">diff&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">coords[&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">^2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">diff&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">coords[&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="n">^2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist_mid&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dist&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist_cum&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">cumsum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dist&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end_index&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">which&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dist_cum&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">dist_mid&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[1]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_index&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">end_index&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">coords[start_index&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">coords[end_index&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist_remaining&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">dist_mid&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">dist_cum[start_index]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mid&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">start&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">end&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">dist_remaining&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">dist[start_index]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mids&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">get_mids&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">coords&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sfc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">g_mids&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">crs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_lines&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">bind_cols&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">sf_lines&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">st_drop_geometry&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">rename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">network_kde&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">point_process&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">bandwidth&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">100&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">n_cores&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">attribute&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">point_process_is_lixel_midpoint&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">FALSE&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#3. Create a network of lixels by establishing the network topology between lixels as well as between lixels and lxnodes.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#Define topology for calculating shortest distances by converting lixel with half the length to calculate distances&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#The shorter the lixel length the more accurate the calculation of network distance from nearest node of source lixel to nearest node of target lixel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Defining network topology...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">parallel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">doParallel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">igraph&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tidygraph&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dplyr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Create nodes at the start and end point of each edge&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_coordinates&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">as_tibble&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">L1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">()))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">rep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#39;start&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;end&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">times&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Give each node a unique index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">nodes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.$X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.$Y&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">xy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xy&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">levels&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unique&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xy&lt;/span>&lt;span class="p">)))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xy&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodeID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">cur_group_id&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">xy&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Combine the node indices with the edges&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">nodes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_end&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#39;start&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodeID&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end_nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">nodes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_end&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#39;end&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodeID&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">from&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">start_nodes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">end_nodes&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Remove duplicate nodes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">nodes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">distinct&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodeID&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.keep_all&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">start_end&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_as_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">coords&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#39;X&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;Y&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_set_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">st_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Convert to tbl_graph&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">graph&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">tbl_graph&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nodes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">edges&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">as_tibble&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">directed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">graph&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">graph&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">edges&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geometry&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kc">NULL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#4. Create the center points of all the lixels for the target lixel (lxcenters)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Calculating lixel midpoints (lxcenters)...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lxcenters&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_line_midpoints&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#5. Select a point process occurring within the road network&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#input as function parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#6. For each point find its nearest lixel. Count the number of points nearest to a lixel and assigned as property of lixel.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#Points should be snapped to network within some distance threshold prior to&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">point_process_is_lixel_midpoint&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="kc">FALSE&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Counting number of events on each lixel...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">point_process&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">point_process&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">target_lixel[&lt;/span>&lt;span class="s">&amp;#34;LIXID&amp;#34;&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">join&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st_is_within_distance&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0.001&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#for each point assign the LIXID that it falls on&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">source_lixels&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">point_process&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="c1">#summarize the number of points by LIXID (e.g. count the points for each LIXID)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nf">is.na&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">summarise&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_events&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">(),&lt;/span>&lt;span class="n">`.groups`&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;drop&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_drop_geometry&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">source_lixels&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">inner_join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lxcenters&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">by&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;LIXID&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#define geometry for source lixels&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">point_process_is_lixel_midpoint&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="kc">TRUE&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">source_lixels&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">lxcenters&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_events&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">n_events&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="s">&amp;#34; events on &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="s">&amp;#34; source lixels&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#7. Define a search bandwidth, measured with the short path network distance&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#input as function parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#8. Calculate the shortest-path network distance from each source lixel to lxcenter of all its neighouring lixels within the seach bandwidth&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nearest_node_to_source_lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_nearest_feature&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">nodes&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="c1">#find nodes from shortest distance network associated with each source lixel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nearest_node_to_lxcentre&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_nearest_feature&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lxcenters&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">nodes&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="c1">#find nodes from shortest distance network associated with each lxcenters&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Calculating distances from each source lixel to all other lixel centers... &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cl&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">makeCluster&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_cores&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">registerDoParallel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cores&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">cl&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#parallel computing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">distances&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">foreach&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">foreach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nearest_node_to_source_lixel&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">.packages&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;magrittr&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;igraph&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;tidygraph&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;sf&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%dopar%&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">distances&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">graph&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">graph&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weights&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">graph&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">edges&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">length&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">v&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nearest_node_to_source_lixel[i]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>&lt;span class="n">[&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">nearest_node_to_lxcentre]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">data.frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">lxcenters[temp&lt;/span>&lt;span class="o">&amp;lt;=&lt;/span>&lt;span class="nf">max&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bandwidth&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp[temp&lt;/span>&lt;span class="o">&amp;lt;=&lt;/span>&lt;span class="nf">max&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bandwidth&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">stopCluster&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cl&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;graph&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># gauss &amp;lt;-function(x) {&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># t1 &amp;lt;- 1/(sqrt(2*pi))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># t2 &amp;lt;- exp(-((x^2)/(2*bandwidth^2)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># n &amp;lt;- (1/bandwidth)*(t1*t2)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># n &amp;lt;- ifelse(x&amp;gt;bandwidth,0,n)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># return(n)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># }&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># plot(gauss(0:(bandwidth*2)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">quartic&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">K&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="kc">pi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t1&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x^2&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">r^2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">ifelse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">K&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LIXID&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">unlist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">distances&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">`[`&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;LIXID&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">distances_list&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">distances&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">`[`&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;dist&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d_list&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="kr">in&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bandwidth&lt;/span>&lt;span class="p">)){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Applying kernel density estimator with bandwidth of &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">bandwidth[i]&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;m ... &amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">distances_list&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">quartic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">bandwidth[i]&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">`*`&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">attribute&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#multiply by attribute of source lixel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">`*`&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">n_events&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#sum over number of events that occured on the source lixel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d_list[[i]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">data.frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">unlist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d_cols&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">as.data.frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">do.call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cbind&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">d_list&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">names&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d_cols&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">paste0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;kde_bw_&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">bandwidth&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#sum densities over all lixels&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">density&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">cbind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">d_cols&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">summarise&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">across&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">everything&lt;/span>&lt;span class="p">(),&lt;/span>&lt;span class="n">sum&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">`.groups`&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;drop&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">network_kde&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">left_join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">density&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">by&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;LIXID&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.)&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.,&lt;/span> &lt;span class="nf">is.na&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.)&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">neighbours&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">distances&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>As of now I have only set up the algorithm to use a quartic kernel.&lt;/p>
&lt;p>Next step is to compute the density of points on a network! The &lt;code>network_kde()&lt;/code> function implements parallel computing functionality using the &lt;code>parallel&lt;/code> and &lt;code>doParallel&lt;/code> packages so we need to specify how many cores are on the computer being used:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">n_cores&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">bigstatsr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">nb_cores&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Finally we specify the lixelized network we are working with, the point process from which we estimate densities of events, the bandwidths we wish to use in our density estimates and the number of cores for parallel computation. The last argument can be ignored for now and set to FALSE as it is something I’m working on to speed up computation if your point process is already associated with the segment (e.g. volumes of road users on a segment).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">system.time&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">collisions_network_kde&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">network_kde&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">lixel_list_25m&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">point_process&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">coll_snp&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bandwidth&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">50&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">100&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">150&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">250&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n_cores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">n_cores&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">point_process_is_lixel_midpoint&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>[1] &amp;quot;Defining network topology...&amp;quot;
[1] &amp;quot;Calculating lixel midpoints (lxcenters)...&amp;quot;
[1] &amp;quot;Counting number of events on each lixel...&amp;quot;
[1] &amp;quot;733 events on 623 source lixels&amp;quot;
[1] &amp;quot;Calculating distances from each source lixel to all other lixel centers... &amp;quot;
[1] &amp;quot;Applying kernel density estimator with bandwidth of 50m ... &amp;quot;
[1] &amp;quot;Applying kernel density estimator with bandwidth of 100m ... &amp;quot;
[1] &amp;quot;Applying kernel density estimator with bandwidth of 150m ... &amp;quot;
[1] &amp;quot;Applying kernel density estimator with bandwidth of 250m ... &amp;quot;
user system elapsed
105.76 2.36 182.16
&lt;/code>&lt;/pre>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">glimpse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collisions_network_kde&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>Rows: 224,904
Columns: 8
$ osm_id &amp;lt;chr&amp;gt; &amp;quot;4231647&amp;quot;, &amp;quot;4231647&amp;quot;, &amp;quot;4231647&amp;quot;, &amp;quot;4231647&amp;quot;, &amp;quot;4231647&amp;quot;, &amp;quot;423…
$ geometry &amp;lt;LINESTRING [m]&amp;gt; LINESTRING (487848.5 545503..., LINESTRING (4878…
$ LIXID &amp;lt;int&amp;gt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …
$ kde_bw_50 &amp;lt;dbl&amp;gt; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ kde_bw_100 &amp;lt;dbl&amp;gt; 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.00000…
$ kde_bw_150 &amp;lt;dbl&amp;gt; 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.00000…
$ kde_bw_250 &amp;lt;dbl&amp;gt; 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.00000…
$ length [m] 24.40429 [m], 24.40429 [m], 24.40429 [m], 24.40429 [m], 24.40…
&lt;/code>&lt;/pre>
&lt;p>The output of the &lt;code>network_kde()&lt;/code> is an &lt;code>sf&lt;/code> object with &lt;code>LINESTRING&lt;/code> geometry, where each line segment is a lixel and the columns refer to density of events in network space for the specified bandwidths.&lt;/p>
&lt;h1 id="mapping-out-the-results">Mapping out the results&lt;/h1>
&lt;p>Below we can then map out the results. We will use the 150m bandwidth in this example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">study_area&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;gray5&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collisions_network_kde&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">kde_bw_150&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">scale_color_viridis_c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;C&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">direction&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Density&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># geom_sf(data=mask,color=NA,fill=&amp;#34;white&amp;#34;)+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">panel.background&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="nf">element_rect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fill&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">NA&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.position&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;top&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.title.align&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.size&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1">#change legend key size&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.height&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1">#change legend key height&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.width&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">coord_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xlim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">483690.9&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">499329.2&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ylim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">5450534.8&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">5463381.0&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-18-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>Zooming into downtown:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">study_area&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;gray5&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collisions_network_kde&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">kde_bw_150&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">scale_color_viridis_c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;C&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">direction&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Density&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">panel.background&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="nf">element_rect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fill&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">NA&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.position&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;top&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.title.align&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.size&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1">#change legend key size&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.height&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1">#change legend key height&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.width&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">coord_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xlim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">491321.39853389-1000&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">491321.39853389+1100&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ylim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">5459015.689874-1000&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">5459015.689874+1000&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-19-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>That’s the network KDE function as it is for now. Some challenges going forward are computation time for higher resolution pixels and implementing different kernels other than quartic.&lt;/p>
&lt;details>
&lt;summary>
Reproducibility receipt
&lt;/summary>
&lt;pre>&lt;code>[1] &amp;quot;2025-09-03 16:15:49 PDT&amp;quot;
Local: main C:/Users/micha/Documents/GitHub/mbcalles.github.io
Remote: main @ origin (https://github.com/mbcalles/mbcalles.github.io)
Head: [2a60de6] 2025-09-03: publication
R version 4.4.1 (2024-06-14 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26100)
Matrix products: default
locale:
[1] LC_COLLATE=English_Canada.utf8 LC_CTYPE=English_Canada.utf8
[3] LC_MONETARY=English_Canada.utf8 LC_NUMERIC=C
[5] LC_TIME=English_Canada.utf8
time zone: America/Vancouver
tzcode source: internal
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods
[8] base
other attached packages:
[1] doParallel_1.0.17 iterators_1.0.14 foreach_1.5.2 readr_2.1.5
[5] stringr_1.5.1 ggplot2_3.5.1 sfnetworks_0.6.4 sf_1.0-18
[9] dplyr_1.1.4 osmdata_0.2.5 cancensus_0.5.7 stplanr_1.2.2
[13] igraph_2.1.1 tidygraph_1.3.1
loaded via a namespace (and not attached):
[1] tidyselect_1.2.1 viridisLite_0.4.2 farver_2.1.2
[4] fastmap_1.2.0 spatstat.geom_3.3-3 spatstat.explore_3.3-3
[7] bigassertr_0.1.7 flock_0.7 digest_0.6.37
[10] rpart_4.1.23 timechange_0.3.0 lifecycle_1.0.4
[13] spatstat.data_3.1-2 magrittr_2.0.3 compiler_4.4.1
[16] rlang_1.1.4 tools_4.4.1 utf8_1.2.4
[19] yaml_2.3.10 knitr_1.48 labeling_0.4.3
[22] bit_4.5.0 classInt_0.4-10 curl_5.2.3
[25] xml2_1.3.6 rmio_0.4.0 abind_1.4-8
[28] KernSmooth_2.23-24 bigstatsr_1.6.2 withr_3.0.2
[31] purrr_1.0.2 grid_4.4.1 polyclip_1.10-7
[34] fansi_1.0.6 git2r_0.35.0 e1071_1.7-16
[37] colorspace_2.1-1 scales_1.3.0 spatstat.utils_3.1-0
[40] cli_3.6.3 rmarkdown_2.28 crayon_1.5.3
[43] generics_0.1.3 rstudioapi_0.17.1 httr_1.4.7
[46] tzdb_0.4.0 DBI_1.2.3 proxy_0.4-27
[49] splines_4.4.1 spatstat.model_3.3-2 vctrs_0.6.5
[52] Matrix_1.7-0 jsonlite_1.8.9 geojsonsf_2.0.3
[55] hms_1.1.3 bit64_4.5.2 tensor_1.5
[58] bigparallelr_0.3.2 spatstat.univar_3.0-1 tidyr_1.3.1
[61] units_0.8-5 goftest_1.2-3 parallelly_1.45.1
[64] glue_1.8.0 spatstat.random_3.3-2 lwgeom_0.2-14
[67] codetools_0.2-20 cowplot_1.1.3 lubridate_1.9.3
[70] stringi_1.8.4 gtable_0.3.6 deldir_2.0-4
[73] munsell_0.5.1 tibble_3.2.1 pillar_1.9.0
[76] rappdirs_0.3.3 htmltools_0.5.8.1 R6_2.5.1
[79] httr2_1.0.5 sfheaders_0.4.4 vroom_1.6.5
[82] evaluate_1.0.1 lattice_0.22-6 class_7.3-22
[85] Rcpp_1.0.13 spatstat.linnet_3.2-2 nlme_3.1-164
[88] spatstat.sparse_3.1-0 mgcv_1.9-1 xfun_0.48
[91] pkgconfig_2.0.3
&lt;/code>&lt;/pre>
&lt;/details></description></item><item><title>To scoot or not to scoot: Findings from a recent survey about the benefits and barriers of using E-scooters for riders and non-rider</title><link>https://mbcalles.github.io/publication/e-scooter-survey/</link><pubDate>Sun, 20 Sep 2020 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/e-scooter-survey/</guid><description/></item><item><title>Impact of Public Bicycle Share Programs on Bicycling Collisions</title><link>https://mbcalles.github.io/project/bikeshare/</link><pubDate>Wed, 02 Sep 2020 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/project/bikeshare/</guid><description>&lt;p>This project evaluated how implementing &lt;strong>public bicycle share programs (PBSPs)&lt;/strong> affected the likelihood of &lt;strong>bicycling collisions&lt;/strong> across multiple North American cities. Using a &lt;strong>difference-in-differences&lt;/strong> approach applied to repeated cross-sectional survey data, it shows that crash odds &lt;strong>did not increase after PBSP implementation&lt;/strong> and were notably &lt;strong>lower in cities with existing programs&lt;/strong>, supporting the safety of well-established bike share systems.&lt;/p>
&lt;p>&lt;strong>Impact:&lt;/strong> Offers empirical insights to urban planners and policymakers assessing the safety implications of bike share adoption.&lt;/p>
&lt;p>&lt;strong>Tech Stack:&lt;/strong> R, quasi-experimental design (difference-in-differences), multi-city survey analysis&lt;/p></description></item><item><title>The Impact of Implementing Public Bicycle Share Programs on Bicycle Crashes</title><link>https://mbcalles.github.io/publication/ibiccs-did/</link><pubDate>Wed, 02 Sep 2020 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/ibiccs-did/</guid><description/></item><item><title>Cyclist crash rates and risk factors in a prospective cohort in seven European cities</title><link>https://mbcalles.github.io/publication/pasta-crash/</link><pubDate>Mon, 01 Jun 2020 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/pasta-crash/</guid><description/></item><item><title>Impacts of study design on sample size, participation bias, and outcome measurement: a case study from bicycling research</title><link>https://mbcalles.github.io/publication/pasta-cohort/</link><pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/pasta-cohort/</guid><description/></item><item><title>Associations between individual characteristics, availability of bicycle infrastructure, and city-wide safety perceptions of bicycling: a cross-sectional survey of bicyclists in 6 Canadian and U.S. cities</title><link>https://mbcalles.github.io/publication/ibiccs-bikelane-score/</link><pubDate>Wed, 01 May 2019 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/ibiccs-bikelane-score/</guid><description/></item><item><title>Impacts of Bicycling Infrastructure in Mid-Sized Cities (IBIMS): Protocol for a Natural Experiment Study</title><link>https://mbcalles.github.io/publication/ibims/</link><pubDate>Thu, 18 Jan 2018 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/ibims/</guid><description/></item><item><title>Cycling safety: Quantifying the under reporting of cycling incidents in Vancouver, British Columbia</title><link>https://mbcalles.github.io/publication/underreporting-vancouver/</link><pubDate>Fri, 01 Dec 2017 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/underreporting-vancouver/</guid><description/></item><item><title>Comparing Crowdsourced Near-Miss and Collision Cycling Data and Official Bike Safety Reporting</title><link>https://mbcalles.github.io/publication/bikemaps-coll-nearmiss/</link><pubDate>Sun, 01 Jan 2017 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/bikemaps-coll-nearmiss/</guid><description/></item><item><title>Adjusting local alcohol consumption data for influence of tourists</title><link>https://mbcalles.github.io/publication/adjusting-local-alcohol/</link><pubDate>Wed, 16 Mar 2016 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/adjusting-local-alcohol/</guid><description/></item><item><title>Evaluation of different radon guideline values based on characterization of ecological risk and visualization of lung cancer mortality trends in British Columbia, Canada</title><link>https://mbcalles.github.io/publication/radon-lung-cancer/</link><pubDate>Thu, 19 Nov 2015 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/radon-lung-cancer/</guid><description/></item><item><title>A geospatial approach to the prediction of indoor radon vulnerability in British Columbia, Canada</title><link>https://mbcalles.github.io/publication/radon-modeling/</link><pubDate>Wed, 25 Mar 2015 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/publication/radon-modeling/</guid><description/></item></channel></rss>