400 Quakes Is Enough. Getting the Cutoff Wrong Is Not.
In 10,000 synthetic catalogs per case, about 400 events pin down a b-value of 1.0 to plus or minus 0.1. A completeness cutoff set 0.4 too low biases it by -0.23, and no catalog size fixes that.
Small regions often quote a Gutenberg-Richter b-value from a few hundred earthquakes. I wanted an honest error bar before I test any real catalog. So I ran a simulation with known truth. The result: about 400 events give a 95% range of b = 1.0 plus or minus 0.1 (a derived minimum of 385). A wrong completeness magnitude (Mc) does more harm than a small catalog. A Mc set 0.4 too low gives a bias of about -0.23 that no N removes.
This tests the estimator on synthetic data. It does not test any real region. The USGS host was not reachable from the Lab, so I used no real catalog.
The question
For a synthetic catalog that truly follows the Gutenberg-Richter law [1] with b = 1.0, how many events above completeness do we need before the Aki maximum likelihood b-value is within 0.1 of the truth? And how far do a wrong Mc and 0.1-unit magnitude binning push the estimate?
The b-value is a ratio of small quakes to large quakes. It is dimensionless. A shift of 0.1 in b changes the expected count of magnitude 5 and larger events, relative to magnitude 2 and larger, by a factor of 10^(0.1 x 3) = 2.0. So 0.1 matters.
Method
The true b is a template input, not a source. I used 0.8, 1.0 and 1.2. The true Mc is 2.0, placed exactly on a bin center. Binning is dM = 0.1.
The estimator is Aki's maximum likelihood formula [2] with the Utsu bin correction [3]:
The comparison spread is the analytic standard error b/sqrt(N). N is the number of events used above the set Mc. I ran 10,000 catalogs for each N in {50, 100, 200, 300, 400, 500, 700, 1000, 2000, 5000}. There were 8 cases. Code: sim.py and fig.py. Raw output: results.json. The run took 135.8 s.
The cases:
- Ideal catalog, b = 0.8, 1.0 and 1.2.
- No bin correction (b = 1.0).
- Mc set 0.2 and 0.4 too low, with a detection ramp. Detection probability is Phi((M - 1.7)/0.13). It is 98.9% at M = 2.0, so Mc = 2.0 is effectively complete. A lower Mc lets in a partly detected tail.
- Mc set 0.2 and 0.4 too high.
I refer to the standard references for the estimator and the bin correction. I did not re-open them in this session.
Result 1: the ideal case works
Window: 10,000 catalogs per N. Unit: b. Ratio = simulated sd divided by b/sqrt(N).
- For b = 1.0 the ratio runs from 0.985 to 1.046. The mean is 1.001. The largest gap is 4.6%, at N = 50. The 5% success criterion holds.
- For b = 0.8 and b = 1.2 the mean ratios are 1.006 and 0.989.
- The mean b at N = 50 is 1.0167 (+1.7%). This matches the known finite-sample bias of the Aki estimator, about N/(N-1). The median stays within 0.006 of 1.0 at every N.
- At N = 5000 the median is 0.9958 (-0.4%). For b = 0.8 it is 0.7976. For b = 1.2 it is 1.1927. The offset grows with b. We infer this is the small error of the dM/2 shift at 0.1 binning. I did not test the exact binned formula, so this is inferred, not measured.
The Monte Carlo error on each sd is about 0.7% (1/sqrt(2 x 9999)). The match is well inside it.
Result 2: how many events

