<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://victor-navarro.github.io/feed.xml" rel="self" type="application/atom+xml"/><link href="https://victor-navarro.github.io/" rel="alternate" type="text/html" hreflang="en"/><updated>2025-05-08T13:58:35+00:00</updated><id>https://victor-navarro.github.io/feed.xml</id><title type="html">victor_navarro</title><subtitle></subtitle><entry><title type="html">calmr.app update</title><link href="https://victor-navarro.github.io/blog/2024/calmr-app-refactor/" rel="alternate" type="text/html" title="calmr.app update"/><published>2024-05-06T00:00:00+00:00</published><updated>2024-05-06T00:00:00+00:00</updated><id>https://victor-navarro.github.io/blog/2024/calmr-app-refactor</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2024/calmr-app-refactor/"><![CDATA[<p>One of the things I had to do to submit <code class="language-plaintext highlighter-rouge">calmr</code> to CRAN was to “unbundle” the visual GUI from the package. This has pros and cons of course. Having a standalone app would enable parallel development of both the core package and the app. However, this puts an extra hurdle on people right in the middle of the usability continuum (those who know how to use R and run stuff locally), by adding an extra installation step.</p> <p>In the end, I found out that most users of the application merely visit the shinyapps website instead of running it locally, so it’s all good.</p> <h2 id="a-new-coat-of-paint">A new coat of paint</h2> <p>Because I am lazy, the old version of the <code class="language-plaintext highlighter-rouge">calmr</code> app was built using <code class="language-plaintext highlighter-rouge">shinydashboard</code>. I just don’t have the time (nor the HTML/CSS skills) to make things from scratch, so a bunch of predetermined widgets did the trick. The brand new version of the app now uses <code class="language-plaintext highlighter-rouge">bslib</code> and its concept of cards. I found these to be quite intuitive and visually appealing. Plus, <code class="language-plaintext highlighter-rouge">bslib</code> has a bunch of functionality that was quite pertinent for a ‘simulator’ app.</p> <p>Among many other things, I ditched raw png <code class="language-plaintext highlighter-rouge">ggplot2</code> plots in preference for <code class="language-plaintext highlighter-rouge">plotly</code> interactive plots. Plotly’s interactivity makes the visualization of complex data (such as more than a handful of associations) a walk in the park. Still, some bits are still missing. For example, facet grids with nested factors don’t display well (e.g., <code class="language-plaintext highlighter-rouge">s1~s2+trial</code>). Also, there’s no support for <code class="language-plaintext highlighter-rouge">ggnetwork</code> yet. A shame, but it will do for the moment.</p> <p>I also added back some functionality to the app, such as filtering trials/phases/groups (in fact, subsetting experiments also made it to the main package). I also found out some people just hate the <code class="language-plaintext highlighter-rouge">viridis</code> scale, so I added an option to switch color/fill scales. Both of these features made it to the main package.</p> <h2 id="a-tutorial-mode">A ‘tutorial’ mode</h2> <p>The app now also has a ‘tutorial’ mode that displays help text in certain regions. I’m quite proud of this, but I have yet to hear from somebody learning to use the app with it. Perhaps also a tutorial are the dynamic links to model pages and their parameters.</p> <p>As always. <a href="https://victor-navarro.shinyapps.io/calmr_app/">Give the app a try!</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[a new coat of (bslib) paint]]></summary></entry><entry><title type="html">calmr refactor</title><link href="https://victor-navarro.github.io/blog/2024/calmr-refactor/" rel="alternate" type="text/html" title="calmr refactor"/><published>2024-02-19T00:00:00+00:00</published><updated>2024-02-19T00:00:00+00:00</updated><id>https://victor-navarro.github.io/blog/2024/calmr-refactor</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2024/calmr-refactor/"><![CDATA[<p>I spent a good part of last week refactoring my <a href="https://victornavarro.org/calmr">calmr</a> package. The whole thing was motivated by creating an <em>add-on</em> package that included time-based models. Funnily enough, while developing this new package, I found myself rewriting some of the core functionalities in the base package so as to make them flexible enough to accommodate both trial- and time-based models. It did not work.</p> <p>After a week of hair-pulling, I’ve finalized all changes and merged the experimental branch into the main branch of the <a href="https://github.com/victor-navarro/calmr">github repository</a>.</p> <h3 id="a-calmr-calmr">A calmr calmr</h3> <p>In the refactor, I rewrote some of the S4 classes. The calmrModel class plays a less pivotal role; it has been superseded in importance by the calmrExperiment class. In fact, pretty much everything revolves around experiments now. Here is a little flow diagram that explains the current organization.</p> <pre><code class="language-mermaid">stateDiagram
    state "Design data.frame" as s1
    state "calmrExperiment" as exp1
    state "calmrExperiment" as exp2
    state "calmrResults" as res
    state "Plots/Graphs" as pg
    state "Usable results" as ures
    s1--&gt;exp1: make_experiment fn
    s1--&gt;exp2: run_experiment fn
    exp2--&gt;res: has
    exp1--&gt;res: does not have
    exp2--&gt;pg: plot/graph methods
    exp2--&gt;ures: results method
