Take-home Exercise 1: Geospatial Analytics for Public Safety

First- and second-order point-pattern analysis of VIIRS active-fire detections in Pulang Pisau Regency, Central Kalimantan, 1 July to 25 September 2026

Contents

One argument running through all of it: a satellite hotspot is not a fire, and almost everything I did follows from taking that seriously.

  1. The place, the data, and the window
  2. Why a detection is not a fire
  3. Where it burns
  4. When it burns, and what the orbit decides
  5. Two nulls: one meaningless, one that can fail
  6. Space and time are not separable
  7. What the clustering is organised around, and how big it is
  8. The correction that reframes it all
  9. What the analysis says about fire here
  10. What I would take from this

1. The place, the data, and the window

413,182
rows downloaded
34,987
inside the regency
10,321
burned 375 m cells
87
days analysed

The regency was chosen by a rule, set before the result. Highest detection density among regencies above 5,000 km², the size floor I need for second-order estimation to a 5 km lag. Pulang Pisau wins at 3,656 per 1,000 km². Ketapang leads on raw count (65,901) but is 3x the area.

My first pass used a 7-day sample, where Pulang Pisau led on count. Over the full window it does not, so I restated the rule against the whole record.

VIIRS 375 m Collection 2, both platforms, clipped to the administrative polygon in UTM 49S, 9,759 km².

The 87-day window is set by what the REST API retains. Why that is a limit of my tooling and not of the data comes later, in the correction slide.

2. A detection is not a fire

One large peat fire fills many 375 m pixels, and two satellites re-detect it about four times a day.

I measured it: the raw count overstates distinct burning locations by 3.4x.

So the pattern I started with partly measures the satellite’s revisit schedule, which means testing against complete spatial randomness was guaranteed to reject before I computed anything.

So I changed two things. The unit becomes the 375 m cell. The null becomes an inhomogeneous Poisson process.

That is the spine of everything else I did.

3. Where it burns

Gaussian kernel, Diggle edge correction, bandwidth I fixed at 4 km.

Cross-validated selectors gave me about 0.6 km and I rejected them: they absorb the very clustering my second-order test exists to detect, which would have rigged the second-order test two slides on.

Intensity spans roughly two orders of magnitude between the southern peat belt and the northern interior.

So allocating in proportion to sub-district area is badly matched to risk. I think that is the most directly usable thing I found.

4. When it burns, and what the orbit decides

Heavily back-loaded: week 1 recorded 7 events, the week of 16 September recorded 8,087.

The day/night contrast is not a daily cycle, and I nearly read it as one. Both platforms observe at four narrow fixed local times, so if I claimed fire peaks at a given hour I would be describing the orbit.

I use the split only as a detectability covariate, since night overpasses catch cooler anomalies against a cooler background.

5. Two nulls: one meaningless, one that can fail

Against CSR, G, F and L all leave the envelope immediately. That persuades nobody, including me: the sensor guarantees it. g(r) is even suppressed below 375 m, which is the pixel, not fires avoiding each other.

So I changed the null. An inhomogeneous Poisson process with intensity from the 4 km kernel estimate, with the reference re-estimated for every simulated pattern. Everything my first-order analysis found is already inside it.

The departure survives. Both global tests reject at the Monte Carlo floor.

The two panels disagree, and that was the lesson. L_inhom never re-enters its envelope in 20 km; g_inhom, which localises scale, peaks at 438 m and is within 10% of no-excess by 7.2 km. My first draft capped r at 5 km and drew the wrong conclusion from exactly this.

An areal method agrees. Moran’s I on hexagons falls from 0.69 on raw counts to 0.28 once lambda-hat is removed, and to 0.07 at 5 km. Different weights, different test, same answer on scale.

6. Space and time are not separable

Knox test. My null is random labelling: I hold locations and dates both fixed and permute only their pairing, across 999 permutations of 8,720,153 close pairs.

Because both marginals stay fixed, none of this can be explained away by the seasonal ramp or the spatial concentration.

Strongest at the tightest cell, decaying monotonically outward. I read that as short-range propagation: a cell that burns today raises the chance a neighbour burns tomorrow, and the effect is largely spent within days and a kilometre or two.

The decay is steeper in time than in space, which fits fire spreading over contiguous ground within days rather than recurring in the same place weeks apart.

7. What it is organised around, and how big it is

Plantation, not access. Fitted alone, distance to plantation and farmland recovers 3,204 of the 3,550 AIC units the full model gains. Roads alone recover 1,991.

My first version had only roads and waterways and concluded access dominated. That was the thin covariate set talking.

But not the forest half of that story. Fitted alone, distance to forest explains less than roads (1,906), its curve is not monotone, and the median burned cell sits 20 km from any mapped forest. I reported it as a mechanism and it is not one.

Cluster scale 1055 m, parametric bootstrap 902 to 1025 m, with 2.2 to 2.5 km holding most of a cluster.

Resampling points with replacement gave an interval that excluded its own point estimate. That is not a valid bootstrap for a point process.

8. The correction that reframes it all

I had written that I could not tell whether 2026 was severe, blaming the API’s 90-day retention.

I was wrong. The standard archive is empty for 2026 only because reprocessing lags five months. For earlier years the same endpoint serves it normally. One query against 2019 would have shown me.

2026 ranks 2 of 14, at 54x the 2013-2025 median of 150 cells.

So everything on the previous slides describes a severe season, not a typical one. And the record is bimodal, which means an average is a useless planning number here.

9. What the analysis says about fire here

Fire is concentrated, not spread. Two orders of magnitude separate the southern peat belt from the northern interior. Capability placed in proportion to sub-district area sits mostly where fire is not.

Fire is contagious, briefly. A cell that burns today raises the chance its neighbour burns tomorrow, strongest within a few hundred metres and a few days. The useful response geometry is 2.2 to 2.5 km and days, not pixels and weeks.

Fire follows cleared land. Proximity to plantation and farmland carries 3,204 of 3,550 AIC units on its own, more than roads and forest together. Burning concentrates on the agricultural frontier.

There is no average year to plan for. 2 of 14, at 54x the median, and the record is bimodal: drought years in the thousands, wet years in single digits. Staffing to the mean staffs for a year that never happens. This argues for surge capacity keyed to seasonal drought forecasts.

10. What I would take from this

3.4x
inflation in the raw count
438 m
peak of residual clustering
0.9 to 1.03 km
cluster scale, bootstrap interval
2 of 14
2026 rank in the record

What made the results credible

Every result I would defend came from replacing a default null with one that could fail. Complete spatial randomness rejects before I compute anything. Moran’s I on raw counts is 0.69. The short-range rose has eight lobes. None of those are findings: they are the instrument and the geometry, restated.

Intensity spans two orders of magnitude and is stable across four bandwidths. Clustering survives the inhomogeneous null and an areal method with different weights agrees. Scale is confirmed by two independent estimators. Land cover carries 3,204 of 3,550 AIC units from one term.

What produced the errors

Every mistake came from not checking what a default was doing. A 5 km distance cap. A cluster fit with no trend term. A covariate set of two. A harmonic that could not see the structure in front of it.

Each returned a confident number, and each was wrong until something forced a look. Ten corrections are listed in the report.

The figure caught what the table missed more than once. That is the practical version of the lesson, and the thing I would carry into the next exercise.

One caveat over all of it. Everything here was measured in a season that ranks 2 of 14, at 54x the median. These are the properties of a severe year, not a typical one.