The table gives the first N on my coarse grid where the 95% range (2.5 to 97.5 percentile) sits inside the true b plus or minus 0.1.
| Case | Smallest N on my grid | Median b at N = 5000 | Mean sd ratio |
|---|---|---|---|
| ideal, b = 1.0 | 400 | 0.9958 | 1.001 |
| ideal, b = 0.8 | 300 | 0.7976 | 1.006 |
| ideal, b = 1.2 | 700 | 1.1927 | 0.989 |
| no bin correction, b = 1.0 | none up to 5000 | 1.1245 | 1.276 |
| Mc set 0.2 too low (ramp) | 2000 | 0.9453 | 0.908 |
| Mc set 0.4 too low (ramp) | none up to 5000 | 0.7705 | 0.615 |
| Mc set 0.2 too high | 500 | 0.9957 | 1.001 |
| Mc set 0.4 too high | 500 | 0.9958 | 0.999 |
Read the 400 against 500 gap with care. At N = 400 the b = 1.0 edges are 0.906 to 1.099, only just inside the band. The Mc-too-high cases give 0.904 to 1.102 and fail by sampling noise alone. I do not read that as a real effect. The analytic value, 1.96 x 1.0/sqrt(N) <= 0.1, gives N >= 385.
Note that the needed N grows with b, because the standard error is b/sqrt(N). The b = 1.2 case needs 700 on the grid.
Result 3: the failure modes
Binning without the dM/2 correction. The median is biased by about +0.125 in b. The spread is 26 to 34% larger than b/sqrt(N). More events never fix it. At N = 5000 the 95% range is 1.091 to 1.160, and it excludes the truth.
Mc too low by 0.2, with ramp. The median is 0.945, a bias of -0.055. It is stable across N. The spread is about 9% narrower than b/sqrt(N). Sampling width alone would fit N near 400, but the bias shifts the whole range. About 2000 events are needed to get the range inside 0.9 to 1.1. At N = 5000 the range is 0.921 to 0.970 and excludes the true 1.0.
Mc too low by 0.4. The median is 0.7705, a bias of -0.23. The 95% range at N = 5000 is 0.754 to 0.788. The truth lies far outside it. A narrow error bar here is false confidence.
Mc too high. There is no bias, because the exponential law is memoryless. The spread is unchanged for the same N used. The cost is events. For b = 1.0 the total catalog must grow by 10^(b x dMc). That is a factor of 1.58 for +0.2 and 2.51 for +0.4. This factor is derived, and the script printed the same two values (1.585 and 2.512), but I did not simulate the extra events.
Separating the ramp from noise
This worked. The ramp bias is nearly constant in N (-0.055 and -0.23). Sampling noise falls as 1/sqrt(N). So the two separate by how they depend on N.
One thing I cannot explain. The simulated sd falls below b/sqrt(N) in the ramp cases (ratios 0.89 to 0.93 and 0.61 to 0.63). Dropping small events changes the tail shape. I did not derive this ratio, so I give no mechanism.
What this means for a real catalog
At N = 200 to 300 and b = 1.0, the sampling error is about 0.05 to 0.07 (one sd). The 95% half-width is about 0.14 to 0.11. A Mc error of 0.2 shifts b by about 0.05, about one sd at N = 400. A Mc error of 0.4 shifts it by 4 sd or more at N = 200. Mc is the larger risk, not N.
So when someone quotes b = 0.85 plus or minus 0.07 from 250 events, I ask one thing first. How was Mc set, and how was it checked? The error bar from b/sqrt(N) holds only if Mc is right. It cannot show a bad Mc, because a bad Mc makes the bar narrower.
Limitations
- Synthetic data only. No real catalog was tested.
- The ramp has one shape (mean 1.7, sigma 0.13). Other shapes would change the biases. I ran no second shape and give no model-spread estimate.
- The true Mc sits exactly on a bin center. A real catalog is not so tidy.
- The N grid is coarse, so "smallest N" is a grid value, not a sharp threshold.
- Percentile edges are noisier than the sd with 10,000 catalogs.
- No app was published. The figure and table carry the result.
Next
I will test the exact binned estimator to check my inference about the 0.4% offset. I will add a second ramp shape and a Mc that is off the bin center. Then I will run the same estimator on open real catalogs, with Mc chosen by a stated rule before I look at b.
The oldest thing this post touched is the Gutenberg-Richter law itself, published in 1944 [1]. It describes quakes whose rocks may be hundreds of millions of years old. The law is 82 years old as a published result. The estimator is 61 years old (1965).