</code></pre> <p>The diagram above encapsulates the two biggest use cases for the package: 1) running quick simulations, and 2) model fitting.</p> <p>If you just want to get a quick and dirty simulation, you can make your way through with a design <code class="language-plaintext highlighter-rouge">data.frame</code>, a model string, and the <code class="language-plaintext highlighter-rouge">run_experiment</code> function.</p> <p>If you are in the business of model fitting. Then you can precompute experiment arguments using <code class="language-plaintext highlighter-rouge">make_experiment</code> and pass that to your model function.</p> <p>I think I finally got the hang of generic methods, so I’ve renamed many of the clumsy calmr_<em>something</em> functions into just <em>something</em>. I’ve also added some getter and setter methods not shown above. For example, the <code class="language-plaintext highlighter-rouge">parameters</code> method for calmrExperiment objects will return a list of the parameters for the experiment (which otherwise is accessible at experiment@arguments$parameters). More importantly, calling <code class="language-plaintext highlighter-rouge">parameters(experiment) &lt;- new_parameters</code> lets you set the parameters for the experiment whilst tricking you into thinking <code class="language-plaintext highlighter-rouge">experiment</code> is mutable.</p> <h3 id="extra-stuff">Extra stuff</h3> <h5 id="more-tests">More tests</h5> <p>The previous version of the package had around 40 tests, and now it is sitting close to 90! I cannot emphasize enough how important these tests were, and how satisfying it is to go from 20 to 80 passed tests by fixing one single line of code.</p> <h5 id="more-flexibility">More flexibility</h5> <p>The package now seamlessly supports many models in an experiment, thanks to the <code class="language-plaintext highlighter-rouge">c</code> method for <code class="language-plaintext highlighter-rouge">calmrExperiments</code>. Just run two experiments (or better yet, use the <code class="language-plaintext highlighter-rouge">compare_models</code> function) and the results will include many models per output. This functionality was key for fixing the methods associated with representational similarity analysis (I really need to write an article about that).</p> <h5 id="simpler-app">Simpler app</h5> <p>With the refactor of the main package, I had to refactor the <code class="language-plaintext highlighter-rouge">calmr</code> <code class="language-plaintext highlighter-rouge">shiny</code> app. I did a pass on the janky HTML code for the header and reorganized some of the widgets. I reactivated the app’s sidebar and threw some of the options there. I also removed some of the options to maintain simplicity.</p> <h3 id="the-last-10-takes-90-of-the-time">The last 10% takes 90% of the time</h3> <p>At some point, I was happy enough to merge the experimental branch into the main branch. All tests passed. Documentation built correctly. Vignettes were knitted. The website was ready and so were the <code class="language-plaintext highlighter-rouge">gh-pages</code> actions.</p> <p>And so I pushed.</p> <p>And the website failed to deploy.</p> <p>The logs disclosed an obscure <code class="language-plaintext highlighter-rouge">pak</code> error with nothing else than a <code class="language-plaintext highlighter-rouge">failed to build source package</code> message. I install my local copy of the package using pak with no trouble, but installing from the freshly pushed repository failed with the same message. You hate to google an error and see another person asking a similar question, alas, with no solution on the horizon.</p> <p>So this is for you, in case you google has brought you here. I am sure this is unlikely to be what’s happening with your pak installation.</p> <p>In my case, I renamed some R/ files to their lowercase version (i.e., RSA.R to rsa.R). The <code class="language-plaintext highlighter-rouge">Collate</code> field in the <code class="language-plaintext highlighter-rouge">DESCRIPTION</code> file of the package does not automatically update and <code class="language-plaintext highlighter-rouge">devtools</code> kept throwing warnings, so I modified it by hand. Yet, when I merged the experimental into the main branch, the <code class="language-plaintext highlighter-rouge">DESCRIPTION</code> file was changed accordingly, but the R files I modified did not. That was the whole problem, hidden by <code class="language-plaintext highlighter-rouge">pak</code>, and revealed by <code class="language-plaintext highlighter-rouge">devtools::build()</code>. So, one file renaming latter, the website was online.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[a calmr calmr]]></summary></entry><entry><title type="html">new year new me</title><link href="https://victor-navarro.github.io/blog/2024/new-year-new-me/" rel="alternate" type="text/html" title="new year new me"/><published>2024-01-22T16:40:16+00:00</published><updated>2024-01-22T16:40:16+00:00</updated><id>https://victor-navarro.github.io/blog/2024/new-year-new-me</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2024/new-year-new-me/"><![CDATA[<p>It’s been a while since I’ve updated my personal webpage, and whilst reinstalling Jekyll, I though I’d try a new template. Like with most things in life, less is more, so here’s my attempt at being even more minimalistic.</p> <p>In trying to migrate to this system, I’ll likely lose some of the old posts. I guess that’s a lesson to use more robust tools in the future.</p> <p>I’ll have to dig up some very old jupyter notebooks…</p>]]></content><author><name></name></author><summary type="html"><![CDATA[starting anew]]></summary></entry><entry><title type="html">gganimate</title><link href="https://victor-navarro.github.io/blog/2024/animation-super-simple/" rel="alternate" type="text/html" title="gganimate"/><published>2024-01-22T16:40:16+00:00</published><updated>2024-01-22T16:40:16+00:00</updated><id>https://victor-navarro.github.io/blog/2024/animation-super-simple</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2024/animation-super-simple/"><![CDATA[<p>Not long ago I gave a talk about time extensions for HeiDI. As we expand the model to account for quantities (expectations and behavior) across time, it is hard to get some points across with a “fully-revealed” function. Animation not only looks cool, but it also helps in driving some points.</p> <p>The <code class="language-plaintext highlighter-rouge">gganimate</code> package makes (some kinds of) animation fairly trivial. Here’s some R code that generates the following gif.</p> <center><img src="/assets/gif/everything_rs.gif" width="50%"/></center> <p><br/></p> <p>There’s a lot of boilerplate code that generates the data for the plot (it is a full-on model after all), but the critical function is <code class="language-plaintext highlighter-rouge">transition_reveal()</code>, which will create an animation based on your x-axis variable. It’s also really smart. Even though there is a <code class="language-plaintext highlighter-rouge">geom_point()</code> layer in the non-animated plot, it does not draw every single point in the animation.</p> <div class="language-R highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">require</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">require</span><span class="p">(</span><span class="n">calmr</span><span class="p">)</span><span class="w">
</span><span class="n">require</span><span class="p">(</span><span class="n">gganimate</span><span class="p">)</span><span class="w">

