<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>pest forecasting on Bhim Chaulagain</title><link>https://bhimchaulagain.netlify.app/tags/pest-forecasting/</link><description>Recent content in pest forecasting on Bhim Chaulagain</description><generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>en-us</language><copyright>B. Chaulagain {year}</copyright><lastBuildDate>Tue, 05 May 2026 21:13:14 -0500</lastBuildDate><atom:link href="https://bhimchaulagain.netlify.app/tags/pest-forecasting/index.xml" rel="self" type="application/rss+xml"/><item><title>Using a Degree-Day Model to Forecast Adult Japanese Beetle Activity</title><link>https://bhimchaulagain.netlify.app/post/2026-05-05-japanese_beetle_modeling/</link><pubDate>Tue, 05 May 2026 21:13:14 -0500</pubDate><guid>https://bhimchaulagain.netlify.app/post/2026-05-05-japanese_beetle_modeling/</guid><description>&lt;p>Last year, Japanese beetles hit the rapeseed vegetables in my backyard hard. After seeing that damage up close, I wanted to learn more about the pest. I wanted to know whether I could anticipate adult activity early enough to scout better and respond before damage built again.&lt;/p>
&lt;p>That question pushed me into the literature. I looked through papers on Japanese beetle phenology, broader modeling references, and the USPEST.ORG white paper. What became clear quickly was that these sources were not all trying to answer the same question. Some were aimed at broad life-cycle or climate-suitability questions, while others were much closer to the practical forecasting problem I cared about: if I saw meaningful beetle pressure last season, can I use weather this season to anticipate adult activity earlier?&lt;/p>
&lt;p>That is what led me to the paper by Dominique N. Ebbenga, A. A. Hanson, E. C. Burkness, and W. D. Hutchison, &lt;em>A degree-day model for forecasting adult phenology of Popillia japonica (Coleoptera: Scarabaeidae) in a temperate climate&lt;/em>. There are many useful papers on Japanese beetle phenology, but I use this one as the main foundation because it is directly focused on forecasting adult trap-catch activity. I also looked at the USPEST.ORG white paper because it is useful for broader phenology and climate-suitability thinking, but I do not want to blur those purposes into one model. My goal here is simpler: use seasonal weather data to build an earlier scouting signal for adult Japanese beetle activity.&lt;/p>
&lt;h2 id="why-i-started-with-this-paper">Why I Started With This Paper&lt;/h2>
&lt;p>The paper addresses a real operational gap. Japanese beetle is a major invasive pest in turf, ornamentals, and several agricultural crops, but traps only tell us that beetles are already active. Ebbenga et al. aimed to build an early-warning degree-day model that links ambient temperature accumulation to adult trap-catch phenology under temperate Midwest conditions.&lt;/p>
&lt;p>For this post, my immediate goal is narrower: I want a model that helps me estimate when adult beetle activity is becoming important enough to scout and respond. That is why I am leaning on Ebbenga et al. as the core paper here. It is focused on forecasting adult trap-catch from field observations and weather data, rather than trying to simulate the entire life cycle from eggs to larvae to pupae in one model.&lt;/p>
&lt;h2 id="what-the-paper-actually-did">What The Paper Actually Did&lt;/h2>
&lt;p>The study used field data from four Minnesota locations across 2019-2021. Commercial traps with semiochemical lures were used to monitor adult beetle activity, and daily temperature data were paired with trap-catch observations. The model-building workflow followed Hanson et al.&amp;rsquo;s concordance-correlation-based approach:&lt;/p>
&lt;ol>
&lt;li>split 12 site-years into 6 development and 6 validation datasets,&lt;/li>
&lt;li>iterate across start dates, lower thresholds, upper thresholds, and degree-day calculation methods,&lt;/li>
&lt;li>fit logistic regression for cumulative proportion trap-catch against accumulated degree-days,&lt;/li>
&lt;li>rank candidate models using the concordance correlation coefficient, with AIC used as a secondary fit check across the full emergence curve.&lt;/li>
&lt;/ol>
&lt;p>The paper reports that model development evaluated &lt;code>7,392&lt;/code> parameter combinations:&lt;/p>
&lt;ul>
&lt;li>start dates of January 1, February 1, March 1, and April 1,&lt;/li>
&lt;li>lower thresholds from &lt;code>0&lt;/code> to &lt;code>15 C&lt;/code>,&lt;/li>
&lt;li>upper thresholds from &lt;code>20&lt;/code> to &lt;code>37 C&lt;/code> in &lt;code>0.56 C&lt;/code> increments,&lt;/li>
&lt;li>both a simple average method and a half-day sine-wave method.&lt;/li>
&lt;/ul>
&lt;p>That comparison is worth keeping in mind. The paper did not begin by assuming the simple method was automatically best. It tested both a simple average degree-day approach and a half-day sine-wave approach, then selected the model that performed better for its forecasting objective. So it is fair to say the paper gives us a taste of both methods, even though the implementation I keep in the main code path follows the one that was ultimately selected.&lt;/p>
&lt;p>The paper selected the following degree-day model specification for forecasting &lt;code>10%&lt;/code> trap-catch:&lt;/p>
&lt;ul>
&lt;li>biofix date: &lt;code>January 1&lt;/code>&lt;/li>
&lt;li>method: &lt;code>simple average degree-day method&lt;/code>&lt;/li>
&lt;li>lower threshold: &lt;code>15.0 C&lt;/code>&lt;/li>
&lt;li>upper threshold: &lt;code>21.7 C&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>For that selected model, the paper reported:&lt;/p>
&lt;ul>
&lt;li>development CCC: &lt;code>0.899&lt;/code>&lt;/li>
&lt;li>validation CCC: &lt;code>0.785&lt;/code>&lt;/li>
&lt;li>validation &lt;code>r = 0.837&lt;/code>&lt;/li>
&lt;li>validation &lt;code>A = 0.938&lt;/code>&lt;/li>
&lt;li>mean error for predicted minus observed 10% trap-catch dates:
development &lt;code>-1.5 d&lt;/code>, validation &lt;code>-1.5 d&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>The fitted log-logistic coefficients reported for that model were:&lt;/p>
&lt;ul>
&lt;li>intercept: &lt;code>-43.34&lt;/code>&lt;/li>
&lt;li>slope: &lt;code>7.41&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="the-exact-core-model">The Exact Core Model&lt;/h2>
&lt;p>The paper&amp;rsquo;s daily degree-day model is not the same as a generic &amp;ldquo;average temperature above base&amp;rdquo; shortcut that adjusts &lt;code>Tmax&lt;/code> and &lt;code>Tmin&lt;/code> independently before averaging. The authors explicitly say they used the McMaster and Wilhelm simple average interpretation they call &lt;code>method 1&lt;/code>, and they distinguish it from the alternative &lt;code>method 2&lt;/code>.&lt;/p>
&lt;p>That means the paper-facing daily thermal-time calculation is based on the daily mean:&lt;/p>
&lt;pre>&lt;code class="language-text">Tavg = (Tmax + Tmin) / 2
&lt;/code>&lt;/pre>
&lt;p>with thresholds applied to the mean:&lt;/p>
&lt;pre>&lt;code class="language-text">DTT = 0, if Tavg &amp;lt; 15.0
DTT = Tavg - 15.0, if 15.0 &amp;lt;= Tavg &amp;lt;= 21.7
DTT = 21.7 - 15.0, if Tavg &amp;gt; 21.7
&lt;/code>&lt;/pre>
&lt;p>That daily value is then accumulated from the biofix date of January 1.&lt;/p>
&lt;p>Once cumulative degree-days &lt;code>D&lt;/code> are available, the paper fits proportion trap-catch with a log-logistic regression:&lt;/p>
&lt;pre>&lt;code class="language-text">proportion = exp(s * ln(D) + i) / (1 + exp(s * ln(D) + i))
&lt;/code>&lt;/pre>
&lt;p>where:&lt;/p>
&lt;ul>
&lt;li>&lt;code>D&lt;/code> is cumulative degree-days in Celsius,&lt;/li>
&lt;li>&lt;code>s = 7.41&lt;/code>,&lt;/li>
&lt;li>&lt;code>i = -43.34&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>This lets us estimate not just one threshold date, but the whole fitted emergence curve in the paper&amp;rsquo;s field-based adult trap-catch sense.&lt;/p>
&lt;h2 id="a-brief-note-on-the-sine-wave-method">A Brief Note On The Sine-Wave Method&lt;/h2>
&lt;p>I still think it is useful to give a taste of the second method the paper evaluated. Ebbenga et al. did not only test a simple average degree-day approach. They also tested a half-day sine-wave approach during model selection.&lt;/p>
&lt;p>That matters because it shows the simple model was chosen after comparison, not by default. In the end, the paper selected the simple average model for this forecasting target, so that is the one I keep in the main implementation path. But I also included a half-day sine-wave function in the companion Python script so it is possible to compare the two approaches side by side.&lt;/p>
&lt;p>In other words:&lt;/p>
&lt;ul>
&lt;li>the simple average model is the main model used in this post,&lt;/li>
&lt;li>the half-day sine-wave model is included as a comparison tool,&lt;/li>
&lt;li>the paper&amp;rsquo;s final forecasting target still comes from the selected simple model.&lt;/li>
&lt;/ul>
&lt;h2 id="what-the-paper-says-about-key-forecast-targets">What The Paper Says About Key Forecast Targets&lt;/h2>
&lt;p>Table 4 in the paper gives rounded degree-day values associated with several trap-catch proportions for the selected simple model:&lt;/p>
&lt;ul>
&lt;li>&lt;code>10%&lt;/code> trap-catch: &lt;code>257 C degree-days&lt;/code>&lt;/li>
&lt;li>&lt;code>25%&lt;/code>: &lt;code>298&lt;/code>&lt;/li>
&lt;li>&lt;code>50%&lt;/code>: &lt;code>346&lt;/code>&lt;/li>
&lt;li>&lt;code>75%&lt;/code>: &lt;code>401&lt;/code>&lt;/li>
&lt;li>&lt;code>90%&lt;/code>: &lt;code>465&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Operationally, &lt;code>257 DDC&lt;/code> is the important early-warning number because the paper frames &lt;code>10% trap-catch&lt;/code> as the target useful for alerting growers before peak beetle activity.&lt;/p>
&lt;h2 id="a-prediction-example-for-this-season">A Prediction Example For This Season&lt;/h2>
&lt;p>The way I would use this for my own situation is to pair the model with daily weather from a nearby station where I saw beetle damage last year. To make that concrete, I pulled a 2026 local weather example and accumulated degree-days from &lt;code>January 1&lt;/code> using the paper&amp;rsquo;s selected thresholds of &lt;code>15.0 C&lt;/code> and &lt;code>21.7 C&lt;/code>.&lt;/p>
&lt;p>As of &lt;code>May 15, 2026&lt;/code>, the local example reached about &lt;code>222.9 DDC&lt;/code> under the selected simple average method. That is still below the paper&amp;rsquo;s &lt;code>257 DDC&lt;/code> benchmark for &lt;code>10% trap-catch&lt;/code>. If I plug &lt;code>222.9&lt;/code> into the fitted equation, the predicted trap-catch proportion is only about &lt;code>3.6%&lt;/code>. So in that example, I would read the season as moving in the right direction for beetle activity, but not yet at the paper&amp;rsquo;s early-warning threshold.&lt;/p>
&lt;p>Here I need to be careful. The paper&amp;rsquo;s &lt;code>257 DDC&lt;/code> threshold comes from Minnesota field data, so I should treat it as a starting benchmark, not as a guaranteed local threshold. But even with that caveat, this kind of calculation is still useful. It gives me a weather-based way to judge whether the season is still early, getting close, or entering the part of the season when adult activity may begin to matter more.&lt;/p>
&lt;p>Because my motivation comes from what I saw last season, this is how I would frame the prediction for this season: not as a claim that I know exactly how many beetles will be on each plant, but as an attempt to identify when local weather has become favorable enough that I should expect meaningful adult activity to begin building.&lt;/p>
&lt;p>That distinction matters. The Ebbenga model predicts the expected proportion of seasonal adult trap-catch, not an absolute beetle count per plant or per garden bed. Still, that kind of timing signal can be very useful. If cumulative degree-days in the season are moving toward the paper&amp;rsquo;s benchmark, I can treat that as a practical sign that pressure may be building and that I should monitor my plants more closely.&lt;/p>
&lt;p>In the Python implementation, I can use &lt;code>proportion_trap_catch_from_degree_days&lt;/code> to convert cumulative degree-days into predicted trap-catch proportion, and &lt;code>predict_first_date_for_proportion&lt;/code> to estimate when a target such as &lt;code>10%&lt;/code> is first reached.&lt;/p>
&lt;h2 id="python-implementation">Python Implementation&lt;/h2>
&lt;p>Below are the core Python functions that capture the main logic of the model discussed in this post:&lt;/p>
&lt;pre>&lt;code class="language-python">def calculate_daily_degree_days_method1(
tmax_c,
tmin_c,
lower_threshold_c=15.0,
upper_threshold_c=21.7,
):
tavg_c = (float(tmax_c) + float(tmin_c)) / 2.0
if tavg_c &amp;lt; lower_threshold_c:
return 0.0
if tavg_c &amp;gt; upper_threshold_c:
return upper_threshold_c - lower_threshold_c
return tavg_c - lower_threshold_c
&lt;/code>&lt;/pre>
&lt;p>The fitted trap-catch curve can be written as:&lt;/p>
&lt;pre>&lt;code class="language-python">def proportion_trap_catch_from_degree_days(
cumulative_degree_days_c,
intercept=-43.34,
slope=7.41,
):
linear_term = slope * math.log(cumulative_degree_days_c) + intercept
exp_term = math.exp(linear_term)
return exp_term / (1.0 + exp_term)
&lt;/code>&lt;/pre>
&lt;p>For comparison, here is a half-day sine-wave function that reflects the second candidate method evaluated in the paper:&lt;/p>
&lt;pre>&lt;code class="language-python">def calculate_daily_degree_days_half_day_sine(
tmin_today_c,
tmax_today_c,
tmin_tomorrow_c,
lower_threshold_c=15.0,
upper_threshold_c=21.7,
):
tmin_today_c = float(tmin_today_c)
tmax_today_c = float(tmax_today_c)
tmin_tomorrow_c = float(tmin_tomorrow_c)
lower_threshold_c = float(lower_threshold_c)
upper_threshold_c = float(upper_threshold_c)
if tmin_today_c &amp;gt; tmax_today_c:
raise ValueError(&amp;quot;tmin_today_c cannot be greater than tmax_today_c&amp;quot;)
half_day_hours = 12
hourly_values = []
amplitude_1 = (tmax_today_c - tmin_today_c) / 2.0
midpoint_1 = (tmax_today_c + tmin_today_c) / 2.0
for hour in range(half_day_hours):
angle = math.pi * (18.0 + hour) / 12.0
hourly_values.append(amplitude_1 * math.sin(angle) + midpoint_1)
amplitude_2 = (tmax_today_c - tmin_tomorrow_c) / 2.0
midpoint_2 = (tmax_today_c + tmin_tomorrow_c) / 2.0
for hour in range(half_day_hours):
angle = math.pi * (6.0 + hour) / 12.0
hourly_values.append(amplitude_2 * math.sin(angle) + midpoint_2)
degree_day_sum = 0.0
for temp_c in hourly_values:
clipped_temp_c = min(temp_c, upper_threshold_c)
degree_day_sum += max(clipped_temp_c - lower_threshold_c, 0.0)
return degree_day_sum / 24.0
&lt;/code>&lt;/pre>
&lt;p>This keeps the code examples aligned with the main model I want to discuss here, while still giving a visible comparison with the alternative method the paper evaluated.&lt;/p>
&lt;h2 id="what-this-model-can-tell-me-for-this-season">What This Model Can Tell Me For This Season&lt;/h2>
&lt;p>For my own use, the value of this model is that it gives me an earlier weather-based signal than simply waiting until damage is obvious again. If I use this season&amp;rsquo;s weather and see cumulative degree-days moving toward the paper&amp;rsquo;s &lt;code>257 DDC&lt;/code> benchmark, that gives me a reason to start watching more carefully before I am caught off guard.&lt;/p>
&lt;p>At the same time, I do not want to claim more than the model can really tell me. It does not predict the exact number of beetles on a particular plant in my backyard, and it does not simulate the full biology from eggs to larvae to pupae. It is better understood as a forecasting tool for adult activity, especially for the timing of when that activity may begin to matter.&lt;/p>
&lt;p>That still fits my purpose well. I am not trying to build a complete Japanese beetle population simulator in the first step. I am trying to use last season&amp;rsquo;s experience and this season&amp;rsquo;s weather to build a better early-warning signal for scouting and management.&lt;/p>
&lt;h2 id="practical-use-beyond-the-paper">Practical Use Beyond The Paper&lt;/h2>
&lt;p>Beyond the paper, a practical workflow is straightforward:&lt;/p>
&lt;ol>
&lt;li>start accumulating daily degree-days on &lt;code>January 1&lt;/code>,&lt;/li>
&lt;li>use daily &lt;code>Tmax&lt;/code> and &lt;code>Tmin&lt;/code> weather data,&lt;/li>
&lt;li>compute daily thermal time with the selected simple average method,&lt;/li>
&lt;li>accumulate cumulative degree-days,&lt;/li>
&lt;li>flag &lt;code>257 DDC&lt;/code> as the early-warning point for &lt;code>10%&lt;/code> trap-catch,&lt;/li>
&lt;li>optionally compute the whole fitted trap-catch proportion curve using Equation 1.&lt;/li>
&lt;/ol>
&lt;p>That workflow is practical, but it is still important to remember that the paper was developed from Minnesota field data. In my case, the natural next step would be to use what I observed last season as a starting point, run this season&amp;rsquo;s weather through the model, and then compare the predicted early-activity timing against what I actually see in the field this year. That season-to-season comparison is what would tell me whether the Minnesota-based benchmark is a good fit for my situation or whether I need to adjust my expectations.&lt;/p></description></item></channel></rss>