<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>R-bloggers</title>
	<atom:link href="https://www.r-bloggers.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.r-bloggers.com</link>
	<description>R news and tutorials contributed by hundreds of R bloggers</description>
	<lastBuildDate>Fri, 10 Jul 2026 13:02:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.18</generator>

<image>
	<url>https://i0.wp.com/www.r-bloggers.com/wp-content/uploads/2016/08/cropped-R_single_01-200.png?fit=32%2C32&#038;ssl=1</url>
	<title>R-bloggers</title>
	<link>https://www.r-bloggers.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">11524731</site>	<item>
		<title>{golem} 1.0.0 is here</title>
		<link>https://www.r-bloggers.com/2026/07/golem-1-0-0-is-here/</link>
		
		<dc:creator><![CDATA[Colin Fay]]></dc:creator>
		<pubDate>Fri, 10 Jul 2026 13:02:50 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://rtask.thinkr.fr/?p=29902</guid>

					<description><![CDATA[<p>You can read the original post in its original format on Rtask website by ThinkR here: {golem} 1.0.0 is here<br />
After years of powering Shiny applications in production, {golem} — our opinionated framework for building production-grade Shiny apps as R packages — has finally reached a symbolic milestone: version 1.0.0. This is more than ...</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/golem-1-0-0-is-here/">{golem} 1.0.0 is here</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://rtask.thinkr.fr/golem-1-0-0-is-here/"> Rtask</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p>You can read the original post in its original format on <a rel="nofollow" href="https://rtask.thinkr.fr/" target="_blank">Rtask</a> website by ThinkR here: <a rel="nofollow" href="https://rtask.thinkr.fr/golem-1-0-0-is-here/" target="_blank">{golem} 1.0.0 is here</a></p>
<p>After years of powering Shiny applications in production, <code>{golem}</code> — our opinionated framework for building production-grade Shiny apps as R packages — has finally reached a symbolic milestone: version <strong>1.0.0</strong>. This is more than a version bump. It marks a mature, stable API, and it’s the right moment to clean up a few legacy behaviors along the way.</p>
<p>Here’s what’s new in this release:</p>
<ul>
<li><strong><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f916.png" alt="🤖" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Agent skills — the headline feature.</strong> <code>{golem}</code> can now install <em>agent skills</em> (Claude Code / <code>AGENTS.md</code> layout) straight into your project, so your coding assistant natively understands golem’s conventions: adding a module, a function, running a check, fixing missing <code>ns()</code> calls… Enable them right at creation with <code>create_golem(&quot;myapp&quot;, with_agents = TRUE)</code>.</li>
<li><strong><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f433.png" alt="🐳" class="wp-smiley" style="height: 1em; max-height: 1em;" /> A reworked Docker/<code>{renv}</code> deployment story.</strong> Multi-stage Dockerfiles by default, production mode enabled out of the box, plus two new helpers — <code>add_github_action()</code> and <code>add_gitlab_ci()</code> — to generate minimal deployment CI for fresh apps.</li>
<li><strong><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/2728.png" alt="✨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Modernized console output.</strong> Every message, progress bar and feedback line has been standardized with the <code>{cli}</code> package for a cleaner, more consistent experience.</li>
<li><strong><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f50c.png" alt="🔌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Functional JavaScript bindings out of the box.</strong> <code>add_js_input_binding()</code> and <code>add_js_output_binding()</code> now generate working bindings — no more manual skeleton completion — with a ready-to-use R companion file.</li>
<li><strong><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Breaking changes.</strong> Unified <code>golem_wd</code> path argument, a reworked <code>get_current_config()</code>, a few removed functions and stricter <code>add_*</code>/<code>use_*</code> helpers. Worth reading before you upgrade an existing project.</li>
</ul>
<p>Getting started (or upgrading) is a one-liner:</p>
<pre>install.packages(&quot;golem&quot;)
golem::create_golem(&quot;myapp&quot;, with_agents = TRUE)</pre>
<p><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f449.png" alt="👉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://www.golemverse.org/news/golem-1.0.0-release-on-cran/" rel="nofollow" target="_blank"><strong>Read the full announcement on golemverse.org →</strong></a></p>
<p>This post is better presented on its original ThinkR website here: <a rel="nofollow" href="https://rtask.thinkr.fr/golem-1-0-0-is-here/" target="_blank">{golem} 1.0.0 is here</a></p>

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://rtask.thinkr.fr/golem-1-0-0-is-here/"> Rtask</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/golem-1-0-0-is-here/">{golem} 1.0.0 is here</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402529</post-id>	</item>
		<item>
		<title>SummaryTables: Publication-Ready Summary Tables for jamovi</title>
		<link>https://www.r-bloggers.com/2026/07/summarytables-publication-ready-summary-tables-for-jamovi/</link>
		
		<dc:creator><![CDATA[["Nour Edin Darwish"]]]></dc:creator>
		<pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://blog.jamovi.org/2026/07/09/summarytables</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> We are excited to introduce SummaryTables, a new module available in the jamovi library designed to provide an easy, flexible, and elegant way to create publication-ready analytical and summary tables. Powered by the gtsummary package in R, this module bridges the gap between running your analyses and publishing them. Instead ...</div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/summarytables-publication-ready-summary-tables-for-jamovi/">SummaryTables: Publication-Ready Summary Tables for jamovi</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://blog.jamovi.org/2026/07/09/summarytables.html"> jamovi</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p>We are excited to introduce <strong>SummaryTables</strong>, a new module available in the jamovi library designed to provide an easy, flexible, and elegant way to create publication-ready analytical and summary tables.</p>

<p>Powered by the <code>gtsummary</code> package in R, this module bridges the gap between running your analyses and publishing them. Instead of piecing together multiple separate outputs into a final manuscript table, SummaryTables generates beautifully formatted, publication-ready tables directly within jamovi. By making complex analyses simple and accessible, it saves you valuable time and reduces the risk of transcription errors. It summarizes data sets, regression models, and more, using sensible defaults while offering highly customizable capabilities.</p>

<span id="more-402524"></span>

<h2 id="key-features">Key Features</h2>

<p>Here is an overview of the analyses included in the module:</p>

<h3 id="1-summary-table">1. Summary Table</h3>

<p>Create classic “Table 1” summaries with group comparisons, automatic statistical testing, effect sizes, and p-value adjustments.
<img src="https://i0.wp.com/blog.jamovi.org/assets/images/summarytables/summary-table.png?w=578&#038;ssl=1" alt="Summary Table" data-recalc-dims="1" /></p>

<h3 id="2-continuous-table">2. Continuous Table</h3>

<p>Summarize a single continuous variable across multiple categorical variables with automatic statistical testing and p-value adjustments.
<img src="https://i0.wp.com/blog.jamovi.org/assets/images/summarytables/continuous-table.png?w=578&#038;ssl=1" alt="Continuous Table" data-recalc-dims="1" /></p>

<h3 id="3-cross-table">3. Cross Table</h3>

<p>Summarize the association between two categorical variables using cross-tabulations with automatic statistical testing.
<img src="https://i0.wp.com/blog.jamovi.org/assets/images/summarytables/cross-table.png?w=578&#038;ssl=1" alt="Cross Table" data-recalc-dims="1" /></p>

<h3 id="4-likert-table">4. Likert Table</h3>

<p>Summarize Likert scale items.
<img src="https://i0.wp.com/blog.jamovi.org/assets/images/summarytables/likert-table.png?w=578&#038;ssl=1" alt="Likert Table" data-recalc-dims="1" /></p>

<h3 id="5-survival-table">5. Survival Table</h3>

<p>Create Kaplan-Meier survival tables showing survival probabilities and median survival times.
<img src="https://i2.wp.com/blog.jamovi.org/assets/images/summarytables/survival-table.png?w=578&#038;ssl=1" alt="Survival Table" data-recalc-dims="1" /></p>

<h3 id="6-multivariable-regression">6. Multivariable Regression</h3>

<p>Fit multivariable linear, logistic, or Cox regression models.
<img src="https://i1.wp.com/blog.jamovi.org/assets/images/summarytables/multivariable-regression.png?w=578&#038;ssl=1" alt="Multivariable Regression" data-recalc-dims="1" /></p>

<h3 id="7-univariable-regression">7. Univariable Regression</h3>

<p>Run separate univariable linear, logistic, or Cox regression models for each predictor, seamlessly combined into a single, clean table.
<img src="https://i2.wp.com/blog.jamovi.org/assets/images/summarytables/univariable-regression.png?w=578&#038;ssl=1" alt="Univariable Regression" data-recalc-dims="1" /></p>

<h2 id="additional-features">Additional Features</h2>

<h3 id="save-to-word">Save to Word</h3>

<p>Bypass the formatting headaches that come with copying and pasting jamovi tables into Word. Save your results directly to a natively formatted Word (.docx) document, preserving the same styling done in jamovi and ensuring a perfect layout for your manuscript.
<img src="https://i2.wp.com/blog.jamovi.org/assets/images/summarytables/word-table.png?w=578&#038;ssl=1" alt="Word Table" data-recalc-dims="1" /></p>

<h3 id="journal-formatting--translations">Journal Formatting &#038; Translations</h3>

<p>Choose from 16 supported languages and apply pre-built formatting themes tailored for major journals (JAMA, The Lancet, NEJM, QJE).</p>

<h2 id="help-and-documentation">Help and Documentation</h2>

<p>For documentation, tutorials, and support, please visit: <a href="https://nouredindarwish.github.io/SummaryTables" rel="nofollow" target="_blank">nouredindarwish.github.io/SummaryTables</a>.</p>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://blog.jamovi.org/2026/07/09/summarytables.html"> jamovi</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/summarytables-publication-ready-summary-tables-for-jamovi/">SummaryTables: Publication-Ready Summary Tables for jamovi</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402524</post-id>	</item>
		<item>
		<title>How to Put your Course Book Online</title>
		<link>https://www.r-bloggers.com/2026/07/how-to-put-your-course-book-online/</link>
		
		<dc:creator><![CDATA[Blog on Credibly Curious]]></dc:creator>
		<pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://www.njtierney.com/post/2026/07/09/put-course-online/</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> I recently gave a talk, The value in teaching is not the content it’s the teacher<br />
My main point in this is:</p>
<p>Your course materials should be out there in public for free online.</p>
<p>To help support this, this blog post goes through the technical det...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/how-to-put-your-course-book-online/">How to Put your Course Book Online</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://www.njtierney.com/post/2026/07/09/put-course-online/"> Blog on Credibly Curious</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p>I recently gave a talk, <a href="https://njtierney.github.io/talk-teacher-over-content/#/title-slide" rel="nofollow" target="_blank">The value in teaching is not the <strong>content</strong> it’s the <strong>teacher</strong></a></p>
<p>My main point in this is:</p>
<blockquote>
<p>Your course materials should be out there in public for free online.</p>
</blockquote>
<p>To help support this, this blog post goes through the technical details I note in one of my slides: How to Put your Course Book Online.</p>
<h1 id="summary">Summary</h1>
<ul>
<li>Make a quarto book</li>
<li>Add an appropriate license <a href="https://creativecommons.org/licenses/by-nc/4.0/" rel="nofollow" target="_blank">CC BY-NC-4.0</a>
<ul>
<li>Can share/adapt, must attribute</li>
<li>Cannot use materials commercially</li>
</ul>
</li>
<li>Add a README</li>
<li>Put it on github</li>
<li>Have it render as an online book when you make changes</li>
</ul>
<h1 id="follow-along-with-github-repo-course-book-template">Follow along with github repo: “course-book-template”</h1>
<p>I have made a repo on github <a href="https://github.com/njtierney/course-book-template" rel="nofollow" target="_blank">“course-book-template”</a> that details each of these steps.</p>
<h1 id="make-a-quarto-book">Make a quarto book</h1>
<p>The quarto docs on starting a book are <em>excellent</em> so I would recommend starting there: <a href="https://quarto.org/docs/books/#quick-start" rel="nofollow" target="_blank">https://quarto.org/docs/books/#quick-start</a>.</p>
<p>But essentially, you run:</p>
<pre>quarto create project book .
</pre><p>It will then guide you through creating a title, etc</p>
<p><a href="https://github.com/njtierney/course-book-template/commit/e2b1a6f3b0e8668ca4c068365124124c14630230" rel="nofollow" target="_blank">commit of adding the book</a></p>
<h1 id="add-an-appropriate-license">Add an appropriate license</h1>
<p>It is important to pick a license early. This helps protect your work, and also makes it clear to others how to reference and use your work. Personally, I like <a href="https://creativecommons.org/licenses/by-nc/4.0/" rel="nofollow" target="_blank">CC BY-NC-4.0</a>, this gives you these conditions:</p>
<ul>
<li>Can share/adapt, must attribute</li>
<li>Cannot use materials commercially</li>
</ul>
<p>Note that this is different to the very common <a href="https://creativecommons.org/licenses/by/4.0/" rel="nofollow" target="_blank">CC-BY</a>, which does allow commercial usage.</p>
<p>If you aren’t sure about licenses for your purpose, it would be worthwhile checking out the chooser here <a href="https://creativecommons.org/chooser/" rel="nofollow" target="_blank">https://creativecommons.org/chooser/</a></p>
<p>In using this, I discovered another useful license, <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="nofollow" target="_blank">CC-BY-NC-SA 4.0</a> Which builds off of CC-BY-NC, but with one additional clause:</p>
<blockquote>
<p>ShareAlike &#8211; If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.</p>
</blockquote>
<p>This is sometimes known as “copyleft”. This is sometimes seen as too restrictive. Consult with your community about what the standards are. Another useful place to read up on licenses is the <a href="https://r-pkgs.org/license.html" rel="nofollow" target="_blank">“licensing” chapter in the R packages book by Hadley Wickham and Jenny Bryan</a></p>
<p>I add a LICENSE file, and also a license.qmd chapter, as well as add the license to the README.</p>
<p><a href="https://github.com/njtierney/course-book-template/commit/1825258f3bda4116ef09886c4fda7dedd722c2f2" rel="nofollow" target="_blank">commit of adding the license</a></p>
<h1 id="using-a-readme">Using a README</h1>
<p>I think it is worthwhile adding a few key sections to your README file:</p>
<ul>
<li>Details: like the abstract &#8211; the hook!</li>
<li>Prerequisites: What do you expect learners to know?</li>
<li>Learning outcomes: What will they walk away knowing?</li>
<li>Schedule: An outline of each hour of learning, optionally with a timetable</li>
</ul>
<p><a href="https://github.com/njtierney/course-book-template/commit/5ca6202b80b047f1da48486db57df96d2bbdbf02" rel="nofollow" target="_blank">commit of adding the README</a></p>
<h1 id="put-it-on-online---github">Put it on online &#8211; github</h1>
<p>Your course should live somewhere public! You can see for example our course materials here: <a href="https://github.com/njtierney/course-book-template" rel="nofollow" target="_blank">https://github.com/njtierney/course-book-template</a></p>
<h1 id="have-it-render-when-you-make-changes">Have it render when you make changes</h1>
<p>You can use github actions to render your book. This is really neat, and means your book will be rendered anytime you push changes. It means you don’t need to push HTML, just the quarto files.</p>
<p>Rhere are a few different ways you can manage this, I happen to like using github pages.</p>
<p>There are some really nice instructions on the quarto website on how to set up github pages &#8211; <a href="https://quarto.org/docs/publishing/github-pages.html#github-action" rel="nofollow" target="_blank">https://quarto.org/docs/publishing/github-pages.html#github-action</a></p>
<p>However, I have found a slightly different setup, which I will share here.</p>
<p>This involves using a DESCRIPTION file to track the R packages that you use. The reason we need to do this is to make sure when we render our book, that all the R packages we need are installed. There are probably other ways around this, and I’d love to hear them, but this is what I have found works.</p>
<p>Here is the first step where I add a dependency, in this case, tidyverse.</p>
<p><a href="https://github.com/njtierney/course-book-template/commit/7777757f9ab2d98985576ef7e65ebc801e2ae17e" rel="nofollow" target="_blank">commit of adding this tidyverse code</a></p>
<p>Then add the DESCRIPTION file with:</p>
<pre>usethis::use_description(check_name = FALSE)
</pre><p>I then edited mine to look like this:</p>
<pre>Package: course-book-template
Title: A book about some things
Version: 0.0.0.9000
Authors@R: 
  c(
  person(
    given = &quot;Nicholas&quot;,
    family = &quot;Tierney&quot;,
    email = &quot;nicholas.tierney@gmail.com&quot;,
    role = c(&quot;aut&quot;, &quot;cre&quot;),
    comment = c(ORCID = &quot;https://orcid.org/0000-0003-1460-8722&quot;)
    )
  )
Description: Course materials for your topic. This should have two sentences.
License: CC-BY-NC 4.0 + file LICENSE
Encoding: UTF-8
Language: en-GB
Roxygen: list(markdown = TRUE)
RoxygenNote: 8.0.0
</pre><p><a href="https://github.com/njtierney/course-book-template/commit/22ec04320474b5c60d6ab1e51772e2a30cfc899d" rel="nofollow" target="_blank">commit</a></p>
<p>You can then add your package dependency into Imports or Depends. Which one you use is normally very important for R package development, but the reason we are using a DESCRIPTION file here is to track our dependencies.</p>
<div class="highlight">
<pre>usethis::use_package(&quot;tidyverse&quot;, type = &quot;Depends&quot;)</pre>
</div>
<p><a href="https://github.com/njtierney/course-book-template/commit/ec736d9eb84849cc10ab798f57772694d33766d0" rel="nofollow" target="_blank">commit</a></p>
<p>I then add the github actions &#8211; you can actually just refer to a file, so this will work:</p>
<pre>use_github_action(url = &quot;https://github.com/njtierney/gentlegit/blob/main/.github/workflows/quarto-publish.yml&quot;)
</pre><p>This will give you a message like the following:</p>
<pre>&#x2714; Creating .github/.
&#x2714; Adding &quot;^\\.github$&quot; to .Rbuildignore.
&#x2714; Adding &quot;*.html&quot; to .github/.gitignore.
&#x2714; Creating .github/workflows/.
&#x2714; Saving
  &quot;njtierney/gentlegit/.github/workflows/quarto-publish.yml@main&quot;
  to .github/workflows/quarto-publish.yml.
</pre>
<p><a href="https://github.com/njtierney/course-book-template/commit/0d18aaa8546698cb2c5ec8de38f5b5ee60be3dbf" rel="nofollow" target="_blank">commit</a></p>
<p>Also, probably a good time to add a .gitignore file. This is a good idea to make sure you don’t commit HTML files (they can be really large,a nd we don’t need them), or other file types that might be really large, or have sensitive information in them.</p>
<div class="highlight">
<pre>usethis::use_git_ignore(&quot;*.pdf&quot;)</pre>
</div>
<p>Will create the file, and tell git to never commit a PDF.</p>
<p>I edit my .gitignore file to look like the following:</p>
<pre>/.quarto/
**/*.quarto_ipynb
.Rproj.user
.Rhistory
.RData
.Ruserdata
dev
docs
/.quarto/
*.aux
*.log
*.pdf
*.tex
*.toc
*.rds
*_files
*_cache
*.html
.DS_Store
</pre>
<p><a href="https://github.com/njtierney/course-book-template/commit/9c165f3c88194b7a2526fe13cfbaaa5ea6c89d9a" rel="nofollow" target="_blank">commit</a></p>
<p>Once all this is said and done, you will still need to run some commands in your terminal:</p>
<pre>quarto publish gh-pages
</pre><p>This should then produce a question like:</p>
<pre>nick course-book-template[main] &gt; quarto publish gh-pages
? Publish site to https://njtierney.github.io/course-book-template/ using gh-pages? (Y/n) › 
</pre>
<p>reply “Y”</p>
<p>You will then get some code that looks like:</p>
<pre>Switched to a new branch 'gh-pages'
[gh-pages (root-commit) 8ccc5e0] Initializing gh-pages branch
remote: 
remote: Create a pull request for 'gh-pages' on GitHub by visiting:        
remote:      https://github.com/njtierney/course-book-template/pull/new/gh-pages        
remote: 
To https://github.com/njtierney/course-book-template.git
 * [new branch]      HEAD -&gt; gh-pages
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
From https://github.com/njtierney/course-book-template
 * branch            gh-pages   -&gt; FETCH_HEAD
</pre>
<p>And then some rendering code that will look like:</p>
<pre>Rendering for publish:

[1/4] index.qmd
[2/4] intro.qmd


processing file: intro.qmd
1/3                  
2/3 [unnamed-chunk-1]
3/3                  
output file: intro.knit.md

...

(|) Deploying gh-pages branch to website (this may take a few minutes)
</pre>
<p>Wait a few minutes, as it asks you.</p>
<p>Then you should see something like:</p>
<pre>[✓] Deploying gh-pages branch to website (this may take a few minutes)
[✓] Published to https://njtierney.github.io/course-book-template/

NOTE: GitHub Pages deployments normally take a few minutes (your site updates
will be visible once the deploy completes)
</pre>
<p>Your website probably won’t be visible just yet, which feels a touch annoying, but you can keep an eye on it on the “actions” tab, e.g., <a href="https://github.com/njtierney/course-book-template/actions" rel="nofollow" target="_blank">https://github.com/njtierney/course-book-template/actions</a></p>
<p>Once this has lit green (hopefully it has!)</p>
<p>You should go to your “about” section, and click on the setting cog:</p>
<div class="highlight">
<p><img src="https://i2.wp.com/www.njtierney.com/post/2026/07/09/put-course-online/imgs/about-cog.png?w=578&#038;ssl=1" alt="" px" style="display: block; margin: auto;" data-recalc-dims="1" /></p>
</div>
<p>Then tick the box that says “Use your GitHub Pages website”</p>
<div class="highlight">
<p><img src="https://i2.wp.com/www.njtierney.com/post/2026/07/09/put-course-online/imgs/about-website.png?w=578&#038;ssl=1" alt="" px" style="display: block; margin: auto;" data-recalc-dims="1" /></p>
</div>
<p>This adds your GitHub Pages website onto the repo, and it looks pretty neat.</p>
<p>There are more things you can do, like configuring your own custom website instead of using github.</p>
<p>So, instead of <a href="https://njtierney.github.io/course-book-template/" rel="nofollow" target="_blank">https://njtierney.github.io/course-book-template/</a>, you could have: “course-book-template.com”.</p>
<p>And that’s it!</p>

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://www.njtierney.com/post/2026/07/09/put-course-online/"> Blog on Credibly Curious</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/how-to-put-your-course-book-online/">How to Put your Course Book Online</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402513</post-id>	</item>
		<item>
		<title>Crude oil stocks at Cushing, Oklahoma by @ellis2013nz</title>
		<link>https://www.r-bloggers.com/2026/07/crude-oil-stocks-at-cushing-oklahoma-by-ellis2013nz/</link>
		
		<dc:creator><![CDATA[free range statistics - R]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://freerangestats.info/blog/2026/07/09/cushing</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> A very short post today. During the global fuel crisis relating to the conflict in Iran, I have been monitoring this chart, every Thursday morning my time:</p>
<p>It shows the amount of crude oil in the Cushing facility in Oklahoma and is one of the most t...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/crude-oil-stocks-at-cushing-oklahoma-by-ellis2013nz/">Crude oil stocks at Cushing, Oklahoma by @ellis2013nz</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://freerangestats.info/blog/2026/07/09/cushing"> free range statistics - R</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p>A very short post today. During the global fuel crisis relating to the conflict in Iran, I have been monitoring this chart, every Thursday morning my time:</p>

<object type="image/svg+xml" data="https://freerangestats.info/img/0325-cushing.svg" width="450"><img src="https://i2.wp.com/freerangestats.info/img/0325-cushing.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>It shows the amount of crude oil in the Cushing facility in Oklahoma and is one of the most timely and frequently updating (every Wednesday) indicators of the overall health of the crude oil market in the USA. As the chart says, below 20 million barrels is widely cited as problematic, “tank bottom”, or the “operational floor”. Below this level is expected to cause risks to oil quality, to the ability of infrastructure to move oil around, and to service the commodities markets that rely on this facility for actual delivery.</p>

<p>We’ve been under 20 million for a few weeks now and yet the oil markets in the USA have not blown up or ground to a halt (choose your metaphor), so clearly there is a bit of slack built into that “minimum”. Perhaps the real minimum is 18 million, 17 million, who knows? But it can’t be far below the current level and this is clearly worth monitoring.</p>

<p>There is of course a web page where you can check the data directly, but naturally I wanted to draw my own polished chart and label it appropriately. The code below runs a complete pipeline to download the data, process it (including preparing some smart uncluttered automatic labelling of points) and drawing the plot.</p>

<figure class="highlight"><pre>library(tidyverse)
library(scales)
library(readxl)
library(ggrepel)
library(glue)

# Download data
download.file(&quot;https://www.eia.gov/dnav/pet/hist_xls/W_EPC0_SAX_YCUOK_MBBLw.xls&quot;, 
              mode = &quot;wb&quot;, destfile = &quot;cushing.xls&quot;)

# Import and process data
cushing &lt;- read_excel(&quot;cushing.xls&quot;, sheet = &quot;Data 1&quot;, skip = 2) |&gt; 
      rename(value = `Weekly Cushing, OK Ending Stocks excluding SPR of Crude Oil  (Thousand Barrels)`,
             end_date = Date) |&gt; 
      # we want a label for a point only if it is at least 500 different from
      # the subsequent point (this is to avoid clutter when the line is
      # basically horizontal)
      mutate(label = ifelse(is.na(lead(value)) | 
                            abs(value - lead(value)) &gt; 500, 
                            comma(value), &quot;&quot;),
      # We also want the label to disappear if the value is really close to
      # 20,000, which is going to be a clearly labelled line anyway so would
      # just be unnecessary clutter.
             label = ifelse(abs(value - 20000) &lt; 200, &quot;&quot;, label))

# Draw chart
cushing |&gt; 
    filter(end_date &gt; as.Date(&quot;2025-12-31&quot;)) |&gt;
    # original data was in thousands but it's better to have it in millioms
    # visually:
    ggplot(aes(x = end_date, y = value / 1000)) +
    geom_hline(yintercept = 20, colour = &quot;darkred&quot;) +
    geom_line(colour = &quot;steelblue&quot;) +
    geom_point(colour = &quot;steelblue&quot;) +
    geom_text(data = filter(cushing, end_date &gt; as.Date(&quot;2026-05-01&quot;)), 
              aes(label = label, x = end_date + 150000), 
              size = 2.8, hjust = 0) +
    annotate(&quot;text&quot;, x = as.Date(&quot;2026-03-02&quot;), y = 20.500, 
             label = &quot;Widely cited minimum working level - 20 million barrels&quot;, 
             colour = &quot;darkred&quot;) +
    scale_x_date(date_breaks = &quot;1 month&quot;, date_labels = &quot;%b&quot;) + 
    scale_y_continuous(label = comma) +
    theme(panel.grid.minor = element_blank()) +
    labs(x = &quot;Month (2026)&quot;,
         y = &quot;Million barrels&quot;,
         title = &quot;Stocks of crude oil at Cushing, Oklahoma&quot;,
         subtitle = &quot;Cushing is the main US crude oil storage and pipeline hub, and the delivery point for the West Texas Intermediary (WTI) oil benchmark.&quot;,
         caption = glue(&quot;Source: US Energy Information Administration (EIA) https://www.eia.gov/dnav/pet/hist/LeafHandler.ashx?n=PET&s=W_EPC0_SAX_YCUOK_MBBL&f=W. Accessed {Sys.Date()}.&quot;))</pre></figure>


<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://freerangestats.info/blog/2026/07/09/cushing"> free range statistics - R</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/crude-oil-stocks-at-cushing-oklahoma-by-ellis2013nz/">Crude oil stocks at Cushing, Oklahoma by @ellis2013nz</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402508</post-id>	</item>
		<item>
		<title>An API for Everything There Is to Know About Packages</title>
		<link>https://www.r-bloggers.com/2026/07/an-api-for-everything-there-is-to-know-about-packages/</link>
		
		<dc:creator><![CDATA[rOpenSci]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://ropensci.org/blog/2026/07/08/r-universe-apis-use-cases/</guid>

					<description><![CDATA[<p>On R-Universe you can discover and learn everything there is to know about R packages. But did you know it does only provide a human-friendly website, but also programmatic access to all information through APIs!<br />
Thanks to those APIs you can list univ...</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/an-api-for-everything-there-is-to-know-about-packages/">An API for Everything There Is to Know About Packages</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://ropensci.org/blog/2026/07/08/r-universe-apis-use-cases/"> rOpenSci - open tools for open science</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<p>On R-Universe you can <a href="https://ropensci.org/blog/2023/02/27/runiverse-discovering/" rel="nofollow" target="_blank">discover and learn everything there is to know about R packages</a>. But did you know it does only provide a human-friendly website, but also programmatic access to all information through APIs!
Thanks to those APIs you can list universes, list packages in an universe, get information on packages, and perform searches; all without any need for authentication.</p>
<p>The R-Universe APIs are both handy and reliable. You can build upon them, as both rOpenSci and community members have done.
This post shows some examples of use cases with the R-Universe API.</p>
<h2>
Know which packages are yours
</h2><p>The toolbox for rOpenSci community management tasks, <a href="https://ropensci.r-universe.dev/promoutils" rel="nofollow" target="_blank">promoutils</a>, calls an R-Universe API to list and get information on <a href="https://github.com/ropensci-org/promoutils/blob/18c80362002bafe48c7c88c1ca062ac3a3050358/R/utils.R#L25" rel="nofollow" target="_blank">rOpenSci packages</a>.
This list of packages is in particular used in the <a href="https://github.com/ropensci-org/promoutils/blob/18c80362002bafe48c7c88c1ca062ac3a3050358/R/help_wanted_json.R#L48" rel="nofollow" target="_blank">function</a> that outputs data on <a href="https://ropensci.org/help-wanted" rel="nofollow" target="_blank">help-wanted issues</a>.</p>
<h2>
Display packages developed at your organization
</h2><p>If your organization develops R packages, you can use its R-Universe as the source of truth for your package collection.
For instance, the <a href="https://ggsegverse.r-universe.dev/builds" rel="nofollow" target="_blank">R-Universe of ggsegverse</a> corresponds to, well, the ggsegverse.
Therefore, on the ggsegverse website, the <a href="https://ggsegverse.github.io/ecosystem/" rel="nofollow" target="_blank">listing of packages</a> is created by querying <code>https://ggsegverse.r-universe.dev/api/packages</code>, the endpoint for <a href="https://docs.r-universe.dev/browse/api.html#information-of-all-packages-in-an-universe" rel="nofollow" target="_blank">information on all packages in the universe</a>.</p>
<figure><a href="https://ggsegverse.github.io/ecosystem/" rel="nofollow" target="_blank"><img src="https://i2.wp.com/ropensci.org/blog/2026/07/08/r-universe-apis-use-cases/ggsegverse.png?w=578&#038;ssl=1"
alt="Screenshot of the ggsegverse website, with informative package cards" data-recalc-dims="1"></a>
</figure>
<p>Likewise, the <a href="https://ggsegverse.github.io/docs/" rel="nofollow" target="_blank">docs page</a> of ggsegverse relies on the R-Universe API to retrieve links to vignettes for each package.</p>
<h3>
Server-side or client-side API requests
</h3><p>The ggsegverse website performs <strong>client-side requests</strong>: it queries the R-Universe API when you open the webpage, through a <a href="https://github.com/ggsegverse/ggsegverse.github.io/blob/aea3723f885387ca9399408ccfbcc7a1ec9d7820/js/api.js" rel="nofollow" target="_blank">JS script</a>.
You can also check this through the <a href="https://inspectelement.org/apis.html#how-to-find-and-use-undocumented-apis" rel="nofollow" target="_blank">web developer tools</a>:</p>
<figure><img src="https://i0.wp.com/ropensci.org/blog/2026/07/08/r-universe-apis-use-cases/request.png?w=578&#038;ssl=1"
alt="Screenshot of the web developer tools&#39; network tab, showing the XHR request logged when one reloads the ggsegverse website" data-recalc-dims="1">
</figure>
<p>The rendering of the nice package cards happens through <a href="https://github.com/ggsegverse/ggsegverse.github.io/blob/fec52718432d098b1162772f3f94985a1d0feef3/js/render.js" rel="nofollow" target="_blank">another JS script</a> that uses information such as the package’s title, description, number of stars, etc.</p>
<p>In contrast, for package listings on author and package pages, the rOpenSci website uses <strong>server-side requests</strong>: the API is called when Hugo renders our website.
For instance, for the list of packages at the bottom of <a href="https://ropensci.org/author/jeroen-ooms/" rel="nofollow" target="_blank">Jeroen Ooms’ author page</a>, we <a href="https://github.com/ropensci/roweb3/blob/503f0547854925eaa72a0e2c36420e3731e98ebf/themes/ropensci/layouts/author/list.html#L84" rel="nofollow" target="_blank">query</a> the R-Universe API link from our website <a href="https://github.com/ropensci/roweb3/blob/7851904c5297868b7c372788166c526f2fe2ed1d/config.toml#L60" rel="nofollow" target="_blank">configuration</a> and <a href="https://github.com/ropensci/roweb3/blob/503f0547854925eaa72a0e2c36420e3731e98ebf/themes/ropensci/layouts/author/list.html#L85" rel="nofollow" target="_blank">filter</a> the packages by GitHub login.</p>
<figure><img src="https://i1.wp.com/ropensci.org/blog/2026/07/08/r-universe-apis-use-cases/jeroen.png?w=578&#038;ssl=1"
alt="Screenshot of Jeroen Ooms&#39; author page on the rOpenSci website, featuring the list of rOpenSci packages that he maintains." data-recalc-dims="1">
</figure>
<p>On a Quarto website, you could have a code chunk using R to query the R-Universe APIs, through the <a href="https://docs.ropensci.org/universe/" rel="nofollow" target="_blank">universe R package</a> for instance.</p>
<p>In any case, if you use server-side requests, you need to re-render your website regularly to avoid your packages’ listing to get out-of-date.
The nice thing about client-side requests is that the package lists will be always up-to-date!</p>
<h2>
Search Packages
</h2><p>With R-universe, you can search packages, not only through the web interface but also through an <a href="https://docs.r-universe.dev/browse/api.html#api-global-search" rel="nofollow" target="_blank">API</a>.</p>
<p>The project <a href="https://rwarehouse.netlify.app/" rel="nofollow" target="_blank">The Wharehouse</a>, that helps users find packages according to given keywords, <a href="https://rwarehouse.netlify.app/about#resources-credits" rel="nofollow" target="_blank">uses R-universe as one its information sources</a>.</p>
<h2>
Conclusion
</h2><p>In this post we provided some use cases of the R-Universe APIs.
Try them out, or read the <a href="https://docs.r-universe.dev/browse/api.html" rel="nofollow" target="_blank">docs</a> to get a sense of all the information that’s shared through the different endpoints.
If you maintain some infrastructure that uses an R-Universe API, feel free to report a <a href="https://ropensci.org/usecases" rel="nofollow" target="_blank">use case</a>!</p>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://ropensci.org/blog/2026/07/08/r-universe-apis-use-cases/"> rOpenSci - open tools for open science</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/an-api-for-everything-there-is-to-know-about-packages/">An API for Everything There Is to Know About Packages</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402506</post-id>	</item>
		<item>
		<title>Close Enough? Using the WGI as a Proxy for the WJP Rule of Law Index</title>
		<link>https://www.r-bloggers.com/2026/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/</link>
		
		<dc:creator><![CDATA[Giles Dickenson-Jones]]></dc:creator>
		<pubDate>Mon, 06 Jul 2026 23:13:14 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://www.gilesd-j.com/?p=4233</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> This post examines whether the Worldwide Governance Indicators' (WGI) rule of law measure provides a reasonable proxy for the World Justice Project's (WJP) Rule of Law Index, such as when analysis might benefit from the WGI's availability for more countries over a longer period. Results suggest the two measures broadly ...</div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/">Close Enough? Using the WGI as a Proxy for the WJP Rule of Law Index</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://www.gilesd-j.com/2026/07/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/"> Data Analytics and AI Archives - Giles</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<p class="wp-block-paragraph"><strong>TLDR: </strong>this post tests whether the Worldwide Governance Indicators’ (WGI) rule of law measure provides a reasonable proxy for the World Justice Project’s (WJP) Rule of Law Index, such as when analysis might benefit from the WGI’s availability for more countries over a longer period. Results suggest the two measures broadly agree with one another when making cross-country comparisons, but care is warranted for country-level estimates where it’s likely to be more difficult to differentiate measurement noise from genuine changes in the quality of institutions.</p>



<p class="wp-block-paragraph"><em>This is the first post in a series examining relationships between the rule of law and economic and social outcomes.</em></p>



<p class="wp-block-paragraph">In the latter half of 2025 I was engaged by the <a href="https://binghamcentre.biicl.org/" rel="nofollow" target="_blank">Bingham Centre for the Rule of Law</a> and <a href="https://www.lawsociety.org.uk/" rel="nofollow" target="_blank">The Law Society of England and Wales</a> to facilitate internal discussions on the links between economic growth and the rule of law. Being subject to the Chatham House Rule means much of my work won’t see the light of day, but for those interested in the topic I’d recommend taking a look at <a href="https://binghamcentre.biicl.org/publications/the-rule-of-law-and-the-institutional-roots-of-economic-performance?cookiesset=1&#038;ts=1782968891" rel="nofollow" target="_blank">Dr Lopez-Gomez’s literature review</a> which provides a good summary of the issues discussed.</p>



<p class="wp-block-paragraph">As somebody that dedicates a lot of time to conducting cross-country comparisons and using statistics to measure amorphous concepts, I started work on the project by identifying approaches for measuring the <em>rule of law </em>(RoL)<em>, </em>to help anchor analysis and discussions to something tangible definition that was rigorous enough to satisfy a room full of lawyers, without offending institutional economists.</p>



<p class="wp-block-paragraph">This led me to two composite measures:</p>



<ol class="wp-block-list">
<li class=""><a href="https://worldjusticeproject.org/rule-of-law-index/" rel="nofollow" target="_blank">The World Justice Project’s (WJP) Rule of Law Index</a>; and</li>



<li class=""><a href="https://www.worldbank.org/en/publication/worldwide-governance-indicators" rel="nofollow" target="_blank">The World Bank’s Rule of Law measure from their Worldwide Governance Indicators (WGI)</a>.</li>
</ol>



<p class="wp-block-paragraph">Like all indices, both are constructed by collecting an assortment of indicators that are thought to proxy something important that can’t be easily be observed or quantified. A person’s performance at work is a good example of this: as even when we might <em>know</em> what a good employee looks it can be hard to explicitly define and quantify. Which often results in performance being <em>proxied</em> through some combination of vague indicators like judgement, communication and sticktoitiveness.</p>



<p class="wp-block-paragraph">Composite indices work in a similar way, except that it’s often harder to validate whether they’re measuring anything useful due to the guiding concept itself being vague and divorced from our day-to-day experience<em>.</em> Unsurprisingly, this has resulted in <a href="https://openknowledge.worldbank.org/entities/publication/4fa16c40-5ad2-5b73-8420-02dcf0ddee7b" rel="nofollow" target="_blank">the birth of a lot of terrible indices</a> whose sole purpose appears to be to fabricate quantitative evidence for whatever concept they’re pushing, which is likely what motivated the OECD to develop <a href="https://www.oecd.org/en/publications/handbook-on-constructing-composite-indicators-methodology-and-user-guide_9789264043466-en.html" rel="nofollow" target="_blank">this handbook on index design and construction</a>.</p>



<p class="wp-block-paragraph">But, there are also good examples out there too. Measures that earnestly attempt to define and quantify a complex phenomena while transparently admitting the inherent limitations and uncertainties of trying to do so in the first place. I’d argue both the WGI and WJP’s rule of law measures sit in this camp, with both making their data freely available and publishing statistical audits of their methodologies (see here for the <a href="https://worldjusticeproject.org/sites/default/files/documents/roli_2014_statisticalaudit_1.pdf" rel="nofollow" target="_blank">WJP</a> and here for the <a href="https://www.worldbank.org/content/dam/sites/govindicators/doc/wgimethodologypaper.pdf" rel="nofollow" target="_blank">WGI</a>).</p>



<h3 class="wp-block-heading"><strong>Worldwide Governance Indicators: Rule of Law</strong></h3>



<p class="wp-block-paragraph">The World Bank’s WGI is intended to provide a broad measure of how well a country is governed across six dimensions, including political stability, government effectiveness and the rule of law. Indicators are selected based on a set of screen criteria and their relevance to measuring a concept of interest. For instance, the WGI’s Rule of Law indicator intends to capture:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>“…perceptions of the extent to which agents respect and follow the rules of society, including contract enforcement, property rights, the police, courts, and the likelihood of crime and violence.</em>“</p>
</blockquote>



<p class="wp-block-paragraph">Indicators used to measure the rule of law include survey-based measures of crime, violence and public trust in the justice system and relevant composite indicators, such as PRS’s ‘Contract Viability’ measure.</p>



<h3 class="wp-block-heading"><strong>World Justice Project: Rule of Law Index</strong></h3>



<p class="wp-block-paragraph">The WJP’s index aims to provide a comprehensive picture of characteristics relevant to <em>the rule of law</em>, which they <a href="https://worldjusticeproject.org/about-us/overview/what-rule-law" rel="nofollow" target="_blank">define as</a>:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">“…a durable system of laws, institutions, norms, and community commitment that delivers four universal principles: accountability, just law, open government, and accessible and impartial justice.”</p>
</blockquote>



<p class="wp-block-paragraph">This is done by organizing survey-based measures organized across eight <em>factors</em> thought to describe the relationship between the state and civil society, which are detailed in their <a href="https://dx.doi.org/10.2139/ssrn.1966257" rel="nofollow" target="_blank">methodology paper</a>:</p>



<ol class="wp-block-list">
<li class=""><strong>Constraints on Government Powers:</strong> the extent to which those who govern are bound by law.</li>



<li class=""><strong>Absence of Corruption:</strong> the absence of corruption in government</li>



<li class=""><strong>Open Government:</strong> the extent to which a government shares information, empowers people with tools to hold the government accountable, and fosters citizen participation in public policy deliberations.</li>



<li class=""><strong>Fundamental Rights:</strong> measures adherence to a menu of rights firmly established under the United Nations Universal Declaration of Human Rights.</li>



<li class=""><strong>Order and Security:</strong> measures how well a society ensures the security of persons and property.</li>



<li class=""><strong>Regulatory Enforcement:</strong> measures the extent to which regulations are fairly and effectively implemented and enforced.</li>



<li class=""><strong>Civil Justice:</strong> measures whether ordinary people can resolve their grievances peacefully and effectively through the civil justice system.</li>



<li class=""><strong>Criminal Justice:</strong> rates the effectiveness of the criminal justice system as a mechanism to redress grievances and bring action against individuals for offenses against society.</li>
</ol>



<h3 class="wp-block-heading"><strong>Why not both?</strong></h3>



<p class="wp-block-paragraph">The WJP gets one of the fundamentals right of good index design: <a href="https://www.gilesd-j.com/2026/07/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/#0" rel="nofollow" target="_blank">they’ve actually thought carefully about how to conceptualize and define what they’re trying to measure</a>, providing a richer picture of different characteristics thought to be associated with the rule of law.</p>



<p class="wp-block-paragraph">However, the WJP’s measure also comes with two important weaknesses for the purpose I had in mind: It covers less countries over a shorter time period than the WGI, which might matter when conducting analysis on slow moving institutions and outcomes. And, if presented in isolation, the WJP’s measure might be taken to imply that the RoL is both a <em>necessary and sufficient</em> condition for driving outcomes like economic growth, while the WGI presents the RoL as part of a collection of mutually supporting institutions.</p>



<p class="wp-block-paragraph">In an attempt to have the best of both worlds, my first question was therefore whether it was possible to use both measures at the same time: the WJP’s measure when a more nuanced and explicit discussion of the RoL is required; and the WGI for longer-term analysis and communicating how the RoL might sit within a wider portfolio of institutions.</p>



<h3 class="wp-block-heading"><strong>Conceptual and practical overlap</strong></h3>



<p class="wp-block-paragraph">At the outside, aside from overlapping conceptually, the WJP and WGI also share common data sources: with five of six dimensions from the WGI sourcing data from the WJP’, including:</p>



<ul class="wp-block-list">
<li class=""><strong>Voice and Accountability:</strong> includes data from Factor 1, 3 and 4.</li>



<li class=""><strong>Political Stability:</strong> leverages data from Factor 5.2</li>



<li class=""><strong>Regulatory Quality:</strong> includes factor 6.</li>



<li class=""><strong>Rule of Law:</strong> uses data from factors 1, 4, 5, 7 and 8.</li>



<li class=""><strong>Control of Corruption:</strong> incorporates data from factor 2.</li>
</ul>



<p class="wp-block-paragraph">The upshot of this is that any observed relationship identified between the WJP and WGI might just reflect overlapping ingredients, rather than some deeper conceptual agreement on the rule of law. However, I’m largely going to ignore this in my analysis as:</p>



<ul class="wp-block-list">
<li class="">Before being included in the WGI, indicators from the same source are averaged to produce a single source–dimension input, which is likely to limit the WJP’s influence; and</li>



<li class="">Sensitivity analysis reported in the <a href="https://www.worldbank.org/content/dam/sites/govindicators/doc/The%20Worldwide%20Governance%20Indicators%202025%20Methodology%20Revision.pdf" rel="nofollow" target="_blank">2025 WGI methodology update</a> indicated that their estimates were largely insensitive to changes in weightings and the exclusion of individual indicators.</li>
</ul>



<p class="wp-block-paragraph">Making it probable that the bulk of any observed relationships are genuine, rather than being statistical truisms.</p>



<h3 class="wp-block-heading">Project Setup and Data</h3>



<p class="wp-block-paragraph">Data used in this post can be <a href="https://www.gilesd-j.com/2026/07/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/gilesd-j.com/shared_resources/blogs/260310_RoL/wgidataset_with_sourcedata-2025.xlsx" rel="nofollow" target="_blank">downloaded here for the WGI</a> and <a href="https://www.gilesd-j.com/2026/07/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/gilesd-j.com/shared_resources/blogs/260310_RoL/2025_wjp_rule_of_law_index_HISTORICAL_DATA_FILE.xlsx" rel="nofollow" target="_blank">here for the WJP’s RoL index</a>. These datasets were current as of July 2025, but publishers frequently update their results over time as the source data and methodology evolves.</p>



<pre>#load the packages we'll probably need
library(tidyverse)
library(readxl)
library(janitor)
library(countrycode)

#import WGI data
dta_wgi_2025&lt;-read_excel(&quot;./Data/wgidataset_with_sourcedata-2025.xlsx&quot;,
                         sheet=&quot;rl&quot;) |&gt; 
  clean_names()

#import World Justice Project RoL data
dta_wjp_rol&lt;-read_excel('./Data/2025_wjp_rule_of_law_index_HISTORICAL_DATA_FILE.xlsx', sheet=&quot;Historical Data&quot;)|&gt; 
  clean_names()</pre>



<h3 class="wp-block-heading">Data Cleaning</h3>



<p class="wp-block-paragraph">Much of the data cleaning below relates to improving how variables are named and ensuring a standard set of country and region names are applied across indices. I’ve retained some indicators that aren’t used in this post as they’ll be drawn on later in the series.</p>



<pre>#standardize column names
dta_wgi_2025&lt;-dta_wgi_2025 |&gt; 
  rename(country=economy_name,
         iso3c=economy_code,
         wgi_rol=governance_estimate_approx_2_5_to_2_5)

dta_wjp_rol&lt;-dta_wjp_rol |&gt; 
  rename(iso3c=country_code) |&gt; 
  rename_with(~ str_replace(., &quot;^x&quot;, &quot;factor_&quot;), starts_with(&quot;x&quot;))

#change wjp's year variable to YYYY format and convert to numeric 
#(adopts the first 4 digit year when in YYYY-YYYY format)
dta_wjp_rol &lt;- dta_wjp_rol |&gt; 
  mutate(year = as.numeric(str_sub(year, 1, 4)))

#cold-heartedly drop columns I'm not interested in 
dta_wgi_2025&lt;-dta_wgi_2025 |&gt; 
  select(iso3c, income_classification, year,wgi_rol)
#drop country and region name labels so these can be standardized 
dta_wjp_rol&lt;-dta_wjp_rol |&gt; 
  select(-country_year,-country,-region) |&gt; 
  rename(wjp_rol=wjp_rule_of_law_index_overall_score)


#merge dataframes
dta_rol_unified&lt;-left_join(dta_wgi_2025,
                           dta_wjp_rol,
                           by = join_by(year, iso3c), 
                           keep=FALSE) 

#add standardized and region names country names

#define country code assignments for legacy / ambigious codes
#(Note: matches devised by Claude) 
ref_iso3c_custom_names &lt;- c(ADO = &quot;Andorra&quot;,
                            ANT = &quot;Netherlands Antilles&quot;,
                            PRI = &quot;Puerto Rico&quot;,
                            REU = &quot;Réunion&quot;,
                            XKX = &quot;Kosovo&quot;)

ref_iso3c_custom_regions &lt;- c(ADO = &quot;Europe &#038; Central Asia&quot;,
                              ANT = &quot;Latin America &#038; Caribbean&quot;,
                              PRI = &quot;Latin America &#038; Caribbean&quot;,
                              REU = &quot;Sub-Saharan Africa&quot;,
                              XKX = &quot;Europe &#038; Central Asia&quot;)

#assign country names and regions:
dta_rol_unified&lt;-dta_rol_unified |&gt; 
  mutate(country_name=countrycode(iso3c, 
                                  origin='iso3c',
                                  destination = 'country.name.en',    
                                  custom_match = ref_iso3c_custom_names),
         region=countrycode(iso3c, 
                            origin='iso3c',
                            destination = 'region',    
                            custom_match =ref_iso3c_custom_regions))</pre>



<h3 class="wp-block-heading">Comparing Coverage</h3>



<p class="wp-block-paragraph">Before examining the crossover of either index, it’s probably a good idea to check what’s not covered by either source. I rely on iso3c codes to do this as in my experience they tend to be specified more consistently than country names.</p>



<p class="wp-block-paragraph">Overall, a little over 73 percent of countries listed in the countrycode package are covered by either index. A cursory glance of <code>ref_missing_iso3c</code> indicates most of the missing countries don’t have an iso3c code, no longer exist, are territories of a larger country (or <em>claimed</em> as one) and/or have relatively small populations. I’m also willing to take the WJP’s word for it when they say <a href="https://worldjusticeproject.org/news/wjp-rule-law-index-2024-global-press-release" rel="nofollow" target="_blank">their index covers more than ninety percent of the worlds population</a>.</p>



<pre>#How many countries exist in either dataset
table(codelist$iso3c %in% dta_rol_unified$iso3c) |&gt; 
  prop.table() |&gt; 
  round(2)

#create listing of countries missing from either index 
#(+ unecessarily using %notin% to undermine compatibility with R versions pre V4.6)
ref_missing_iso3c&lt;-codelist[(codelist$iso3c %notin% dta_rol_unified$iso3c),] |&gt; 
  select(iso3c, country.name.en)

#create a summary of country coverage over time
sum_rol_index_coverage_overall&lt;- dta_rol_unified |&gt;
  group_by(year) |&gt;
  summarize(wjp = sum(!is.na(wjp_rol)),
            wgi = sum(!is.na(wgi_rol)),
            .groups = &quot;drop&quot;)</pre>



<p class="wp-block-paragraph">Within the set of countries that <em>are</em> covered by be either index, the WGI provides estimates for more countries over a longer time period. Specifically, WGI RoL estimates are available from 1996 for 199 countries whereas the WJP’s measure starts in 2012 (2012-13) for 97 countries.</p>



<p class="wp-block-paragraph">Although coverage has increased for both indices, it has increased more dramatically for the WJP over the period (46% compared to 8% for the WGI). The dumbbell plot below illustrates how the WJP’s coverage has increased relative to the WGI by region. Highlighting that the WJP’s coverage improvements have been heavily concentrated in Latin America and the Caribbean, and the Middle East and North Africa.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" loading="lazy" src="https://i2.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/coverage.png?w=450&#038;ssl=1" alt="" class="wp-image-4235" srcset_temp="https://i2.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/coverage.png?w=450&#038;ssl=1 606w, https://www.gilesd-j.com/wp-content/uploads/2026/07/coverage-300x277.png 300w" sizes="auto, (max-width: 606px) 100vw, 606px" data-recalc-dims="1" /></figure>



<p class="wp-block-paragraph">*North America’s coverage has remained the same over the period.</p>



<pre># compare coverage: WJP as % of WGI at index start (2012) vs end (2024)
sum_rol_index_coverage_by_region &lt;- dta_rol_unified |&gt;
  group_by(region, year) |&gt;
  summarize(wjp = sum(!is.na(wjp_rol)),
            wgi = sum(!is.na(wgi_rol)),
            .groups = &quot;drop&quot;) |&gt;
  filter(year %in% c(2012, 2024)) |&gt;
  mutate(wjp_pct_of_wgi = 100 * wjp / wgi) |&gt;
  select(region, year, wjp_pct_of_wgi) |&gt;
  pivot_wider(names_from = year, values_from = wjp_pct_of_wgi,
              names_prefix = &quot;yr_&quot;) |&gt;
  mutate(region = reorder(region, yr_2024))  

plt_rol_index_coverage &lt;- ggplot(sum_rol_index_coverage_by_region, aes(y = reorder(region,yr_2024) )) +
  geom_segment(aes(x = yr_2012, xend = yr_2024, yend = region),
               colour = &quot;grey75&quot;, linewidth = 1) +
  geom_point(aes(x = yr_2012, colour = &quot;2012&quot;), size = 5, alpha=0.7) +
  geom_point(aes(x = yr_2024, colour = &quot;2024&quot;), size = 5, alpha=0.7) +
  scale_colour_manual(values = c(&quot;2012&quot; = &quot;#E69F00&quot;, &quot;2024&quot; = &quot;#0072B2&quot;)) +
  scale_x_continuous(labels = function(x) paste0(x, &quot;%&quot;)) +
  labs(x = &quot;Country Coverage (% of WGI)&quot;, y = NULL, colour = NULL,
       title = &quot;WJP Rule of Law index coverage by Region&quot;) +
  theme_classic() +
  theme(legend.position = &quot;top&quot;,
        panel.grid.major.y = element_line(colour = &quot;grey92&quot;))

plt_rol_index_coverage</pre>



<h3 class="wp-block-heading">Cross-country agreement between the indices</h3>



<p class="wp-block-paragraph">When examined globally, both measures exhibit strong agreement with one another. Suggesting that when a country achieves a poor (or strong) score on the WJP’s index they probably will on the WGI RoL measure too.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" loading="lazy" src="https://i0.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/figure_relationship.png?w=450&#038;ssl=1" alt="" class="wp-image-4237" srcset_temp="https://i0.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/figure_relationship.png?w=450&#038;ssl=1 737w, https://www.gilesd-j.com/wp-content/uploads/2026/07/figure_relationship-300x206.png 300w" sizes="auto, (max-width: 737px) 100vw, 737px" data-recalc-dims="1" /></figure>



<pre>#association between the two measures - global 
plt_rol_index_comparison_global &lt;- dta_rol_unified |&gt; 
  filter(!is.na(wjp_rol)) |&gt; 
  ggplot(aes(x = wgi_rol, y = wjp_rol)) +
  geom_point(aes(col = region), alpha = 0.5) +
  geom_smooth(method = &quot;lm&quot;, col = &quot;black&quot;, se = FALSE) +
  labs(x = &quot;WGI rule of law index&quot;, y = &quot;WJP rule of law index&quot;, col = &quot;Region&quot;) +
  theme_classic()

plt_rol_index_comparison_global</pre>



<p class="wp-block-paragraph"><div class="body pm-cursor-color pm-text-color pm-background-color pm-editing-root-node pm-scroll-container" data-pm-slice="2 2 []"><div class="pm-content"><h3 data-pm-pandoc-attr="1" class=" pm-heading">Regional agreement between the indices</h3><p>This observation holds up when split by region. In fact when calculating regional correlations between the measures by year <em>and</em> region in <code>dta_rol_cor_by_year_and_region</code> the median correlation observed is 98%, with the lowest being 82% for MENA in 2019 and South Asia in 2012.</p></div></div></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" loading="lazy" src="https://i1.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/regional_scatter.png?w=450&#038;ssl=1" alt="" class="wp-image-4239" srcset_temp="https://i1.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/regional_scatter.png?w=450&#038;ssl=1 831w, https://www.gilesd-j.com/wp-content/uploads/2026/07/regional_scatter-300x227.png 300w, https://www.gilesd-j.com/wp-content/uploads/2026/07/regional_scatter-768x581.png 768w" sizes="auto, (max-width: 831px) 100vw, 831px" data-recalc-dims="1" /></figure>



<pre>#association between the two measures - global 
plt_rol_index_comparison_regional &lt;- dta_rol_unified |&gt; 
  filter(!is.na(wjp_rol)) |&gt; 
  ggplot(aes(x = wgi_rol, y = wjp_rol)) +
  geom_point(aes(col = region), alpha = 0.5) +
  geom_smooth(method = &quot;lm&quot;, col = &quot;black&quot;, se = FALSE) +
  labs(x = &quot;WGI rule of law index&quot;, y = &quot;WJP rule of law index&quot;, col = &quot;Region&quot;) +
  theme_classic()+
  facet_wrap(region ~. )

plt_rol_index_comparison_regional

# Correlation between WGI and WJP rule-of-law measures, by year -----------
dta_rol_cor_by_year_and_region &lt;- dta_rol_unified |&gt; 
  filter(!is.na(wgi_rol), !is.na(wjp_rol)) |&gt; 
  group_by(year, region) |&gt; 
  summarise(
    cor = cor(wgi_rol, wjp_rol))

#median correlation
median(dta_rol_cor_by_year_and_region$cor)</pre>



<h3 class="wp-block-heading">Agreement by country</h3>



<p class="wp-block-paragraph">Although agreement between the two measures appears less compelling at the country level, much of this likely stems from the rule of law being sticky and changing little from year to year; which results in measurement noise frequently dominating the underlying signal. This intuitive explanation appears to be largely supported by the scatter plot below, which suggests negative and weaker correlations are more likely for countries experiencing less within-country variation (aka where measurement noise is likely to dominate). The practical implication is that while caution is warranted at the country level, the two measures have a tendency to agree with one another when the observed changes are large enough not to be dominated by measurement noise.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" loading="lazy" src="https://i0.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/signal_and_noise.png?w=450&#038;ssl=1" alt="" class="wp-image-4241" srcset_temp="https://i0.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/signal_and_noise.png?w=450&#038;ssl=1 871w, https://www.gilesd-j.com/wp-content/uploads/2026/07/signal_and_noise-300x190.png 300w, https://www.gilesd-j.com/wp-content/uploads/2026/07/signal_and_noise-768x487.png 768w" sizes="auto, (max-width: 871px) 100vw, 871px" data-recalc-dims="1" /></figure>



<pre>#create list of countries with low number of observations
ref_low_n_obs&lt;-dta_rol_unified |&gt; 
  filter(!is.na(wgi_rol), !is.na(wjp_rol)) |&gt; 
  group_by(country_name) |&gt; 
  summarise(n_obs     = n()) |&gt; 
  filter(n_obs&lt;5) |&gt;
  select(country_name) |&gt; 
  unlist()
 
#calculate within-country assocation between WGI and WJI  
sum_rol_cor_country &lt;- dta_rol_unified |&gt; 
  filter(!is.na(wgi_rol), !is.na(wjp_rol),
         country_name %notin% ref_low_n_obs) |&gt; 
  summarise(
    n_obs     = n(),
    signal_sd = min(sd(wgi_rol), sd(wjp_rol)),  
    cor       = cor(wgi_rol, wjp_rol),
    .by = country_name) |&gt; 
  arrange(cor)

#plot correlation coefficient against standard deviation of either measure
plt_cor_vs_signal &lt;- ggplot(sum_rol_cor_country, aes(signal_sd, cor)) +
  geom_hline(yintercept = 0, linewidth = 0.3, col = &quot;grey70&quot;) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = &quot;loess&quot;, se = FALSE, col = &quot;grey40&quot;, linewidth = 0.5) +
  labs(x = &quot;Within-country signal (min SD of the two indices)&quot;,
       y = &quot;WGI–WJP within-country correlation&quot;) +
  theme_classic()
plt_cor_vs_signal</pre>



<h3 class="wp-block-heading">First Difference Agreement</h3>



<p class="wp-block-paragraph">As a final test the code below transforms each index into its first difference to explore whether year to year movements in the two measures agree with one another. Because taking the first difference removes country <em>levels</em>, this can be a helpful way to examine whether the two series reliably move together, but it also means measurement errors are more dominant, which can result in a noisier signal.</p>



<p class="wp-block-paragraph">The good news is the first difference estimates provide solid support for the two measures being reliably linked, with a pooled correlation coefficient of 0.36 and observed positive associations across each region. Providing further support that the WGI’s RoL measure can act as an imperfect and/or imprecise general proxy for the WJP’s aggregate RoL measure, but not a perfect substitute.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" loading="lazy" src="https://i1.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/first_difference_region.png?w=450&#038;ssl=1" alt="" class="wp-image-4243" srcset_temp="https://i1.wp.com/www.gilesd-j.com/wp-content/uploads/2026/07/first_difference_region.png?w=450&#038;ssl=1 833w, https://www.gilesd-j.com/wp-content/uploads/2026/07/first_difference_region-300x207.png 300w, https://www.gilesd-j.com/wp-content/uploads/2026/07/first_difference_region-768x531.png 768w" sizes="auto, (max-width: 833px) 100vw, 833px" data-recalc-dims="1" /></figure>



<pre># First-difference agreement between WGI and WJP rule-of-law measures ------
dta_rol_diff &lt;- dta_rol_unified |&gt; 
  filter(!is.na(wgi_rol), !is.na(wjp_rol)) |&gt;
  arrange(country_name, year) |&gt; 
  mutate(
    wgi_chg = wgi_rol - lag(wgi_rol, order_by = year),
    wjp_chg = wjp_rol - lag(wjp_rol, order_by = year),
    yr_gap  = year - lag(year, order_by = year), 
    .by='country_name') |&gt; 
  #drop differences calculated over more than one year
    filter(yr_gap == 1)                    

#calculate pooled correlation across regions 
sum_rol_diff_cor &lt;- cor(dta_rol_diff$wgi_chg, dta_rol_diff$wjp_chg)

#produce plot
plt_rol_diff &lt;- ggplot(dta_rol_diff, aes(wgi_chg, wjp_chg)) +
  geom_hline(yintercept = 0, linewidth = 0.3, col = &quot;grey80&quot;) +
  geom_vline(xintercept = 0, linewidth = 0.3, col = &quot;grey80&quot;) +
  geom_point(alpha = 0.4, size = 0.9,aes(col = region)) +
  geom_smooth(method = &quot;lm&quot;, se = FALSE, col = &quot;grey30&quot;, linewidth = 0.5) +
  labs(x = &quot;Δ WGI rule of law (year-on-year)&quot;,
       y = &quot;Δ WJP rule of law (year-on-year)&quot;,
       subtitle = paste0(&quot;Pooled correlation of changes: r = &quot;, round(sum_rol_diff_cor, 2))) +
  theme_classic()+
  facet_wrap(region ~. )

plt_rol_diff</pre>



<h3 class="wp-block-heading">Buried Lede</h3>



<p class="wp-block-paragraph">When I asked Claude to critique this post, it said that <em>If the intended use is ranking/trend-tracking, the correlational case is fine and you can say so explicitly. If it’s cardinal substitution, a between-country prediction-error test is needed.</em> I told Claude that this is a ridiculous idea and that I would cancel my subscription if it didn’t return to being sycophantic. And while Claude agreed that it was misguided in questioning my judgement, my reasoning for not including this analysis in the post is that <em>nobody should be expecting this level of precision when using composite indices</em>. Particularly not when they’re trying to pin down something as complex as the rule of law and governance.   </p>



<p class="wp-block-paragraph">This is because no index can perfectly capture and/or quantifiy something as amorphous as the rule of law. But composite indices don’t always need to. For the purpose of telling a broad story about how the rule of law varies across countries and shifts over time, the WGI and WJP measures point in the same general direction, which makes the WGI a serviceable stand-in where the WJP’s shorter record falls short. </p>



<p class="wp-block-paragraph"><strong>How AI was used for this post: </strong>Aside from tilting at windmills, I also used Claude to suggest refinements to my code, the title of my post and prose. But, as I’m sure is attested by the errant grammatical and spelling errors, the majority of this post was written by me. </p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://www.gilesd-j.com/2026/07/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/" rel="nofollow" target="_blank">Close Enough? Using the WGI as a Proxy for the WJP Rule of Law Index</a> appeared first on <a href="https://www.gilesd-j.com/" rel="nofollow" target="_blank">Giles</a>.</p>

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://www.gilesd-j.com/2026/07/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/"> Data Analytics and AI Archives - Giles</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/close-enough-using-the-wgi-as-a-proxy-for-the-wjp-rule-of-law-index/">Close Enough? Using the WGI as a Proxy for the WJP Rule of Law Index</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402476</post-id>	</item>
		<item>
		<title>Understanding Tail Analysis in Financial Markets</title>
		<link>https://www.r-bloggers.com/2026/07/understanding-tail-analysis-in-financial-markets/</link>
		
		<dc:creator><![CDATA[Selcuk Disci]]></dc:creator>
		<pubDate>Sat, 04 Jul 2026 12:43:57 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">http://datageeek.com/?p=12288</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> In financial markets, distinguishing between information-driven movements and liquidity-driven shocks is critical. The reference study we based our work on highlights the importance of tail analysis: comparing Gaussian (thin-tailed) and Student‑t (fat-tailed) distributions to understand whether price changes are more likely to reflect genuine information or temporary liquidity imbalances. ...</div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/understanding-tail-analysis-in-financial-markets/">Understanding Tail Analysis in Financial Markets</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://datageeek.com/2026/07/04/understanding-tail-analysis-in-financial-markets/"> DataGeeek</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<p class="wp-block-paragraph">In financial markets, distinguishing between <strong>information-driven movements</strong> and <strong>liquidity-driven shocks</strong> is critical. <a href="https://arxiv.org/abs/2607.01198" rel="nofollow" target="_blank"><em><strong>The reference study</strong></em></a> we based our work on highlights the importance of <strong>tail analysis</strong>: comparing Gaussian (thin-tailed) and Student‑t (fat-tailed) distributions to understand whether price changes are more likely to reflect genuine information or temporary liquidity imbalances.</p>



<p class="wp-block-paragraph">Financial returns are rarely as well‑behaved as the Gaussian (normal) distribution assumes. In theory, extreme price movements should be exceedingly rare under a thin‑tailed Gaussian model. Yet in practice, markets frequently exhibit <strong>fat tails</strong>: large jumps, crashes, and spikes that occur far more often than Gaussian theory predicts.</p>



<p class="wp-block-paragraph">This discrepancy motivates <strong>tail analysis</strong>—a statistical approach that compares how well different distributions explain the observed data. Two common candidates are:</p>



<ul class="wp-block-list">
<li><strong>Gaussian distribution (thin tails):</strong> If returns fit this model better, extreme movements are interpreted as <strong>information‑driven</strong>. In other words, new information has entered the market, and price changes are more likely to reflect genuine shifts in fundamentals or expectations.</li>



<li><strong>Student‑t distribution (fat tails):</strong> If returns fit this model better, extreme movements are considered <strong>liquidity‑driven</strong>. These shocks often arise from temporary imbalances in order flow or liquidity constraints, and prices tend to revert once the imbalance subsides.</li>
</ul>



<p class="wp-block-paragraph">By comparing the log‑likelihoods of Gaussian and Student‑t fits, we can classify market behavior into these two regimes. This classification is not merely academic: it helps traders, risk managers, and analysts distinguish between <strong>trend continuation</strong> (information‑driven) and <strong>mean reversion</strong> (liquidity‑driven).</p>



<p class="wp-block-paragraph">In our workflow, we apply this tail analysis to <strong>gold futures (GC=F)</strong> over the past 15 trading days. We compute log returns, fit both distributions, and compare their likelihoods. We then enrich the analysis with a <strong>volume impact metric</strong>, which highlights whether abnormal trading activity amplifies price changes. Finally, we present the results in a color‑coded audit table that makes tail behavior visually interpretable.</p>



<h3 class="wp-block-heading">Why These R Packages?</h3>



<ul class="wp-block-list">
<li><strong>tidyverse</strong>: Provides a consistent grammar for data manipulation (<code>mutate</code>, <code>drop_na</code>, <code>select</code>). It ensures reproducibility and readability when transforming raw market data into log returns and derived metrics.</li>



<li><strong>tidyquant</strong>: Bridges financial data sources with the tidyverse ecosystem. We use it to fetch gold futures data (<code>GC=F</code>) directly from Yahoo Finance, making the workflow self-contained and easy to extend to other tickers.</li>



<li><strong>MASS</strong>: Offers statistical tools for distribution fitting. We rely on <code>fitdistr()</code> to estimate parameters for both Gaussian and Student‑t distributions, enabling a direct comparison of log‑likelihoods.</li>



<li><strong>gt</strong>: Provides professional table rendering. It allows us to format numbers, apply color scales, and highlight audit warnings, turning raw statistical output into a visually interpretable audit table.</li>
</ul>


<pre>
library(tidyverse)   # Load tidyverse for data manipulation
library(tidyquant)   # Load tidyquant for financial data retrieval
library(MASS)        # Load MASS for distribution fitting
library(gt)          # Load gt for table rendering

ticker &lt;- &quot;GC=F&quot;     # Define the ticker symbol (Gold Futures)
horizon &lt;- 15        # Set horizon to last 15 days

# Fetch market data for the chosen ticker and horizon
market_data &lt;- tq_get(ticker, from = Sys.Date() - horizon, to = Sys.Date())

# Compute log returns and drop missing values
market_tbl &lt;- market_data %&gt;%
  mutate(returns = log(adjusted) - log(lag(adjusted))) %&gt;%
  drop_na()

# Gaussian fit
fit_gauss &lt;- fitdistr(market_tbl$returns, densfun = &quot;normal&quot;)

# Student-t fit
fit_t &lt;- fitdistr(
  market_tbl$returns,
  densfun = function(x, df, mean, sd) dt((x - mean)/sd, df)/sd,
  start = list(df = 5, mean = mean(market_tbl$returns), sd = sd(market_tbl$returns))
)

# Compare log-likelihoods
ll_gauss &lt;- fit_gauss$loglik
ll_t &lt;- fit_t$loglik
signal &lt;- if (ll_gauss &gt; ll_t) &quot;INFO-DRIVEN&quot; else &quot;LIQUIDITY-DRIVEN&quot;

# Build audit table
audit_tbl &lt;- market_tbl %&gt;%
  mutate(
    Gaussian_Density = dnorm(returns, mean = mean(returns), sd = sd(returns)),
    StudentT_Density = dt((returns - mean(returns))/sd(returns), df = 5)/sd(returns),
    Volume_Impact = abs(volume)^ifelse(signal == &quot;INFO-DRIVEN&quot;, 1.0, 0.6),
    Audit_Warning = signal
  ) %&gt;%
  dplyr::select(Date = date,
                Price = adjusted,
                Gaussian_Density,
                StudentT_Density,
                Volume_Impact,
                Audit_Warning)


#GT Table
audit_gt &lt;- audit_tbl %&gt;%
  gt() %&gt;%
  tab_header(title = md(&quot;**Tail Analysis-Based Audit Table**&quot;)) %&gt;%
  cols_label(
    Date = md(&quot;**Date**&quot;),
    Price = md(&quot;**Price**&quot;),
    Gaussian_Density = md(&quot;**Gaussian Density**&quot;),
    StudentT_Density = md(&quot;**Student-t Density**&quot;),
    Volume_Impact = md(&quot;**Volume Impact**&quot;),
    Audit_Warning = md(&quot;**Audit Warning**&quot;)
  ) %&gt;%
  fmt_number(columns = c(Price, Gaussian_Density, StudentT_Density, Volume_Impact),
             decimals = 2, use_seps = TRUE) %&gt;%
  data_color(
    columns = c(Price),
    colors = scales::col_numeric(
      palette = c(&quot;lightgreen&quot;,&quot;darkgreen&quot;),
      domain = range(audit_tbl$Price, na.rm = TRUE)
    )
  ) %&gt;%
  data_color(
    columns = c(Gaussian_Density, StudentT_Density),
    colors = scales::col_numeric(
      palette = c(&quot;lightblue&quot;,&quot;darkblue&quot;),
      domain = range(c(audit_tbl$Gaussian_Density,
                       audit_tbl$StudentT_Density), na.rm = TRUE)
    )
  ) %&gt;%
  data_color(
    columns = c(Volume_Impact),
    colors = scales::col_numeric(
      palette = c(&quot;pink&quot;,&quot;red&quot;),
      domain = c(min(audit_tbl$Volume_Impact, na.rm = TRUE),
                 max(audit_tbl$Volume_Impact, na.rm = TRUE))
    )
  ) %&gt;%
  text_transform(
    locations = cells_body(columns = vars(Audit_Warning)),
    fn = function(x) {
      ifelse(x == &quot;INFO-DRIVEN&quot;,
             &quot;&lt;span style=&#039;color:green;font-weight:bold;&#039;&gt;INFO-DRIVEN&lt;/span&gt;&quot;,
             &quot;&lt;span style=&#039;color:red;font-weight:bold;&#039;&gt;LIQUIDITY-DRIVEN&lt;/span&gt;&quot;)
    }
  )

audit_gt
</pre>


<figure data-wp-context="{"imageId":"6a4901b9138b9"}" data-wp-interactive="core/image" data-wp-key="6a4901b9138b9" class="wp-block-image size-large wp-lightbox-container"><img loading="lazy" data-attachment-id="12301" data-permalink="https://datageeek.com/2026/07/04/understanding-tail-analysis-in-financial-markets/tail_analysis-2/" data-orig-file="https://datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png" data-orig-size="1150,710" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0","alt":""}" data-image-title="tail_analysis" data-image-description="" data-image-caption="" data-large-file="https://i2.wp.com/datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png?w=450&#038;ssl=1" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://i2.wp.com/datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png?w=450&#038;ssl=1" alt="" class="wp-image-12301" srcset_temp="https://i2.wp.com/datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png?w=450&#038;ssl=1 1024w, https://datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png?w=150 150w, https://datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png?w=300 300w, https://datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png?w=768 768w, https://datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png 1150w" sizes="(max-width: 1024px) 100vw, 1024px" data-recalc-dims="1" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph"></p>

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://datageeek.com/2026/07/04/understanding-tail-analysis-in-financial-markets/"> DataGeeek</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/understanding-tail-analysis-in-financial-markets/">Understanding Tail Analysis in Financial Markets</a>]]></content:encoded>
					
		
		<enclosure url="https://datageeek.com/wp-content/uploads/2026/07/tail_analysis-2.png" length="0" type="" />
<enclosure url="https://1.gravatar.com/avatar/db5e3f9ef188ea98fe38ab05c5a3fad9fb52fe3472715a8fc02f7ea41731f77c?s=96&#038;d=identicon&#038;r=G" length="0" type="" />
<enclosure url="https://datageeek.com/wp-content/uploads/2026/07/tail_analysis-1.png?w=1024" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402435</post-id>	</item>
		<item>
		<title>Rethinking Validation for Spatial Machine Learning: Takeaways from the Talk</title>
		<link>https://www.r-bloggers.com/2026/07/rethinking-validation-for-spatial-machine-learning-takeaways-from-the-talk/</link>
		
		<dc:creator><![CDATA[Jakub Nowosad]]></dc:creator>
		<pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://jakubnowosad.com/posts/2026-07-03-ml4eo/</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; ">
<p>Title slide of the talk</p>
<p>Keynote slides: https://jakubnowosad.com/ml4eo2026/<br />
Workshop materials: https://jakubnowosad.com/ml4eo2026workshop/<br />
Machine learning is now deeply embedded1 in Earth observation workflows, from mapping current enviro...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/rethinking-validation-for-spatial-machine-learning-takeaways-from-the-talk/">Rethinking Validation for Spatial Machine Learning: Takeaways from the Talk</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://jakubnowosad.com/posts/2026-07-03-ml4eo/"> Thinking in spatial patterns</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
 





<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://i0.wp.com/jakubnowosad.com/posts/2026-07-03-ml4eo/keynote-title-slide.png?w=578&#038;ssl=1" class="img-fluid figure-img" data-recalc-dims="1"></p>
<figcaption>Title slide of the talk</figcaption>
</figure>
</div>
<p><strong>Keynote slides:</strong> <a href="https://jakubnowosad.com/ml4eo2026/" class="uri" rel="nofollow" target="_blank">https://jakubnowosad.com/ml4eo2026/</a></p>
<p><strong>Workshop materials:</strong> <a href="https://jakubnowosad.com/ml4eo2026workshop/" class="uri" rel="nofollow" target="_blank">https://jakubnowosad.com/ml4eo2026workshop/</a></p>
<p>Machine learning is now deeply embedded<sup>1</sup> in Earth observation workflows, from mapping current environmental conditions to forecasting future change. However, the quality of a spatial prediction map cannot be judged only by how well a model performs on a convenient test sample. In spatial problems, the gap between where we have observations and where we want to make predictions is often a crucial factor in determining whether a model can be trusted.</p>
<p>At the <a href="https://ml4eo.org/" rel="nofollow" target="_blank">Machine Learning for Earth Observation 2026</a> conference in Exeter<sup>2</sup>, I gave a keynote talk entitled <em>Rethinking Validation for Spatial Machine Learning</em> (June 22, 2026). The next day, I showed some practical ways to implement these ideas in a workshop called <em>Where your models can be trusted: evaluating spatial machine learning reliably</em> (June 23, 2026). Both focused on the same general question: how can we evaluate spatial machine learning in a way that reflects the actual prediction task?</p>
<p>The keynote was structured around three assumptions that are easy to make, but often unsafe in spatial prediction:</p>
<ul>
<li>We can predict everywhere. In practice, we validate where we have data, but predict in places that may be poorly represented by the training sample. Tools such as Area of Applicability (AoA) and Local Point Density (LPD) help identify parts of the prediction domain where environmental conditions are more or less supported by the available data.</li>
<li>There is one “correct” validation approach. In reality, validation should follow the prediction task. Random cross-validation can be too optimistic when observations are spatially clustered, while spatial cross-validation can be too pessimistic when the intended prediction scenario is closer to interpolation. Adaptive strategies such as k-Nearest Neighbor Distance Matching (kNNDM) try to align validation folds with the distance structure of the prediction domain.</li>
<li>All validation points are equal. Prediction conditions are not equally common across a map, so a single unweighted average error can misrepresent the expected performance over the full prediction domain. This motivates thinking about how validation samples should be weighted by their prevalence in the places where predictions will be used.</li>
</ul>
<p>Together, these points lead to the idea of <strong>prediction-domain adaptive evaluation</strong>: first define the prediction domain, then construct validation folds that reflect it, and finally summarize performance in a way that accounts for how common different prediction conditions are. This is not a complete theory of spatial machine learning evaluation, but it is a useful step away from treating validation as a model-only problem. (To learn more about these ideas, read our preprint: <a href="https://arxiv.org/abs/2605.13689" class="uri" rel="nofollow" target="_blank">https://arxiv.org/abs/2605.13689</a>.)</p>
<p>The workshop turned these ideas into practical R workflows. Using synthetic and real-world-inspired examples, we used and discussed techniques for Area of Applicability, Local Point Density, compared random cross-validation, spatial cross-validation, and kNNDM cross-validation, and looked at error profiles. The hands-on materials also include exercises, where participants can compare validation strategies, map areas of applicability, and explore how expected error varies across space.</p>
<p>The main takeaway is simple: for spatial machine learning, the question is not only <em>How accurate is the model?</em> It is also <em>Where can the model be trusted?</em></p>




<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>And embeddings are too, but that’s a story for another day<img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</p></li>
<li id="fn2"><p>Many thanks to the organizers for inviting me to speak and for hosting a great event! The next edition of the conference will be in Exeter again in June 2027, and I highly recommend it to anyone interested in (broad) spatial machine learning.<img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</p></li>
</ol>
</section><section class="quarto-appendix-contents" id="quarto-citation"><h2 class="anchored quarto-appendix-heading">Citation</h2><div><div class="quarto-appendix-secondary-label">BibTeX citation:</div><pre>@online{nowosad2026,
  author = {Nowosad, Jakub},
  title = {Rethinking {Validation} for {Spatial} {Machine} {Learning:}
    {Takeaways} from the {Talk}},
  date = {2026-07-03},
  url = {https://jakubnowosad.com/posts/2026-07-03-ml4eo/},
  langid = {en}
}
</pre><div class="quarto-appendix-secondary-label">For attribution, please cite this work as:</div><div id="ref-nowosad2026" class="csl-entry quarto-appendix-citeas">
Nowosad, Jakub. 2026. <span>“Rethinking Validation for Spatial Machine
Learning: Takeaways from the Talk.”</span> July 3. <a href="https://jakubnowosad.com/posts/2026-07-03-ml4eo/" rel="nofollow" target="_blank">https://jakubnowosad.com/posts/2026-07-03-ml4eo/</a>.
</div></div></section></div> 
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://jakubnowosad.com/posts/2026-07-03-ml4eo/"> Thinking in spatial patterns</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/rethinking-validation-for-spatial-machine-learning-takeaways-from-the-talk/">Rethinking Validation for Spatial Machine Learning: Takeaways from the Talk</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402420</post-id>	</item>
		<item>
		<title>FOSS Tools for Lazy Editors</title>
		<link>https://www.r-bloggers.com/2026/07/foss-tools-for-lazy-editors/</link>
		
		<dc:creator><![CDATA[rOpenSci]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://ropensci.org/blog/2026/07/02/editor-tools/</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; ">
<p>I recently had the opportunity to learn what the term “Nerd Sniping” meant.<br />
Maëlle pointed out a conversation on the rOpenSci Slack about something called Vale, meant for text linting.<br />
I’d seen the comment, but honestly hadn’t...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/foss-tools-for-lazy-editors/">FOSS Tools for Lazy Editors</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://ropensci.org/blog/2026/07/02/editor-tools/"> rOpenSci - open tools for open science</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<!--- cSpell: ignore xkcd wordlists roweb chrischinchilla jolars --->
<p>I recently had the opportunity to learn what the term “Nerd Sniping” meant.
<a href="https://ropensci.org/author/ma%C3%ABlle-salmon" rel="nofollow" target="_blank">Maëlle</a> pointed out a conversation on the rOpenSci Slack about something called Vale, meant for text linting.
I’d seen the comment, but honestly hadn’t really understood what it was all about until Maëlle asked if I thought it’d be useful for editing the blog…</p>
<p>…time passes…</p>
<p>About three days later, I’ve hardly finished any of the blog post reviews I was planning to do.
I’ve been sucked down a rabbit hole of Vale setup, custom rules, and overrides.</p>
<p>It turns out that “Nerd Sniping” refers to the practice of throwing problems at nerds that distract them from what they were doing.</p>
<figure class="center"><img src="https://i0.wp.com/ropensci.org/blog/2026/07/02/editor-tools/nerd_sniping.png?w=450&#038;ssl=1"
alt="xkcd comic #356 Nerd Sniping. A comic where a shouted physics problem stops an engineer crossing the street so they are hit by a bus while contemplating the solution."  data-recalc-dims="1"><figcaption>
<p><a href="https://xkcd.com/356" rel="nofollow" target="_blank">xkcd Nerd Sniping</a></p>
</figcaption>
</figure>
<p>That being said, it was a glorious hole to fall down!
It was just too bad that Maëlle sniped me two more times by asking me about my spell check setup in Positron and then by asking if Panache would help with translations.</p>
<p>I was pretty slow at my editorial duties that week!
But I did come out of the dive with a great editorial setup which will definitely save me time in future.</p>
<p>I’ve <a href="https://ropensci.org/author/steffi-lazerte" rel="nofollow" target="_blank">edited</a> <strong>a lot</strong> of posts on the rOpenSci blog.
I take pride in helping writers get their ideas across with clarity, while not losing their own style.
I’m an opinionated editor, so I also try hard to ensure that writers understand when my suggestions are just my opinion, and when I think there are mistakes in style or content that really do need to be fixed.
I am also fussy about the details, about being consistent with capitalizations, about keeping ideas logically ordered, and about making sure that readers without the same background might still understand the gist of the post<sup id="fnref:1"><a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fn:1" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">1</a></sup>.</p>
<p>As such, my post reviews can get a bit lengthy and it’s not unreasonable for me to have 20-30 comments on a standard post.
That’s not too problematic, but if I had to complain it might be about the technical edits, like fixing the capitalization of ‘rOpenSci’<sup id="fnref:2"><a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fn:2" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">2</a></sup>, ensuring headings are in sentence case, and that links to ropensci.org pages are relative.
These aren’t complicated fixes, but if you have to remember to keep an eye out for them, and then create a GitHub PR review suggestion for each fix, it can become a tad tedious.</p>
<p>Maëlle’s timely sniping helped me finalize my collection of tools to help streamline editorial tasks.</p>
<ul>
<li><strong>Spell checking</strong> with <a href="https://cspell.org/" rel="nofollow" target="_blank">cSpell</a></li>
<li><strong>Linting</strong><sup id="fnref:3"><a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fn:3" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">3</a></sup> with <a href="https://vale.sh/" rel="nofollow" target="_blank">Vale</a></li>
<li><strong>Formatting</strong> with <a href="https://panache.bz/" rel="nofollow" target="_blank">Panache</a></li>
<li><strong>Creating GitHub PR suggestions</strong> with <a href="https://github.com/Microsoft/vscode-pull-request-github" rel="nofollow" target="_blank">GitHub Pull Requests</a></li>
</ul>
<p>All of these tools can be installed and used in different ways.
They are also powerful with many different possible customizations and configurations.
Here, I’ll share with you how I use these tools as extensions in <a href="https://positron.posit.co/" rel="nofollow" target="_blank">Positron</a> to help make it easier to write and edit posts for the rOpenSci blog.
Hopefully this inspires you to explore how you might set them up to support your workflows!
Further, if you’re interested in setting up your own tools, perhaps you want to check out this <a href="https://ropensci.org/blog/2025/09/18/markdown-programmatic-parsing/" rel="nofollow" target="_blank">blog post</a> on “All the Ways to Programmatically Edit or Parse R Markdown / Quarto Documents”.</p>
<h2>
General setup
</h2><p>For each tool, you’ll want to install the Positron extension, and then set up your configuration.
Configurations can usually be specified at three different levels:</p>
<ul>
<li><strong>User</strong>: Your system-wide setup which is how you want things to work in general across projects.
User config files are generally stored somewhere in your home directory.</li>
<li><strong>Project</strong>: Project-wide setup which overrides your user setup if the project does things differently.
These config files are stored in the project directly (like <code>roweb3</code>, for the rOpenSci blog).</li>
<li><strong>File</strong>: File or file section setup which works at a very local scale.
Usually this configuration is indicated by in-file comments.</li>
</ul>
<p>More specifically here are (some) of the locations/names for configuration files and links to their documentation sections for more details.</p>
<!-- panache-ignore-format-start -->
<table>
<thead>
<tr>
<th>Level</th>
<th>cSpell</th>
<th>Vale</th>
<th>Panache</th>
</tr>
</thead>
<tbody>
<tr>
<td>User</td>
<td><a href="https://streetsidesoftware.com/vscode-spell-checker/#vs-code-configuration-settings" rel="nofollow" target="_blank">Positron settings</a></td>
<td><a href="https://docs.vale.sh/topics/.vale.ini#search-process" rel="nofollow" target="_blank"><code>.vale.ini</code> in any parent dir. or global config</a></td>
<td><a href="https://panache.bz/guide/configuration.html" rel="nofollow" target="_blank"><code>~/.config/panache/config.toml</code></a></td>
</tr>
<tr>
<td>Project</td>
<td><a href="https://ropensci.org/blog/2026/07/02/editor-tools/" rel="nofollow" target="_blank"><code>.cspell.json</code></a></td>
<td><a href="https://ropensci.org/blog/2026/07/02/editor-tools/docs.vale.sh/topics/.vale.ini#creating-a-valeini-file" rel="nofollow" target="_blank"><code>.vale.ini</code></a></td>
<td><a href="https://panache.bz/guide/configuration.html" rel="nofollow" target="_blank"><code>.panache.toml</code></a></td>
</tr>
<tr>
<td>File</td>
<td><a href="https://cspell.org/docs/Configuration/document-settings" rel="nofollow" target="_blank">Inline Comments</a></td>
<td><a href="https://docs.vale.sh/formats/html" rel="nofollow" target="_blank">Inline Comments</a></td>
<td><a href="https://panache.bz/getting-started.html#ignore-directives" rel="nofollow" target="_blank">Inline Comments</a></td>
</tr>
</tbody>
</table>
<!-- panache-ignore-format-end -->
<p>This means you can have different rules for different projects, and override them as needed.
In the following examples, I’ll show you how I do this for posts on the rOpenSci blog.</p>
<h3>
Code Spell Checker (cSpell)
</h3><p>First is my spell checker, which probably doesn’t need much explanation.
However, it’s nice to use a spell checker which also works on code.
I use the <a href="https://github.com/streetsidesoftware/vscode-spell-checker" rel="nofollow" target="_blank">Code Spell Checker (cSpell)</a> extension by Street Side Software and installed the languages extensions individually:</p>
<ul>
<li>Canadian English<sup id="fnref:4"><a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fn:4" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">4</a></sup> &#8211; Code Spell Checker</li>
<li>French &#8211; Code Spell Checker</li>
<li>Portuguese &#8211; Code Spell Checker</li>
<li>Spanish &#8211; Code Spell Checker</li>
</ul>
<p>Alternatively, you could also install the <a href="https://github.com/streetsidesoftware/vscode-cspell-dict-extensions#readme" rel="nofollow" target="_blank"><code>cSpell Bundled Dictionaries</code></a> instead.</p>
<p>To configure this extension, I added two types of files: a project-level configuration file, and two dictionaries of words to consider ‘correct’.</p>
<p>The project level configuration file, <a href="https://github.com/ropensci/roweb3/blob/5af882c6c3794048391543ced8a10bad39371f72/.cspell.json" rel="nofollow" target="_blank"><code>.cspell.json</code></a>, lists languages to use for different files (to ensure <code>index.es.md</code> files go through the Spanish spellchecker, while <code>index.pt.md</code> files go through the Portuguese spellchecker, etc.).
It also includes a list of globs for file paths we can ignore (I’m really not interested in spelling mistakes in the .git folder), as well as pointing to dictionaries.</p>
<p>These dictionaries are initially created by functions from my <a href="https://docs.ropensci.org/promoutils" rel="nofollow" target="_blank">promoutils</a> package, an R package for all my rOpenSci community workflows.
<code>wordlist_create()</code> creates a wordlist based on rOpenSci packages and author names, so they don’t trigger the spell check if they aren’t recognized.
<code>wordlist_update()</code> updates this list with new names as needed.</p>
<p>We keep these dictionaries in a <a href="hhttps://github.com/ropensci/roweb3/tree/5af882c6c3794048391543ced8a10bad39371f72/.wordlists" rel="nofollow" target="_blank"><code>.wordlists</code></a> folder.
Names are stored in the <code>.wordlists/names.txt</code> file, and we also have a <code>.wordlists/words.txt</code> file which stores words which are considered correct in the rOpenSci context (like ‘usecases’).</p>
<p>I should also note that I have a personal list of user words stored in my Positron user settings which lists words (like my name!)
which I want to be considered correct across all projects.</p>
<p>When writing posts, we can also override the language settings within a post using a special comment.
For example if we want to use <a href="https://github.com/ropensci/roweb3/blob/98a419ebb3efc5dcecc35b05265e83e6baa4f32a/content/blog/2026-06-02-ftc-guide/index.en.md?plain=1#L44" rel="nofollow" target="_blank">English and Portuguese for a post</a> we could add <code>&lt;--- cSpell: language en,pt--&gt;</code> to the document.</p>
<p>We can also include post-specific words to ignore, which is handy for acronyms.
For example, if we wanted to <a href="https://github.com/ropensci/roweb3/blob/98a419ebb3efc5dcecc35b05265e83e6baa4f32a/content/blog/2026-06-02-ftc-guide/index.en.md?plain=1#L76" rel="nofollow" target="_blank">ignore the acronym <code>CSCW</code></a> we could use <code>&lt;!--- cSpell: ignore CSCW ---&gt;</code> at the top of a post.</p>
<p>Spell check issues pop up as a warning in my text window, or as a list under “Spell Checker Issues By File” my lower window pane so I can review them, add them to word lists, or just mentally ignore them.</p>
<h3>
Vale
</h3><p>For linting text (checking the <em>style</em> and <em>meaning</em> of the words) I use the <a href="https://github.com/chrischinchilla/vale-vscode" rel="nofollow" target="_blank">Vale VSCode</a> extension by chrischinchilla<sup id="fnref:5"><a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fn:5" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">5</a></sup>.
Vale helps me check that the <a href="https://blogguide.ropensci.org/authortechnical.html#styleguide" rel="nofollow" target="_blank">Blog Style</a> rules are respected, and gives suggestions for alternative word choices to avoid common mistakes (such as words or expressions which might be derogatory).</p>
<p>To setup Vale I created a project-specific Vale configuration file <a href="https://github.com/ropensci/roweb3/blob/5af882c6c3794048391543ced8a10bad39371f72/.vale.ini" rel="nofollow" target="_blank"><code>.vale.ini</code></a><sup id="fnref:6"><a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fn:6" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">6</a></sup> in the roweb3 repository.
I keep my personal <code>.vale.ini</code> file in a higher level folder that holds all my R projects.
In addition to the Vale configuration file, I also created a Vale styles folder in <a href="https://github.com/ropensci/roweb3/tree/5af882c6c3794048391543ced8a10bad39371f72/.vale-styles" rel="nofollow" target="_blank"><code>roweb3/.vale-styles</code></a>.
This is where Vale rules are installed if we use predefined rules, and where I can put rOpenSci-specific rules for the blog.
The first time you use Vale you’ll want to run <code>vale sync</code> in the terminal to install the standard, non-custom, rules.
I <code>.gitignore</code> all rules which are installed, but track and push custom rules.</p>
<p>Vale is where I’ve made the most customizations, especially with the rOpenSci Blog.</p>
<!-- TODO: Add links to the configuration file for these items -->
<ul>
<li>I’ve added a <a href="https://github.com/ropensci/roweb3/blob/5af882c6c3794048391543ced8a10bad39371f72/.vale-styles/config/vocabularies/Blog/accept.txt" rel="nofollow" target="_blank">specific Blog vocab list</a> to ensure proper capitalization of rOpenSci projects and (not to mention “rOpenSci” <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" />)</li>
<li>I’ve <a href="https://github.com/ropensci/roweb3/blob/4d7e22b1487a589b3e639109aa5fdc320acf21ff/.vale.ini#L18" rel="nofollow" target="_blank">turned off a lot of specific rules</a> which are a bit too aggressive for a blog which allows people to write casually and informally as they like (including using words like “very” <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f604.png" alt="😄" class="wp-smiley" style="height: 1em; max-height: 1em;" />).</li>
<li>I’ve created custom rules to modify existing rules <sup id="fnref:7"><a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fn:7" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">7</a></sup></li>
<li>I’ve created custom rules to enforce our style guide, like using <a href="https://github.com/ropensci/roweb3/blob/main/.vale-styles/rOpenSci/title.yml" rel="nofollow" target="_blank">Title Case</a> for blog post titles<sup id="fnref:8"><a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fn:8" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">8</a></sup>, sentence case for subheadings, and using <a href="https://github.com/ropensci/roweb3/blob/main/.vale-styles/rOpenSci/ropensci_links.yml" rel="nofollow" target="_blank">relative links</a> for ropensci.org pages.</li>
</ul>
<p>This is just the start!
I imagine the more I use these rules the more fine tuning I’ll do.</p>
<p>Vale problems are classified as messages, warnings, or errors, and are highlighted in the text window as a quick fix and listed in the Problems pane in my lower window.</p>
<p>I should also note that for all the rules I’ve disabled, there are a lot of opinionated rules left.
We keep them as prompts to think about our writing, not because we <em>must</em> follow them!</p>
<figure class="center"><img src="https://i1.wp.com/ropensci.org/blog/2026/07/02/editor-tools/there_is.png?w=450&#038;ssl=1"
alt="Vale’s write-good rule doesn’t want me to start a sentence with ‘There is’, but I’m going to anyway!"  data-recalc-dims="1"><figcaption>
<p>Vale’s write-good rule doesn’t want me to start a sentence with ‘There is’, but I’m going to anyway!</p>
</figcaption>
</figure>
<h3>
Panache
</h3><p>For formatting text, I use the <a href="https://github.com/jolars/panache" rel="nofollow" target="_blank">Panache</a> extension by jolars to format the (R)markdown files for the blog.
This is probably the smallest amount of setup, as all we need is a minimal <a href="https://github.com/ropensci/roweb3/blob/5af882c6c3794048391543ced8a10bad39371f72/.panache.toml" rel="nofollow" target="_blank"><code>.panache.toml</code></a> configuration file in the roweb3 repository.
However, this file instructs Panache to do one super awesome thing for us, especially for translations of multilingual blog posts:</p>
<pre>[format]
wrap = &quot;sentence&quot;
</pre><p>If you set up Positron to format on save, Panache automatically wraps text by sentence every time you save the file.
This means that when a blog post is sent for a first pass translation using <a href="https://docs.ropensci.org/babeldown/" rel="nofollow" target="_blank">babeldown</a>, the translation comes back pretty good.
Alternatively, if the line breaks are in the middle of a sentence, the translation can become garbled as lines are treated as disjointed sections of text.</p>
<p>For my other work, I use <code>wrap = &quot;reflow&quot;</code>, set in my user configuration file in <code>~/.config/panache/config.toml</code>.</p>
<h3>
GitHub Pull Requests
</h3><p>Finally, once I’ve got all the fiddly edits on a post’s (R)md file ready to go, I use the <a href="https://github.com/Microsoft/vscode-pull-request-github" rel="nofollow" target="_blank">GitHub Pull Requests</a> extension to convert these edits to GitHub PR review suggestions.
This is really handy if you find yourself making many small suggested changes to GitHub PRs.</p>
<p>To review blog posts, I fetch the PR with <code>usethis::pr_fetch()</code>, and then open the blog post (R)md file in Positron side by side with the html preview of the post in my web browser.</p>
<p>Then I review the html preview and make the edits directly in the (R)md file.
When I’m done, I right click on the edited file name in the Source Control > Changes and select Create Pull Request Suggestions.</p>
<figure class="center"><img src="https://i1.wp.com/ropensci.org/blog/2026/07/02/editor-tools/suggestions.png?w=450&#038;ssl=1"  data-recalc-dims="1">
</figure>
<p>This converts my edits to GitHub PR review suggestions which I can then review in Positron, or as I prefer, in a web browser (and fix weird ones, such as suggestions which delete part of a section in one edit but add it back in the next; it’s not always a perfect process).
Once all the suggestions are converted, the extension asks me if I want to revert my changes (which I usually do).</p>
<p>A note of caution, I find this tool a bit confusing to use on a PR that has a lot of comments already.
The comments it makes are sometimes hidden or split in odd ways and it’s easy to accidentally create duplicates.
In these situations it’s sometimes easier just to make the suggestions in a browser as you might normally.</p>
<h2>
Why so many tools?
</h2><p>Each of these tools provides me a specific solution to a problem.
There is some overlap among them; Vale could do spell checks, and Panache could do linting.
However, I find that by using the tools separately I can achieve an especially detailed and customized setup that works really well with the rOpenSci blog in particular, and with my work in general.</p>
<p>By including the configuration files in the roweb3 repository, people who also use these tools will automatically use the configurations we’ve setup for the rOpenSci blog when they write a post.
We also plan to add instructions for how to use these tools to the <a href="https://blogguide.ropensci.org/" rel="nofollow" target="_blank">Blog Guide</a>.
This should give blog writers the option of using these tools if they would like to.</p>
<p>However, even if other writers don’t use these tools, it’s still very useful for me to see a list of potential problems to double check at the end of my review without having to remember to check for them manually.
It means I can focus more on the review of the content rather than worry about whether it’s Ropensci or rOpenSci <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f604.png" alt="😄" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Don’t judge <em>this</em> post by these ideals, I said I’m a opinionated <em>editor</em>, writing is completely different <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" />. <a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fnref:1" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:2">
<p>It’s <strong>rO</strong>pen<strong>S</strong>ci.
Not Ropensci, not RopenSci and not ropenSci. <a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fnref:2" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:3">
<p>“Linting” with respect to text or prose means checking the <em>style</em> and <em>meaning</em> of the words. <a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fnref:3" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:4">
<p>I’m Canadian so generally follow Canadian spelling (a mix of British and American for those of you new to the complex world of English spelling differences).
At rOpenSci, we generally just ask an author to pick one and stick to it. <a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fnref:4" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:5">
<p>There is also <a href="https://github.com/vale-cli/vale-vscode" rel="nofollow" target="_blank">Vale</a> by errata-ai, but this extension has been <a href="https://github.com/vale-cli/vale-vscode#vale--vs-code" rel="nofollow" target="_blank">deprecated</a> in favour of Vale VSCode. <a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fnref:5" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:6">
<p>If you get an error on startup, you may need to tell Vale where this is explicitly by modifying Projects’ settings.json file to include <code>&quot;vale.valeCLI.config&quot;: &quot;.vale.ini&quot;</code> <a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fnref:6" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:7">
<p>For example, <a href="https://github.com/get-alex/alex" rel="nofollow" target="_blank"><code>alex</code></a> worries that the word “Mexican” might be used in a racist manner, but at rOpenSci, it’s stated with pride and I don’t want Vale to flag our community members for mentioning their nationality <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fnref:7" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:8">
<p>But awesomely, we can enforce this rule for English, but not Spanish posts! <a href="https://ropensci.org/blog/2026/07/02/editor-tools/#fnref:8" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
</ol>
</div>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://ropensci.org/blog/2026/07/02/editor-tools/"> rOpenSci - open tools for open science</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/foss-tools-for-lazy-editors/">FOSS Tools for Lazy Editors</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402400</post-id>	</item>
		<item>
		<title>A New Guide: Organizing Events for First-time Contributors</title>
		<link>https://www.r-bloggers.com/2026/07/a-new-guide-organizing-events-for-first-time-contributors/</link>
		
		<dc:creator><![CDATA[rOpenSci]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://ropensci.org/blog/2026/07/02/ftc-guide/</guid>

					<description><![CDATA[<p>Making your first contribution to open source can be both empowering and yet very intimidating.<br />
– rOpenSci FTC Guide</p>
<p>Last year we were grateful to receive funding from NumFOCUS1 to organize a series of events designed to reduce barriers restri...</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/a-new-guide-organizing-events-for-first-time-contributors/">A New Guide: Organizing Events for First-time Contributors</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://ropensci.org/blog/2026/07/02/ftc-guide/"> rOpenSci - open tools for open science</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<blockquote>
<p>Making your first contribution to open source can be both empowering and yet very intimidating.</p>
<p>– <a href="https://ftc-guide.ropensci.org/" rel="nofollow" target="_blank">rOpenSci FTC Guide</a></p>
</blockquote>
<p>Last year we were grateful to receive funding from NumFOCUS<sup id="fnref:1"><a href="https://ropensci.org/blog/2026/07/02/ftc-guide/#fn:1" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">1</a></sup> to organize a series of events designed to reduce barriers restricting First-Time Contributors to Free and Open Source Software (FOSS).
There are many barriers<sup id="fnref:2"><a href="https://ropensci.org/blog/2026/07/02/ftc-guide/#fn:2" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">2</a></sup> to first time contributions, but making these contributions can be an empowering experience.
To help reduce some of these barriers we hosted two types of events: <strong>mini-translathons</strong> and <strong>mini-hackathons</strong>.</p>
<p>A <strong>mini-translathon</strong> is a short, live, coworking session, focused on translation and localization contributions.
Participants review and improve translations of documentation, websites, or other resources.
They also work with guidance from mentors and editors, often collaborating in language-specific groups.
The goal is to make content accessible in multiple languages while helping newcomers learn <a href="https://ropensci.org/multilingual-publishing/" rel="nofollow" target="_blank">translation workflows and tools</a>.</p>
<!--- cSpell: language en,pt --->
<p>We paired our mini-translathon with a Portuguese Community Call (<a href="https://ropensci.org/commcalls/translation-portuguese/" rel="nofollow" target="_blank"><em>A comunidade R fala português</em></a><sup id="fnref:3"><a href="https://ropensci.org/blog/2026/07/02/ftc-guide/#fn:3" class="footnote-ref" role="doc-noteref" rel="nofollow" target="_blank">3</a></sup>) which preceded the <a href="https://latinr.org/en/cronograma/translaton/translaton-en.html" rel="nofollow" target="_blank">mini-translathon</a> at LatinR 2024.</p>
<figure><img src="https://i2.wp.com/ropensci.org/blog/2026/07/02/ftc-guide/Translathon-LatinR-3.png?w=578&#038;ssl=1"
alt="Screenshot of the Zoom call for the translathon, showing participants and a screenshare of the pull-request translation process." data-recalc-dims="1"><figcaption>
<p>Demonstrating the PR process during the translathon</p>
</figcaption>
</figure>
<p>Similarly, a <strong>mini-hackathon</strong> is a short (typically ~2-hour), live, online coworking session designed to help people make their first contributions to open-source software.
Participants work on small, well-prepared tasks such as fixing bugs, improving code, or updating documentation.
Maintainers and mentors are available in real time to guide them, answer questions, and support the contribution process.
The focus is on learning by doing in a collaborative and supportive environment.</p>
<p>Again, we paired our mini-hackathons with an English Community Call (<a href="https://ropensci.org/commcalls/first-time-contributor/" rel="nofollow" target="_blank">From Novice to Contributor: Making and Supporting First-Time Contributions to FOSS</a>) which was then followed by the two <a href="https://ropensci.org/events/coworking-2025-02/" rel="nofollow" target="_blank">mini-hackathons</a> to support contributors to coding projects.</p>
<figure><img src="https://i0.wp.com/ropensci.org/blog/2026/07/02/ftc-guide/Yani-JuanCruz-miniHackathon.jpg?w=578&#038;ssl=1"
alt="Photo of two participants of the mini-hackathon participating on their computers from the same location." data-recalc-dims="1"><figcaption>
<p>Yani and Juan Cruz participate in the mini-hackathon together</p>
</figcaption>
</figure>
<p>Part of the grant we received also allowed us to write up our processes and findings as a <strong>guide book</strong> “<a href="https://ftc-guide.ropensci.org/" rel="nofollow" target="_blank">From User to Contributor: Organizing Events for First-Time Contributors</a>”, which we are excited to share with you!</p>
<figure><img src="https://i1.wp.com/ropensci.org/blog/2026/07/02/ftc-guide/ftc_guide.png?w=578&#038;ssl=1"
alt="Screenshot of the introduction to the FTC Guide showing the Table of Contents including &#39;Preface&#39;, &#39;Pilot&#39;, &#39;Events Overview&#39;, &#39;Community Calls&#39;, &#39;Mini-translathons&#39;, &#39;Mini-hackathons&#39;, and &#39;Appendices&#39;" data-recalc-dims="1">
</figure>
<p>In our guide we start by discussing <a href="https://ftc-guide.ropensci.org/" rel="nofollow" target="_blank">why supporting first time contributors is important</a>.
We describe our <a href="https://ftc-guide.ropensci.org/pilot.html" rel="nofollow" target="_blank">pilot events</a>, how they went, feedback we received, and ideas for future improvement.
The main chapters of the guide then cover how to run these events in greater detail.
This includes <a href="https://ftc-guide.ropensci.org/event-overview.html" rel="nofollow" target="_blank">Timelines</a>, <a href="https://ftc-guide.ropensci.org/commcall.html" rel="nofollow" target="_blank">Community Calls</a>, <a href="https://ftc-guide.ropensci.org/translathon.html" rel="nofollow" target="_blank">Mini-translathons</a>, and <a href="https://ftc-guide.ropensci.org/hackathon.html" rel="nofollow" target="_blank">Mini-hackathons</a>, all from the perspective of supporting first time contributors.
In the <a href="https://ftc-guide.ropensci.org/resources.html" rel="nofollow" target="_blank">Appendices</a> we include communication examples and templates.</p>
<p>We hope that this guide can be useful to other communities beyond rOpenSci.
If you use this guide to create your own events to support first time contributors, we hope <a href="https://ropensci.org/usecases/" rel="nofollow" target="_blank">you’ll let us know</a>!</p>
<p>Thanks to NumFOCUS for the Small Development Grant to support this work.</p>
<!--- cSpell: ignore CSCW --->
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://numfocus.org/" rel="nofollow" target="_blank">NumFocus</a> is rOpenSci’s fiscal sponsor. <a href="https://ropensci.org/blog/2026/07/02/ftc-guide/#fnref:1" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:2">
<p>Steinmacher et al. identified 13 social barriers.
Igor Steinmacher, Tayana Conte, Marco Aurélio Gerosa, and David Redmiles. 2015.
Social Barriers Faced by Newcomers Placing Their First Contribution in Open Source Software Projects. In Proceedings of the 18th ACM Conference on Computer Supported Cooperative Work &#038; Social Computing (CSCW ‘15). Association for Computing Machinery, New York, NY, USA, 1379–1392. <a href="https://doi.org/10.1145/2675133.2675215%E2%86%A9%EF%B8%8E" rel="nofollow" target="_blank">https://doi.org/10.1145/2675133.2675215<img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a> <a href="https://ropensci.org/blog/2026/07/02/ftc-guide/#fnref:2" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
<li id="fn:3">
<p>“The R community speaks Portuguese” <a href="https://ropensci.org/blog/2026/07/02/ftc-guide/#fnref:3" class="footnote-backref" role="doc-backlink" rel="nofollow" target="_blank"><img src="https://s.w.org/images/core/emoji/13.0.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>
</ol>
</div>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://ropensci.org/blog/2026/07/02/ftc-guide/"> rOpenSci - open tools for open science</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/07/a-new-guide-organizing-events-for-first-time-contributors/">A New Guide: Organizing Events for First-time Contributors</a>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">401598</post-id>	</item>
		<item>
		<title>May 2026 Top 40 New CRAN Packages</title>
		<link>https://www.r-bloggers.com/2026/06/may-2026-top-40-new-cran-packages/</link>
		
		<dc:creator><![CDATA[Joseph Rickert]]></dc:creator>
		<pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://rworks.dev/posts/may-2026-top-40-new-cran-packages/</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; ">
<p>Three hundred twenty-three of the new packages were submitted to CRAN in May. Here are my Top 40 picks in eighteen categories: Artificial Intelligence, Computational Methods, Ecology, Education, Finance, Functional Data Analysis, Genomics, Machi...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/may-2026-top-40-new-cran-packages/">May 2026 Top 40 New CRAN Packages</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://rworks.dev/posts/may-2026-top-40-new-cran-packages/"> R Works</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
 





<p>Three hundred twenty-three of the new packages were submitted to CRAN in May. Here are my Top 40 picks in eighteen categories: Artificial Intelligence, Computational Methods, Ecology, Education, Finance, Functional Data Analysis, Genomics, Machine Learning, Medical Statistics, Meta Analysis, Probability, Process Control, Psychometrics, Statistics, Surveys, Time Series, Utilities, and Visualization.</p>
<div class="columns">
<div class="column" style="width:45%;">
<section id="artifical-intelligence" class="level3">
<h3 class="anchored" data-anchor-id="artifical-intelligence">Artifical Intelligence</h3>
<p><a href="https://cran.r-project.org/package=corteza" rel="nofollow" target="_blank">corteza</a> v0.6.9: Implements an agent runtime that gives Large Language Models (LLMs) from <a href="https://www.anthropic.com/" rel="nofollow" target="_blank">Anthropic</a>, <a href="https://openai.com/" rel="nofollow" target="_blank">OpenAI</a>, <a href="https://www.moonshot.ai/" rel="nofollow" target="_blank">Moonshot</a>, and <a href="https://ollama.com/" rel="nofollow" target="_blank">Ollama</a> direct access to a live <code>R</code> session with managed workspace state. Tools execute as function calls with provenance tracking, and a deterministic retrieval system keeps relevant objects in context across turns. There are three entry points: a shell command-line interface, a console read-eval-print-loop, and a Model Context Protocol server for external clients. There are four vignettes, including <a href="https://cran.r-project.org/web/packages/corteza/vignettes/package-as-skill.html" rel="nofollow" target="_blank">Package as Skill</a> and <a href="https://cran.r-project.org/web/packages/corteza/vignettes/skills.html" rel="nofollow" target="_blank">Skills</a>.</p>
<p><a href="https://cran.r-project.org/package=ElicitationWizard" rel="nofollow" target="_blank">ElicitationWizard</a> v0.1.0: Implements a <code>Shiny</code> application for eliciting Bayesian prior distributions using large language models (LLMs). Supports multiple LLM experts, linear opinion pooling, and the Delphi method for iterative consensus. For more details, see <a href="https://pubsonline.informs.org/doi/10.1287/deca.2022.0451" rel="nofollow" target="_blank">Falconer et al. (2022)</a> and <a href="https://onlinelibrary.wiley.com/doi/10.1002/sta4.70054" rel="nofollow" target="_blank">Selby et al. (2025)</a>. There is a <a href="https://cran.r-project.org/web/packages/ElicitationWizard/vignettes/getting-started.html" rel="nofollow" target="_blank">Getting Started</a> vignette and a <a href="https://cran.r-project.org/web/packages/ElicitationWizard/vignettes/tutorial.html" rel="nofollow" target="_blank">Tutorial</a>.</p>
</section>
<section id="computational-methods" class="level3">
<h3 class="anchored" data-anchor-id="computational-methods">Computational Methods</h3>
<p><a href="https://cran.r-project.org/package=boids4R" rel="nofollow" target="_blank">boids4R</a> v0.3.1: Provides deterministic two- and three-dimensional boids and swarm simulations implementing Reynolds-style separation, alignment, and cohesion rules with optional obstacles, attractors, predators, species parameters, and reproducible frame export. The simulation state is renderer-neutral, meaning that optional adapters can transfer data to visualization packages such as <code>ggWebGL</code>. The model follows <a href="https://dl.acm.org/doi/10.1145/37402.37406" rel="nofollow" target="_blank">Reynolds (1987)</a>. There are five vignettes, including <a href="https://cran.r-project.org/web/packages/boids4R/vignettes/getting-started.html" rel="nofollow" target="_blank">Getting Started</a> and <a href="https://cran.r-project.org/web/packages/boids4R/vignettes/scenario-gallery.html" rel="nofollow" target="_blank">Scenario Gallery</a>.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/boids4R.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-1" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/boids4R.png?w=578&#038;ssl=1" class="img-fluid" alt="Example of Swarm Art" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=combss" rel="nofollow" target="_blank">combss</a> v0.1.0: Reformulates the NP-hard discrete subset selection problem as a continuous optimisation over the hypercube <img src="https://latex.codecogs.com/png.latex?%5B0,1%5D%5Ep">, to be solved via a Frank-Wolfe homotopy algorithm with closed-form ridge inner solves. Supports linear (Gaussian), binary logistic, and multinomial regression. See <a href="https://link.springer.com/article/10.1007/s11222-024-10387-8" rel="nofollow" target="_blank">Moka et al. (2024)</a> and <a href="https://arxiv.org/abs/2603.21952" rel="nofollow" target="_blank">Mather et al. (2026)</a> for methodological details and the <a href="https://cran.r-project.org/web/packages/combss/vignettes/combss.html" rel="nofollow" target="_blank">vignette</a> for an example.</p>
<p><a href="https://cran.r-project.org/package=diffcp" rel="nofollow" target="_blank">diffcp</a> v0.1.1: Provides a port of the <code>python</code> <code>diffcp</code> package. Functions compute the derivative of the optimal solution map of a convex cone program, treating the program as an implicit function of its data (constraint matrix, offset, objective coefficients, and optionally a quadratic), mirroring <a href="https://arxiv.org/abs/1904.09043" rel="nofollow" target="_blank">Agrawal et al. (2019)</a>. See the <a href="https://cran.r-project.org/web/packages/diffcp/vignettes/diffcp.html" rel="nofollow" target="_blank">vignette</a>.</p>
<p><a href="https://cran.r-project.org/package=LangevinFlow" rel="nofollow" target="_blank">LangevinFlow</a> v0.1.0: Implements Langevin diffusion based Markov chain Monte Carlo samplers, including the Unadjusted Langevin algorithm and the Metropolis-Adjusted Langevin algorithm with minimal dependencies, with the intention of supporting Bayesian inference and stochastic optimization. The core sampling loops are written in <code>C++</code> via <code>Rcpp</code> and <code>RcppArmadillo</code> Methods follow <a href="https://www.jstor.org/stable/3318418?origin=crossref" rel="nofollow" target="_blank">Roberts and Tweedie (1996)</a> and <a href="https://academic.oup.com/jrsssb/article-abstract/60/1/255/7083121?redirectedFrom=fulltext&#038;login=false" rel="nofollow" target="_blank">Roberts and Rosenthal (1998)</a>. See the <a href="https://cran.r-project.org/web/packages/LangevinFlow/vignettes/introduction.html" rel="nofollow" target="_blank">vignette</a>.</p>
</section>
<section id="ecology" class="level3">
<h3 class="anchored" data-anchor-id="ecology">Ecology</h3>
<p><a href="https://cran.r-project.org/package=BRCore" rel="nofollow" target="_blank">BRCore</a> v2.0.7: Implements a unified framework for the identification and ecological interpretation of core microbiomes across time and space, enhancing robustness and reproducibility in microbiome data analysis. See <a href="https://www.sciencedirect.com/science/article/pii/S1369527419300426" rel="nofollow" target="_blank">Shade A, Stopnisek N (2019)</a>. See <a href="https://enviromicro-journals.onlinelibrary.wiley.com/doi/10.1111/j.1462-2920.2005.00956.x" rel="nofollow" target="_blank">Sloan et al. (2006)</a> for details on abundance-occupancy distributions and <a href="https://academic.oup.com/ismej/article/10/3/655/7538159?login=false" rel="nofollow" target="_blank">Burns et al. (2015)</a> for neutral models. The <a href="https://cran.r-project.org/web/packages/BRCore/vignettes/BRCore-vignette.html" rel="nofollow" target="_blank">vignette</a> provides an introduction.</p>
<p><a href="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/BRCore.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-2" rel="nofollow" target="_blank"><img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/BRCore.png?w=578&#038;ssl=1" class="img-fluid" alt="Core set occupancy heat map" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=ELAplus" rel="nofollow" target="_blank">ELAplus</a> v1.0.2: Provides tools for Energy landscape analysis and a systematic method for analyzing an energy landscape represented as a weighted network. Functions are especially designed to analyze ecological dynamics, i.e., transitions in community compositions. See <a href="https://esajournals.onlinelibrary.wiley.com/doi/10.1002/ecm.1469" rel="nofollow" target="_blank">Suzuki et al. (2021)</a> for details about the analysis framework and the <a href="https://cran.r-project.org/web/packages/ELAplus/vignettes/ELAplus-intro.html" rel="nofollow" target="_blank">vignette</a> for examples.</p>
<p><a href="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/ELAplus.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-3" rel="nofollow" target="_blank"><img src="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/ELAplus.png?w=578&#038;ssl=1" class="img-fluid" alt="A disconnectivity graph is a compact visualization of the global structure of an energy landscape" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=fb4package" rel="nofollow" target="_blank">fb4package</a> v2.1.0: Implements the <em>Fish Bioenergetics 4.0</em> framework described in <a href="https://academic.oup.com/fisheries/article-abstract/42/11/586/7833943?redirectedFrom=fulltext&#038;login=false" rel="nofollow" target="_blank">Deslauriers et al. (2017)</a> and provides automated parameter optimization, multi-prey diet modeling, and comprehensive energy budget simulations for fisheries research and aquaculture applications. Includes species-specific parameter databases and tools for modeling fish growth, consumption, and metabolism under varying environmental conditions. There are six vignettes, including <a href="https://cran.r-project.org/web/packages/fb4package/vignettes/fb4-introduction.html" rel="nofollow" target="_blank">Introduction</a> and <a href="https://cran.r-project.org/web/packages/fb4package/vignettes/fb4-temperature-climate.html" rel="nofollow" target="_blank">Temperature Sensitivity and Climate Change Scenarios</a>.</p>
<p><a href="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/fb4package.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-4" rel="nofollow" target="_blank"><img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/fb4package.png?w=578&#038;ssl=1" class="img-fluid" alt="Plot of temperature and feeding effects on growth" data-recalc-dims="1"></a></p>
</section>
<section id="education" class="level3">
<h3 class="anchored" data-anchor-id="education">Education</h3>
<p><a href="https://cran.r-project.org/package=bibnets" rel="nofollow" target="_blank">bibnets</a> v0.6.0: Provides functions to import, construct, and export bibliometric networks from scholarly metadata. Reads <em>Scopus</em>, <em>Web of Science</em>, <em>BibTeX</em>, <em>RIS</em>, <em>OpenAlex</em>, <em>Lens.org</em>, <em>Dimensions</em>, and <em>Crossref</em> exports. Goes beyond standard co-networks with attention-weighted networks, position-aware counting, similarity and dissimilarity normalisations, temporal networks, and local citation scoring. See <a href="https://link.springer.com/chapter/10.1007/978-3-031-25336-2_5" rel="nofollow" target="_blank">López-Pernas, Saqr &#038; Apiola (2023)</a> for the methods involved. There are four vignettes, including <a href="https://cran.r-project.org/web/packages/bibnets/vignettes/bibnets.html" rel="nofollow" target="_blank">Getting Started</a> and <a href="https://cran.r-project.org/web/packages/bibnets/vignettes/reading-data.html" rel="nofollow" target="_blank">Reading bibliometric data</a>.</p>
</section>
<section id="finance" class="level3">
<h3 class="anchored" data-anchor-id="finance">Finance</h3>
<p><a href="https://cran.r-project.org/package=contagionchannels" rel="nofollow" target="_blank">contagionchannels</a> v0.1.3: Implements a two-stage framework for the joint detection and attribution of cross-border financial contagion. Stage one detects directional information flows between equity markets. Stage two attributes each significant directional link to one of five mutually exclusive transmission channels: trade, financial, Ggopolitical, behavioural, or monetary policy. The package also bundles datasets and scripts to reproduce the headline findings of <a href="https://arxiv.org/abs/2604.26546" rel="nofollow" target="_blank">Bhandari, Parida and Sahu (2026)</a>. There are three vignettes, including <a href="https://cran.r-project.org/web/packages/contagionchannels/vignettes/custom_data.html" rel="nofollow" target="_blank">Using Custom Datasets</a> and <a href="https://cran.r-project.org/web/packages/contagionchannels/vignettes/methodology.html" rel="nofollow" target="_blank">Methodology Guide</a>.</p>
</section>
<section id="functional-data-analysis" class="level3">
<h3 class="anchored" data-anchor-id="functional-data-analysis">Functional Data Analysis</h3>
<p><a href="https://cran.r-project.org/package=SmoothPLS" rel="nofollow" target="_blank">SmoothPLS</a> v0.1.5: Implements the partial least-squares algorithm for functional data through the concept of active area integration by building upon the basis expansion methods described in <a href="https://www.sciencedirect.com/science/article/abs/pii/S0169743910001747" rel="nofollow" target="_blank">Aguilera et al. (2010)</a>. Functions handle both scalar and categorical functional data and interpretable regression curves, even for discrete state changes. There are six vignettes, including <a href="https://cran.r-project.org/web/packages/SmoothPLS/vignettes/s02_SFD.html" rel="nofollow" target="_blank">smoothPLS ScalarFD</a> and <a href="https://cran.r-project.org/web/packages/SmoothPLS/vignettes/s03_CFD_multistates.html" rel="nofollow" target="_blank">SmoothPLS multi state</a>.</p>
<p><a href="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/SmoothPLS.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-5" rel="nofollow" target="_blank"><img src="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/SmoothPLS.png?w=578&#038;ssl=1" class="img-fluid" alt="Model comparison plots" data-recalc-dims="1"></a></p>
</section>
<section id="genomics" class="level3">
<h3 class="anchored" data-anchor-id="genomics">Genomics</h3>
<p><a href="https://cran.r-project.org/web/packages/cclustr/vignettes/cclustr-introduction.html" rel="nofollow" target="_blank">cclustr</a> v0.1.1: Provides tools for performing consensus clustering on multiple imputed datasets that support a range of clustering algorithms across imputations, including hierarchical methods, partition-based approaches such as k-means, and methods for mixed or categorical data. Consensus solutions are derived via hierarchical clustering applied to a dissimilarity matrix. The consensus clustering framework is based on <a href="https://link.springer.com/article/10.1023/A:1023949509487" rel="nofollow" target="_blank">Monti et al. (2003)</a>, rank aggregation methods follow <a href="https://academic.oup.com/bioinformatics/article/23/13/1607/223480?login=false" rel="nofollow" target="_blank">Pihur et al. (2007)</a>, and the proportion of ambiguous clustering metric is based on <a href="https://www.nature.com/articles/srep06207" rel="nofollow" target="_blank">Senbabaoglu et al. (2014)</a>. See the <a href="https://cran.r-project.org/web/packages/cclustr/vignettes/cclustr-introduction.html" rel="nofollow" target="_blank">vignette</a>.<img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/cclustr.png?w=578&#038;ssl=1" class="img-fluid" alt="Example of consenus matrix" data-recalc-dims="1"></p>
</section>
<section id="machine-learning" class="level3">
<h3 class="anchored" data-anchor-id="machine-learning">Machine Learning</h3>
<p><a href="https://cran.r-project.org/package=tmfast" rel="nofollow" target="_blank">tmfast</a> 0.1.1: Provides functions to fit topic models using varimax-rotated principal component analysis, following the “vintage factor analysis” approach of <a href="https://arxiv.org/abs/2004.05387" rel="nofollow" target="_blank">Rohe &#038; Zheng (2020)</a>. Leverages truncated PCA via <code>irlba</code> for sparse matrices, enabling fast model fitting on large corpora. Includes an information-theoretic approach to vocabulary selection, <code>broom</code>-compatible tidiers for extracting word-topic and topic-document matrices into a tidy data workflow, and samplers for constructing simulated corpora for benchmarking and method evaluation. There are two vignettes <a href="https://cran.r-project.org/web/packages/tmfast/vignettes/realbooks.html" rel="nofollow" target="_blank">Fast topic modeling with real books</a> and <a href="https://cran.r-project.org/web/packages/tmfast/vignettes/simulated.html" rel="nofollow" target="_blank">Fitting topic models with tmfast</a>.</p>
<p><a href="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/tmfast.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-6" rel="nofollow" target="_blank"><img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/tmfast.png?w=578&#038;ssl=1" class="img-fluid" alt="t-SNE visualization of a topic model" data-recalc-dims="1"></a></p>
</section>
<section id="medicine" class="level3">
<h3 class="anchored" data-anchor-id="medicine">Medicine</h3>
<p><a href="https://cran.r-project.org/package=BSET" rel="nofollow" target="_blank">BSET</a> v1.0: Implements the Bayesian Surrogate Evaluation Test (BSET) for assessing the validity of surrogate markers in clinical trials and provides hypothesis testing tools to evaluate whether a surrogate can reliably estimate the causal effect of a treatment on a primary outcome. Addresses key limitations of the frequentist method, including the lack of causal interpretability and the inability to adjust for covariates in the estimation process. See <a href="https://arxiv.org/abs/2603.14381" rel="nofollow" target="_blank">Carlotti and Parast (2026)</a>, <a href="https://academic.oup.com/biometrics/article/80/1/ujad035/7612597?login=false" rel="nofollow" target="_blank">Parast et al. (2024)</a> for background and the <a href="https://cran.r-project.org/web/packages/BSET/vignettes/BSET_tutorial.html" rel="nofollow" target="_blank">vignette</a> for a tutorial.</p>
<p><a href="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/BSET.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-7" rel="nofollow" target="_blank"><img src="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/BSET.png?w=578&#038;ssl=1" class="img-fluid" alt="The posterior distribution of 𝜃from the BSET procedure without adjusting for covariates" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=DICErClust" rel="nofollow" target="_blank">DICErClust</a> v0.1.2: Implements Deep Significance Clustering (DICE), a self-supervised learning framework designed to identify clinically meaningful and risk-stratified patient subgroups from electronic health record data. DICE jointly optimizes deep representation learning, clustering, and outcome prediction while enforcing statistical significance between predicted outcomes and cluster membership, and produces subgroups that are both clinically coherent and predictive. <a href="https://academic.oup.com/jamia/article-abstract/28/12/2641/6377084?redirectedFrom=fulltext&#038;login=false" rel="nofollow" target="_blank">See Huang et al. (2021)</a> and the vignettes <a href="https://cran.r-project.org/web/packages/DICErClust/vignettes/DICEr-introduction.html" rel="nofollow" target="_blank">Introduction</a> and <a href="https://cran.r-project.org/web/packages/DICErClust/vignettes/heart-failure-example.html" rel="nofollow" target="_blank">Heart Failure Risk Stratification</a>.</p>
</section>
<section id="meta-analysis" class="level3">
<h3 class="anchored" data-anchor-id="meta-analysis">Meta Analysis</h3>
<p><a href="https://cran.r-project.org/package=MetaHunt" rel="nofollow" target="_blank">MetaHunt</a> v0.1.0: Provides tools for privacy-preserving meta-analysis of function-valued quantities across heterogeneous studies. Implements a pipeline that includes the denoised functional successive projection algorithm for basis hunting, constrained weight estimation, Dirichlet regression of weights on study-level covariates, target prediction, and split/cross conformal prediction intervals. The methodology described in <a href="https://arxiv.org/abs/2604.23847" rel="nofollow" target="_blank">Shi, Imai, and Zhang (2026)</a>. There are eight vignettes, including <a href="https://cran.r-project.org/web/packages/MetaHunt/vignettes/get-started.html" rel="nofollow" target="_blank">Get started</a> and <a href="https://cran.r-project.org/web/packages/MetaHunt/vignettes/metahunt-intro.html" rel="nofollow" target="_blank">An Introduction</a>.</p>
<p><a href="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/MetaHunt.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-8" rel="nofollow" target="_blank"><img src="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/MetaHunt.png?w=578&#038;ssl=1" class="img-fluid" alt="Plot of predicted target functions" data-recalc-dims="1"></a></p>
</section>
<section id="probability" class="level3">
<h3 class="anchored" data-anchor-id="probability">Probability</h3>
<p><a href="https://cran.r-project.org/package=BetaDanish" rel="nofollow" target="_blank">BetaDanish</a> v0.2.0: Implements the four-parameter Beta-Danish distribution and its three-parameter submodel for survival and reliability analysis, based on <a href="https://reference-global.com/article/10.2478/jamsi-2025-0010" rel="nofollow" target="_blank">Ahmad and Danish (2025)</a>, and provides functions for density, distribution, quantile, hazard, and random generation. There are five vignettes, including <a href="https://cran.r-project.org/web/packages/BetaDanish/vignettes/BetaDanish_Introduction.html" rel="nofollow" target="_blank">Introduction</a> and <a href="https://cran.r-project.org/web/packages/BetaDanish/vignettes/bd-bayesian.html" rel="nofollow" target="_blank">Bayesian Estimation</a>.</p>
<p><a href="https://cran.r-project.org/package=mhn" rel="nofollow" target="_blank">mhn</a> v0.1.0: Provides density, distribution, quantile, and random generation functions for the Modified Half-Normal (MHN) distribution, along with moments, mode, and the Fox-Wright Psi function used as the normalizing constant. The MHN distribution arises as a conditional posterior in Bayesian MCMC and generalizes the half-normal, truncated normal, and square-root gamma distributions. Implements efficient sampling via the <a href="https://www.tandfonline.com/doi/full/10.1080/03610926.2021.1934700" rel="nofollow" target="_blank">Sun, Kong &#038; Pal (2023)</a> algorithms and the <a href="https://www.tandfonline.com/doi/full/10.1080/03610918.2025.2524551" rel="nofollow" target="_blank">Gao &#038; Wang (2025)</a> RTDR method. See the vignettes <a href="https://cran.r-project.org/web/packages/mhn/vignettes/introduction.html" rel="nofollow" target="_blank">Introduction</a> and <a href="https://cran.r-project.org/web/packages/mhn/vignettes/theory.html" rel="nofollow" target="_blank">Theoretical Background</a>.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/mhn.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-9" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/mhn.png?w=578&#038;ssl=1" class="img-fluid" alt="MHN density curves for various parameter values" data-recalc-dims="1"></a></p>
</section>
<section id="process-control" class="level3">
<h3 class="anchored" data-anchor-id="process-control">Process Control</h3>
<p><a href="https://cran.r-project.org/package=shewhartr" rel="nofollow" target="_blank">shewhartr</a> v1.3.0: Provides a toolkit for statistical process control that combines the rigor of classical Shewhart methodology with modern tidyverse-native interfaces that include classical control charts, regression-based control charts for processes with trend, Nelson runs tests, average run length simulation, process capability indices, and Box-Cox transformation guidance. See <a href="https://www.tandfonline.com/doi/abs/10.1080/00224065.1984.11978921" rel="nofollow" target="_blank">Montgomery (2019)</a>, <a href="https://www.tandfonline.com/doi/abs/10.1080/00224065.1984.11978921" rel="nofollow" target="_blank">Nelson (1984)</a>, and <a href="https://www.tandfonline.com/doi/abs/10.1080/00224065.2000.11980013" rel="nofollow" target="_blank">Woodall (2000)</a> for background. There are eleven vignettes, including <a href="https://cran.r-project.org/web/packages/shewhartr/vignettes/getting-started.html" rel="nofollow" target="_blank">Getting started</a> and <a href="https://cran.r-project.org/web/packages/shewhartr/vignettes/regression-charts.html" rel="nofollow" target="_blank">Regression-based control charts</a>.</p>
<p><a href="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/shewhartr.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-10" rel="nofollow" target="_blank"><img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/shewhartr.png?w=578&#038;ssl=1" class="img-fluid" alt="Regression Control Chart" data-recalc-dims="1"></a></p>
</section>
<section id="psychometrics" class="level3">
<h3 class="anchored" data-anchor-id="psychometrics">Psychometrics</h3>
<p><a href="https://cran.r-project.org/package=personnelSelectionUtility" rel="nofollow" target="_blank">personnelSelectionUtility</a> v1.0.2: Implements classical and contemporary utility-analysis methods for personnel selection, organised by criterion scale and selection structure. Provides multiple methods, including Taylor-Russell classification <a href="https://psycnet.apa.org/doiLanding?doi=10.1037%2Fh0057079" rel="nofollow" target="_blank">Taylor and Russell (1939)</a>, and Brogden-Cronbach-Gleser monetary utility <a href="https://onlinelibrary.wiley.com/doi/10.1111/j.1744-6570.1949.tb01397.x" rel="nofollow" target="_blank">Brogden (1949)</a>. There are five vignettes, including <a href="https://cran.r-project.org/web/packages/personnelSelectionUtility/vignettes/reproductions.html" rel="nofollow" target="_blank">Reproducing canonical examples from the literature</a> and <a href="https://cran.r-project.org/web/packages/personnelSelectionUtility/vignettes/utility-analysis-taxonomy.html" rel="nofollow" target="_blank">Utility-analysis taxonomy for personnel selection</a>.</p>
</section>
</div><div class="column" style="width:10%;">

</div><div class="column" style="width:45%;">
<section id="statistics" class="level3">
<h3 class="anchored" data-anchor-id="statistics">Statistics</h3>
<p><a href="https://cran.r-project.org/package=bvarnet" rel="nofollow" target="_blank">bvarnet</a> v1.0.1: Provides functions for the Bayesian estimation of multilevel vector autoregression models using Stan. Supports Gaussian, binary, and ordinal (adjacent category) outcome variables with random effects and customizable priors. There are six vignettes, including an <a href="https://cran.r-project.org/web/packages/bvarnet/vignettes/bvarnet.html" rel="nofollow" target="_blank">introduction</a> and <a href="https://cran.r-project.org/web/packages/bvarnet/vignettes/Mixed-Model.html" rel="nofollow" target="_blank">Mixed Model</a>.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/bvarnet.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-11" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/bvarnet.png?w=578&#038;ssl=1" class="img-fluid" alt="Network visualization of a model" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=glmbayes" rel="nofollow" target="_blank">glmbayes</a> v0.9.5: Provides Bayesian linear and generalized linear model fitting with independent and identically distributed posterior samples. Features include functions that mirror <code>lm()</code> and <code>glm()</code> interfaces, prior family specifications for Gaussian, Poisson, Binomial, and Gamma models with log-concave likelihoods, accept-reject sampling for non-conjugate priors, and optional <code>OpenCL</code> acceleration for larger models. See <a href="https://www.tandfonline.com/doi/abs/10.1198/016214506000000357" rel="nofollow" target="_blank">Nygren and Nygren (2006)</a> for accept-reject methods. There are twenty-seven vignettes, including <a href="https://cran.r-project.org/web/packages/glmbayes/vignettes/Chapter-01.html" rel="nofollow" target="_blank">Getting started</a> and <a href="https://cran.r-project.org/web/packages/glmbayes/vignettes/Chapter-05.html" rel="nofollow" target="_blank">Foundations of GLMs</a>.</p>
<p><a href="https://cran.r-project.org/package=griddy" rel="nofollow" target="_blank">griddy</a> v0.1.0: Provides tools for exploratory geospatial distribution dynamics with <code>sf</code> objects. Includes pooled and time-specific classification of longitudinal spatial values, classic discrete Markov transition matrices, spatial Markov matrices conditioned on spatial-lag classes, endpoint and adjacent rank mobility summaries, and <code>ggplot2</code> visualizations. Methods follow <a href="https://link.springer.com/article/10.1007/s10109-016-0234-x" rel="nofollow" target="_blank">Rey (2001)</a> and <a href="https://link.springer.com/article/10.1007/s10109-016-0234-x" rel="nofollow" target="_blank">Rey et al. (2016)</a>. See the <a href="https://cran.r-project.org/web/packages/griddy/vignettes/griddy.html" rel="nofollow" target="_blank">vignette</a> to get started.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/griddy.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-12" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/griddy.png?w=578&#038;ssl=1" class="img-fluid" alt="Map of US showing pooled classes" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=RMeDPower2" rel="nofollow" target="_blank">RMeDPower2</a> v1.0.2: Provides functions to analyze data from repeated measures experiments with hierarchical or crossed experimental designs. Supports testing modeling assumptions, identifying outlier observations and experimental units, estimating statistical power, and performing sample size calculations. For details, see <a href="https://www.biorxiv.org/content/10.1101/2022.07.18.500490v1" rel="nofollow" target="_blank">Shin et al. (2022)</a> and <a href="https://www.jstatsoft.org/article/view/v067i01" rel="nofollow" target="_blank">Bates et al. (2015)</a>. See the <a href="https://cran.r-project.org/web/packages/RMeDPower2/vignettes/ShortTutorial.html" rel="nofollow" target="_blank">vignette</a> for a tutorial.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/RMeDPower2.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-13" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/RMeDPower2.png?w=578&#038;ssl=1" class="img-fluid" alt="Flowchart illustrating Package capabilities" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=ROCsurvcomp" rel="nofollow" target="_blank">ROCsurvcomp</a> v0.1.2: Implements nonparametric and semiparametric methods for comparing two survival distributions under non-proportional hazards. The methods are based on the Receiver Operating Characteristic (ROC) curve length described in <a href="https://onlinelibrary.wiley.com/doi/10.1002/sim.8869" rel="nofollow" target="_blank">Bantis et al. (2021)</a> and the overlap coefficient method of <a href="https://journals.sagepub.com/doi/10.1177/09622802211046386" rel="nofollow" target="_blank">Franco-Pereira et al. (2021)</a>, as well as a joint ROC length-OVL-based approach. See the <a href="https://cran.r-project.org/web/packages/ROCsurvcomp/vignettes/ROCsurvcomp.html" rel="nofollow" target="_blank">vignette</a>.</p>
<p><a href="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/ROC.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-14" rel="nofollow" target="_blank"><img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/ROC.png?w=578&#038;ssl=1" class="img-fluid" alt="Plot illustrating vonvex hull Joint inference" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=sssvcqr" rel="nofollow" target="_blank">sssvcqr</a> v0.0.4: Implements sparse-smooth spatially varying coefficient quantile regression combining the quantile regression of <a href="https://www.jstor.org/stable/1913643?origin=crossref" rel="nofollow" target="_blank">Koenker and Bassett (1978)</a> with grouped variable selection of <a href="https://academic.oup.com/jrsssb/article/68/1/49/7110631?login=false" rel="nofollow" target="_blank">Yuan and Lin (2006)</a>, graph regularization, and the alternating direction method of multipliers of <a href="https://www.emerald.com/ftmal/article-abstract/3/1/1/1331527/Distributed-Optimization-and-Statistical-Learning?redirectedFrom=fulltext" rel="nofollow" target="_blank">Boyd et al. (2011)</a>. Functions provide graph-regularized estimation, spatially blocked cross-validation, prediction, diagnostics, and simulation helpers for global-local spatial quantile regression. See the vignettes <a href="https://cran.r-project.org/web/packages/sssvcqr/vignettes/sssvcqr-introduction.html" rel="nofollow" target="_blank">Getting Started</a> and <a href="https://cran.r-project.org/web/packages/sssvcqr/vignettes/lucas-county-example.html" rel="nofollow" target="_blank">Lucas County Housing Example</a>.</p>
<p><a href="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/sssvcqr.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-15" rel="nofollow" target="_blank"><img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/sssvcqr.png?w=578&#038;ssl=1" class="img-fluid" alt="Visualization of codfficients" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=TemporalHazard" rel="nofollow" target="_blank">TemporalHazard</a> v1.1.0: Implements the multiphase parametric hazard model of <a href="https://www.tandfonline.com/doi/abs/10.1080/01621459.1986.10478314" rel="nofollow" target="_blank">Blackstone, Naftel, and Turner (1986)</a> with a focus on behavioral parity, transparent numerics, and provides reproducible validation against reference outputs from the original <code>C</code>/<code>SAS</code> HAZARD program, originally developed at the University of Alabama at Birmingham. The generalized temporal decomposition family extends to longitudinal mixed-effects settings <a href="https://journals.sagepub.com/doi/10.1177/0962280215623583" rel="nofollow" target="_blank">Rajeswaran et al. (2018)</a>. There are eight vignettes, including <a href="https://cran.r-project.org/web/packages/TemporalHazard/vignettes/mf-mathematical-foundations.html" rel="nofollow" target="_blank">Mathematical Foundations</a> and <a href="https://cran.r-project.org/web/packages/TemporalHazard/vignettes/prediction-visualization.html" rel="nofollow" target="_blank">Prediction &#038; Visualization</a>.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/TemporalHazard.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-16" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/TemporalHazard.png?w=578&#038;ssl=1" class="img-fluid" alt="Plot of cumulative and instantaneous hazard functions" data-recalc-dims="1"></a></p>
</section>
<section id="surveys" class="level3">
<h3 class="anchored" data-anchor-id="surveys">Surveys</h3>
<p><a href="https://cran.r-project.org/package=stepssurvey" rel="nofollow" target="_blank">stepssurvey</a> v0.1.0: Provides a complete analysis pipeline for the WHO STEPwise Approach to NCD Risk Factor Surveillance (STEPS) as described in <a href="https://ajph.aphapublications.org/doi/full/10.2105/AJPH.2015.302962" rel="nofollow" target="_blank">Riley et al. (2016)</a>. Imports raw survey data (<code>CSV</code>, <code>Excel</code>, <code>Stata</code>, <code>SPSS</code>), applies WHO-standard cleaning and re-coding, sets up complex survey designs, computes all standard NCD indicators, and generates publication-ready tables, visualizations, and reports. There are four vignettes, including <a href="https://cran.r-project.org/web/packages/stepssurvey/vignettes/data-preparation.html" rel="nofollow" target="_blank">Preparing STEPS Data for Analysis</a> and <a href="https://cran.r-project.org/web/packages/stepssurvey/vignettes/shiny-walkthrough.html" rel="nofollow" target="_blank">Interactive Analysis with the Shiny App</a>.</p>
<p><a href="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/steps.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-17" rel="nofollow" target="_blank"><img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/steps.png?w=578&#038;ssl=1" class="img-fluid" alt="Plot of NCD Risk Factor Analysis" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=surveycore" rel="nofollow" target="_blank">surveycore</a> v1.0.0: Implements a modern, <code>S7</code>-based foundation for survey analysis spanning both probability and non-probability samples. Probability sample designs include Taylor series linearization, replicate weights (BRR, Fay, jackknife, bootstrap), and two-phase estimation, following <a href="https://www.jstatsoft.org/article/view/v009i08" rel="nofollow" target="_blank">Lumley (2004)</a>. Non-probability sample designs support bootstrap and jackknife variance estimation for opt-in panels and convenience samples. There are three vignettes, including <a href="https://cran.r-project.org/web/packages/surveycore/vignettes/getting-started.html" rel="nofollow" target="_blank">Getting Started</a> and <a href="https://cran.r-project.org/web/packages/surveycore/vignettes/surveycore-vs-survey.html" rel="nofollow" target="_blank">surveycore vs. survey and srvyr</a>.</p>
<p><a href="https://cran.r-project.org/package=surveyframe" rel="nofollow" target="_blank">surveyframe</a> v0.3.2: Supports survey research workflows built around a typed instrument object, <em>the sframe</em>. Features include visual instrument design via a browser-based builder or <code>Shiny</code>, exporting to a self-contained static HTML survey, an embeddable <code>Shiny</code>module, SHA-256 integrity-checked serialisation, multi-page survey rendering, branching logic, response quality checking, scale scoring, psychometric diagnostics and more. There are seven vignettes including <a href="https://cran.r-project.org/web/packages/surveyframe/vignettes/analysing-survey-responses.html" rel="nofollow" target="_blank">analyzing survey responses</a> and <a href="https://cran.r-project.org/web/packages/surveyframe/vignettes/building-survey-instrument.html" rel="nofollow" target="_blank">Building a survey instrument</a>.</p>
</section>
<section id="time-series" class="level3">
<h3 class="anchored" data-anchor-id="time-series">Time Series</h3>
<p><a href="https://cran.r-project.org/package=icomb" rel="nofollow" target="_blank">icomb</a> v0.2.0: Implements the Information Combination (IComb) approach proposed by <a href="https://www.monash.edu/business/ebs/research/publications/ebs/2025/wp11-2025.pdf" rel="nofollow" target="_blank">Nguyen, Vahid and Wickramasuriya (2025)</a> for hierarchical forecast reconciliation. The method combines information from base forecasts constructed using different information sets while ensuring coherence. See the <a href="https://cran.r-project.org/web/packages/icomb/vignettes/icomb.html" rel="nofollow" target="_blank">vignette</a>.</p>
<p><a href="https://cran.r-project.org/package=fable.bayesRecon" rel="nofollow" target="_blank">fable.bayesRecon</a> v0.1.0: Implements probabilistic reconciliation methods within the <code>fable</code> framework for hierarchical time series forecasting following <code>fable</code> conventions. See the <a href="https://cran.r-project.org/web/packages/fable.bayesRecon/vignettes/fable.bayesRecon.html" rel="nofollow" target="_blank">vignette</a> for examples and the following for methodological background: <a href="https://link.springer.com/chapter/10.1007/978-3-030-67664-3_13" rel="nofollow" target="_blank">Corani et al. (2021)</a>, <a href="https://link.springer.com/article/10.1007/s11222-023-10343-y" rel="nofollow" target="_blank">Zambon et al. (2024a)</a>, <a href="https://proceedings.mlr.press/v244/zambon24a.html" rel="nofollow" target="_blank">Zambon et al. (2024b)</a>, and <a href="https://arxiv.org/abs/2506.19554" rel="nofollow" target="_blank">Carrara et al. (2025)</a>.</p>
<p><a href="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/bayesRecon.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-18" rel="nofollow" target="_blank"><img src="https://i1.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/bayesRecon.png?w=578&#038;ssl=1" class="img-fluid" alt="Aggregated time series with base and reconciled forecasts" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=mixtime" rel="nofollow" target="_blank">mixtime</a> v0.1.0: Provides flexible time classes for time series analysis and forecasting with mixed temporal granularities. Supports linear and cyclical time representations in discrete and continuous forms, with timezone support, across multiple calendar systems, including Gregorian and ISO week date calendars. Calendrical arithmetic enables conversion between time granules (e.g., days to months) and calendar systems. Multi-unit arithmetic allows for temporal analysis with other granules of common calendars. Time vectors of different granularities (e.g., monthly and quarterly) can be combined in a single vector. See the vignettes <a href="https://cran.r-project.org/web/packages/mixtime/vignettes/extending-mixtime.html" rel="nofollow" target="_blank">Extending mixtime</a> and <a href="https://cran.r-project.org/web/packages/mixtime/vignettes/time-format-strings.html" rel="nofollow" target="_blank">Time format strings</a>.</p>
<p><a href="https://cran.r-project.org/package=ModalForecast" rel="nofollow" target="_blank">ModalForecast</a> v0.1.0: Implements parametric modal Autoregressive Integrated Moving Average (ARIMA) models utilizing the Skewed Distribution family. Supported distributions include the Skew-Normal, Skewed Student-t, and Skewed Laplace. Features include comprehensive residual diagnostics, robustness options (heavy tails, asymmetry), robust parametric bootstrap prediction intervals, and classical asymptotic inference via the Fisher Information matrix. Methods are described in <a href="https://onlinelibrary.wiley.com/doi/10.1002/sta4.140" rel="nofollow" target="_blank">Galarza et al. (2017)</a>. Look <a href="https://github.com/chedgala/ModalForecast" rel="nofollow" target="_blank">here</a> for an example.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/ModalForecast.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-19" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/ModalForecast.png?w=578&#038;ssl=1" class="img-fluid" alt="Skew normal Modal (ARIMA (3,0,4) diagnostics" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=VARcheck" rel="nofollow" target="_blank">VARcheck</a> v0.1.0: Provides model-agnostic visual diagnostics for vector autoregressive models. Given empirical data, model predictions, residuals, and optionally simulated data, the package assembles a multi-panel diagnostic grid: empirical vs. predicted time series, residual inspection, residuals vs. predictions scatter, and posterior predictive style checks via simulated trajectories. See <a href="https://osf.io/preprints/psyarxiv/k6uz4_v3" rel="nofollow" target="_blank">Haslbeck et al. (2026)</a> for the approach followed and the vignettes <a href="https://cran.r-project.org/web/packages/VARcheck/vignettes/example-analyses.html" rel="nofollow" target="_blank">Example analyses</a> and <a href="https://cran.r-project.org/web/packages/VARcheck/vignettes/getting-started.html" rel="nofollow" target="_blank">Getting Started</a>.</p>
<p><a href="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/VARcheck.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-20" rel="nofollow" target="_blank"><img src="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/VARcheck.png?w=578&#038;ssl=1" class="img-fluid" alt="Diagnostic plots on grid" data-recalc-dims="1"></a></p>
</section>
<section id="utilities" class="level3">
<h3 class="anchored" data-anchor-id="utilities">Utilities</h3>
<p><a href="https://cran.r-project.org/package=DT2" rel="nofollow" target="_blank">DT2</a> v0.1.2: Implements a modern <code>R</code> binding for <code>DataTables</code> V2 with modular extension loading, <code>Bootstrap 5</code> styling, <code>Shiny</code> integration (proxy, events, inline inputs), server-side processing helpers, and standalone support. Configure <code>DataTables</code> options directly via R lists, a 1:1 mapping to the <code>JavaScript</code> API. There are five vignettes, including <a href="https://cran.r-project.org/web/packages/DT2/vignettes/getting-started.html" rel="nofollow" target="_blank">Getting Started</a> and <a href="https://cran.r-project.org/web/packages/DT2/vignettes/shiny-integration.html" rel="nofollow" target="_blank">Shiny Integration</a>.</p>
<p><a href="https://cran.r-project.org/package=gridmicrotex" rel="nofollow" target="_blank">gridmicrotex</a> v0.0.4: Provides functions to render <code>LaTeX</code> math equations as native <code>R</code> grid graphics objects (grobs) using the <code>MicroTeX</code> <code>C++</code> library as the layout engine. Produces resolution-independent vector output that works on any <code>R</code> graphics device, with no external <code>LaTeX</code> installation required. See the vignettes <a href="https://cran.r-project.org/web/packages/gridmicrotex/vignettes/getting-started.html" rel="nofollow" target="_blank">Introduction</a> and <a href="https://cran.r-project.org/web/packages/gridmicrotex/vignettes/ggplot2-integration.html" rel="nofollow" target="_blank">Using LaTeX Math in ggplot2</a>.</p>
<p><a href="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/gridmicrotex.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-21" rel="nofollow" target="_blank"><img src="https://i0.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/gridmicrotex.png?w=578&#038;ssl=1" class="img-fluid" alt="Regression plot with equation" data-recalc-dims="1"></a></p>
</section>
<section id="visualization" class="level3">
<h3 class="anchored" data-anchor-id="visualization">Visualization</h3>
<p><a href="https://cran.r-project.org/package=ggsql" rel="nofollow" target="_blank">ggsql</a> v0.3.3: Provides functions to write queries that combine <code>SQL</code> (Structured Query Language) data retrieval with visualization specifications in a single, composable syntax, binds directly with the <code>ggsql</code> <code>Rust</code> library, and offers <code>knitr</code> and <code>Shiny</code> integration. See the vignettes <a href="https://cran.r-project.org/web/packages/ggsql/vignettes/ggsql.html" rel="nofollow" target="_blank">Getting started</a> and <a href="https://cran.r-project.org/web/packages/ggsql/vignettes/engine.html" rel="nofollow" target="_blank">The ggsql knitr engine</a>.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/ggsql.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-22" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/ggsql.png?w=578&#038;ssl=1" class="img-fluid" alt="ggplot2 rendering of a SQL query" data-recalc-dims="1"></a></p>
<p><a href="https://cran.r-project.org/package=mSigPlot" rel="nofollow" target="_blank">mSigPlot</a> v2.0.38: Provides plotting functions for mutational signatures and mutational spectra, including single base substitutions, doublet base substitutions, and small insertions and deletions. Generates plots similar to those used previously in <a href="https://www.nature.com/articles/s41586-020-1943-3" rel="nofollow" target="_blank">Alexandrov et al. (2020)</a> and <a href="https://zenodo.org/records/20147372" rel="nofollow" target="_blank">Rozen et al. (2026)</a>. See the <a href="https://cran.r-project.org/web/packages/mSigPlot/vignettes/mSigPlot.html" rel="nofollow" target="_blank">vignette</a> for an example.</p>
<p><a href="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/mSigPlot.png?ssl=1" class="lightbox" data-gallery="quarto-lightbox-gallery-23" rel="nofollow" target="_blank"><img src="https://i2.wp.com/rworks.dev/posts/may-2026-top-40-new-cran-packages/mSigPlot.png?w=578&#038;ssl=1" class="img-fluid" alt="Plot of mutation classes" data-recalc-dims="1"></a></p>
</section>
</div>
</div>



 
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://rworks.dev/posts/may-2026-top-40-new-cran-packages/"> R Works</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/may-2026-top-40-new-cran-packages/">May 2026 Top 40 New CRAN Packages</a>]]></content:encoded>
					
		
		<enclosure url="https://rworks.dev/posts/may-2026-top-40-new-cran-packages/bvarnet.png" length="0" type="image/png" />

		<post-id xmlns="com-wordpress:feed-additions:1">402366</post-id>	</item>
		<item>
		<title>rOpenSci News Digest, June 2026</title>
		<link>https://www.r-bloggers.com/2026/06/ropensci-news-digest-june-2026/</link>
		
		<dc:creator><![CDATA[rOpenSci]]></dc:creator>
		<pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://ropensci.org/blog/2026/06/30/news-june-2026/</guid>

					<description><![CDATA[<p>Dear rOpenSci friends, it’s time for our monthly news roundup!  You can read this post on our blog. Now let’s dive into the activity at and around rOpenSci!</p>
<p>rOpenSci HQ</p>
<p>Champions Program update<br />
We have two concurrent cohorts, both in Sp...</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/ropensci-news-digest-june-2026/">rOpenSci News Digest, June 2026</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://ropensci.org/blog/2026/06/30/news-june-2026/"> rOpenSci - open tools for open science</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<!-- Before sending DELETE THE INDEX_CACHE and re-knit! -->
<p>Dear rOpenSci friends, it’s time for our monthly news roundup! <!-- blabla --> You can read this post <a href="https://ropensci.org/blog/2026/06/30/news-june-2026" rel="nofollow" target="_blank">on our blog</a>. Now let’s dive into the activity at and around rOpenSci!</p>
<h2>
rOpenSci HQ
</h2><h3>
Champions Program update
</h3><p>We have two concurrent cohorts, both in Spanish.</p>
<p>The 2025–2026 cohort is nearing the end of its participation in the program, so we are organizing the closing meeting and the overall evaluation.</p>
<p>The 2026–2027 cohort is continuing their training activities, meeting with their mentors, and starting to work on their packages, and they have been formally introduced on our blog! Read all about the <a href="https://ropensci.org/blog/2026/06/09/champions-2026/" rel="nofollow" target="_blank">11 new Champions</a>.</p>
<h3>
New editors Ronny Hernandez Mora, Joel Nitta, and Nick Tierney
</h3><p>We’re thrilled to <a href="https://ropensci.org/blog/2026/06/11/neweditorsq22026/" rel="nofollow" target="_blank">introduce</a> new editors Ronny Hernandez Mora, Joel Nitta, and Nick Tierney. An official welcome and thank you to all three!</p>
<h3>
A new guide: Organizing Events for First-time Contributors
</h3><p>Steffi LaZerte and Yanina Bellini Saibene released a fantastic new rOpenSci guide! Learn how to organize events for first-time contributors such as mini-hackathons and mini-translathons. Read more in the <a href="https://ropensci.org/blog/2026/06/02/ftc-guide/" rel="nofollow" target="_blank">release announcement</a>.</p>
<h3>
R-Universe updates
</h3><p>“Five recent R-Universe features you might have missed”: A clickbait title for a blog post you don’t want to miss! <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Jeroen Ooms <a href="https://ropensci.org/blog/2026/06/07/r-universe-updates/" rel="nofollow" target="_blank">describes five recent additions</a> to the R-Universe platform:</p>
<ul>
<li>Social media cards that actually look good</li>
<li>PACKAGES.rds support (or: implementing R internals in JavaScript)</li>
<li>Fancy sort/filter bars in the WebUI</li>
<li>For the impatient: trigger a sync manually</li>
<li>Making check results easier to find and share</li>
</ul>
<p>In other news, R-universe user Tom Palmer also wrote about five things: <a href="https://remlapmot.github.io/post/2026/runiverse-tips/" rel="nofollow" target="_blank">“Five tips for managing your R-universe <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" />”</a>. You won’t believe the fifth one. <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h3>
Yanina Joins the 2026 Sovereign Tech Fellowship
</h3><p>We’re excited to share that our Community Manager, Yanina Bellini Saibene, <a href="https://www.sovereign.tech/news/meet-the-2026-sovereign-tech-fellows" rel="nofollow" target="_blank">has been selected as a 2026 Sovereign Tech Fellow</a>. During the fellowship, she will focus on making open source more accessible through improved contribution guidance, newcomer-focused mini-hackathons, multilingual training resources, and more sustainable localization practices across communities in the R ecosystem. These efforts will build on and extend rOpenSci’s work in community building, mentorship, and open science.</p>
<h3>
<em>Quinceañera</em>: celebrating 15 years together
</h3><p>In June, we held two community events and a co-working session to mark rOpenSci’s 15th anniversary. Across all three sessions, people shared memories of their first contribution, discussed ideas for the next 15 years, and reminded us of how genuinely welcoming rOpenSci <em>and</em> it’s community are. There’s more to come <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Keep an eye out for what we have planned for the rest of the year.</p>
<h3>
Software Peer-Review updates
</h3><p>Community member <a href="https://ropensci.org/author/athanasia-mo-mowinckel/" rel="nofollow" target="_blank">Athanasia Mo Mowinckel</a> has started a new AI agent “skills” repo at <a href="https://github.com/ropensci-review-tools/ropensci-skills" rel="nofollow" target="_blank"><code>ropensci-review-tools/ropensci-skills</code></a>. The repo holds a variety of “skills”, which are human-readable markdown files, for AI agents to assist in preparing software for peer-review. Anybody thinking about using AI systems to prepare software for peer-review is encouraged to try out these experimental skills, and to help us improve them for others by opening issues or pull requests in <a href="https://github.com/ropensci-review-tools/ropensci-skills" rel="nofollow" target="_blank">the GitHub repo</a>.</p>
<p>Our recent updates to the <a href="https://ropensci.org/blog/2026/06/01/goodpractice/" rel="nofollow" target="_blank">goodpractice package</a> have also been enhanced with an all-new AI “skill”. <a href="https://github.com/ropensci-review-tools/goodpractice/blob/main/inst/skills/goodpractice4agents.md" rel="nofollow" target="_blank">This skill</a> instructs agents to edit and improve your package’s code to comply with the full suite of goodpractice checks. You can try it out with the package’s new <a href="https://docs.ropensci.org/goodpractice/reference/use_skill_gp.html" rel="nofollow" target="_blank"><code>use_skill_gp()</code> function</a>.</p>
<h3>
Coworking
</h3><p>Read <a href="https://ropensci.org/blog/2023/06/21/coworking/" rel="nofollow" target="_blank">all about coworking</a>!</p>
<ul>
<li>Tuesday July 7nd 2026, 09:00 Americas Pacific (16:00 UTC) <a href="https://ropensci.org/events/coworking-2026-07/" rel="nofollow" target="_blank">“Debugging in R”</a>, with <a href="https://ropensci.org/author/yanina-bellini-saibene/" rel="nofollow" target="_blank">Yanina Bellini Saibene</a> and cohost <a href="https://ropensci.org/author/shannon-pileggi" rel="nofollow" target="_blank">Shannon Pileggi</a>.
<ul>
<li>Read up on debugging in R.</li>
<li>Meet community host, Shannon Pileggi, and discuss tips and tricks for debugging in R.</li>
</ul>
</li>
<li>Tuesday August 4th, 09:00 Australia Western (01:00 UTC) <a href="https://ropensci.org/events/coworking-2026-08/" rel="nofollow" target="_blank">“Vale and Text Linting”</a>, with <a href="https://ropensci.org/author/steffi-lazerte" rel="nofollow" target="_blank">Steffi LaZerte</a> and cohost <a href="https://ropensci.org/author/jonathan-carroll/" rel="nofollow" target="_blank">Jonathan Carroll</a>.
<ul>
<li>Read up on text linting.</li>
<li>Setup a linting framework for your projects.</li>
<li>Meet co-host, Jonathan Carroll, and discuss Vale and text linting.</li>
</ul>
</li>
<li>Tuesday September 1st, 14:00 Europe Central (12:00 UTC) <a href="https://ropensci.org/events/coworking-2026-09/" rel="nofollow" target="_blank">“Getting to Know SORTEE”</a>, with <a href="https://ropensci.org/author/steffi-lazerte" rel="nofollow" target="_blank">Steffi LaZerte</a> and cohost <a href="https://ropensci.org/author/ed-ivimey-cook/" rel="nofollow" target="_blank">Ed Ivimey-Cook</a>.
<ul>
<li>Visit <a href="https://sortee.org/" rel="nofollow" target="_blank">SORTEE</a> (Society for Open, Reliable, and Transparent Ecology and Evolutionary Biology).</li>
<li>Meet co-host, Ed Ivimey-Cook, and learn more about SORTEE and how you might get involved.</li>
</ul>
</li>
</ul>
<p>And remember, you can always cowork independently on work related to R, work on packages that tend to be neglected, or work on what ever you need to get done!</p>
<h2>
Software <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f4e6.png" alt="📦" class="wp-smiley" style="height: 1em; max-height: 1em;" />
</h2><p>The following two packages recently became a part of our software suite:</p>
<ul>
<li>
<p><a href="https://docs.ropensci.org/pvEBayes" rel="nofollow" target="_blank">pvEBayes</a>, developed by Yihao Tan together with Marianthi Markatou, Saptarshi Chakraborty, and Raktim Mukhopadhyay: A suite of empirical Bayes methods to use in pharmacovigilance. Contains various model fitting and post-processing functions. For more details see Tan et al. (2025) <a href="https://doi.org/10.1002/sim.70195" rel="nofollow" target="_blank">https://doi.org/10.1002/sim.70195</a>, <a href="https://doi.org/10.48550/arXiv.2512.01057" rel="nofollow" target="_blank">https://doi.org/10.48550/arXiv.2512.01057</a>; Koenker and Mizera (2014) <a href="https://doi.org/10.1080/01621459.2013.869224" rel="nofollow" target="_blank">https://doi.org/10.1080/01621459.2013.869224</a>; Efron (2016) <a href="https://doi.org/10.1093/biomet/asv068" rel="nofollow" target="_blank">https://doi.org/10.1093/biomet/asv068</a>. It has been <a href="https://github.com/ropensci/software-review/issues/760" rel="nofollow" target="_blank">reviewed</a> by Kathryn Doering and Collin Cademartori.</p>
</li>
<li>
<p><a href="https://docs.ropensci.org/nycOpenData" rel="nofollow" target="_blank">nycOpenData</a>, developed by Christian Martinez: Provides a unified set of helper functions to access datasets from the NYC Open Data platform <a href="https://opendata.cityofnewyork.us/" rel="nofollow" target="_blank">https://opendata.cityofnewyork.us/</a>. Functions return results as tidy tibbles and support optional filtering, sorting, and row limits via the Socrata API. The package includes endpoints for 311 service requests, DOB job applications, juvenile justice metrics, school safety, environmental data, event permitting, and additional citywide datasets. It has been <a href="https://github.com/ropensci/software-review/issues/750" rel="nofollow" target="_blank">reviewed</a> by Haolin Dong and Michael Pascale.</p>
</li>
</ul>
<p>Discover <a href="https://ropensci.org/packages" rel="nofollow" target="_blank">more packages</a>, read more about <a href="https://ropensci.org/software-review" rel="nofollow" target="_blank">Software Peer Review</a>.</p>
<h3>
New versions
</h3><p>The following seventeen packages have had an update since the last newsletter: <a href="https://docs.ropensci.org/weathercan" title="Download Weather Data from Environment and Climate Change Canada" rel="nofollow" target="_blank">weathercan</a> (<a href="https://github.com/ropensci/weathercan/releases/tag/v1.0.0" rel="nofollow" target="_blank"><code>v1.0.0</code></a>), <a href="https://docs.ropensci.org/occCite" title="Querying and Managing Large Biodiversity Occurrence Datasets" rel="nofollow" target="_blank">occCite</a> (<a href="https://github.com/ropensci/occCite/releases/tag/v0.6.2" rel="nofollow" target="_blank"><code>v0.6.2</code></a>), <a href="https://docs.ropensci.org/lightr" title="Read Spectrometric Data and Metadata" rel="nofollow" target="_blank">lightr</a> (<a href="https://github.com/ropensci/lightr/releases/tag/v2.0.0" rel="nofollow" target="_blank"><code>v2.0.0</code></a>), <a href="https://docs.ropensci.org/gutenbergr" title="Download and Process Public Domain Works from Project Gutenberg" rel="nofollow" target="_blank">gutenbergr</a> (<a href="https://github.com/ropensci/gutenbergr/releases/tag/v0.5.2" rel="nofollow" target="_blank"><code>v0.5.2</code></a>), <a href="https://docs.ropensci.org/slopes" title="Calculate Slopes of Roads, Rivers and Trajectories" rel="nofollow" target="_blank">slopes</a> (<a href="https://github.com/ropensci/slopes/releases/tag/v2.0.0" rel="nofollow" target="_blank"><code>v2.0.0</code></a>), <a href="https://docs.ropensci.org/qualtRics" title="Download Qualtrics Survey Data" rel="nofollow" target="_blank">qualtRics</a> (<a href="https://github.com/ropensci/qualtRics/releases/tag/v3.3.0" rel="nofollow" target="_blank"><code>v3.3.0</code></a>), <a href="https://docs.ropensci.org/srr" title="rOpenSci Software Review Roclets" rel="nofollow" target="_blank">srr</a> (<a href="https://github.com/ropensci-review-tools/srr/releases/tag/v1.0.0" rel="nofollow" target="_blank"><code>v1.0.0</code></a>), <a href="https://docs.ropensci.org/goodpractice" title="Advice on R Package Building" rel="nofollow" target="_blank">goodpractice</a> (<a href="https://github.com/ropensci-review-tools/goodpractice/releases/tag/v1.1" rel="nofollow" target="_blank"><code>v1.1</code></a>), <a href="https://docs.ropensci.org/pkgmatch" title="Find R Packages Matching Either Descriptions or Other R Packages" rel="nofollow" target="_blank">pkgmatch</a> (<a href="https://github.com/ropensci-review-tools/pkgmatch/releases/tag/v0.5.4" rel="nofollow" target="_blank"><code>v0.5.4</code></a>), <a href="https://docs.ropensci.org/pkgstats" title="Metrics of R Packages" rel="nofollow" target="_blank">pkgstats</a> (<a href="https://github.com/ropensci-review-tools/pkgstats/releases/tag/v0.2.3" rel="nofollow" target="_blank"><code>v0.2.3</code></a>), <a href="https://docs.ropensci.org/cffr" title="Generate Citation File Format (CFF) Metadata for R Packages" rel="nofollow" target="_blank">cffr</a> (<a href="https://github.com/ropensci/cffr/releases/tag/v1.4.1" rel="nofollow" target="_blank"><code>v1.4.1</code></a>), <a href="https://docs.ropensci.org/dfms" title="Dynamic Factor Models" rel="nofollow" target="_blank">dfms</a> (<a href="https://github.com/ropensci/dfms/releases/tag/v1.0.1" rel="nofollow" target="_blank"><code>v1.0.1</code></a>), <a href="https://docs.ropensci.org/osmdata" title="Import OpenStreetMap Data as Simple Features or Spatial Objects" rel="nofollow" target="_blank">osmdata</a> (<a href="https://github.com/ropensci/osmdata/releases/tag/v0.4.0" rel="nofollow" target="_blank"><code>v0.4.0</code></a>), <a href="https://docs.ropensci.org/aRxiv" title="Interface to the arXiv API" rel="nofollow" target="_blank">aRxiv</a> (<a href="https://github.com/ropensci/aRxiv/releases/tag/0.20" rel="nofollow" target="_blank"><code>0.20</code></a>), <a href="https://docs.ropensci.org/Athlytics" title="A Reproducible Framework for Endurance Data Analysis" rel="nofollow" target="_blank">Athlytics</a> (<a href="https://github.com/ropensci/Athlytics/releases/tag/v1.0.6" rel="nofollow" target="_blank"><code>v1.0.6</code></a>), <a href="https://docs.ropensci.org/ReLTER" title="An Interface for the eLTER Community" rel="nofollow" target="_blank">ReLTER</a> (<a href="https://github.com/ropensci/ReLTER/releases/tag/3.1.1" rel="nofollow" target="_blank"><code>3.1.1</code></a>), and <a href="https://docs.ropensci.org/read.abares" title="Read Australian Agricultural Data from Government Agencies" rel="nofollow" target="_blank">read.abares</a> (<a href="https://github.com/ropensci/read.abares/releases/tag/v3.0.0" rel="nofollow" target="_blank"><code>v3.0.0</code></a>).</p>
<p>The writexl package has a <a href="https://github.com/ropensci/writexl/pull/98#issuecomment-4191858158" rel="nofollow" target="_blank">new maintainer</a>, Bill Denney. NLMR is now maintained by <a href="https://github.com/ropensci/NLMR/issues/116#issuecomment-4280937012" rel="nofollow" target="_blank">Jakub Nowosad</a>.</p>
<h2>
Software Peer Review
</h2><p>There are eighteen recently closed and active submissions and 4 submissions on hold. Issues are at different stages:</p>
<ul>
<li>
<p>Four at <a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%226/approved%22" rel="nofollow" target="_blank">‘6/approved’</a>:</p>
<ul>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/760" rel="nofollow" target="_blank">pvEBayes</a>, Empirical Bayes Methods for Pharmacovigilance. Submitted by <a href="https://github.com/YihaoTancn" rel="nofollow" target="_blank">Yihao Tan</a>. (Stats).</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/750" rel="nofollow" target="_blank">nycOpenData</a>, Convenient Access to NYC Open Data API Endpoints. Submitted by <a href="https://github.com/martinezc1" rel="nofollow" target="_blank">Christian Martinez</a>.</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/730" rel="nofollow" target="_blank">ernest</a>, A Toolkit for Nested Sampling. Submitted by <a href="https://github.com/kylesnap" rel="nofollow" target="_blank">Kyle Dewsnap</a>. (Stats).</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/671" rel="nofollow" target="_blank">pkgmatch</a>, Find R Packages Matching Either Descriptions or Other R Packages. Submitted by <a href="https://mpadge.github.io/" rel="nofollow" target="_blank">mark padgham</a>.</p>
</li>
</ul>
</li>
<li>
<p>Two at <a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%225/awaiting-reviewer(s)-response%22" rel="nofollow" target="_blank">‘5/awaiting-reviewer(s)-response’</a>:</p>
<ul>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/762" rel="nofollow" target="_blank">lakefetch</a>, Calculate Fetch and Wave Exposure for Lake Sampling Points. Submitted by <a href="https://github.com/jeremylfarrell" rel="nofollow" target="_blank">jeremylfarrell</a>.</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/704" rel="nofollow" target="_blank">priorsense</a>, Prior Diagnostics and Sensitivity Analysis. Submitted by <a href="https://github.com/n-kall" rel="nofollow" target="_blank">Noa Kallioinen</a>. (Stats).</p>
</li>
</ul>
</li>
<li>
<p>Five at <a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%224/review(s)-in-awaiting-changes%22" rel="nofollow" target="_blank">‘4/review(s)-in-awaiting-changes’</a>:</p>
<ul>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/744" rel="nofollow" target="_blank">RAQSAPI</a>, A Simple Interface to the US EPA Air Quality System Data Mart API. Submitted by <a href="https://github.com/mccroweyclinton-EPA" rel="nofollow" target="_blank">mccroweyclinton-EPA</a>.</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/743" rel="nofollow" target="_blank">RAMEN</a>, RAMEN: Regional Association of Methylome variability with the Exposome and geNome. Submitted by <a href="https://erick-navarrodelgado.netlify.app/" rel="nofollow" target="_blank">Erick Navarro-Delgado</a>.</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/741" rel="nofollow" target="_blank">logolink</a>, An Interface for Running NetLogo Simulations. Submitted by <a href="https://danielvartan.com/" rel="nofollow" target="_blank">Daniel Vartanian</a>.</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/718" rel="nofollow" target="_blank">rcrisp</a>, Automate the Delineation of Urban River Spaces. Submitted by <a href="https://github.com/cforgaci" rel="nofollow" target="_blank">Claudiu Forgaci</a>. (Stats).</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/615" rel="nofollow" target="_blank">galamm</a>, Generalized Additive Latent and Mixed Models. Submitted by <a href="https://osorensen.no/" rel="nofollow" target="_blank">Øystein Sørensen</a>. (Stats).</p>
</li>
</ul>
</li>
<li>
<p>Two at <a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%223/reviewer(s)-assigned%22" rel="nofollow" target="_blank">‘3/reviewer(s)-assigned’</a>:</p>
<ul>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/765" rel="nofollow" target="_blank">ciecl</a>, International Classification of Diseases ICD-10/ICD-11 for Chile. Submitted by <a href="https://github.com/Rodotasso" rel="nofollow" target="_blank">Rodolfo Tasso</a>.</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/763" rel="nofollow" target="_blank">EpiStrainDynamics</a>, Infer temporal trends of multiple pathogens. Submitted by <a href="https://www.smwindecker.com/" rel="nofollow" target="_blank">Saras Windecker</a>. (Stats).</p>
</li>
</ul>
</li>
<li>
<p>Two at <a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%222/seeking-reviewer(s)%22" rel="nofollow" target="_blank">‘2/seeking-reviewer(s)’</a>:</p>
<ul>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/740" rel="nofollow" target="_blank">fcmconfr</a>, Fuzzy Cognitive Map Analysis in R. Submitted by <a href="https://github.com/bhroston" rel="nofollow" target="_blank">benroston</a>. (Stats).</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/717" rel="nofollow" target="_blank">coevolve</a>, Fit Bayesian Generalized Dynamic Phylogenetic Models using Stan. Submitted by <a href="https://scottclaessens.github.io/" rel="nofollow" target="_blank">Scott Claessens</a>. (Stats).</p>
</li>
</ul>
</li>
<li>
<p>Three at <a href="https://github.com/ropensci/software-review/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%221/editor-checks%22" rel="nofollow" target="_blank">‘1/editor-checks’</a>:</p>
<ul>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/775" rel="nofollow" target="_blank">grumpy</a>, Read NumPy .npy and .npz Files. Submitted by <a href="https://hugogruson.fr/" rel="nofollow" target="_blank">Hugo Gruson</a>.</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/752" rel="nofollow" target="_blank">metasurvey</a>, Reproducible Survey Data Processing with Step Pipelines. Submitted by <a href="https://github.com/mauroloprete" rel="nofollow" target="_blank">Mauro Loprete</a>.</p>
</li>
<li>
<p><a href="https://github.com/ropensci/software-review/issues/725" rel="nofollow" target="_blank">LBDiscoverAnalysis</a>, Co-occurrence Discovery Models and Visualization for Biomedical LBD. Submitted by <a href="https://github.com/chaoliu-cl" rel="nofollow" target="_blank">Chao Liu</a>.</p>
</li>
</ul>
</li>
</ul>
<p>Find out more about <a href="https://ropensci.org/software-review" rel="nofollow" target="_blank">Software Peer Review</a> and how to get involved.</p>
<h2>
On the blog
</h2><!-- Do not forget to rebase your branch! -->
<h3>
Software Review
</h3><ul>
<li>
<p><a href="https://ropensci.org/blog/2026/06/11/neweditorsQ22026" rel="nofollow" target="_blank">Ronny Hernandez Mora, Joel Nitta, and Nick Tierney Join rOpenSci Software Peer Review Editorial Team</a> by Ronny Hernandez Mora, Joel Nitta, Nicholas Tierney, and Yanina Bellini Saibene. Introducing three new editors for rOpenSci software peer review.</p>
</li>
<li>
<p><a href="https://ropensci.org/blog/2026/06/19/maintainers-month" rel="nofollow" target="_blank">Celebrating Our Maintainers during Maintainers Month</a> by Yanina Bellini Saibene. A Look Back at our Maintainer Month 2026 social media campaign.</p>
</li>
<li>
<p><a href="https://ropensci.org/blog/2026/06/01/goodpractice" rel="nofollow" target="_blank">Our goodpractice Package Has New Superpowers</a> by Mark Padgham and Athanasia Mo Mowinckel. We have worked hard over the past few months on major upgrades to our goodpractice package. Checks are now grouped into categories, making it easier to control which checks are run. The biggest change has been adding over 100 new checks, from new lints to many new CRAN checks.</p>
</li>
<li>
<p><a href="https://ropensci.org/blog/2026/06/02/ftc-guide" rel="nofollow" target="_blank">A New Guide: Organizing Events for First-time Contributors</a> by Steffi LaZerte and Yanina Bellini Saibene. We introduce our Guide book for organizing events to support first-time contributors to FOSS.</p>
</li>
<li>
<p><a href="https://ropensci.org/blog/2026/06/07/r-universe-updates" rel="nofollow" target="_blank">Five recent R-universe features you might have missed</a> by Jeroen Ooms. In this technote we look at a few recent additions that make R-universe a little nicer, faster, or more convenient to use.</p>
</li>
<li>
<p><a href="https://ropensci.org/blog/2026/06/09/champions-2026" rel="nofollow" target="_blank">Eleven Latin American Voices for Open Science: The New Cohort of Champions rOpenSci 2026</a> by Bastián Olea Herrera, Denisse Fierro Arcos, Durga Valentina Linares Herrera, Evelia Lorena Coss Navarrete, Gladys Choque Ulloa, José Daniel Conejeros, Linda Cabrera Orellana, María Florencia Tames, Marina Cecilia Cock, Patricia A. Loto, Estefania Torrejón, and Yanina Bellini Saibene. Introducing 11 new rOpenSci Champions. Other languages: <a href='https://ropensci.org/es/blog/2026/06/09/champions-2026' lang='es' rel="nofollow" target="_blank">Once voces latinoamericanas para la ciencia abierta: la nueva cohorte de Campeon(a|e)s rOpenSci 2026 (es)</a>.</p>
</li>
</ul>
<h2>
Calls for contributions
</h2><h3>
Calls for maintainers
</h3><p>If you’re interested in maintaining any of the R packages below, you might enjoy reading our blog post <a href="https://ropensci.org/blog/2023/02/07/what-does-it-mean-to-maintain-a-package/" rel="nofollow" target="_blank">What Does It Mean to Maintain a Package?</a>.</p>
<ul>
<li>
<p><a href="https://docs.ropensci.org/charlatan" rel="nofollow" target="_blank">charlatan</a>, create fake data in R. <a href="https://github.com/ropensci/charlatan/issues/150" rel="nofollow" target="_blank">Issue for volunteering</a>.</p>
</li>
<li>
<p><a href="https://docs.ropensci.org/hddtools" rel="nofollow" target="_blank">hddtools</a>, Tools to discover hydrological data, accessing catalogues and databases from various data providers. <a href="https://github.com/ropensci/hddtools/issues/36" rel="nofollow" target="_blank">Issue for volunteering</a>.</p>
</li>
</ul>
<h3>
Calls for contributions
</h3><p>Refer to our <a href="https://ropensci.org/help-wanted/" rel="nofollow" target="_blank">help wanted page</a> – before opening a PR, we recommend asking in the issue whether help is still needed.</p>
<h2>
Package development corner
</h2><p>Some useful information for R package developers. <img src="https://s.w.org/images/core/emoji/13.0.0/72x72/1f440.png" alt="👀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h3>
goodpractice’s new features and behind-the-scene notes
</h3><p>Software Review Lead Mark Padgham and long-time community member <a href="https://ropensci.org/author/athanasia-mo-mowinckel/" rel="nofollow" target="_blank">Athanasia Mo Mowinckel</a> have written a blog post particularly relevant to package developers for two reasons:</p>
<ul>
<li>Learn how goodpractice, which helps make your package better, has improved.</li>
<li>Read how Mark and Mo collaborated, including their use of LLMs in the development process.</li>
</ul>
<h3>
Dumb Ways for an Open Source Project to Die
</h3><p>If you’re interested in open-source software projects’ survivability, you’ll enjoy this <a href="https://nesbitt.io/2026/05/19/dumb-ways-for-an-open-source-project-to-die.html" rel="nofollow" target="_blank">write-up by Andrew Nesbitt</a> shared by Yanina Bellini Saibene.</p>
<h3>
Refactoring with Jarl: unused functions and more
</h3><p>Hannah Frick and Maëlle Salmon wrote <a href="https://blog.r-hub.io/2026/06/02/jarl/" rel="nofollow" target="_blank">“Refactoring with Jarl: a coffee chat”</a> on the R-hub blog.</p>
<h3>
A strategy for recovering data on request interruption
</h3><p>Gábor Csárdi summarized <a href="https://gaborcsardi.org/2026/gh-1-6-0-recover-from-interruption/" rel="nofollow" target="_blank">recent changes to the gh package</a>. Especially interesting is his strategy for <a href="https://gaborcsardi.org/2026/gh-1-6-0-recover-from-interruption/#Interrupts" rel="nofollow" target="_blank">interruptions</a>: the user starts a long query then interrupts the process… how to not lose the data that’s already been received? The solution is to make it accessible through <a href="https://rlang.r-lib.org/reference/last_error.html" rel="nofollow" target="_blank"><code>rlang::last_error()</code></a>. More details in the <a href="https://gaborcsardi.org/2026/gh-1-6-0-recover-from-interruption/#Interrupts" rel="nofollow" target="_blank">post</a>.</p>
<h3>
curl summer of bliss
</h3><p>The curl project <a href="https://daniel.haxx.se/blog/2026/06/15/curl-summer-of-bliss/" rel="nofollow" target="_blank">announced</a> that it will not accept any vulnerability report during the month of July this year. This is both the opportunity for maintainers to take a break, and to advertise paid curl support, in which there will be no interruption of service.</p>
<h3>
To conventionally commit or not
</h3><p>Sumner Evans wrote an interesting post <a href="https://sumnerevans.com/posts/software-engineering/stop-using-conventional-commits/" rel="nofollow" target="_blank">criticizing the conventional commits convention</a> (starting commits with e.g. <code>fix:</code> for bug fixes, <code>feat:</code> for new features, etc).</p>
<h3>
More than .gitignore
</h3><p>Nelson Figueroa wrote a useful <a href="https://nelson.cloud/.gitignore-isnt-the-only-way-to-ignore-files-in-git/" rel="nofollow" target="_blank">overview</a> of the different ways to make Git ignore some files.</p>
<h3>
How to work with LLMs without losing your skills
</h3><p>Vicki Boykis wrote an insightful post <a href="https://vickiboykis.com/2026/05/28/we-should-be-more-tired-than-the-model/" rel="nofollow" target="_blank">“We should be more tired than the model”</a> including pratical tips such as “Starting to use the agent only after I’ve spent 20 minutes on the problem” or “Discussing an agent’s proposed implementation with another person instead”.</p>
<h2>
Last words
</h2><p>Thanks for reading! If you want to get involved with rOpenSci, check out our <a href="https://contributing.ropensci.org/" rel="nofollow" target="_blank">Contributing Guide</a>. This guide will help direct you to the right place, whether you want to make code contributions, non-code contributions, or contribute in other ways such as through sharing use cases. You can also support our work through <a href="https://ropensci.org/donate" rel="nofollow" target="_blank">donations</a>.</p>
<p>If you haven’t subscribed to our newsletter yet, you can <a href="https://ropensci.org/news/" rel="nofollow" target="_blank">do so though our signup form</a>. Until it’s time for our next newsletter, you can keep in touch with us through our <a href="https://ropensci.org/" rel="nofollow" target="_blank">website</a>, <a href="https://hachyderm.io/@rOpenSci" rel="nofollow" target="_blank">Mastodon</a>, or <a href="https://www.linkedin.com/company/ropensci/" rel="nofollow" target="_blank">LinkedIn</a>. See you soon!</p>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://ropensci.org/blog/2026/06/30/news-june-2026/"> rOpenSci - open tools for open science</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/ropensci-news-digest-june-2026/">rOpenSci News Digest, June 2026</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402357</post-id>	</item>
		<item>
		<title>cp1919 is on CRAN</title>
		<link>https://www.r-bloggers.com/2026/06/cp1919-is-on-cran/</link>
		
		<dc:creator><![CDATA[https://pacha.dev/blog]]></dc:creator>
		<pubDate>Mon, 29 Jun 2026 23:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://pacha.dev/blog/2026/06/30/cp1919/index.html</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> Or how to plot a very famous album cover.</div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/cp1919-is-on-cran/">cp1919 is on CRAN</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://pacha.dev/blog/2026/06/30/cp1919/index.html"> https://pacha.dev/blog</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p>This dataset, found in one of my old external drives, corresponds to the famous plot from <a href="https://www.proquest.com/docview/302499144/abstract?sourcetype=Dissertations%20&#038;%20Theses" rel="nofollow" target="_blank"><em>Radio Observations of the Pulse Profiles and Dispersion Measures of Twelve Pulsars</em></a> (Craft, 1970).</p>
<p>This is broadly known as the Joy Division’s cover from <a href="https://en.wikipedia.org/wiki/Unknown_Pleasures" rel="nofollow" target="_blank"><em>Unknown Pleasures</em></a>. If you happen to know whom created the original CSV I used, please let me know so I can give proper credit.</p>
<p>The dataset contains “successive pulses from the first pulsar discovered, CP 1919, are here superimposed vertically. The pulses occur every 1.337 seconds. They are caused by rapidly spinning neutron star.” (The Cambridge Encyclopaedia of Astronomy, 1977)</p>
<p>Thanks to <a href="https://www.scientificamerican.com/blog/sa-visual/pop-culture-pulsar-origin-story-of-joy-division-s-unknown-pleasures-album-cover-video/" rel="nofollow" target="_blank">Scientific American</a>, there is a complete explanation of the dataset and its origin.</p>
<p>The contribution I made consists in:</p>
<ol>
<li>Easing the access to this very popular dataset.</li>
<li>Documenting everything and organizing the columns in a clear way (I hope).</li>
</ol>
<p>A few days ago I wrote about the Tidyverse/Shiny internals, so here I will show how to plot this dataset exactly like the very popular Joy Division t-shirts both with <code>ggplot2</code> and <code>tinyplot</code>. This is a good way to think more actively rather than resorting on muscular memory at my age and years using R.</p>

<h2>Install</h2>
<p>From CRAN</p>
<pre>install.packages(&quot;cp1919&quot;)</pre>
<p>From GitHub</p>
<pre>pak::pkg_install(&quot;pachadotdev/cp1919&quot;)</pre>

<h2>Read</h2>

<pre>library(cp1919)
head(pulsar)
  measurement time radio_intensity
1           1    1           -0.81
2           1    2           -0.91
3           1    3           -1.09
4           1    4           -1.00
5           1    5           -0.59
6           1    6           -0.82</pre>

<h2>Visualize</h2>

<h3>Simple plot</h3>
<p>This looks nothing like the Joy Division album cover but it is the starting point.</p>

<pre>library(ggplot2)

ggplot(pulsar) +
    geom_line(
        aes(x = time, y = radio_intensity)
    ) +
    facet_wrap(~measurement)</pre>

<p><img src="https://i2.wp.com/pacha.dev/blog/2026/06/30/cp1919/plot0-1.png?w=450&#038;ssl=1" class="img-fluid figure-img"  data-recalc-dims="1"></p>

<pre>library(tinyplot)

plt(
    radio_intensity ~ time,
    data = pulsar,
    facet = ~measurement
)</pre>

<p><img src="https://i0.wp.com/pacha.dev/blog/2026/06/30/cp1919/plot0-2-1.png?w=450&#038;ssl=1" class="img-fluid figure-img"  data-recalc-dims="1"></p>

<h3>The Cambridge Encyclopaedia of Astronomy (1977)</h3>
<p>Now we get a plot with the stacked waves.</p>
<p>With <code>ggplot2</code> the easy option is to rely on <code>ggridges</code> that does a great job stacking the series.</p>

<pre>library(ggridges)

col1 &lt;- &quot;white&quot;
col2 &lt;- &quot;black&quot;

ggplot(pulsar, aes(x = time, y = measurement, height = radio_intensity, group = measurement)) +
  geom_ridgeline(
    min_height = min(pulsar$radio_intensity),
    scale = 0.2,
    linewidth = 0.5,
    fill = col1,
    colour = col2
  ) +
  scale_y_reverse() +
  theme_void() +
  theme(
    panel.background = element_rect(fill = col1),
    plot.background = element_rect(fill = col1, color = col1),
  )</pre>

<p><img src="https://i2.wp.com/pacha.dev/blog/2026/06/30/cp1919/plot1-1.png?w=450&#038;ssl=1" class="img-fluid figure-img"  data-recalc-dims="1"></p>

<p>With <code>tinyplot</code> I have to go back one decade to the past and remember base R to adapt from <code>ggridges</code> <a href="https://github.com/wilkelab/ggridges/blob/master/R/geoms.R" rel="nofollow" target="_blank">internals</a>.</p>

<pre>pulsar2 &lt;- transform(pulsar, measurement = factor(measurement))
measurements &lt;- sort(unique(pulsar2$measurement))
n &lt;- length(measurements)

# integer baselines: identical to ggridges ymax = y + scale * height
scale_fac &lt;- 0.2  # mirrors geom_ridgeline(scale = 0.2)

pulsar2$y_stacked &lt;- scale_fac * pulsar2$radio_intensity +
    (n - match(pulsar2$measurement, measurements))

par(bg = col1, mar = c(0, 0, 0, 0))

plt(
    y_stacked ~ time | measurement,
    data = pulsar2,
    type = type_area(alpha = 1),
    ylim = range(pulsar2$y_stacked),
    bg = col1,
    col = col2,
    axes = FALSE,
    legend = FALSE,
    frame.plot = FALSE
)</pre>

<p><img src="https://i0.wp.com/pacha.dev/blog/2026/06/30/cp1919/plot1-2-1.png?w=450&#038;ssl=1" class="img-fluid figure-img"  data-recalc-dims="1"></p>

<h3>The Nature of Pulsars (Scientific American, 1970)</h3>
<p>Similar to the previous plots.</p>

<pre>col1 &lt;- &quot;#94cee1&quot;
col2 &lt;- &quot;white&quot;

ggplot(pulsar, aes(x = time, y = measurement, height = radio_intensity, group = measurement)) +
  geom_ridgeline(
    min_height = min(pulsar$radio_intensity),
    scale = 0.2,
    linewidth = 0.5,
    fill = col1,
    colour = col2
  ) +
  scale_y_reverse() +
  theme_void() +
  theme(
    panel.background = element_rect(fill = col1),
    plot.background = element_rect(fill = col1, color = col1),
  )</pre>

<p><img src="https://i1.wp.com/pacha.dev/blog/2026/06/30/cp1919/plot2-1.png?w=450&#038;ssl=1" class="img-fluid figure-img"  data-recalc-dims="1"></p>

<pre>par(bg = col1, mar = c(0, 0, 0, 0))

plt(
    y_stacked ~ time | measurement,
    data = pulsar2,
    type = type_area(alpha = 1),
    ylim = range(pulsar2$y_stacked),
    bg = col1,
    col = col2,
    axes = FALSE,
    legend = FALSE,
    frame.plot = FALSE
)</pre>

<p><img src="https://i1.wp.com/pacha.dev/blog/2026/06/30/cp1919/plot2-2-1.png?w=450&#038;ssl=1" class="img-fluid figure-img"  data-recalc-dims="1"></p>

<h3>Joy Division’s Unknown Pleasures (1979)</h3>
<p>Now we get a plot you can print on a T-Shirt.</p>

<pre>col1 &lt;- &quot;black&quot;
col2 &lt;- &quot;white&quot;

ggplot(pulsar, aes(x = time, y = measurement, height = radio_intensity, group = measurement)) +
  geom_ridgeline(
    min_height = min(pulsar$radio_intensity),
    scale = 0.2,
    linewidth = 0.5,
    fill = col1,
    colour = col2
  ) +
  scale_y_reverse() +
  theme_void() +
  theme(
    panel.background = element_rect(fill = col1),
    plot.background = element_rect(fill = col1, color = col1),
  )</pre>

<p><img src="https://i1.wp.com/pacha.dev/blog/2026/06/30/cp1919/plot3-1.png?w=450&#038;ssl=1" class="img-fluid figure-img"  data-recalc-dims="1"></p>

<pre>par(bg = col1, mar = c(0, 0, 0, 0))

plt(
    y_stacked ~ time | measurement,
    data = pulsar2,
    type = type_area(alpha = 1),
    ylim = range(pulsar2$y_stacked),
    bg = col1,
    col = col2,
    axes = FALSE,
    legend = FALSE,
    frame.plot = FALSE
)</pre>

<p><img src="https://i0.wp.com/pacha.dev/blog/2026/06/30/cp1919/plot3-2-1.png?w=450&#038;ssl=1" class="img-fluid figure-img"  data-recalc-dims="1"></p>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://pacha.dev/blog/2026/06/30/cp1919/index.html"> https://pacha.dev/blog</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/cp1919-is-on-cran/">cp1919 is on CRAN</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402363</post-id>	</item>
		<item>
		<title>Let&#8217;s create a minimal R GUI (R GUI 2, previously Q)</title>
		<link>https://www.r-bloggers.com/2026/06/lets-create-a-minimal-r-gui-r-gui-2-previously-q/</link>
		
		<dc:creator><![CDATA[https://pacha.dev/blog]]></dc:creator>
		<pubDate>Mon, 29 Jun 2026 23:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://pacha.dev/blog/2026/06/30/r-gui-2/index.html</guid>

					<description><![CDATA[<p>I realised that people that come from Stata struggle with R's current UI approach.</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/lets-create-a-minimal-r-gui-r-gui-2-previously-q/">Let’s create a minimal R GUI (R GUI 2, previously Q)</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://pacha.dev/blog/2026/06/30/r-gui-2/index.html"> https://pacha.dev/blog</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p>A few months ago I started an experiment, the Q IDE, a Qt-based IDE for R. I started it because I felt that the old RStudio was nice but I wanted it to be even simpler, closer to a scientific calculator like the old TI-89 Titanium.</p>
<p>While working on Q, I noticed that while the name is fine for geeks like me (e.g., think 007 or QR matrix decomposition), it can lead to more confusion for new R users.</p>
<p>Today we have Positron, VS Code, VSCodium, and a wide range of IDEs that in my opinion are a bit “oversized” for daily data analysis with R.</p>
<p>R GUI 2, named after the R GUI for Windows, is a multiplatform project that aims to make using R as simple as possible, integrating everything into a single Windows rather than multiple small windows and making it intentionally similar to Stata’s UI.</p>
<p>One of the reasons why I want to make this similar to Stata visuals is that I am doing a PhD in Economics, where Stata is predominant and it offers an amazingly simple UI despite that R has the same functions and more. People who are smarter than me tend to feel overwhelmed with R and I think the R GUI 2 can minimize that problem by giving a streamlined R experience.</p>
<p>If you would like to contribute to complete a good R GUI 2 v1.0, please comment <a href="https://github.com/pachadotdev/r-gui-2/issues/1" rel="nofollow" target="_blank">here</a>. My idea is to run a fully collaborative project and that will require multiple inputs from the R community, including testing, comments, and checking how it works on different computers. At the moment I can only say “it works on my computer”.</p>
<p>The R GUI currently looks like <a href="https://github.com/pachadotdev/r-gui-2/blob/main/screenshot.png" rel="nofollow" target="_blank">this</a>.</p>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://pacha.dev/blog/2026/06/30/r-gui-2/index.html"> https://pacha.dev/blog</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/lets-create-a-minimal-r-gui-r-gui-2-previously-q/">Let’s create a minimal R GUI (R GUI 2, previously Q)</a>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">402339</post-id>	</item>
		<item>
		<title>Unlearning the Tidyverse</title>
		<link>https://www.r-bloggers.com/2026/06/unlearning-the-tidyverse/</link>
		
		<dc:creator><![CDATA[https://pacha.dev/blog]]></dc:creator>
		<pubDate>Sun, 28 Jun 2026 23:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://pacha.dev/blog/2026/06/29/index.html</guid>

					<description><![CDATA[<p>Unlearning the Tidyverse R My motivation to unlearn the Tidyverse after eight years using it. Author Mauricio “Pachá” Vargas S. Published June 29, 2026 Why I have been working in a project with the University of Texas that showed some ABI issues (e.g.,...</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/unlearning-the-tidyverse/">Unlearning the Tidyverse</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://pacha.dev/blog/2026/06/29/index.html"> https://pacha.dev/blog</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
Unlearning the Tidyverse R My motivation to unlearn the Tidyverse after eight years using it. Author Mauricio “Pachá” Vargas S. Published June 29, 2026 Why I have been working in a project with the University of Texas that showed some ABI issues (e.g., incompatibilities between software) that ultimately led me to propose a few changes to the ‘httpuv’ package, a package central to multiple parts of the Tidyverse and also Shiny. I think Hadley Wickham is an amazing person and I met him at Latin R and the RStudio Conf over the lapse of a few years before COVID. This is nothing against people and I know that Hadley does not maintain ‘httpuv’. Initially, I started working on adapting ‘httpuv’ to minimize its dependencies and do it in a very old fashioned way using the R’s C API. I am quite confident using it even when the notation feels like a time travel to the DOS days. I have used computers since I was 5 years old and I got my first computer to start Kindergarden back in 1995 and I learned commands such as “CD GAMES/” and “KEEN.EXE” to play Commander Keen back then. What made me feel very dissapointed was what I consider being gaslighted in a public forum. For PR 437 I read things such as “this is AI” and “you do not understand software development”. We all come from different places but starting from there is probably not the best start. Furthermore, after answering a few questions about a PR I worked on for two weeks because I want to keep UT staff happy, I decided to open a new PR to do the same using Posit’s cpp11 (PR 438 ), which did not receive any comments despite my follow up on GitHub and via email. I started using R back in 2015, initially I struggled a lot and I started with data.table. A few years after starting with R, I was told about the Tidyverse which, besides the struggles to install it on Linux, I find it is an amazing end-user tool. Meeting comments like what I found with the ‘httpuv’ package does not feel like “this is the R way”. I have co-maintained the CRAN WebTechnologies task view for a few years now, I am soon attending an R sprint to address bugs in R base, and I maintained a wide range of packages including wbstats and tradestatistics . Once in a while I receive PRs to the multiple repositories I have, including the Shiny-dependent d3po package, which is one of the very few fully FOSS packages created as an alternative to the excellent highcharter package made by my friend Joshua Kunst (highcharter depends on highcharts which requires payment for some uses). As side contributions, I have dedicated a few years of my life to improve pointblank , an excellent package for data validation. In other words, R has been a significant percentage of my life and I have used it from 9 to 5 Mon-Fri for over a decade now. This is why I do not appreciate certain forms of communication, especially after having been involved with a global community where I’ve met fantastic people (and unfortunately people that have insulted me over the email, which is not the ‘httpuv’ case). At some point I considered myself to be some random guy from Chile living in the far end of the world. Now I consider myself to be the same infinitesimal person but living in London and writing a PhD thesis where two-thirds of it are about improving R for Econometrics and I am glad that during all these years I played a major role in making R Para Ciencia de Datos happen. Stay tuned. I am really rusty with apply() , mapply() and most of base R that is not %*% and t() . I have just removed the Tidyverse from my laptop and I will be posting how do to common data cleaning tasks with minimal typing in base R.
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://pacha.dev/blog/2026/06/29/index.html"> https://pacha.dev/blog</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/unlearning-the-tidyverse/">Unlearning the Tidyverse</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402332</post-id>	</item>
		<item>
		<title>R’ousseeuw²⁶ prize!</title>
		<link>https://www.r-bloggers.com/2026/06/rousseeuw%c2%b2%e2%81%b6-prize/</link>
		
		<dc:creator><![CDATA[xi'an]]></dc:creator>
		<pubDate>Sun, 28 Jun 2026 22:26:56 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">http://xianblog.wordpress.com/?p=63197</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> Great news that a major Statistics prize like the Rousseeuw Prize goes to the R Core Team, esp. Brian Ripley (University of Oxford), Martin Mächler (ETH Zürich), Kurt Hornik (WU Wien), Peter Dalgaard (Copenhagen Business School), and Luke Tierney (University of Iowa). R is indeed a unique phenomenon, ...</div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/rousseeuw%c2%b2%e2%81%b6-prize/">R’ousseeuw²⁶ prize!</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://xianblog.wordpress.com/2026/06/29/rousseeuw%C2%B2%E2%81%B6-prize/"> R – Xi&#039;an&#039;s Og</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p><a href="https://i2.wp.com/www.rousseeuwprize.org/assets/2026/announcement.jpg?ssl=1" rel="nofollow" target="_blank"><img loading="lazy" class="aligncenter " src="https://i2.wp.com/www.rousseeuwprize.org/assets/2026/announcement.jpg?w=450&#038;ssl=1" data-recalc-dims="1" /></a></p>
<p style="text-align: justify"><img loading="lazy" class="aligncenter " src="https://i2.wp.com/www.rousseeuwprize.org/assets/2026/laureates_announcement.jpg?w=450&#038;ssl=1" data-recalc-dims="1" /><strong>G</strong>reat news that a major Statistics prize like the <a href="https://www.rousseeuwprize.org/" rel="nofollow" target="_blank">Rousseeuw Prize</a> goes to the <a href="https://www.r-project.org/" rel="nofollow" target="_blank">R Core Team</a>, esp. Brian Ripley (University of Oxford), Martin Mächler (ETH Zürich), Kurt Hornik (WU Wien), Peter Dalgaard (Copenhagen Business School), and Luke Tierney (University of Iowa). <a href="https://www.r-project.org/" rel="nofollow" target="_blank">R</a> is indeed a unique phenomenon, where open-source and open-access has been developed by and for the statistics community. Which is about to release <a href="http://cran.r-project.org/src/base-prerelease" rel="nofollow" target="_blank"><strong>R version 4.6.1 (Happy Hop) version</strong></a>.</p>
<p style="text-align: justify">Thanks to the R Core Team (and congrats!). Half of the Prize goes to the other members of the Team.</p>
<blockquote>
<p style="text-align: right"><span style="color: #ff6600"><em>“The international and independent jury, appointed by the <a style="color: #ff6600" href="https://www.kbs-frb.be/en/" rel="nofollow" target="_blank">King Baudouin Foundation</a>, has recognised the groundbreaking work of five members of the R Core Team who have been awarded the Rousseeuw Prize for Statistics. The international award, which recognises major contributions to statistical research, honours their nearly three decades of unpaid work building <a style="color: #ff6600" href="https://www.r-project.org/" rel="nofollow" target="_blank">R</a>, the open-source language that has become the common foundation of modern statistical computing.</em></span></p>
<p><span style="color: #ff6600"><em>Statistics is everywhere. It determines whether a new medicine is safe enough to reach patients, monitors risk in financial markets, and tracks how diseases spread. R is the tool that made it accessible to everyone. The language that the R Core Team built is trusted by institutions including the US Food and Drug Administration, the European Central Bank, the Bank of England, and major pharmaceutical companies worldwide.”</em></span></p>
</blockquote>

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://xianblog.wordpress.com/2026/06/29/rousseeuw%C2%B2%E2%81%B6-prize/"> R – Xi&#039;an&#039;s Og</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/rousseeuw%c2%b2%e2%81%b6-prize/">R’ousseeuw²⁶ prize!</a>]]></content:encoded>
					
		
		<enclosure url="https://0.gravatar.com/avatar/3bddf040412784bc8ff54f0b6353b2c283c3eb7e11daccf2b3bfa95b469e4029?s=96&#038;d=https://s0.wp.com/i/mu.gif&#038;r=G" length="0" type="" />
<enclosure url="https://www.rousseeuwprize.org/assets/2026/announcement.jpg" length="0" type="" />
<enclosure url="https://www.rousseeuwprize.org/assets/2026/laureates_announcement.jpg" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402334</post-id>	</item>
		<item>
		<title>Machine learning meets reality: Forecast evaluation for the 2026 FIFA World Cup</title>
		<link>https://www.r-bloggers.com/2026/06/machine-learning-meets-reality-forecast-evaluation-for-the-2026-fifa-world-cup/</link>
		
		<dc:creator><![CDATA[Achim Zeileis]]></dc:creator>
		<pubDate>Sun, 28 Jun 2026 22:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://www.zeileis.org/news/fifa2026group/</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; ">
<p>    After all 72 matches of the group stage in the 2026 FIFA World Cup our probabilistic forecasts are evaluated, revealing what the machine learning algorithm predicted well and where it struggled.</p>
<p>    A challenging new tournament form...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/machine-learning-meets-reality-forecast-evaluation-for-the-2026-fifa-world-cup/">Machine learning meets reality: Forecast evaluation for the 2026 FIFA World Cup</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://www.zeileis.org/news/fifa2026group/"> Achim Zeileis</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

    
    <p>After all 72 matches of the group stage in the 2026 FIFA World Cup our probabilistic forecasts are evaluated, revealing what the machine learning algorithm predicted well and where it struggled.</p>
    
    
    <h2 id="a-challenging-new-tournament-format">A challenging new tournament format</h2>

<p>A couple of days ago the group stage of the 2026 FIFA World Cup was wrapped up after squeezing 72 matches into just a little bit more than two weeks. Thus, all pairings for the Round of 32 are fixed now. Today we want to assess the quality of our own <a href="https://www.zeileis.org/news/fifa2026/" rel="nofollow" target="_blank">probabilistic forecast for the 2026 FIFA World Cup</a> based on an ensemble machine learning algorithm that we have published prior to the tournament.</p>

<p>Most of our predictions worked reasonably well and the corresponding results are within the limits of expected random variation. It turned out, though, that the switch from 32 to 48 teams in the tournament was not only challenging for the audience but also for the machine learning algorithm. There were many more matches between very unequal teams compared to earlier editions of the World Cup (i.e., the training data for the algorithm). Also, due to 8 out of 12 third-ranked teams also proceeding to the knockout stage, it often was more important for the teams not to lose a match (rather than to actually win it), thus favoring many draws. Finally, due to the many possibilities of assigning the third-ranked teams to the knockout matches, some teams profited more than others from the realized tournament draw in the Round of 32.</p>

<h2 id="tldr">TL;DR</h2>

<p>All tournament favorites proceeded to the Round of 32 and mostly the weaker teams dropped out of the tournament. Arguably the biggest surprises were the African teams (especially South Africa, Cape Verde, and DR Congo) who all “survived” the group stage.</p>

<p>While the predicted win/loss probabilities mostly conformed with the observed results, the predicted goal differences tended to be too low. Especially for matches between rather unequal teams the observed goal differences were often more extreme than expected by the algorithm. The likely reason for this is that there were many more weak teams in this tournament compared to earlier years due to the extension to 48 teams.</p>

<p>There were also somewhat more draws than expected (and fewer wins/losses with a margin of only one goal). Again, this is likely due to the new tournament format with 48
teams. One win and one draw was most sufficient to be among the best third-ranked teams who also proceed to the knockout stage. Also, those groups playing their matches
last could behave more strategically and could try to settle for a draw. A fact which was painfully obvious in the memorable match between Algeria and Austria.</p>

<h2 id="group-stage-results">Group stage results</h2>

<p>First, we look at the results in terms of which teams successfully advanced from the group stage to the Round of 32. The barplots below show the <strong>predicted</strong> probability for all teams to proceed to the Round of 32, in the <strong>observed</strong> ranking order, with the color highlighting which teams advanced to the knockout stage.</p>

<p><img src="https://i2.wp.com/www.zeileis.org/assets/posts/2026-06-29-fifa2026group/barplot.png?w=578&#038;ssl=1" alt="Predicted probabilities to advance to the knockout stage, shaded by actual outcome" data-recalc-dims="1" /></p>

<p>Clearly, all group favorites made the cut and mostly teams with lower probabilities dropped out. The biggest suprises were some of the African teams, notably South Africa (in Group A), Cape Verde (in Group H), and DR Congo (in Group K), all of which successfully “survived” the group stage. Moreover, although some of the tournament favorites (such as Spain, England, Germany, or Portugal) did not fully convince in their respective group stage matches, these performances did not have many negative consequences, yet. All of them proceeded to the knockout stage, typically still taking the top spot in their respective groups.</p>

<h2 id="match-results">Match results</h2>

<p>Next, we take a closer look at the 72 individual group-stage matches to check how well our forecasts conformed with the actual outcome. The stacked bar plot below groups all match results into five intervals (columns) based on their predicted goal difference for the stronger vs. the weaker team.</p>

<p><img src="https://i2.wp.com/www.zeileis.org/assets/posts/2026-06-29-fifa2026group/spineplot.png?w=578&#038;ssl=1" alt="Observed match outcome vs. predicted goal difference" data-recalc-dims="1" /></p>

<p>The first column summarizes 15 matches where both teams were predicted to be almost equally strong. More precisely, the stronger team was predicted to be only slightly better, with 0 to 0.35 more predicted goals on average. One third of these matches was won by the slightly better team, one third was lost, and another third ended in a draw. In short, the distribution of the outcomes conforms very well with the prediction that both teams would be essentially equally strong.</p>

<p>In the second and third column the predicted advantages of the stronger team increased to 0.35-0.7 goals and 0.7-1.05 goals, respectively, and also the empirical proportion of matches won increased accordingly.</p>

<p>However, in the last two columns with the most pronounced predicted advantages (goal difference of 1.05-1.4 and 1.4-1.75, respectively) the winning proportion remained high but did not increase further. Also, the proportion of draws remained relatively high, even in matches with a clear favorite.</p>

<p>This suggests that our probabilistic forecasts captured the actual outcomes better in matches with small to moderate differences between the teams. But it seems that the algorithm struggled a little bit in matches with very large predicted differences.</p>

<p>To explore this in more detail, we compare the observed goal differences in these matches with the expected distributions based on the Poisson model employed. This is brought out graphically by so-called <a href="https://dx.doi.org/10.1080/00031305.2016.1173590" rel="nofollow" target="_blank">hanging rootograms</a>, separately for the low predicted goal differences (0-0.7, first two columns above) and the high ones (1.05-1.75, last two columns above).</p>

<p><img src="https://i1.wp.com/www.zeileis.org/assets/posts/2026-06-29-fifa2026group/rootogram.png?w=578&#038;ssl=1" alt="Hanging rootogram with observed and expected frequencies of goal differences" data-recalc-dims="1" /></p>

<p>In both panels, the red line shows the square root of the expected frequencies while the “hanging” gray bars represent the square root of the observed frequencies.</p>

<p>For the low difference subset in the panel on the left, the observed and expected distributions conform reasonably well. It is noticeable, though,
that draws (goal differences of 0) are slightly overrepresented in the observations compared to the predictions.</p>

<p>However, for the high difference subset it is clear that there is a bias in goal difference predictions: Low observed goal differences are underrepresented
whereas high observed goal differences are overrepresented. The overrepresentation of draws is also more pronounced in this subset.</p>

<p>As explained above, it is likely that these deviations are due to the new tournament format with 48 teams. Many more matches between extremely different teams occurred in this tournament compared to earlier tournaments with only few very weak teams. The machine learning algorithm apparently has not fully captured this. Similarly, the incentives for winning each match were not as strong as in previous tournaments because 8 out of 12 third-ranked teams also proceeded to the knockout stage.</p>

<h2 id="updated-knockout-stage-predictions">Updated knockout stage predictions</h2>

<p>Finally, we want to look ahead and explore how the realized tournament draw based on the group stage results changes the predicted winning probabilities for the 2026 FIFA World Cup. We do so under the assumption that all results so far are within the range of random variation and that we do <strong>not</strong> need to adapt the <a href="https://www.zeileis.org/news/fifa2026/#match-probabilities" rel="nofollow" target="_blank">predictions for all possible matches</a>. In other words, the simulation is based on the expectation that especially the top favorites Spain and England can still reach their full potential in the upcoming matches.</p>

<p>As for our <a href="https://www.zeileis.org/news/fifa2026/#winning-probabilities" rel="nofollow" target="_blank">original prediction</a>, we simulate the knockout stage 100,000 times and then compute by how many percentage points the winning probabilities change.</p>

<p><img src="https://i0.wp.com/www.zeileis.org/assets/posts/2026-06-29-fifa2026group/knockout.png?w=578&#038;ssl=1" alt="Barplot with changes in the winning probabilities for the tournament" data-recalc-dims="1" /></p>

<p>This shows that Argentina and England profited most from the realized tournament draw. They are both in the arm of the tournament with fewer strong teams and they can only face each other in the semi-final. Therefore, Argentina’s winning probability increased by 3.1 percentage points (from 8.2% to 11.3%). Similarly, England’s winning probability increased by 2.6 percentage points (from 12.4% to 15.0%). Recall that these numbers are derived under the assumption that all teams will play according to the expectations from before the start of the tournament. Thus, additionally, one might want to factor in that Argentina played even stronger than expected and England somewhat weaker.</p>

<p>The teams who suffer most from the realized tournament draw include top favorites Spain and France along with Portugal and Germany because these are very likely to meet already in the Round of 16 (Spain vs. Portugal and France vs. Germany, respectively). Thus, these are much more difficult obstacles on the way to the World Cup Final compared to those for Argentina and England in the other arm of the tournament.</p>

<p>In any case, the most exciting part of the 2026 FIFA World Cup is only starting now and we can all be curious what is going to happen. There are still 32 teams in the race for the title! (Well, 31 after Canada has defeated South Africa in the first knockout match yesterday.)</p>

    
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://www.zeileis.org/news/fifa2026group/"> Achim Zeileis</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/machine-learning-meets-reality-forecast-evaluation-for-the-2026-fifa-world-cup/">Machine learning meets reality: Forecast evaluation for the 2026 FIFA World Cup</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402330</post-id>	</item>
		<item>
		<title>Long term economic growth rates by @ellis2013nz</title>
		<link>https://www.r-bloggers.com/2026/06/long-term-economic-growth-rates-by-ellis2013nz/</link>
		
		<dc:creator><![CDATA[free range statistics - R]]></dc:creator>
		<pubDate>Sat, 27 Jun 2026 13:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://freerangestats.info/blog/2026/06/28/long-term-growth</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> I came across a chart of long term real gross domestic product per capita for Australia (1900 to about 2020) that had a couple of mistakes in its y axis scale and labelling. I wanted to see for myself what it should actually look like.</p>
<p>Looking for dat...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/long-term-economic-growth-rates-by-ellis2013nz/">Long term economic growth rates by @ellis2013nz</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://freerangestats.info/blog/2026/06/28/long-term-growth"> free range statistics - R</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p>I came across a chart of long term real gross domestic product per capita for Australia (1900 to about 2020) that had a couple of mistakes in its y axis scale and labelling. I wanted to see for myself what it should actually look like.</p>

<p>Looking for data for this drew my attention to the excellent Maddison Project, which publishes long term estimates of real GDP per capita, in 2011 prices, for many countries. It’s certainly not perfect (price comparisons over such a long period of time—and they go well back before 1900—is a vexed business!), but it looks like a great effort. It’s necessary to have something like this from the economic historians because most standard official statistics series for Australia only go back to 1959, due to the complications of comparisons over time.</p>

<p>The Maddison Project’s <a href="https://www.rug.nl/ggdc/historicaldevelopment/maddison/releases/maddison-project-database-2023" rel="nofollow" target="_blank">latest release is 2023</a>.</p>

<p>Here’s my re-creation of the original chart (which is not shown here), but with correct y axis labels:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0326-Australia.svg" width="450"><img src="https://i2.wp.com/freerangestats.info/img/0326-Australia.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>A distinctive feature of this chart is that it compares the actual growth trajectory to a constant rate of growth from 1900 to present. It’s a nice comparison. It takes care to draw—it’s definitely not the same as a line of best fit. On a logarithmic scale where the constant growth is a straight line, it gives a good point of reference for the faster and slower periods of growth.</p>

<p>Here’s my code that draws the chart. The work is actually done by a project-specific function <code>draw_chart()</code>, which draws a fairly decent chart for any given country available in the database. This lets me easily produce similar charts for other countries (results shown after the R code).</p>

<figure class="highlight"><pre># download latest version of Maddison data from:
# https://www.rug.nl/ggdc/historicaldevelopment/maddison/releases/maddison-project-database-2023

library(tidyverse)
library(readxl)
library(scales)
library(glue)
library(countrycode)

gdppc &lt;- read_excel(&quot;mpd2023_web.xlsx&quot;, sheet = &quot;GDPpc&quot;, skip = 2)

#' Draw time series chart from 1900 to 2023 for a single country
#' 
#' @param ccode 3 digit ISO country code
#' @param points whether to add points for each observation(default is to just draw line)
draw_chart &lt;- function(ccode, points = FALSE){
    # country name for this country code  
    cname &lt;- countrycode(ccode, origin = &quot;iso3c&quot;, destination = &quot;country.name.en&quot;)

    # Data for just this country&quot;
    data_tc &lt;- gdppc |&gt; 
        select(year, all_of(ccode)) |&gt; 
        filter(year &gt;= 1900)

    names(data_tc)[2] &lt;- &quot;value&quot;

    constant_growth &lt;- data_tc |&gt;
        arrange(year) |&gt; 
        drop_na() |&gt; 
        summarise(n = max(year) - min(year),
                    start = value[1],
                    end = value[n()],
                    start_year = min(year),
                    # for drawing labels, not actually a 'mid' point:
                    mid_point = (end + start) / 4) |&gt; 
        mutate(growth_rate = (end / start) ^ (1 / n) - 1)

    # colours for constant growth and for data:
    cgcol &lt;- &quot;red&quot;
    dcol &lt;- &quot;blue&quot;

    # define plot
    p1 &lt;- data_tc |&gt; 
        ggplot(aes(x = year, y = value)) +
        # Draw constant growth line:
        annotate(&quot;segment&quot;, 
                x = constant_growth$start_year, 
                xend = max(data_tc$year),
                    y = constant_growth$start, yend = constant_growth$end, 
                colour = cgcol, linetype = 2) +
        # draw data line:
        geom_line(colour = dcol) +
        annotate(&quot;text&quot;, x = 1900, y = constant_growth$mid_point, 
                label = glue(&quot;Constant growth of {percent(constant_growth$growth_rate, accuracy = 0.1)}&quot;), 
                colour = cgcol, hjust = 0) +
        annotate(&quot;text&quot;, x = 2010, y = constant_growth$mid_point, 
                    label = &quot;Actual GDP per capita&quot;, 
                    colour = dcol, hjust = 1) +
        scale_y_log10(label = dollar_format(accuracy = 1), 
                    breaks = c(0, 0.25, 0.5, 1:6) * 10000) +
        labs(x = &quot;&quot;,
            y= &quot;&quot;,
            title = glue(&quot;Long term historical growth in GDP per person in {cname}&quot;),
            subtitle = &quot;GDP per capita, purchasing power parity, 2011 prices.&quot;,
            caption = &quot;Source: Maddison Project Database 2023&quot;)
  
  # for some countries with broken series we might want to draw points, not just
  # lines:
  if(points){
    p1 &lt;- p1 + geom_point(colour = dcol)
  }

    frs::svg_png(p1, glue(&quot;..https://freerangestats.info/img/0326-{cname}&quot;), w = 9, h = 5)
}

draw_chart(&quot;AUS&quot;)
draw_chart(&quot;NZL&quot;)
draw_chart(&quot;USA&quot;)
draw_chart(&quot;DNK&quot;)
draw_chart(&quot;CHN&quot;, points = TRUE)
draw_chart(&quot;IND&quot;)
draw_chart(&quot;GBR&quot;)
draw_chart(&quot;IDN&quot;)
draw_chart(&quot;JPN&quot;)</pre></figure>

<p>Here’s some of those other outputs, along with some glib and not-really-thought through observations from myself. Some interesting things here as we see the visible impact of historical events: Covid, the second world war and national independence across multiple countries; as well as national catastrophes such as China’s Great Leap Forward.</p>

<p>New Zealand and the USA have slightly slower growth than Australia over this period but a similar overall trajectory. The USA has a particularly strong New Deal and World War II boost to growth:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0326-New%20Zealand.svg" width="450"><img src="https://i1.wp.com/freerangestats.info/img/0326-New%20Zealand.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<object type="image/svg+xml" data="https://freerangestats.info/img/0326-United%20States.svg" width="450"><img src="https://i0.wp.com/freerangestats.info/img/0326-United%20States.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>Denmark has less impact from the 1930s Great Depression but experienced the war as economic destruction (rather than a GDP boost as was the case for the USA). Overall its experienced fairly fast and steady economic growth:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0326-Denmark.svg" width="450"><img src="https://i1.wp.com/freerangestats.info/img/0326-Denmark.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>The UK had a bad time recovering from World War I but eventually attained faster (albeit periodically interrupted) economic growth until the early 2000s:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0326-United%20Kingdom.svg" width="450"><img src="https://i0.wp.com/freerangestats.info/img/0326-United%20Kingdom.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>China’s economic growth really began with its new economic policies in the 1970s:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0326-China.svg" width="450"><img src="https://i2.wp.com/freerangestats.info/img/0326-China.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>India’s significant economic growth began soon after 1947 independence but only accelerated from the 1980s onwards and then further from the 2000s onwards:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0326-India.svg" width="450"><img src="https://i0.wp.com/freerangestats.info/img/0326-India.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>Indonesia’s post-war growth path reflects its turbulent political history but is essentially a success story. In addition to the interruption of meaningful estimates during the war and deconolonisation, and the troubled transition from Sukarno to Suharto in the 1960s, the East Asia Economic Crisis of the late 1990s really stands out:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0326-Indonesia.svg" width="450"><img src="https://i2.wp.com/freerangestats.info/img/0326-Indonesia.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>Japan had a particularly catastrophic World War II, recovered well until the late twentieth century, and in recent decades has sunk into well-known relative stagnation:</p>
<object type="image/svg+xml" data="https://freerangestats.info/img/0326-Japan.svg" width="450"><img src="https://i0.wp.com/freerangestats.info/img/0326-Japan.png?w=450&#038;ssl=1" data-recalc-dims="1" /></object>

<p>The Maddison Project estimates are presented and discussed in Bolt and Van Zanden (2024), “Maddison style estimates of the evolution of the world economy: A new 2023 update”, Journal of Economic Surveys, 1–41.</p>

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://freerangestats.info/blog/2026/06/28/long-term-growth"> free range statistics - R</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/long-term-economic-growth-rates-by-ellis2013nz/">Long term economic growth rates by @ellis2013nz</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402315</post-id>	</item>
		<item>
		<title>Running local LLMs on your NPU from R with Foundry Local and ellmer</title>
		<link>https://www.r-bloggers.com/2026/06/running-local-llms-on-your-npu-from-r-with-foundry-local-and-ellmer/</link>
		
		<dc:creator><![CDATA[Giles Dickenson-Jones]]></dc:creator>
		<pubDate>Sat, 27 Jun 2026 07:01:55 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://www.gilesd-j.com/?p=4213</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; "> TLDR: this post summarizes how I was able to leverage my Surface Pro 11’s Neural Processing Unit (NPU) to chat […]<br />
The post Running local LLMs on your NPU from R with Foundry Local and ellmer appeared first on Giles.</div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/running-local-llms-on-your-npu-from-r-with-foundry-local-and-ellmer/">Running local LLMs on your NPU from R with Foundry Local and ellmer</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://www.gilesd-j.com/2026/06/27/running-local-llms-on-your-npu-from-r-with-foundry-local-and-ellmer/"> Data Analytics and AI Archives - Giles</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<p class="wp-block-paragraph"><strong>TLDR: </strong>this post summarizes how I was able to leverage my Surface Pro 11’s Neural Processing Unit (NPU) to chat with Large Language Models (LLMs) from R (for some reason). The code has been adapted from <a href="https://learn.microsoft.com/en-us/azure/foundry-local/get-started?tabs=windows&#038;pivots=programming-language-python" rel="nofollow" target="_blank">this guide</a> from Microsoft. </p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" loading="lazy" src="https://i0.wp.com/www.gilesd-j.com/wp-content/uploads/2026/06/image-1-1024x377.png?w=450&#038;ssl=1" alt="" class="wp-image-4228" style="width:383px;height:auto" srcset_temp="https://i0.wp.com/www.gilesd-j.com/wp-content/uploads/2026/06/image-1-1024x377.png?w=450&#038;ssl=1 1024w, https://www.gilesd-j.com/wp-content/uploads/2026/06/image-1-300x110.png 300w, https://www.gilesd-j.com/wp-content/uploads/2026/06/image-1-768x283.png 768w, https://www.gilesd-j.com/wp-content/uploads/2026/06/image-1.png 1282w" sizes="auto, (max-width: 1024px) 100vw, 1024px" data-recalc-dims="1" /><figcaption class="wp-element-caption">Success!</figcaption></figure>



<p class="wp-block-paragraph">While I’ve been <a href="https://www.gilesd-j.com/2024/01/18/how-i-chatgpt-as-a-public-policy-professional/" rel="nofollow" target="_blank">obsessively utilizing LLMs </a>since the hype train first set off, in the last 12 months I’ve been <a href="https://www.gilesd-j.com/2025/01/20/from-code-to-conversation-localized-ai-fun-with-lm-studio-and-the-ellmer-package-2/" rel="nofollow" target="_blank">experimenting</a> with local LLMs so I can better utilize them in my work. For the most part, I’ve been using my laptop’s RTX 4060 for this, but I’ve long been curious what the integrated NPU in my Surface Pro 11 can (or can’t) do. Unfortunately, at the time of writing, neither Ollama or LM Studio<sup data-fn="6627ee7f-d0b6-4fc3-ae5a-c72d74501086" class="fn"><a href="https://www.gilesd-j.com/2026/06/27/running-local-llms-on-your-npu-from-r-with-foundry-local-and-ellmer/#6627ee7f-d0b6-4fc3-ae5a-c72d74501086" id="6627ee7f-d0b6-4fc3-ae5a-c72d74501086-link" rel="nofollow" target="_blank">1</a></sup> natively support this functionality which has made satisfying my curiosity trickier than I’d like.</p>



<p class="wp-block-paragraph">At the outset, I’m still not entirely sure this is a question worth answering (or a blog worth writing) given the RTX 4060’s performance thoroughly trumps that of my NPU, but I’m a tinkerer and the idea of being stranded without a stochastic parrot on hand is nothing short of terrifying.</p>



<h3 class="wp-block-heading"><strong>Foundry Local</strong></h3>



<p class="wp-block-paragraph">Before starting, you’ll need to install Foundry Local which can be installed using the Bash command below:</p>



<pre>npm install foundry-local-sdk-winml openai</pre>



<p class="wp-block-paragraph">You’ll also need to make sure that Foundry is available on PATH, so your OS knows how to launch it (<a href="https://learn.microsoft.com/en-us/azure/foundry-local/reference/reference-cli" rel="nofollow" target="_blank">see here</a>). </p>



<h3 class="wp-block-heading"><strong>The R Code</strong></h3>



<p class="wp-block-paragraph"><em>Microsoft provides a getting started guide <a href="https://learn.microsoft.com/en-us/azure/foundry-local/get-started?tabs=windows&#038;pivots=programming-language-python" rel="nofollow" target="_blank">here</a>, which includes a set of Python code that this was based on</em> (with Claude’s help):</p>



<pre># Load necessary packages ---------------------------------------------------
library(ellmer)   # LLM chat interface (chat_openai_compatible)
library(httr2)    # resolve the exact loaded model id from /v1/models

# Set project assumptions and define functions ------------------------------
ref_model_alias &lt;- &quot;qwen2.5-0.5b&quot;
ref_prompt      &lt;- &quot;What is the golden ratio?&quot;

# fnc_foundry_load: ensure the service is up and the model is loaded.
fnc_foundry_load &lt;- function(alias) {
  if (Sys.which(&quot;foundry&quot;) == &quot;&quot;) {
    stop(&quot;`foundry` CLI not found on PATH. Install Foundry Local first.&quot;)
  }
  system2(&quot;foundry&quot;, c(&quot;service&quot;, &quot;start&quot;))
  system2(&quot;foundry&quot;, c(&quot;model&quot;, &quot;download&quot;, alias))
  system2(&quot;foundry&quot;, c(&quot;model&quot;, &quot;load&quot;, alias))
  invisible(alias)
}

# fnc_foundry_endpoint: discover the service base URL (port is dynamic).
fnc_foundry_endpoint &lt;- function() {
  tmp_status   &lt;- system2(&quot;foundry&quot;, c(&quot;service&quot;, &quot;status&quot;), stdout = TRUE)
  tmp_status   &lt;- iconv(paste(tmp_status, collapse = &quot; &quot;),
                        to = &quot;ASCII&quot;, sub = &quot; &quot;)
  tmp_hostport &lt;- regmatches(
    tmp_status,
    regexpr(&quot;[0-9]{1,3}(\\.[0-9]{1,3}){3}:[0-9]+&quot;, tmp_status)
  )
  if (length(tmp_hostport) == 0) {
    stop(&quot;Could not parse endpoint from status: &quot;, tmp_status)
  }
  paste0(&quot;http://&quot;, tmp_hostport[1])
}

# fnc_model_id: resolve the concrete model id required by the REST API.
fnc_model_id &lt;- function(base, alias) {
  tmp_models &lt;- request(paste0(base, &quot;/v1/models&quot;)) |&gt;
    req_perform() |&gt;
    resp_body_json(simplifyVector = FALSE)
  tmp_ids &lt;- vapply(tmp_models$data, \(m) m$id, character(1))
  tmp_hit &lt;- tmp_ids[grepl(alias, tmp_ids, fixed = TRUE)]
  if (length(tmp_hit)) tmp_hit[1] else tmp_ids[1]
}

# fnc_foundry_unload: release the model from memory.
fnc_foundry_unload &lt;- function(alias) {
  system2(&quot;foundry&quot;, c(&quot;model&quot;, &quot;unload&quot;, alias))
  invisible(alias)
}

fnc_foundry_load(ref_model_alias)
ref_endpoint &lt;- fnc_foundry_endpoint()
ref_model_id &lt;- fnc_model_id(ref_endpoint, ref_model_alias)
cat(&quot;Model loaded and ready.\n&quot;)

# Point ellmer at the local OpenAI-compatible endpoint. Foundry Local needs
mod_chat &lt;- chat_openai_compatible(
  base_url    = paste0(ref_endpoint, &quot;/v1&quot;),
  name        = &quot;foundry-local&quot;,
  credentials = \() &quot;not-needed&quot;,
  model       = ref_model_id,
  echo        = &quot;output&quot;
)

#send prompt to local model 
rlt_reply &lt;- mod_chat$chat(ref_prompt)</pre>


<ol class="wp-block-footnotes"><li id="6627ee7f-d0b6-4fc3-ae5a-c72d74501086">Although there were rumors that LM Studio was working on this feature <a href="https://www.reddit.com/r/LocalLLaMA/comments/1h5eyb8/lm_studio_running_on_npu_finally_qualcomm/" rel="nofollow" target="_blank">based on this video</a>  <a href="https://www.gilesd-j.com/2026/06/27/running-local-llms-on-your-npu-from-r-with-foundry-local-and-ellmer/#6627ee7f-d0b6-4fc3-ae5a-c72d74501086-link" aria-label="Jump to footnote reference 1" rel="nofollow" target="_blank"><img src="https://i2.wp.com/s.w.org/images/core/emoji/17.0.2/72x72/21a9.png?w=578&#038;ssl=1" alt="&#x21a9;" class="wp-smiley" style="height: 1em; max-height: 1em;" data-recalc-dims="1" />︎</a></li></ol>


<p class="wp-block-paragraph"></p>
<p>The post <a href="https://www.gilesd-j.com/2026/06/27/running-local-llms-on-your-npu-from-r-with-foundry-local-and-ellmer/" rel="nofollow" target="_blank">Running local LLMs on your NPU from R with Foundry Local and ellmer</a> appeared first on <a href="https://www.gilesd-j.com/" rel="nofollow" target="_blank">Giles</a>.</p>

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://www.gilesd-j.com/2026/06/27/running-local-llms-on-your-npu-from-r-with-foundry-local-and-ellmer/"> Data Analytics and AI Archives - Giles</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/running-local-llms-on-your-npu-from-r-with-foundry-local-and-ellmer/">Running local LLMs on your NPU from R with Foundry Local and ellmer</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402303</post-id>	</item>
		<item>
		<title>stick function for the EDA in time series</title>
		<link>https://www.r-bloggers.com/2026/06/stick-function-for-the-eda-in-time-series/</link>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Fri, 26 Jun 2026 11:24:43 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4157</guid>

					<description><![CDATA[<p>You have probably seen my post about the STI classification of Hans Levenbach (this one). Well, I’ve decided to implement it, and it has landed in the greybox package for R/Python. What’s greybox? It is a package for statistical modelling focusing on forecasting and time series analysis. ...</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/stick-function-for-the-eda-in-time-series/">stick function for the EDA in time series</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://openforecast.org/2026/06/26/stick-function-for-the-eda-in-time-series/"> Archives R - Open Forecasting</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
<p>You have probably seen my post about the STI classification of Hans Levenbach (<a href="https://openforecast.org/2026/05/18/hans-levenbach-s-classification-scheme-for-trend-seasonal-components/" rel="nofollow" target="_blank">this one</a>). Well, I’ve decided to implement it, and it has landed in the greybox package for R/Python.</p>
<p>What’s greybox? It is a package for statistical modelling focusing on forecasting and time series analysis. I created it back in 2018 to split the static models (such as linear regression) from the dynamic ones that landed in the smooth package. Greybox has evolved since then, and now has linear regression (alm), regression selection (stepwise) and combinations (calm), a variety of tools for feature generation, diagnostics, forecast evaluation (e.g. rolling origin) etc. You can <a href="https://github.com/config-i1/greybox/wiki" rel="nofollow" target="_blank">read more about it here</a>. Originally, the package was available for R only, but Claude and I ported its main functions to Python back in February.</p>
<p>The Exploratory Data Analysis techniques for time series fit the package quite well, although I don’t have many of those yet. So, I’ve implemented the main idea of the STI of Hans Levenbach in a function called “stick” (Seasonal, Trend, Irregular Contribution Kit) in the greybox package for R/Python. The idea is straightforward: apply stick to a time series, it will use ANOVA, and give you the strength of each component. Here, for example, is how to apply the function to the AirPassengers data (everyone’s favourite toy time series) in R:</p>
<pre>library(greybox)
stick(AirPassengers)</pre>
<p>and in Python:</p>
<pre>from fcompdata import AirPassengers
from greybox import stick

result = stick(AirPassengers.y, lags=12)
print(result)</pre>
<p>which gives exactly the same result:</p>
<pre>Strength of the components:
seasonal12      trend  irregular
    0.1061     0.8613     0.0326</pre>
<p>So, trend dominates the time series, explaining 86.13% of its variability, meaning that if you capture it correctly, you solve a big chunk of the problem. This split also gives you a rough idea about the structure-versus-noise breakdown in the time series, although it assumes that the seasonal component does not evolve over time.</p>
<p>The function supports several seasonal components, and I might extend it to include external information (e.g. promotions) in the future if there is demand for it.</p>
<p>Message <a href="https://openforecast.org/2026/06/26/stick-function-for-the-eda-in-time-series/" rel="nofollow" target="_blank">stick function for the EDA in time series</a> first appeared on <a href="https://openforecast.org/" rel="nofollow" target="_blank">Open Forecasting</a>.</p>

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://openforecast.org/2026/06/26/stick-function-for-the-eda-in-time-series/"> Archives R - Open Forecasting</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/stick-function-for-the-eda-in-time-series/">stick function for the EDA in time series</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402296</post-id>	</item>
		<item>
		<title>AI in Production Conference Summary (2026)</title>
		<link>https://www.r-bloggers.com/2026/06/ai-in-production-conference-summary-2026/</link>
		
		<dc:creator><![CDATA[The Jumping Rivers Blog]]></dc:creator>
		<pubDate>Thu, 25 Jun 2026 23:59:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://www.jumpingrivers.com/blog/2026-ai-in-production-summary/</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; ">
<p>“AI In Production 2026”, a new conference hosted<br />
by Jumping Rivers, was held on 4-5 June, 2026. The conference touched on many of the intricacies of<br />
using AI in software products, as part of the developer toolkit, and at the wider us...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/ai-in-production-conference-summary-2026/">AI in Production Conference Summary (2026)</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://www.jumpingrivers.com/blog/2026-ai-in-production-summary/"> The Jumping Rivers Blog</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<p>
<a href = "https://www.jumpingrivers.com/blog/2026-ai-in-production-summary/">
<img src="https://www.jumpingrivers.com/blog/2026-ai-in-production-summary/" width="400" style="width:400px" class="image-center" style="display: block; margin: auto;" />
</a>
</p>
<!--
TODO: define LLM/MCP/ML etc at first use
(AI is widely known)
-->
<p><a href="https://ai-in-production-2026.jumpingrivers.com/" rel="nofollow" target="_blank">“AI In Production 2026”</a>, a new conference hosted
by Jumping Rivers, was held on 4-5 June, 2026. The conference touched on many of the intricacies of
using AI in software products, as part of the developer toolkit, and at the wider usage of AI
throughout organisations. Themes that stood out in the talks this year included regulatory and
security matters, the deployment and scalability of AI products, how to incorporate custom
data/knowledge, and how to make use of AI tooling to simplify data-intensive tasks.</p>
<p>In addition to the talks (held on 5th June), there was a
<a href="https://www.jumpingrivers.com/blog/ai-in-production-2026-workshops/" rel="nofollow" target="_blank">day of workshops</a> on the 4th
June.</p>
<h2 id="ai-within-the-software-development-lifecycle">AI within the software-development lifecycle</h2>
<p>AI-based tooling has revolutionised software development during the 2020s.
Colin Eberhardt (<a href="https://www.scottlogic.com/" rel="nofollow" target="_blank">Scott Logic</a>) highlighted steps in the evolution of
the AI developer since 2022 (“Agentic AI and the Future of Software Development”).
In 2022, AI could be used as an auto-completion tool with assistive code suggestions.
With CoPilot (GitHub) and the launch of Claude (Anthropic), by 2023 AI tools could function as
a virtual pair-programmer (proposing code, finding and fixing bugs in new code), though any
contributions needed thorough code review.
Since 2024, AI tools have increasingly been used as autonomous contributors or as a component
of continuous code-review operations.</p>
<p><img
src="https://i0.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/colin.jpg?w=578&#038;ssl=1"
alt="Colin Eberhardt from Scott Logic"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>This transition is having an impact throughout software organisations:</p>
<ul>
<li>How should a junior, or newly-onboarded, developer get up-to-speed with a project?</li>
<li>Where should developers focus their time and effort?</li>
<li>How should projects, teams and organisations be structured to take best advantage of AI tooling?</li>
</ul>
<p>On the first point, Rebecca Guiney (<a href="https://www.certara.com/" rel="nofollow" target="_blank">Certara</a>) gave an interesting
lightning talk (“Learning in Production: Becoming a software engineer during the AI wave”).
In a recent project, she used AI to build a tool for schema discovery (over clinical trial
databases). The tool can work reproducibly on new data.</p>
<p>Rebecca highlighted how “contract-first development” is important when building tools using AI
assistance. That is, when agents can write code and/or tests, an important role of the developer is
to control what the different components of a system are reponsible for, and how they interact.
Similarly, when reviewing code a greater emphasis is placed on the purpose of what was implemented
than on how it works. This emphasis on higher-level thinking is also impacting how new developers
learn &#8211; learning from AI-generated example code, rather than from step-by-step tutorials.</p>
<p>Rebecca won the
(<a href="https://www.taylorfrancis.com/" rel="nofollow" target="_blank">CRC-Press</a> sponsored) prize for the best lightning talk.</p>
<p><img
src="https://i2.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/rebecca.jpg?w=578&#038;ssl=1"
alt="Rebecca Guiney from Certara"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>Since the AI toolkit is relatively new, many projects exist upon which AI has never been used.
When looking at these projects, Claude (or similar) could find countless issues.
So how do you prioritise what to fix first (when you may also have a list of bugs and features
waiting to be addressed)?
Badr Adnani (<a href="https://www.roundelkitchens.co.uk/" rel="nofollow" target="_blank">Roundel Kitchens</a>) gave a lightning talk
explaining how his use of AI helped identify and fix a critical bug in a SQL command
(“Breaking Barriers with AI Automation”). The bug itself, could have posed a real financial risk to
the company.</p>
<p>As part of his talk, Badr split up the audience by their level of AI usage.
Most of our attendees were daily users of AI for well-defined tasks.
Had Badr not increased his usage of AI at work, he may not have fixed the above bug (and got
promoted), and he urged us all to experiment more with AI in our daily work.</p>
<p><img
src="https://i1.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/badr.jpg?w=578&#038;ssl=1"
alt="Badr Adnani from Roundel Kitchens"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>So how do we broaden the use of AI within programming teams?
Firstly we make the tools easy to use, and work out how to use them cheaply and effectively.</p>
<p>The <a href="https://positron.posit.co/" rel="nofollow" target="_blank">Positron IDE</a> is becoming a very popular system for development in
data science and allied fields.
George Stagg (<a href="https://posit.co/" rel="nofollow" target="_blank">Posit</a>) gave the closing talk of the meeting describing how the
<a href="https://assistant.posit.co/" rel="nofollow" target="_blank">Posit Assistant</a> came into existence
(“A Builder’s Guide to Working with AI”).
Posit Assistant is an AI agent available in RStudio and Positron, with which a user can explore
their data and generate analytical dashboards via a conversational interface.</p>
<p>Building the Posit Assistant helped George understand AI systems like Claude.
These systems can lie to you (or your users), for example, if you ask an AI tool to summarise the
trend in a dataset, it may give you a good enough answer.
But it could be guessing &#8211; it might not even have seen the data &#8211; but may still give you an answer.
So it’s sometimes important to check the raw messages that are sent to an AI tool and have
an independent way to verify agent outputs.</p>
<p>There are existing standards that make using AI coding tools more effective.
Project-level definitions of how certain tasks should be performed, or how the project is
structured, can be put into an AGENTS.md file or a ‘skills’ directory.
George explained that it is important to make use of these common standards when building a
developer-facing agent.</p>
<p>If you want to limit the cost of AI-usage in a project, limit the amount of data that is sent
to- and from- your agent.
This could be by cacheing previous messages &#8211; because otherwise you may be sending all of your
previous conversation each time you interact with an agent.</p>
<p><img
src="https://i2.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/george.jpg?w=578&#038;ssl=1"
alt="George Stagg from Posit"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<!--
- Badr Adnani
- Roundel Kitchens Ltd
- "Breaking Barriers with AI Automation"
- Rebecca Guiney
- Certara
- "Learning in Production: Becoming a Software Engineer During the AI Wave"
- Colin Eberhardt
- Scott Logic
- "Agentic AI and the Future of Software Development"
- George Stagg
- Posit
- "Effective Agents, A Builder's Guide to Working with AI"
-->
<h2 id="ai-usage-in-specific-projects">AI usage in specific projects</h2>
<p>There are many ways in which AI can be used across organisations.
In addition to its use as an aid in software development (above) and within search-engine summaries,
it is extremely common to find people using AI to write emails, to summarise meetings, to annotate
videos and speak and to perform a range of other workplace tasks.</p>
<p>Nayara Macedo de Medeiros Albrech
(<a href="https://www.ncl.ac.uk/gps/staff/profile/nayaraalbrecht-.html" rel="nofollow" target="_blank">Newcastle University</a>) gave an
interesting summary of her research on the use of AI in local government and education
(“AI Beyond Industry: Insights from Higher Education and Government”).
Government decision making has a focus on ’evidence-based policy’, so AI could contribute in this
area, but there is a need to prevent AI from introducing bias into decision making.
The talk emphasised ethics in the public sector use of AI and the variability in take-up of AI
tooling across different local government sectors.</p>
<p><img
src="https://i0.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/nayara.jpg?w=578&#038;ssl=1"
alt="Nayara Macedo de Medeiros Albrech from Newcastle University"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>Continuing on the theme of AI use in government, Katy Morgan introduced some self-serve tools that
the
<a href="https://www.gov.uk/government/organisations/government-internal-audit-agency" rel="nofollow" target="_blank">Government Internal Audit Agency</a>
have generated to aid the production of internal audits (“From risks to insights: Driving innovation
with AI-powered tools in internal audit”).
The use of AI in these products ranged from highly-guided settings (where user-selection from a
fixed collection of application-encoded choices creates LLM prompt input automatically), to more
flexible use (where an auditor could freely interact with a chat engine).
With these tools, users are encouraged to use their own judgement to interpret any AI-generated
output.</p>
<p><img
src="https://i0.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/katy.jpg?w=578&#038;ssl=1"
alt="Katy Morgan from UK Government Internal Audit Agency"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>So AI-embedded tools can fix your code and reduce administrative work.
Can AI help resurrect old projects?</p>
<p>Shona Ferguson outlined an interesting use-case for LLMs in data-rescue efforts at the
<a href="https://www.ceh.ac.uk/" rel="nofollow" target="_blank">UK Centre for Ecology and Hydrology</a>
(“Comparing and Evaluating Large Language Models for Efficient and Responsible Data Rescue”).
Preservation of historical data resources is a time-consuming, and largely manual, task.
The typical steps involve defining some quality checks, writing a data-cleaning script, finding
supporting publications and creating documentation.</p>
<p>Shona demonstrated how effective three different LLM tools (free versions of CoPilot, ChatGPT and
Claude Sonnet) could be in a project to rescue a dataset related to cloud and rain chemistry.
The tools were particularly effective at code generation and making draft documentation.
When approaching this type of project, recommendations are to give the LLM prompt as much context
about the project as possible, to tell the LLM ’not to guess’ results and to be very explicit
about the form of output you expect the LLM to return.</p>
<p><img
src="https://i1.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/shona.jpg?w=578&#038;ssl=1"
alt="Shona Ferguson from UK Centre for Ecology and Hydrology"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>Sometimes your data is so large that it wouldn’t be possible to analyse it manually.
The team from <a href="https://www.wordnerds.ai/" rel="nofollow" target="_blank">Wordnerds</a> (Izzie Johnson and Damani Richards) gave a
talk that touched on some novel themes for our conference
(“A Nerd’s eye view: wrangling the GenAI hype cycle and refusing to become irrelevant”).</p>
<p>One of the powers of LLMs is their ability to accept natural language as input.
But natural language is complex and there’s an awful lot of natural language in the world.
For text-analytics specialists, processing customer reviews or other large-scale collections of text
using LLMs could be pretty expensive: both economically and ecologically.
If you want to process natural language efficiently at-scale, maybe an LLM isn’t the right tool to
use.
Izzie and Damani explained a hybrid approach, using both the Gemini LLM to identify and tag training
data, and smaller custom-trained neural networks to analyse millions of records efficiently.</p>
<p><img
src="https://i1.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/izzie-damani.jpg?w=578&#038;ssl=1"
alt="Izzie Johnson and Damani Richards from Wordnerds"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>Just as human language is a complicated world, so is human behaviour.
Grant Beasley from <a href="https://www.tombola.co.uk/safeplay" rel="nofollow" target="_blank">tombola</a>, alongside our own Myles Mitchell (Jumping
Rivers), presented a project where they used deep-learning to assess player behaviour in their
online betting platform (“Using Deep Learning to monitor player safety on online betting platforms”).
tombola monitors players over time, to help identify people at risk of gambling addiction, and to
intervene where appropriate.</p>
<p>The models used here are not large language models, they are deep neural networks trained on
time-series data.
Training this model over large numbers of players was a substantial undertaking.
But the tombola project highlighted how, if you are planning to build a model on this scale, it is
important that you start with simpler benchmark models to compare your larger model against.</p>
<p><img
src="https://i1.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/myles-grant.jpg?w=578&#038;ssl=1"
alt="Grant Beasley from tombola, and Myles Mitchell from Jumping Rivers"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>William Kirby (<a href="https://www.wessexwater.co.uk/" rel="nofollow" target="_blank">Wessex Water</a>) presented a lightning talk covering
another project where real-time interventions can impact on human behaviour.
This time the subject was wild-swimming and water quality in inland bathing waters in the UK
(“Near Real Time Notifications for Bathing Waters using Machine Learning”).
The project integrates data on water quality and climate with sensor and sampling data, and is
capable of classifying risk at their pilot site (Warleigh Weir, near Bath) on a 15 minute
turnaround. They have developed a <a href="https://www.waterqualitylive.info/" rel="nofollow" target="_blank">web application</a> to present
their results and are scaling out to additional sites over the next two years.</p>
<p><img
src="https://i1.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/william.jpg?w=578&#038;ssl=1"
alt="William Kirby from Wessex Water"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<!--
- Uses of AI in _specific_ projects/products
- AI usage by organisations
- extracting information from users/datasets
- LLMs in government/HE
- Player safety
- Nayara Albrecht
- Newcastle University & University of Amsterdam
- "AI Beyond Industry: Insights from Higher Education and Government"
- Katie Morgan
- Government Internal Audit Agency
- "From Risks to Insights: Driving Innovation with AI-powered Tools in Internal Audit"
- Shona Ferguson
- UK Centre for Ecology and Hydrology
- "Comparing and Evaluating LLMs for Efficient and Responsible Data Rescue"
- Izzie Johnson & Damani Richards
- Wordnerds
- "A Nerd's Eye View: wrangling the GenAI hype cycle and refusing to become irrelevant — how we
made text analytics faster, leaner, greener (and kept our sense of humour)"
- Myles Mitchell & Grant Beasley
- Jumping Rivers and tombola
- "Using Deep Learning to Monitor Player Safety on online betting platforms"
- Will Kirby
- Wessex Water
- "Developing Scalable Solutions for Predicting Water Quality"
- (? The website says "Near real-time nofications for bathing waters using machine learning")
-->
<h2 id="incorporating-custom-information-into-ai-tools">Incorporating custom information into AI-tools</h2>
<p>Agentic systems are clearly very powerful, but they can become far more useful in a project or
product when the data they have access to is tailored to that project.
Three talks highlighted different ways to connect an LLM to a custom data source or an external
service so that the agent can be better informed.</p>
<p>The standard way to enhance an LLM with a custom data source, is by using
<a href="https://en.wikipedia.org/wiki/Retrieval-augmented_generation" rel="nofollow" target="_blank">“Retrieval-Augmented Generation”</a>
(RAG). Obinna Iheanachor (<a href="https://www.rotork.com/en" rel="nofollow" target="_blank">Rotork</a>; and host of the
<a href="https://www.youtube.com/@wisabianalytics" rel="nofollow" target="_blank">Wisabi Analytics</a> YouTube channel) gave a lightning talk
explaining a two-step AI-driven process where he used RAGs to identify documents related to
corporate insolvency cases, and then to identify evidence within those documents
(“RAG in the Real World: Designing Trustworthy LLM Systems for Corporate Insolvency Data”).
The aim here was to identify citable evidence, rather than plausible-sounding and eloquently written
LLM outputs, so the use of RAGs was essential.</p>
<p><img
src="https://i0.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/obinna.jpg?w=578&#038;ssl=1"
alt="Obinna Iheanachor from Rotork"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>RAG is a way of embedding document-derived text in a way that can be searched by an LLM.
An extension of this concept is the <a href="https://graphrag.com/" rel="nofollow" target="_blank">GraphRAG</a>, where relationships between
entities in a series of documents can also be represented.
Jonny Law (<a href="https://neo4j.com/" rel="nofollow" target="_blank">Neo4J</a>) presented a talk that explained many of the concepts
underpinning GraphRAG (“Engineering a Scalable Knowledge Graph Builder on Neo4J Cloud”).
Neo4J have developed a “Knowledge Graph Builder” that allows data and relationships to be extracted
from documents and represented in a graph structure.
This graph structure can be queried using an LLM by converting an LLM query into a GraphRAG query.</p>
<p><img
src="https://i1.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/jonny.jpg?w=578&#038;ssl=1"
alt="Jonny Law from Neo4J"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>Another way to connect an agent to an external data source or service is the
<a href="https://en.wikipedia.org/wiki/Model_Context_Protocol" rel="nofollow" target="_blank">“Model Context Protocol”</a> (MCP).
MCP is an open standard and was the subject of Neal Richardson’s (<a href="https://posit.co/" rel="nofollow" target="_blank">Posit</a>) talk
(“MCP, or not MCP”).
As a motivation, Neal explained that for security reasons, there are external resources that an
AI agent shouldn’t be given access to.
For example, you might not want an LLM to be able to read and write to the support message-board
for your software, or to read any file on your computer.</p>
<p>MCPs use a standard API and JSON-based interchange format, but they make it easier to restrict the
reach of an AI system.
OAuth 2.1 can be used to register an LLM with an MCP, meaning that API secrets needn’t be available
to the LLM &#8211; so it can’t leak these.
Recommendations for building MCPs, are to only define the tools you actually need, to make API
responses concise and to sanitise any sensitive data that the MCP might return.</p>
<p><img
src="https://i2.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/neal.jpg?w=578&#038;ssl=1"
alt="Neal Richardson from Posit"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<!--
- Incorporating custom data/information
- RAG / GraphRAG
- MCPs
- Obinna Iheanachor
- Rotork
- https://www.youtube.com/@wisabianalytics
- "RAG in the Real World: Designing Trustworthy LLM Systems for Corporate Insolvency Data"
- Neal Richardson
- Posit
- "MCP, or not MCP"
- Jonny Laws
- Neo4j
- "Engineering a Scalable Knowledge Graph Builder on Neo4J Cloud"
-->
<h2 id="development-deployment-and-auditing-of-ai-embedded-products">Development, deployment and auditing of AI-embedded products</h2>
<p>We have seen software-development tools that make use of AI; specific projects that use AI and/or
ML; analysis of, and recommendations for, the use of AI; and ways to link additional data to
AI tools.
But before you incorporate AI into all your workflows, you need to take a step back and consider how
to implement everything in a way that’s cost-effective, safe and legal.</p>
<p>First we need to consider what we’re allowed to do with AI and the liabilities we create when we use
it on the public.</p>
<p>Nathan Bilton (<a href="https://www.weightmans.com/" rel="nofollow" target="_blank">Weightmans</a>) provided a thought-provoking insight
into how legislation is evolving to match the growth of AI (“Regulating Artificial Intelligence”).
Given that AI can take in vast quantities of personal data and intellectual property during
training, does existing legislation provide enough protection?
And even if we agree on a better set of rules, how do we enforce them?
And who will be the enforcers?</p>
<p>Some of these questions may feel out of your remit, and something for your elected lawmakers to
debate over.
But keeping abreast of these developing laws remains relevant to your deployment of AI,
both now and in the uncertain future.</p>
<p>The <a href="https://digital-strategy.ec.europa.eu/en/policies/regulatory-framework-ai" rel="nofollow" target="_blank">EU AI Act 2024</a>
already applies a number of restrictions on how AI can be used, with extraterrestrial effects.
If you feed personal data of UK or EU citizens into AI, then GDPR rules still apply.
And if you do allow AI to interface with the public on your behalf, are you responsible if things go
wrong?
Here Nathan cites the case of
<a href="https://www.bbc.co.uk/travel/article/20240222-air-canada-chatbot-misinformation-what-travellers-should-know" rel="nofollow" target="_blank">Moffatt v. Air Canada, 2024</a>
where a Civil Resolution Tribunal found Air Canada to be
<a href="https://canlii.ca/t/k2spq#par32" rel="nofollow" target="_blank">liable for damages due to “negligent misrepresentation”</a>
after incorrect advice was given by a chatbot on their website.</p>
<p><img
src="https://i2.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/nathan.jpg?w=578&#038;ssl=1"
alt="Nathan Bilton from Weightmans"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>Next, how do you ensure your product’s use of AI is secure?
Mac Misiura (Red Hat) presented the first technical talk of the day
(“Open Source Guardrails for AI: Securing LLM Applications at Scale”).
If you are planning to deploy an AI-backed application to production, I strongly urge you to watch
this talk (soon to be on the Jumping Rivers
<a href="https://www.youtube.com/@jumping-rivers" rel="nofollow" target="_blank">YouTube channel</a>).</p>
<p>Mac highlighted some of the top risks that an LLM-based app exposes you to.
There is a top-10 list hosted by <a href="https://genai.owasp.org/llm-top-10/" rel="nofollow" target="_blank">OWASP</a>, that covers things
like disclosure of sensitive information, and spreading of misinformation.
Not addressing these risks can expose you to reputational damage and adversarial attacks.</p>
<p>To help secure your app, you can use “Guardrails”, which filter out inappropriate queries.
These can range in complexity from rules and regular expressions up to LLM-based assessment of
the intent of the query (use the simplest guardrails first).
There are open-source guardrail collections that you can use with your application, for example,
the <a href="https://docs.nvidia.com/nemo/guardrails/home" rel="nofollow" target="_blank">NVIDIA NeMo Guardrails</a>.
Mac also argued that you should run attacks against your own system to identify security weak spots.</p>
<p><img
src="https://i2.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/mac.jpg?w=578&#038;ssl=1"
alt="Mac Misiura from Red Hat"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>You may have multiple products in the pipeline.
Diego Jimenez and Oliver Thomas from <a href="https://www.sage.com/en-gb/" rel="nofollow" target="_blank">Sage</a> covered their approach
to product delivery using what they described as a “repeatable path for controlled AI at enterprise
scale” (“Beyond the POC: Architecting Enterprise-Grade Agentic Systems at Sage”).
This approach allows them to rapidly iterate from prototype to scalable product, by using common
designs across those products.
They emphasised the importance of monitoring agent behaviour, and similarly to Mac Misiura (above)
the use of safety guardrails across their products.</p>
<p><img
src="https://i0.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/oliver-diego.jpg?w=578&#038;ssl=1"
alt="Diego Jimenez and Oliver Thomas from Sage"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<p>Finally, once your app is in production, you’ll need to start paying for tokens.</p>
<p>Seb Ringrose (<a href="https://www.doubleword.ai/" rel="nofollow" target="_blank">Doubleword</a>) described
<a href="https://github.com/apps/doubleword-code" rel="nofollow" target="_blank">“Doubleword Code”</a>, a system developed by Doubleword that
performs pull-request reviews on repositories.
During the talk, Seb identified a few challenges with the current use of AI agents: how to select
which model to use (from a continually changing collection of models), how much context to provide
to an agent, what ancillary tooling to use, and—importantly—the cost of using these agents.</p>
<p>Given these desirable qualities of agents &#8211; low latency, low cost and high quality &#8211; Seb argued
that you can only have two in any AI system.
So if you need a real-time system, then you have to choose between high cost or low quality.
But not all systems need to run in real-time.
For the pull-request review system, it can run asynchronously or as a batch process, and by doing so
can lead to cost savings.
Given that for many settings, the number of tokens used per task is increasing, finding ways to
reduce cost is becoming extremely important.</p>
<p><img
src="https://i1.wp.com/www.jumpingrivers.com/blog/2026-ai-in-production-summary/speakers/seb.jpg?w=578&#038;ssl=1"
alt="Seb Ringrose from Doubleword"
style="display:block; margin:auto;" data-recalc-dims="1"
/></p>
<h2 id="summary">Summary</h2>
<p>This years talks at “AI In Production” covered a wide spectrum of the uses of AI (and advanced
machine learning) in software products and data projects across several domains. We discussed
best practices for securely releasing AI-embedded software into the world, regulatory matters,
and how we can evolve as software professionals as AI tooling becomes commonplace.</p>
<p>Jumping Rivers would like to thank everyone who presented talks or workshops at the conference (or
submitted abstracts), all of the sponsors and the attendees for making this an interesting
conference. We hope to see you again next year at
<a href="https://ai-in-production.jumpingrivers.com/" rel="nofollow" target="_blank"><em>AI In Production 2027</em></a>.</p>
<p>The talks from the conference will be added to the Jumping Rivers
<a href="https://www.youtube.com/@jumping-rivers" rel="nofollow" target="_blank">YouTube channel</a> soon.</p>
<h2 id="sponsors">Sponsors</h2>
<ul>
<li><a href="https://www.jumpingrivers.com/" rel="nofollow" target="_blank">Jumping Rivers</a></li>
<li><a href="https://www.databricks.com/" rel="nofollow" target="_blank">Databricks</a></li>
<li>The <a href="https://rss.org.uk/" rel="nofollow" target="_blank">Royal Statistical Society</a></li>
<li><a href="https://posit.co/" rel="nofollow" target="_blank">Posit</a></li>
<li><a href="https://taylorandfrancis.com/" rel="nofollow" target="_blank">CRC Press</a></li>
<li>The <a href="https://www.nicd.org.uk/" rel="nofollow" target="_blank">National Innovation Centre for Data (NICD)</a></li>
</ul>
<h2 id="community-partners">Community Partners</h2>
<ul>
<li><a href="https://devitjobs.uk/" rel="nofollow" target="_blank">DevITJobs.uk</a></li>
</ul>
<p>
For updates and revisions to this article, see the <a href = "https://www.jumpingrivers.com/blog/2026-ai-in-production-summary/">original post</a>
</p>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://www.jumpingrivers.com/blog/2026-ai-in-production-summary/"> The Jumping Rivers Blog</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/ai-in-production-conference-summary-2026/">AI in Production Conference Summary (2026)</a>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">402280</post-id>	</item>
		<item>
		<title>SIM2 climate data</title>
		<link>https://www.r-bloggers.com/2026/06/sim2-climate-data/</link>
		
		<dc:creator><![CDATA[Michael]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 16:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://r.iresmi.net/posts/2026/sim2/</guid>

					<description><![CDATA[<div style = "width:60%; display: inline-block; float:left; ">
<p>Temperature change in France – CC-BY by University of Reading</p>
<p>As France enters its second heatwave of 2026, can we produce more detailed plots than the excellent visualizations provided by ShowYourStripes?<br />
MétéoFrance offers its monthly SI...</p></div>
<div style = "width: 40%; display: inline-block; float:right;"></div>
<div style="clear: both;"></div>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/sim2-climate-data/">SIM2 climate data</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://r.iresmi.net/posts/2026/sim2/"> r.iresmi.net</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
 






<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://showyourstripes.info/b/europe/france/all" rel="nofollow" target="_blank"><img src="https://i0.wp.com/r.iresmi.net/posts/2026/sim2/images/EUROPE-France-_3CAll_20of_20France_3E-1850-2025-BK.png?w=578&#038;ssl=1" class="preview-image img-fluid figure-img" alt="A plot of temperature anomaly in France as blue and red stripes" data-recalc-dims="1"></a></p>
<figcaption>Temperature change in France – CC-BY by University of Reading</figcaption>
</figure>
</div>
<p>As France enters its second heatwave of 2026, can we produce more detailed plots than the excellent visualizations provided by <a href="https://showyourstripes.info/" rel="nofollow" target="_blank">ShowYourStripes</a>?</p>
<p>MétéoFrance offers its <a href="https://meteo.data.gouv.fr/datasets/65e040c50a5c6872ebebc711" rel="nofollow" target="_blank">monthly SIM2 dataset</a> albeit over a shorter time span (currently 1970–2025). The dataset includes temperature, precipitation and other variables on an 8 km resolution grid.</p>
<p>We will select a French city, retrieve its geographic coordinates, build the grid for a specific month over the 1970–2025 period, extract the data from the grid at that location and plot the temperature anomaly.</p>
<p>We will use {terra} to create the grid from the tabular files containing cell centers and weather variables, and <code>terra::extract()</code> to get all temperatures.</p>
<div class="cell">
<pre>library(tidyverse)
library(fs)
library(janitor)
library(osmdata)
library(sf)
library(terra)
library(glue)
library(memoise)

invisible(
  Sys.setlocale(category = &quot;LC_ALL&quot;, 
                locale = &quot;en_GB.UTF8&quot;))


#' Geolocate using OSM (Nominatim API)
#'
#' using first result
#' Memoized function
#'
#' @param location (char): place name (geocodable via OSM)
#'
#' @returns (SpatVector): first result
geolocate &lt;- memoise(function(location) {
  loc &lt;- getbb(location, format_out = &quot;sf_polygon&quot;)  |&gt; 
    st_point_on_surface() |&gt;
    slice_head(n = 1)
  
  message(glue(&quot;{loc$display_name} — WGS84 : {loc$geometry}&quot;))
  
  return(loc|&gt;
           st_transform(&quot;IGNF:NTFLAMB2E&quot;) |&gt;
           as(&quot;SpatVector&quot;))
})

#' Generate a monthly temperature chart since 1970
#'
#' @param sim2 (data.frame): Météo-France SIM2 data over the period
#' @param month (char): month number &quot;01&quot;...&quot;12&quot;
#' @param location (char): place name (geocodable via OSM); memoized
#' @param output_dir (char): directory path where a PNG file will be written, if not NULL
#'
#' @returns (ggplot and optionally a file on disk)
generate_chart &lt;- function(
    sim2,
    month,
    location,
    output_dir = NULL) {
  stopifnot(month %in% sprintf(&quot;%02d&quot;, 1:12))
  month_name &lt;- format(ymd(glue(&quot;0000-{month}-01&quot;)), &quot;%B&quot;)
  
  sim2_raster &lt;- sim2 |&gt;
    filter(str_detect(date, glue(&quot;{month}$&quot;))) |&gt;
    mutate(
      x = lambx * 100,
      y = lamby * 100,
      layer = date,
      temp = t,
      .keep = &quot;none&quot;) |&gt;
    rast(
      type = &quot;xylz&quot;,
      crs = &quot;IGNF:NTFLAMB2E&quot;)
  
  loc &lt;- geolocate(location)
  
  temperatures &lt;- sim2_raster |&gt;
    terra::extract(loc) |&gt;
    select(-ID) |&gt;
    pivot_longer(
      cols = everything(),
      names_to = &quot;month&quot;,
      values_to = &quot;temperature&quot;) |&gt;
    mutate(
      year = as.integer(str_sub(month, 1, 4)),
      anomaly = temperature - mean(temperature[year &gt;= 1991 & year &lt;= 2020],
                                   na.rm = TRUE))
  
  p &lt;- temperatures |&gt;
    ggplot(aes(year, anomaly)) +
    geom_col(aes(fill = anomaly)) +
    geom_smooth(method = &quot;loess&quot;,
                formula = y ~ x) +
    scale_fill_gradient2(
      high = scales::muted(&quot;red&quot;),
      mid = &quot;white&quot;,
      low = scales::muted(&quot;blue&quot;)) +
    scale_x_continuous(breaks = scales::breaks_pretty()) +
    scale_y_continuous(breaks = scales::breaks_pretty()) +
    labs(
      title = glue(&quot;Average monthly anomaly temperature — {month_name}&quot;),
      subtitle = location,
      x = &quot;year&quot;,
      y = &quot;departure from average* (°C)&quot;,
      fill = &quot;°C&quot;,
      caption = glue(
        &quot;https://r.iresmi.net/ — {Sys.Date()}
         data: Météo-France SIM2 — *baseline: 1991–2020 normal for {month_name}&quot;)) +
    theme(
      text = element_text(family = &quot;Ubuntu&quot;),
      plot.caption = element_text(size = 7))
  
  if (!is.null(output_dir)) {
    dir_create(output_dir)
    
    ggsave(
      glue(&quot;{output_dir}/tm_{month}_{make_clean_names(location)}.png&quot;),
      plot = p,
      width = 20,
      height = 20 / 1.618,
      units = &quot;cm&quot;,
      dpi = 150)
  }
  
  return(p)
}</pre>
</div>
<p>The data is a bunch of compressed CSV.</p>
<div class="cell">
<pre># https://meteo.data.gouv.fr/datasets/65e040c50a5c6872ebebc711
# Climate change data - monthly SIM
# all files MENS_SIM2_*-*.csv.gz
sim2 &lt;- dir_ls(&quot;data&quot;) |&gt;
  read_delim(
    delim = &quot;;&quot;,
    locale = locale(decimal_mark = &quot;.&quot;),
    name_repair = make_clean_names)</pre>
</div>
<p>Now we just call our function.</p>
<div class="cell">
<pre>generate_chart(sim2,
               month = &quot;06&quot;,
               location = &quot;Paris, France&quot;)</pre>
<div class="cell-output-display">
<div id="fig-process" class="quarto-float quarto-figure quarto-figure-center anchored" alt="Bar plot of temperature anomaly in Paris">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-process-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://i2.wp.com/r.iresmi.net/posts/2026/sim2/index_files/figure-html/fig-process-1.png?w=578&#038;ssl=1" class="img-fluid figure-img" style="width:100.0%" alt="Bar plot of temperature anomaly in Paris" data-recalc-dims="1">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-process-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure 1: June temperature in Paris 1970–2025
</figcaption>
</figure>
</div>
</div>
</div>
<p>If we want each month:</p>
<div class="cell">
<pre># for each month
sprintf(&quot;%02d&quot;, 1:12) |&gt;
  map(\(x) generate_chart(sim2,
                           month = x,
                           location = &quot;Grenoble, France&quot;,
                           output_dir = &quot;results&quot;), 
  .progress = TRUE)</pre>
</div>
<p>Note that scales are not constant across plots; if we want to compare month (or places) we should fix the y-axis and the color scale. It’s left as an exercise to the reader if you want to make a nice poster…</p>


<!-- -->


 
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://r.iresmi.net/posts/2026/sim2/"> r.iresmi.net</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/sim2-climate-data/">SIM2 climate data</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402233</post-id>	</item>
		<item>
		<title>Winter R workshops at University of Queensland, Brisbane</title>
		<link>https://www.r-bloggers.com/2026/06/winter-r-workshops-at-university-of-queensland-brisbane/</link>
		
		<dc:creator><![CDATA[Seascapemodels]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 14:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://www.seascapemodels.org/posts/2026-06-25-R-workshops-in-brisbane/</guid>

					<description><![CDATA[<p>My colleagues run some highly regarded R workshops for well over a decade in Brisbane (Australia) every year.<br />
Details here and info below<br />
Are you ready to take your R skills to the next level and conquer the challenges of messy data? Transform r...</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/winter-r-workshops-at-university-of-queensland-brisbane/">Winter R workshops at University of Queensland, Brisbane</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://www.seascapemodels.org/posts/2026-06-25-R-workshops-in-brisbane/"> Seascapemodels</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
 





<p>My colleagues run some highly regarded R workshops for well over a decade in Brisbane (Australia) every year.</p>
<p><a href="https://mathmarecol.github.io/RWorkshop/winter.html" rel="nofollow" target="_blank">Details here and info below</a></p>
<p>Are you ready to take your R skills to the next level and conquer the challenges of messy data? Transform raw data into actionable insights with the Centre for Biodiversity and Conservation Science (CBCS) 2026 Winter R Workshops @ UQ.</p>
<p>These intensive, hands-on workshops are designed for individuals with a foundational understanding of R who are eager to master the essential skills for effective data wrangling, code organisation, advanced visualisation, spatial analysis, and building interactive Shiny apps. Join us to elevate your R proficiency and become a data manipulation and presentation expert!</p>
<p>Each day is self-contained so you can attend the workshops you want to.</p>
<p>Day 1 (Monday 6th July) Data Wrangling 1 Day 2 (Tuesday 7th July) Data Wrangling 2 Day 3 (Wednesday 8th July) Visual Storytelling Day 4 (Thursday 9th July) Mapping our World Day 5 (Friday 10th July) Building Interactive Web Apps with Shiny</p>
<p>Registration for the 2026 Winter R Workshops @ UQ in July is OPEN.</p>
<p>We are passionate users of R and want to share our experience. Our workshops are accessible, interactive, informative and fun. They are run in-person only (no online option) to provide a tailored student experience and we provide all the code and learning materials. For more information on the topics covered and to view testimonials, see our website https://mathmarecol.github.io/RWorkshop/winter.html and the attached flyer.</p>
<p>These workshops are brought to you by the Centre for Biodiversity and Conservation Science (CBCS). For any questions about registration, email cbcs-workshops@uq.edu.au.</p>
<p>We look forward to seeing you there. The R Workshops @ UQ team (Anthony, Dave, Jason, Claire and Tin)</p>



 
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://www.seascapemodels.org/posts/2026-06-25-R-workshops-in-brisbane/"> Seascapemodels</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/winter-r-workshops-at-university-of-queensland-brisbane/">Winter R workshops at University of Queensland, Brisbane</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402255</post-id>	</item>
		<item>
		<title>Data for fitting models versus data for predicting from models</title>
		<link>https://www.r-bloggers.com/2026/06/data-for-fitting-models-versus-data-for-predicting-from-models/</link>
		
		<dc:creator><![CDATA[Seascapemodels]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 14:00:00 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">https://www.seascapemodels.org/posts/2026-06-25-prediction-vs-fitting/</guid>

					<description><![CDATA[<p>Answering a question that came up from a student recently.<br />
Say you have 20 surveys of reef fish biomass at different locations. Then you also have gridded data with environmental covariates. The gridded data is for all reefs everywhere.<br />
The goal...</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/data-for-fitting-models-versus-data-for-predicting-from-models/">Data for fitting models versus data for predicting from models</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://www.seascapemodels.org/posts/2026-06-25-prediction-vs-fitting/"> Seascapemodels</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>
 





<p>Answering a question that came up from a student recently.</p>
<p>Say you have 20 surveys of reef fish biomass at different locations. Then you also have gridded data with environmental covariates. The gridded data is for all reefs everywhere.</p>
<p>The goal is to predict fish biomass at all reefs everywhere. <a href="https://www.seascapemodels.org/posts/2020-02-19-spatial-gam-predictions/index.html" rel="nofollow" target="_blank">Here’s an older post that walks through the steps in R with older packages</a> (you will want to update <code>raster</code> to <code>terra</code>, everything else should work).</p>
<p>The statistically correct workflow would look like this:</p>
<p><strong>1. Extract environmental covariates at your 20 reef sites</strong></p>
<p>For example, you might have sites as x-y coordinates and the gridded data as <code>terra</code> rasters. You can use the <code>extract</code> function to get the values of the environmental data at your reef sites. Let’s call this new dataframe you will make <code>fish_data</code>.</p>
<p><strong>2. Fit a model</strong></p>
<p>Fit a model predicting fish biomass at the 20 sites from the environmental covariates. for example:</p>
<pre>model1 &lt;- gam(biomass ~ SST + depth, data = `fish_data`)</pre>
<p>Your sample size for this model will be 20, ie the number of reef sites where you measured fish.</p>
<p>Do all the usual steps to verify your model, model selection etc…</p>
<p><strong>3. Turn the grids into a dataframe of environmental covariates</strong></p>
<p>There’s lots of ways to do this data wrangling step. I like to use the function to get coordinates of centre points of the grids (<code>xyFromCell</code>), then convert that to a spatial points, then use <code>extract</code>, the convert back to a plain dataframe (keeping the X-Y as columns).</p>
<p>Now we have a new dataframe of environmental covariates at every grid cell location. Let’s call it <code>pred_data</code> for ‘prediction data’. It will have as many rows as there are grids in your raster, probably 1000s.</p>
<p>You might like to do a filtering step to remove grids that aren’t on reefs (or your target habitat, no point predicting reef fish biomass for places that are sand or land).</p>
<p><strong>4. Predict with your model</strong></p>
<p>Now use your model to predict to all the grid locations, e.g. </p>
<pre>pred_data$mean &lt;- predict(model1, newdata = pred_data)</pre>
<p>Then you can convert <code>pred_data</code> back into a spatial object for mapping the predictions.</p>
<section id="common-mistakes" class="level2">
<h2 class="anchored" data-anchor-id="common-mistakes">Common mistakes</h2>
<p>So students sometimes get the sequence of steps wrong. For example, you could turn the grids into a dataframe, interpolate fish biomass to unmeasured grids BEFORE you fit your model. That would be statistically inappropriate as you are inflating the sample size by replicating survey data across unmeasured grids.</p>
<p>Another common mistake is using locally measured covariates but then predicting to gridded covariates that were measured differently. We should use the gridded covariates, rather than locally measured covariates for our fitting and prediction.</p>
<p>For instance, you may have temperature gridded measured by a satellite as well as temperature measured locally during the surveys. You want to use gridded covariates for our goal of predicting, because that is the temperature data you have everywhere.</p>
<p>So now you are ready to go forth and make some cool map predictions. <a href="https://www.nature.com/articles/s41559-022-01778-z" rel="nofollow" target="_blank">Don’t forget to map the uncertainty too (e.g. standard errors)</a>.</p>
<p>Last word, <a href="https://r-tmap.github.io/tmap/" rel="nofollow" target="_blank"><code>tmap</code></a> is still my fave tool for mapping in R and it keeps getting better.</p>


</section>

 
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://www.seascapemodels.org/posts/2026-06-25-prediction-vs-fitting/"> Seascapemodels</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/data-for-fitting-models-versus-data-for-predicting-from-models/">Data for fitting models versus data for predicting from models</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402235</post-id>	</item>
		<item>
		<title>Set Working Directory in R: setwd() &#038; RStudio GUI Guide</title>
		<link>https://www.r-bloggers.com/2026/06/set-working-directory-in-r-setwd-rstudio-gui-guide/</link>
		
		<dc:creator><![CDATA[Unknown]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 08:24:57 +0000</pubDate>
				<category><![CDATA[R bloggers]]></category>
		<guid isPermaLink="false">http://www.r-bloggers.com/?guid=76daad1a014d4de2f77abf2ed8325ea6</guid>

					<description><![CDATA[<p>Learn how to set your working directory in R using setwd() or the RStudio Session menu. Covers getwd(), Windows path errors, and the here() package for dissertation projects.</p>
<p>Read More »</p>
<strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/set-working-directory-in-r-setwd-rstudio-gui-guide/">Set Working Directory in R: setwd() & RStudio GUI Guide</a>]]></description>
										<content:encoded><![CDATA[<!-- 
<div style="min-height: 30px;">
[social4i size="small" align="align-left"]
</div>
-->

<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 12px;">
[This article was first published on  <strong><a href="https://www.rstudiodatalab.com/2023/10/how-to-set-working-directory-setwd-in-r.html"> RStudioDataLab</a></strong>, and kindly contributed to <a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers</a>].  (You can report issue about the content on this page <a href="https://www.r-bloggers.com/contact-us/">here</a>)
<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div>

<!-- Explicit post snippet -->
<div hidden="" aria-hidden="true">Learn how to set your working directory in R using setwd() or the RStudio Session menu. Covers getwd(), Windows path errors, and the here() package for dissertation projects.</div>

<a href="https://www.rstudiodatalab.com/2023/10/how-to-set-working-directory-setwd-in-r.html#more" rel="nofollow" target="_blank">Read More »</a>
<div style="border: 1px solid; background: none repeat scroll 0 0 #EDEDED; margin: 1px; font-size: 13px;">
<div style="text-align: center;">To <strong>leave a comment</strong> for the author, please follow the link and comment on their blog: <strong><a href="https://www.rstudiodatalab.com/2023/10/how-to-set-working-directory-setwd-in-r.html"> RStudioDataLab</a></strong>.</div>
<hr />
<a href="https://www.r-bloggers.com/" rel="nofollow">R-bloggers.com</a> offers <strong><a href="https://feedburner.google.com/fb/a/mailverify?uri=RBloggers" rel="nofollow">daily e-mail updates</a></strong> about <a title="The R Project for Statistical Computing" href="https://www.r-project.org/" rel="nofollow">R</a> news and tutorials about <a title="R tutorials" href="https://www.r-bloggers.com/how-to-learn-r-2/" rel="nofollow">learning R</a> and many other topics. <a title="Data science jobs" href="https://www.r-users.com/" rel="nofollow">Click here if you're looking to post or find an R/data-science job</a>.

<hr>Want to share your content on R-bloggers?<a href="https://www.r-bloggers.com/add-your-blog/" rel="nofollow"> click here</a> if you have a blog, or <a href="http://r-posts.com/" rel="nofollow"> here</a> if you don't.
</div><strong>Continue reading</strong>: <a href="https://www.r-bloggers.com/2026/06/set-working-directory-in-r-setwd-rstudio-gui-guide/">Set Working Directory in R: setwd() & RStudio GUI Guide</a>]]></content:encoded>
					
		
		<enclosure url="" length="0" type="" />

		<post-id xmlns="com-wordpress:feed-additions:1">402226</post-id>	</item>
	</channel>
</rss>