</span><span class="n">source</span><span class="p">(</span><span class="s2">"scripts/time/HD2022_custom.R"</span><span class="p">)</span><span class="w">
</span><span class="n">source</span><span class="p">(</span><span class="s2">"scripts/time/helper_functions.R"</span><span class="p">)</span><span class="w">
</span><span class="n">source</span><span class="p">(</span><span class="s2">"scripts/time/time_wrapper.R"</span><span class="p">)</span><span class="w">

</span><span class="n">scales</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="w">
  </span><span class="n">scale_colour_viridis_d</span><span class="p">(</span><span class="n">end</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">.9</span><span class="p">),</span><span class="w">
  </span><span class="n">scale_fill_viridis_d</span><span class="p">(</span><span class="n">end</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">.9</span><span class="p">)</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">no_labs</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="w">
  </span><span class="n">theme</span><span class="p">(</span><span class="n">axis.text.x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">(),</span><span class="w"> </span><span class="n">axis.text.y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">())</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">set.seed</span><span class="p">(</span><span class="m">2024</span><span class="p">)</span><span class="w">
</span><span class="n">theme_set</span><span class="p">(</span><span class="n">tidybayes</span><span class="o">::</span><span class="n">theme_tidybayes</span><span class="p">())</span><span class="w">

</span><span class="n">exp</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">data.frame</span><span class="p">(</span><span class="n">group</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"G"</span><span class="p">,</span><span class="w"> </span><span class="n">P1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"30A&gt;(US)/30AB"</span><span class="p">,</span><span class="w"> </span><span class="n">R1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">)</span><span class="w">
</span><span class="n">calm_args</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">make_model_args</span><span class="p">(</span><span class="n">exp</span><span class="p">,</span><span class="w"> </span><span class="n">model</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"HD2022"</span><span class="p">)</span><span class="w">

</span><span class="c1"># these are minimum parameters required to run the model</span><span class="w">
</span><span class="n">epochs</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">30</span><span class="w">
</span><span class="n">rate</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">.1</span><span class="w">
</span><span class="n">pwr</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="n">max_cs_alpha</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">.4</span><span class="w">
</span><span class="n">us_alpha</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">.6</span><span class="w">
</span><span class="n">other_args</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="w">
  </span><span class="n">alphas</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"A"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">max_cs_alpha</span><span class="p">,</span><span class="w"> </span><span class="s2">"B"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">max_cs_alpha</span><span class="p">,</span><span class="w"> </span><span class="s2">"US"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">us_alpha</span><span class="p">),</span><span class="w">
  </span><span class="n">fun_map</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"A"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"A"</span><span class="p">,</span><span class="w"> </span><span class="s2">"B"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"B"</span><span class="p">,</span><span class="w"> </span><span class="s2">"US"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"US"</span><span class="p">),</span><span class="w"> </span><span class="c1"># functional cs</span><span class="w">
  </span><span class="n">fun_alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"A"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">max_cs_alpha</span><span class="p">,</span><span class="w"> </span><span class="s2">"B"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">max_cs_alpha</span><span class="p">,</span><span class="w"> </span><span class="s2">"US"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">us_alpha</span><span class="p">),</span><span class="w">
  </span><span class="n">fun_test</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="s2">"A"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"A"</span><span class="p">,</span><span class="w"> </span><span class="s2">"AB"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"A"</span><span class="p">,</span><span class="w"> </span><span class="s2">"B"</span><span class="p">)),</span><span class="w">
  </span><span class="n">fun_pots</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"US"</span><span class="p">),</span><span class="w">
  </span><span class="n">min_alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w">
  </span><span class="n">rate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rate</span><span class="p">,</span><span class="w">
  </span><span class="n">pwr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pwr</span><span class="p">,</span><span class="w">
  </span><span class="n">epochs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">epochs</span><span class="p">,</span><span class="w">
  </span><span class="n">test_step</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">60</span><span class="p">,</span><span class="w">
  </span><span class="n">sensitivity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">cs_trace</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">power_decay</span><span class="p">(</span><span class="n">max_cs_alpha</span><span class="p">,</span><span class="w">
  </span><span class="n">rate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rate</span><span class="p">,</span><span class="w">
  </span><span class="n">pwr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pwr</span><span class="p">,</span><span class="w"> </span><span class="n">times</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">10</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">off_trace</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">power_decay</span><span class="p">(</span><span class="nf">min</span><span class="p">(</span><span class="n">cs_trace</span><span class="p">),</span><span class="w">
  </span><span class="n">rate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rate</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">3</span><span class="p">,</span><span class="w">
  </span><span class="n">pwr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pwr</span><span class="p">,</span><span class="w"> </span><span class="n">times</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="p">)[</span><span class="m">2</span><span class="o">:</span><span class="p">(</span><span class="m">10</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">)]</span><span class="w">
</span><span class="n">cs_alpha</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">cs_trace</span><span class="p">[</span><span class="m">10</span><span class="p">]</span><span class="w">

</span><span class="n">manual_alphas</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">array</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w">
  </span><span class="n">dim</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">other_args</span><span class="o">$</span><span class="n">epochs</span><span class="p">),</span><span class="w">
  </span><span class="n">dimnames</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s2">"A"</span><span class="p">,</span><span class="w"> </span><span class="s2">"B"</span><span class="p">),</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="n">other_args</span><span class="o">$</span><span class="n">epochs</span><span class="p">)</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">manual_alphas</span><span class="p">[</span><span class="s2">"A"</span><span class="p">,</span><span class="w"> </span><span class="m">11</span><span class="o">:</span><span class="m">30</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="n">cs_trace</span><span class="p">,</span><span class="w"> </span><span class="n">off_trace</span><span class="p">)</span><span class="w">
</span><span class="n">manual_alphas</span><span class="p">[</span><span class="s2">"B"</span><span class="p">,</span><span class="w"> </span><span class="m">11</span><span class="o">:</span><span class="m">30</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="n">cs_trace</span><span class="p">,</span><span class="w"> </span><span class="n">off_trace</span><span class="p">)</span><span class="w">

</span><span class="n">other_args</span><span class="o">$</span><span class="n">manual_alphas</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">manual_alphas</span><span class="w">
</span><span class="n">other_args</span><span class="o">$</span><span class="n">calm_alphas</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"A"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cs_alpha</span><span class="p">,</span><span class="w"> </span><span class="s2">"B"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cs_alpha</span><span class="p">,</span><span class="w"> </span><span class="s2">"US"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">us_alpha</span><span class="p">)</span><span class="w">

</span><span class="n">mod</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">time_wrapper</span><span class="p">(</span><span class="n">other_args</span><span class="p">,</span><span class="w"> </span><span class="n">calm_args</span><span class="p">)</span><span class="w">
</span><span class="c1"># parse_mod</span><span class="w">

</span><span class="n">rs</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">parse_mod</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span><span class="w"> </span><span class="s2">"rs"</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">filter</span><span class="p">(</span><span class="n">s2</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"US"</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ifelse</span><span class="p">(</span><span class="nf">is.na</span><span class="p">(</span><span class="n">value</span><span class="p">),</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">))</span><span class="w">

</span><span class="n">rs_plot</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rs</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w"> </span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">epoch</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s1</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_line</span><span class="p">(</span><span class="n">linewidth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.5</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_point</span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scales</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">no_labs</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">labs</span><span class="p">(</span><span class="w">
    </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Time"</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Strength"</span><span class="p">,</span><span class="w">
    </span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Responding"</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Stimulus"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">facet_grid</span><span class="p">(</span><span class="n">trial_type</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">.</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">transition_reveal</span><span class="p">(</span><span class="n">epoch</span><span class="p">)</span><span class="w">

</span><span class="n">rs_anim</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">animate</span><span class="p">(</span><span class="n">rs_plot</span><span class="p">,</span><span class="w">
  </span><span class="n">renderer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gifski_renderer</span><span class="p">(),</span><span class="w">
  </span><span class="n">height</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5</span><span class="p">,</span><span class="w"> </span><span class="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">,</span><span class="w"> </span><span class="n">units</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"in"</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">500</span><span class="p">,</span><span class="w">
  </span><span class="n">duration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">10</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">anim_save</span><span class="p">(</span><span class="s2">"everything_rs.gif"</span><span class="p">,</span><span class="w"> </span><span class="n">rs_anim</span><span class="p">)</span><span class="w">
</span></code></pre></div></div> <p>P.s. The bits of code that extend HeiDI will be released on OSF soon<sup>tm</sup></p>]]></content><author><name></name></author><summary type="html"><![CDATA[poor-man's manim]]></summary></entry><entry><title type="html">mentimeter</title><link href="https://victor-navarro.github.io/blog/2024/mentimeter/" rel="alternate" type="text/html" title="mentimeter"/><published>2024-01-20T00:00:00+00:00</published><updated>2024-01-20T00:00:00+00:00</updated><id>https://victor-navarro.github.io/blog/2024/mentimeter</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2024/mentimeter/"><![CDATA[<p>I used <a href="https://www.mentimeter.com/">Mentimeter</a> for the first time over the last research away day @ Cardiff. Within the same week, I used it again to gauge the overall knowledge level of my audience during a web seminar.</p> <p>I presented some of the work I’ve done with Rob and Dom during the seminar; the work tends to have a ton of math, but I was lucky the audience was a bunch of nerds in our field.</p> <center><img src="/assets/img/mentimeter-palm.png" width="80%"/></center> <p><br/></p> <p>The talk went well, although I forgot to ask how much more confused people were after my talk.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[a double-edged tool]]></summary></entry><entry><title type="html">calmr package</title><link href="https://victor-navarro.github.io/blog/2023/calmr/" rel="alternate" type="text/html" title="calmr package"/><published>2023-01-22T00:00:00+00:00</published><updated>2023-01-22T00:00:00+00:00</updated><id>https://victor-navarro.github.io/blog/2023/calmr</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2023/calmr/"><![CDATA[<center><img src="/assets/img/calmr.png" width="30%"/></center> <p><br/></p> <p>I am developing an R package that includes some cool associative learning models. You can find it in its <a href="https://github.com/victor-navarro/calmr">github repository</a>.</p> <p>Better yet, you can access its own webpage with documentation and examples at <a href="https://victornavarro.org/calmr/">https://victornavarro.org/calmr/</a></p> <p>Even betterer, you can access a <a href="https://victor-navarro.shinyapps.io/calmr_app/">Shiny app</a> that allows you to do simulations using a fairly simple syntax.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[canonical associative learning models in R]]></summary></entry><entry><title type="html">a HeiDI demo</title><link href="https://victor-navarro.github.io/blog/2021/heidi/" rel="alternate" type="text/html" title="a HeiDI demo"/><published>2021-02-23T00:00:00+00:00</published><updated>2021-02-23T00:00:00+00:00</updated><id>https://victor-navarro.github.io/blog/2021/heidi</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2021/heidi/"><![CDATA[<p>2024 Victor says: The notebook below is very outdated. Please head to the calmr section if you want to use an intelligible (and correct) version of the model.</p> <div class="jupyter-notebook" style="position: relative; width: 100%; margin: 0 auto;"> <div class="jupyter-notebook-iframe-container"> <iframe src="/assets/jupyter/HeiDI_demo.ipynb.html" style="position: absolute; top: 0; left: 0; border-style: none;" width="100%" height="100%" onload="this.parentElement.style.paddingBottom = (this.contentWindow.document.documentElement.scrollHeight + 10) + 'px'"></iframe> </div> </div>]]></content><author><name></name></author><category term="associative"/><category term="learning"/><category term="model"/><summary type="html"><![CDATA[abuelito dime tu]]></summary></entry><entry><title type="html">creating cancer</title><link href="https://victor-navarro.github.io/blog/2020/cancer_dcgan/" rel="alternate" type="text/html" title="creating cancer"/><published>2020-12-29T00:00:00+00:00</published><updated>2020-12-29T00:00:00+00:00</updated><id>https://victor-navarro.github.io/blog/2020/cancer_dcgan</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2020/cancer_dcgan/"><![CDATA[<p>In what follows, I train a generative adversarial network (GAN) to generate fake images of breast cancer tissue. GANs are pretty cool, and so I wanted to dip my toes on them.</p> <p>This one follows a basic GAN <a href="https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html">tutorial</a> to the point. All credit goes to them.</p> <p>2024 Victor says: I could not manage to recover the notebook below. Sorry! But, it is exactly what you would have expected to find.</p> ]]></content><author><name></name></author><category term="categorization"/><category term="generative"/><category term="adversarial"/><category term="networks"/><category term="convolutional"/><category term="cancer"/><summary type="html"><![CDATA[why would you do that?]]></summary></entry><entry><title type="html">on fast and slow errors</title><link href="https://victor-navarro.github.io/blog/2020/slow-errors/" rel="alternate" type="text/html" title="on fast and slow errors"/><published>2020-08-03T00:00:00+00:00</published><updated>2020-08-03T00:00:00+00:00</updated><id>https://victor-navarro.github.io/blog/2020/slow-errors</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2020/slow-errors/"><![CDATA[<p>I try really hard, but I still struggle when it comes to convolving distributions entirely in my head. Apparently, the presence of slow errors is a common prediction for the <a href="https://en.wikipedia.org/wiki/Two-alternative_forced_choice#Drift-diffusion_model">drift diffusion model</a>. Here’s a code-adventure showing it is indeed the case.</p> <div class="jupyter-notebook" style="position: relative; width: 100%; margin: 0 auto;"> <div class="jupyter-notebook-iframe-container"> <iframe src="/assets/jupyter/slow_errors.ipynb.html" style="position: absolute; top: 0; left: 0; border-style: none;" width="100%" height="100%" onload="this.parentElement.style.paddingBottom = (this.contentWindow.document.documentElement.scrollHeight + 10) + 'px'"></iframe> </div> </div>]]></content><author><name></name></author><category term="drift"/><category term="diffusion"/><category term="model"/><category term="categorization"/><category term="jupyter"/><summary type="html"><![CDATA[A counterintuitive prediction]]></summary></entry><entry><title type="html">every paper is an iceberg</title><link href="https://victor-navarro.github.io/blog/2020/iceberg/" rel="alternate" type="text/html" title="every paper is an iceberg"/><published>2020-07-27T00:00:00+00:00</published><updated>2020-07-27T00:00:00+00:00</updated><id>https://victor-navarro.github.io/blog/2020/iceberg</id><content type="html" xml:base="https://victor-navarro.github.io/blog/2020/iceberg/"><![CDATA[<p>You only see the tip of it</p> <p>Here’s a Jupyter notebook that illustrates the modelling I did for a recent paper on <a href="/pubs/human-pigeon-attention/">the attentional profiles of pigeons and humans</a>. Some numerical optimization is done in it, so be patient if you try the live version. You can access live code by clicking this badge <a href="https://mybinder.org/v2/gh/victor-navarro/binder-repo/master?filepath=Recovering%20attention%20from%20GCM.ipynb" target="blank"><img src="https://mybinder.org/badge_logo.svg" alt="Binder"/></a></p> <p>Otherwise, a static view of the code is shown below.</p> <div class="jupyter-notebook" style="position: relative; width: 100%; margin: 0 auto;"> <div class="jupyter-notebook-iframe-container"> <iframe src="/assets/jupyter/iceberg.ipynb.html" style="position: absolute; top: 0; left: 0; border-style: none;" width="100%" height="100%" onload="this.parentElement.style.paddingBottom = (this.contentWindow.document.documentElement.scrollHeight + 10) + 'px'"></iframe> </div> </div>]]></content><author><name></name></author><category term="jupyter"/><category term="code"/><category term="categorization"/><category term="gcm"/><category term="attention"/><summary type="html"><![CDATA[You only see the tip of it]]></summary></entry></feed>