Does the solar activity cycle keep time like a clock, or does its phase perform a random walk? A likelihood test on sunspot-cycle minima epochs in the SILSO v2.0 record with propagated measurement uncertainty
Paper
No Chronometer in the Sun: the Phase of the Schwabe Cycle Diffuses as a Random Walk
Abstract
Is the solar activity cycle paced by an internal clock, or does its phase diffuse? We locate 25 sunspot-cycle minima in the directly measured SILSO v2.0 record (1749-2026) and propagate the published per-month measurement errors into every epoch. A phase model nesting rigid-clock jitter and a random walk yields a diffusion step of 1.155 yr per cycle (68% interval 1.006-1.344) and a clock amplitude consistent with zero (<0.156 yr, 95%). The clock limit is rejected at 5.2 standard deviations. Dicke's ratio is 2.171 against 0.460 expected for a clock. Phase coherence is lost after 91 cycles.
The Schwabe cycle is the archetypal stochastically forced astrophysical oscillator, and the sharpest open question about it concerns its phase, not its amplitude. Dicke asked whether a "chronometer hidden deep in the Sun" anchors successive epochs in absolute time, so that a short cycle is systematically followed by a long one, or whether each cycle merely inherits its predecessor's phase, so that the phase performs an unbounded random walk [1]. The two pictures are physically distinct: a chronometer demands a pacemaker or an internal reservoir with memory far exceeding a cycle, whereas phase diffusion is the generic behaviour of a noise-driven limit cycle and follows from mean-field theory with fluctuating helicity [2,6].
The question is contentious. A dynamo entrained at the 11.07-yr Venus-Earth-Jupiter tidal period has been proposed, its principal empirical support being Dicke's ratio over a millennium of epochs [3]. The rebuttal is that those pre-telescopic epochs come from a reconstruction built assuming a continued 11-yr cycle, and are clocked by construction [4,8]; the exchange continues [5]. Separately, every claimed periodicity beyond the 11/22-yr band is consistent with the realization noise of a noisy limit cycle [7].
The dispute thus rests on epochs that were never measured. Here we settle it with directly observed sunspot numbers alone, on the recalibrated version 2.0 scale [9], propagating each epoch's measurement uncertainty from the published monthly dispersions. We find no chronometer: the clock is excluded at 5.2 standard deviations and the phase diffuses by 1.155 yr per cycle.
§Ask about this paper
Grounded in this runQuestions are answered from this run's record — the paper, the executed analysis, the data provenance and the referee report. Nothing else is consulted.
This run is finished, so the recorded paper cannot be rewritten. Questions are still answered from its record.
Pipeline
1.Literature review
Literature review complete (live:agent:claude-opus-5): 10 key papers, 16 grounded sources, 6 open gaps.
Summary
The Schwabe cycle is the archetypal astrophysical nonlinear oscillator, and the sharpest open question about it is not its amplitude but its phase. Dicke (1978) asked whether a 'chronometer hidden deep in the Sun' anchors the epochs of successive cycles, or whether each cycle merely inherits the phase left by its predecessor, so that the phase performs an unbounded random walk. The two pictures are physically distinct: a chronometer demands either an external pacemaker or an internal reservoir with memory far longer than a cycle, while phase diffusion is the generic long-time behaviour of a stochastically forced limit cycle. Dicke built a discriminating statistic, now called Dicke's ratio, whose expectation is (n^2-1)/(2(n^2+2n+3)) -> 1/2 for a clocked series and (n+2)(n^2-1)/(3(5n^2+6n-3)) -> n/15 for a random walk; with only 25 post-1705 maxima he could not decide, though he leaned towards a clock.
The question has become contentious again. Stefani, Giesecke and Weier (2019) proposed a Tayler-Spruit dynamo entrained by the 11.07-yr Venus-Earth-Jupiter tidal alignment, and their principal empirical support is Dicke's ratio evaluated on a millennium of epochs. Nataf (2022) rebutted this: the pre-telescopic part of that series comes from Schove's aurora-based reconstruction, which was built assuming a continued ~11-yr cycle and is therefore clocked by construction; Usoskin (2023) independently cautions against quantitative use of Schove's series. The exchange has continued (Stefani, Beer and Weier 2023; Nataf 2023) without resolution. Against this, Hoyng (1996) showed that the apparent phase memory follows from alpha-fluctuations in mean-field theory with no extra timing device, Charbonneau (2020) treats stochastic forcing as the standard account of cycle variability, and Cameron and Schuessler (2019) find every claimed periodicity beyond the 11/22-yr band consistent with realization noise. Weiss and Tobias (2016) argue instead for deterministic chaos. Leamon, McIntosh and Title (2022) advocate a 'solar cycle clock', but theirs is a normalised-phase construction and says nothing about absolute-time chronometry.
The decisive gap is that the entire dispute rests on reconstructed epochs. What the directly measured record says on its own -- with the recalibrated SILSO version 2.0 series (Clette et al. 2014) and with the per-epoch measurement uncertainty actually propagated from the published monthly dispersions -- has not been established.
Key papers (10)
- Is there a chronometer hidden deep in the Sun?. R. H. Dicke; Nature 276, 676-680, 1978.Poses the clock-versus-random-walk question and defines Dicke's ratio with its two limiting expectations; our study is a direct, modern re-execution of this test on the recalibrated record.
- Is the solar cycle timed by a clock?. P. Hoyng; Solar Physics 169, 253-264, 1996.Shows that alpha-fluctuations in mean-field dynamo theory reproduce the apparent phase memory, so no extra timing device is required either observationally or theoretically.
- A Model of a Tidally Synchronized Solar Dynamo. F. Stefani, A. Giesecke, T. Weier; Solar Physics 294, 60, 2019.The principal modern claim that the cycle is clocked, at the 11.07-yr Venus-Earth-Jupiter alignment period, argued from Dicke's ratio on a 1000-yr epoch series.
- Tidally Synchronized Solar Dynamo: A Rebuttal. H.-C. Nataf; Solar Physics 297, 107, 2022.Shows the epochs underpinning the clock claim are clocked by construction because Schove assumed a continued 11-yr cycle; also states the Dicke-ratio formulae explicitly.
- No Evidence for Absence of Solar Dynamo Synchronization. F. Stefani, J. Beer, T. Weier; Solar Physics 298, 83, 2023.The counter-reply, defending a stable 11.07-yr period from cosmogenic-radionuclide reconstructions; documents that the controversy is unresolved and still rests on proxy epochs.
- Dynamo models of the solar cycle. P. Charbonneau; Living Reviews in Solar Physics 17, 4, 2020.Reference account of stochastic forcing of the alpha-effect and Babcock-Leighton source, the theoretical setting in which a diffusing cycle phase is expected.
- Solar activity: periodicities beyond 11 years are consistent with random forcing. R. H. Cameron, M. Schuessler; Astronomy & Astrophysics 625, A28, 2019.Demonstrates that apparent long-period regularities in solar activity are realization noise of a noisy limit cycle, the null against which any claim of extra timekeeping must be judged.
- A history of solar activity over millennia. I. G. Usoskin; Living Reviews in Solar Physics 20, 2, 2023.Sets out the reliability limits of Schove-type epoch reconstructions, motivating a test restricted to directly measured sunspot numbers.
- Revisiting the Sunspot Number. A 400-Year Perspective on the Solar Cycle. F. Clette, L. Svalgaard, J. M. Vaquero, E. W. Cliver; Space Science Reviews 186, 35-103, 2014.Documents the recalibration behind SILSO version 2.0, whose values are not comparable with the version 1.0 numbers used in all pre-2015 analyses of this question.
- The Solar Cycle. D. H. Hathaway; Living Reviews in Solar Physics 12, 4, 2015.Standard compilation of cycle-length statistics, the Waldmeier effect and the length-amplitude anticorrelation, providing the descriptive baseline for any phase model.
Methods in use
- Cycle epochs defined as extrema of the 13-month running mean of the monthly sunspot number with half weight on the two end months (SIDC convention); epochs are quoted to the month, so they carry an intrinsic one-month quantisation.
- Dicke's ratio Di(n) = sum_{i=2..n} delta(i)^2 / sum_{i=2..n} (delta(i)-delta(i-1))^2 with delta the residual from the least-squares line through the n epochs, compared with its clock expectation (n^2-1)/(2(n^2+2n+3)) and random-walk expectation (n+2)(n^2-1)/(3(5n^2+6n-3)).
- Serial correlation of successive cycle lengths: a rigid clock with independent epoch jitter makes the lengths an MA(1) process with theta = -1 and therefore predicts a lag-1 autocorrelation of exactly -1/2, while a random walk predicts zero.
- Deviation of observed epochs from a rigid ephemeris of fixed period, used to test specific proposed clock periods such as 11.07 yr.
- Spectral analysis of activity proxies with significance assessed against realization noise of a noisy limit cycle rather than white noise.
- Mean-field and flux-transport dynamo simulations with stochastic alpha-effect or Babcock-Leighton source to generate synthetic cycle sequences for comparison.
- Gaussian likelihood fitting of variance-component (local-level) models to epoch series, with the caveat that a zero variance component lies on the parameter-space boundary so the likelihood-ratio statistic is a 50:50 mixture of chi^2_0 and chi^2_1 and should be checked by parametric bootstrap at small sample size.
Open gaps
- Separate the direct from the reconstructed evidence: rerun the clock test using only directly measured sunspot numbers, since the strongest published claim for a clocked cycle depends on Schove's reconstruction, which was built assuming a continued 11-yr cycle.
- Propagate the measurement uncertainty of the epochs. SILSO publishes the monthly dispersion and the number of contributing observations from 1818 onward, so the standard error of each monthly mean, and hence of each epoch, can be obtained by Monte Carlo; no published analysis of the clock question appears to do this, so no number yet separates 'the phase wanders' from 'we cannot locate the phase'.
- Fit a phase model that contains both hypotheses as limits -- rigid-clock jitter plus a random walk of the phase -- and report the two variance components with confidence intervals rather than choosing between two point hypotheses.
- Measure the phase-diffusion coefficient and the resulting coherence time, a quantitative target that dynamo models could be required to reproduce and that sets a hard horizon on how far ahead cycle timing can be predicted.
- Redo the analysis on the recalibrated version 2.0 sunspot number, since version 1.0 values are not numerically comparable and the record is now about 50 per cent longer than the sample Dicke had.
- Test whether a slow deterministic drift of the period, of Gleissberg type, can be distinguished from genuine phase diffusion with the roughly two dozen cycles available, and state honestly if it cannot.
Grounded search sources (16) · mode: live:agent:claude-opus-5
- Is there a chronometer hidden deep in the Sun? (Dicke 1978, Nature 276, 676-680)
- Is the solar cycle timed by a clock? (Hoyng 1996, Solar Physics 169, 253-264)
- A Model of a Tidally Synchronized Solar Dynamo (Stefani, Giesecke & Weier 2019, Solar Physics 294, 60)
- Tidally Synchronized Solar Dynamo: A Rebuttal (Nataf 2022, Solar Physics 297, 107)
- No Evidence for Absence of Solar Dynamo Synchronization (Stefani, Beer & Weier 2023, Solar Physics 298, 83)
- Response to Comment on 'Tidally Synchronized Solar Dynamo: A Rebuttal' (Nataf 2023, Solar Physics 298, 33)
- Dynamo models of the solar cycle (Charbonneau 2020, Living Reviews in Solar Physics 17, 4)
- Solar activity: periodicities beyond 11 years are consistent with random forcing (Cameron & Schuessler 2019, A&A 625, A28)
- The Solar Cycle (Hathaway 2015, Living Reviews in Solar Physics 12, 4)
- Solar cycle prediction (Petrovay 2020, Living Reviews in Solar Physics 17, 2)
- A history of solar activity over millennia (Usoskin 2023, Living Reviews in Solar Physics 20, 2)
- Supermodulation of the Sun's magnetic activity: the effects of symmetry changes (Weiss & Tobias 2016, MNRAS 456, 2654-2661)
- Deciphering Solar Magnetic Activity: The Solar Cycle Clock (Leamon, McIntosh & Title 2022, Frontiers in Astronomy and Space Sciences 9, 886670)
- Revisiting the Sunspot Number. A 400-Year Perspective on the Solar Cycle (Clette, Svalgaard, Vaquero & Cliver 2014, Space Science Reviews 186, 35-103)
- Small noise and long time phase diffusion in stochastic limit cycle oscillators (Giacomin, Poquet & Shapira, arXiv:1512.04436)
- WDC-SILSO, Royal Observatory of Belgium - Sunspot Number and Long-term Solar Observations
2.Ideation
3 candidate ideas generated; selected: “No chronometer in the Sun: the Schwabe cycle phase diffuses as a random walk”.
- Idea 1Selected
No chronometer in the Sun: the Schwabe cycle phase diffuses as a random walk
Hypothesis. The epochs of sunspot-cycle minima are NOT anchored to a rigid clock. Writing the n-th minimum as t_n = t_0 + nP + xi_n + W_n, with xi_n an independent rigid-clock jitter of rms sigma_c and W_n = sum_{k<=n} eps_k a random walk of the phase with per-cycle step rms sigma_w, the hypothesis is sigma_w > 0 with the clock limit sigma_w = 0 rejected. Two parameter-free corollaries follow and are tested as well: the lag-1 autocorrelation of successive cycle lengths, which a rigid clock forces to exactly -1/2, must instead be consistent with 0; and Dicke's ratio Di(25) must lie near its random-walk expectation (n+2)(n^2-1)/(3(5n^2+6n-3)) rather than its clock expectation (n^2-1)/(2(n^2+2n+3)). The hypothesis is refuted if sigma_w is consistent with zero, or if the likelihood-ratio test fails to reject sigma_w = 0 at the 5 per cent level, or if the lag-1 autocorrelation is consistent with -1/2.
Dataset. SILSO monthly mean total sunspot number, version 2.0 sidc_sunspot_monthly
Test plan, novelty and risk
Test plan. VARIABLES: decimal_year, sunspot_number, sd and n_observations from the monthly file. EPOCHS: smooth sunspot_number with the SIDC 13-month kernel (unit weights with half weight on the two end months); take every month at which the smoothed series attains its minimum over a +-48-month window, merging months within 12 of one another into one epoch and using their mean date, which resolves the flat 1810 minimum. This yields the cycle-1 to cycle-25 minima, i.e. 25 epochs and 24 cycle lengths. Cycle maxima are located the same way as an independent marker. MEASUREMENT UNCERTAINTY: the standard error of each monthly mean is sd/sqrt(n_observations), available from 1818; draw 600 Monte Carlo replicates of the monthly series with independent Gaussian perturbations of that size, re-smooth and re-locate every epoch, and take the replicate standard deviation as the epoch measurement uncertainty s_n, adding in quadrature the variance (1/12)^2/12 of the one-month quantisation of an epoch. SAMPLE FILTERS: primary sample all 25 minima; a secondary sample restricted to the 19 minima from 1823 onward, for which every contributing month carries a published dispersion. ESTIMATOR: Gaussian maximum likelihood for the covariance Cov(t_n,t_m) = sigma_c^2 delta_nm + sigma_w^2 min(n,m) + s_n^2 delta_nm with the mean t_0 + nP profiled out by generalised least squares; report P and its standard error, sigma_w with a profile-likelihood 68 per cent interval and sigma_c with a 95 per cent upper limit. TESTS: likelihood ratio for sigma_w = 0 (a boundary case, so the asymptotic p-value uses the 50:50 mixture of chi^2_0 and chi^2_1) and, because N is small, an exact p-value from 2000 parametric-bootstrap replicates simulated under the maximum-likelihood clock; likelihood ratio for sigma_c = 0; the lag-1 autocorrelation of the 24 cycle lengths against 20000 simulations of each model; Dicke's ratio against the same simulations and against both analytic expectations; and the phase structure function S(k) = <(t_{n+k}-t_n-kP)^2> for k = 1..12, which must grow linearly under a random walk and saturate under a clock. DERIVED QUANTITIES: phase-diffusion coefficient sigma_w^2/P^3 in squared cycles per year, the coherence horizon (P/sigma_w)^2 cycles, the residuals of the epochs against a rigid 11.07-yr planetary-tidal ephemeris, and a falsifiable forecast of the cycle-26 minimum with its uncertainty. ROBUSTNESS ACTUALLY RUN: maxima instead of minima; the 1823-onward subsample; a 24-month smoothing kernel; refitting with the measurement uncertainties set to zero to size their contribution; and a quadratic mean term to test for a secular drift of the period. REFUTATION: sigma_w consistent with zero, or the clock not rejected, or lag-1 autocorrelation consistent with -1/2.
Novelty. The strongest published claim that the cycle is clocked (Stefani, Giesecke and Weier 2019) needs a millennium of epochs to reach significance, and those pre-telescopic epochs come from Schove's reconstruction, which Nataf (2022) showed is clocked by construction because Schove assumed a continued 11-yr cycle. Nobody has settled the question on directly measured sunspot numbers alone, and nobody in the exchange propagates the published per-month measurement uncertainty into the epochs. Fitting a model that nests both hypotheses, rather than choosing between two point hypotheses, and delivering a measured phase-diffusion coefficient with an uncertainty, are both new.
Expected outcome. A per-cycle phase step of order 1 yr, significantly non-zero, with the rigid-clock component consistent with zero and an upper limit of a few tenths of a year; the clock model rejected at better than the 1 per cent level; lag-1 autocorrelation near 0 rather than -1/2; Dicke's ratio near its random-walk expectation; and a coherence horizon of order 100 cycles, i.e. about a millennium, after which the cycle phase is no longer predictable.
Main risk. Only about two dozen cycles exist, so the power is limited and the confidence intervals on sigma_w will be wide; and a slow deterministic drift of the period, of Gleissberg type, would also inflate the long-lag phase dispersion and cannot be cleanly separated from genuine diffusion with 24 cycles. Both must be stated explicitly rather than glossed over.
- Idea 2
Sub-proportional scaling of the seasonal CO2 amplitude with the atmospheric CO2 burden
Hypothesis. The peak-to-trough amplitude A(t) of the seasonal cycle of atmospheric CO2 at Mauna Loa scales with the trend mole fraction C(t) as A = A_0 (C/C_0)^gamma with gamma = 1, the value expected if the seasonal biospheric exchange is a fixed fraction of the ambient burden. The hypothesis is refuted if the maximum-likelihood gamma differs from 1 by more than twice its standard error.
Dataset. Mauna Loa monthly mean atmospheric CO2 mauna_loa_co2_monthly
Test plan, novelty and risk
Test plan. VARIABLES: decimal_date, average and unc. SAMPLE FILTER: months from May 1974 onward, for which NOAA publishes unc, and excluding months with missing unc, which flag interpolated values; report the number of months actually used. MODEL: C(t) = T(t) + A_0 (T(t)/C_0)^gamma S(t) with T(t) a cubic polynomial trend and S(t) = sum_{k=1..4} [a_k cos(2 pi k t) + b_k sin(2 pi k t)] normalised to unit peak-to-trough amplitude. ESTIMATOR: weighted nonlinear least squares with weights 1/unc^2, gamma and its standard error from the Jacobian; because the residual scatter will exceed the stated measurement uncertainty, report both the measurement-limited error and an error inflated by the square root of the reduced chi-square, and a moving-block bootstrap error that respects the residual autocorrelation. TESTS: Wald test of gamma = 1; likelihood-ratio test of the nested constant-amplitude model gamma = 0. ROBUSTNESS: two and six harmonics; quadratic and quartic trends; splitting the record in half.
Novelty. The growth of the Mauna Loa seasonal amplitude is documented, but it is almost always reported as a linear trend in years. Casting it as a scaling exponent in the CO2 burden itself gives a dimensionless, physically interpretable number with a null of exactly 1, and makes the measurement-uncertainty budget explicit.
Expected outcome. A gamma significantly different from 1, with the reduced chi-square far above 1, showing that interannual geophysical variability rather than measurement error dominates the uncertainty budget.
Main risk. Trend and amplitude are strongly correlated in the fit, so gamma may be poorly identified; the trend polynomial order can absorb part of the amplitude change; and the residuals are strongly autocorrelated, so naive standard errors would be far too small.
- Idea 3
Which elemental property controls the critical temperature? A collinearity-resolved ranking
Hypothesis. Of the eight elemental properties summarised in the SuperCon feature set, the stoichiometrically weighted statistics of valence and of thermal conductivity carry more independent predictive information about the measured critical temperature than those of atomic mass, so that grouping the 80 predictors into eight physical blocks and dropping each block in turn reduces the cross-validated coefficient of determination most for valence and thermal conductivity. The hypothesis is refuted if the atomic-mass block, which an isotope-effect argument would privilege, causes a drop at least as large as either of them.
Dataset. Critical temperatures of 21,263 superconductors superconductor_tc
Test plan, novelty and risk
Test plan. VARIABLES: all 81 predictors and critical_temp. SAMPLE FILTER: rows with critical_temp above 0 K; report the count. ESTIMATOR: ridge regression and gradient-boosted trees on standardised predictors, both with the penalty or depth chosen by inner cross-validation, under a fixed-seed 10-fold outer cross-validation; the statistic is the mean drop in out-of-fold R^2 when one physical block of ten summary statistics is removed, with its standard error across the ten folds. Also report block-permutation importances. TESTS: paired t-tests across folds between the valence, thermal-conductivity and atomic-mass blocks.
Novelty. The original benchmark paper reports single-feature importances from one model; grouping the extremely collinear predictors into physically meaningful blocks and measuring block-level drop-out importance with fold-level errors gives an interpretable answer to which elemental property actually matters.
Expected outcome. Valence and thermal conductivity dominate, with atomic mass contributing little once the other blocks are present, consistent with the cuprate-dominated tail of the sample.
Main risk. Blocks are mutually collinear, so drop-out importance understates a block whose information is duplicated elsewhere; and the sample is unevenly distributed over chemistry, so the ranking may describe SuperCon's sampling rather than physics.
Ranking rationale
Idea 1 is first because it settles a specific, long-standing and currently contested physical question with a single well-posed likelihood test, the null is parameter-free rather than fitted, the dataset is exactly the right one and is the only directly measured record in existence, and the measurement uncertainty the venue expects can be propagated from published per-month dispersions rather than assumed. It also yields a new measured constant, the phase-diffusion coefficient, and a falsifiable forecast. Idea 2 is a clean uncertainty-weighted fit with a sharp null but the underlying amplitude growth is already well documented, so the contribution is a reparameterisation rather than a new answer. Idea 3 is the weakest for this venue: it is a predictive-modelling exercise whose conclusion is about a database's sampling as much as about physics, and it has no propagated measurement uncertainty because the SuperCon critical temperatures carry none.
3.Experimentation
Experiment succeeded in 1 round (11.28s).
Data provenance
SILSO monthly mean total sunspot number, version 2.0
- Source
- WDC-SILSO, Royal Observatory of Belgium, Brussels
- Citation
- SILSO, World Data Center (1749-present) Sunspot Number and Long-term Solar Observations. Royal Observatory of Belgium, on-line Sunspot Number catalogue, https://www.sidc.be/SILSO/, DOI: 10.24414/qnza-ac80. Series revision: Clette, F., Svalgaard, L., Vaquero, J.M. and Cliver, E.W. (2014) Revisiting the sunspot number: a 400-year perspective on the solar cycle. Space Science Reviews 186(1-4), 35-103.
- Licence
- Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0). Academic and non-commercial research use is permitted with explicit credit to WDC-SILSO.
- File
- https://www.sidc.be/SILSO/DATA/SN_m_tot_V2.0.csv
- Observations
- 3,332
- Variables (7)
- year, month, decimal_year, sunspot_number, sd, n_observations, definitive
- Units
- sunspot_number is the monthly mean total sunspot number, a dimensionless index. sd is the mean standard deviation of the individual daily values contributing to that month and n_observations the count of observations used, both available only from 1818 onwards. decimal_year is the mid-month date as a fraction of a year. definitive is True for finalised values and False for provisional recent months. The file's -1 missing marker is converted to NaN by the loader.
- Retrieved
- 8 Sept 2026, 16:00
- Checksum
- sha256 6383f7c67fc2e67e…
Real, publicly available data — downloaded and checksum-verified before the analysis ran, never simulated.
Result (RESULT_JSON)
{
"n_months_total": 3332,
"n_months_missing_ssn": 0,
"n_months_with_stated_error": 2503,
"n_months_provisional": 5,
"record_start": 1749.042,
"record_end": 2026.623,
"median_monthly_se": 1.1502173707608487,
"median_monthly_se_1818_1849": 2.193931022920578,
"median_monthly_se_2000_2026": 0.23012177511630372,
"n_minima": 25,
"n_maxima": 24,
"first_minimum": 1755.123,
"last_minimum": 2019.958,
"epoch_sigma_median": 0.024056261216234408,
"epoch_sigma_max": 0.24779782983082185,
"epoch_sigma_max_year": 1902.042,
"n_epochs_unmoved_by_noise": 14,
"epoch_quantisation_sigma": 0.024056261216234408,
"n_cycles": 24,
"P": 11.034786928655784,
"P_se": 0.23570072202057415,
"mean_cycle_length": 11.034791666666669,
"sd_cycle_length": 1.1793288716725157,
"shortest_cycle": 9,
"longest_cycle": 13.579999999999927,
"sigma_w": 1.1546721277171903,
"sigma_w_lo68": 1.0060378369054217,
"sigma_w_hi68": 1.3435620081549022,
"sigma_c": 0,
"sigma_c_ul95": 0.15637456445529277,
"sigma_c_under_clock": 1.6652504040922345,
"LR_clock": 27.04321810856809,
"p_clock_asymptotic": 9.947851308793453e-8,
"p_clock_bootstrap": 0.0004997501249375312,
"n_bootstrap_LR": 2000,
"significance_sigma_clock": 5.200309424310066,
"LR_randomwalk": 6.323830348264892e-12,
"p_randomwalk": 0.4999989967707843,
"r1": 0.10270290807450956,
"r1_lo68": -0.09898407872441536,
"r1_hi68": 0.3068498108917252,
"r1_clock_expectation": -0.5,
"r1_clock_sim_mean": -0.47903529974407455,
"r1_clock_sim_sd": 0.14687010122711505,
"p_r1_vs_clock": 0.0008499575021248938,
"r1_rw_sim_mean": -0.0477155151001121,
"r1_rw_sim_sd": 0.199161197338526,
"p_r1_vs_randomwalk": 0.4617269136543173,
"dicke_ratio": 2.171341196744508,
"dicke_n": 25,
"dicke_expect_clock": 0.46017699115044247,
"dicke_expect_randomwalk": 1.7163814180929096,
"dicke_clock_sim_mean": 0.4787540407758899,
"dicke_clock_sim_sd": 0.09851936235252975,
"dicke_rw_sim_mean": 1.6581351936870905,
"dicke_rw_sim_sd": 0.8930516341714142,
"p_dicke_vs_clock": 0.00004999750012499375,
"p_dicke_vs_randomwalk": 0.4217289135543223,
"dicke_ratio_maxima": 1.0667854187107084,
"sf_kmax": 12,
"sf_slope": 0.9136315947685262,
"sf_slope_sim_sd": 0.6802775832435396,
"sf_intercept": 0.9792681452962064,
"sf_clock_sim_slope_mean": 0.08617729533148583,
"sf_clock_sim_slope_sd": 0.21775059602422683,
"sf_rw_sim_slope_mean": 0.643303581307581,
"p_sf_vs_clock": 0.00899775056235941,
"n_bootstrap_LR_exceeding": 0,
"endpoint_period": 11.034791666666669,
"sigma_w_no_meas_err": 1.1540893536228176,
"meas_var_fraction_of_sigma_w2": 0.0036903534360983262,
"maxima_n_cycles": 23,
"maxima_P": 10.99274779332274,
"maxima_P_se": 0.4081718361529133,
"maxima_sigma_w": 1.9575105069781504,
"maxima_sigma_c": 0,
"maxima_LR_clock": 10.882845224876547,
"maxima_p_clock": 0.00048529515669544986,
"post1818_n_cycles": 18,
"post1818_P": 10.921649235754396,
"post1818_P_se": 0.2016126712997723,
"post1818_sigma_w": 0.8551955469350631,
"post1818_sigma_c": 0,
"post1818_LR_clock": 17.132207754543813,
"post1818_p_clock": 0.000017433006711023756,
"smooth24_P": 10.992974885856416,
"smooth24_sigma_w": 1.092065517871609,
"smooth24_sigma_c": 0,
"smooth24_LR_clock": 28.30382383366307,
"smooth24_p_clock": 5.1845477332818345e-8,
"LR_period_drift": 0.25084449733397207,
"p_period_drift": 0.6164810676983199,
"clock_resid_rms": 1.6691450564260175,
"clock_resid_max_abs": 3.982029743588328,
"clock_resid_max_year": 1784.708,
"tidal_period": 11.07,
"tidal_resid_rms": 1.669146692654662,
"tidal_resid_max_abs": 3.984946666666474,
"P_minus_tidal_sigma": -0.14939738428608948,
"pred_cycle26_minimum": 2030.992786928656,
"pred_cycle26_minimum_se": 1.1787286611394785,
"phase_drift_per_cycle_deg": 37.67013977394716,
"coherence_cycles": 91.3293860666246,
"coherence_years": 1007.8003155701468,
"phase_diffusion_cycles2_per_year": 0.0009922600584166973,
"hypothesis_supported": true,
"sf_obs_k1": 1.3328658964120204,
"sf_rw_k1": 1.2886595224218345,
"sf_clock_k1": 5.601982407648848,
"sf_obs_k2": 3.0629651977656978,
"sf_rw_k2": 2.454306989567359,
"sf_clock_k2": 5.63778368598131,
"sf_obs_k4": 4.468028895502645,
"sf_rw_k4": 4.443056046743987,
"sf_clock_k4": 5.660468372172896,
"sf_obs_k8": 8.805153241829899,
"sf_rw_k8": 7.118236982047629,
"sf_clock_k8": 6.012154311954938,
"sf_obs_k12": 10.190768438034096,
"sf_rw_k12": 8.046949109396529,
"sf_clock_k12": 6.573400815955307
}Experiment script · experiment_v1.py
"""Clock or random walk? Phase memory of the solar activity cycle.
Epochs of sunspot-cycle minima and maxima are located in the 13-month smoothed
SILSO v2.0 monthly total sunspot number and their measurement uncertainty is
propagated by Monte Carlo from the per-month standard error sd/sqrt(n_obs).
A phase model with rigid-clock jitter (sigma_c) plus a random walk (sigma_w) is
fitted by maximum likelihood; both limits are tested by likelihood ratio.
"""
import json
import numpy as np
from scipy import optimize, stats
from dataset import load
SEED, B_MC, B_SIM, B_LR = 20260908, 600, 20000, 2000
QV = (1.0 / 12.0) ** 2 / 12.0 # variance of one-month rounding of an epoch, yr^2
P_TIDAL = 11.07 # period of the proposed planetary-tidal clock, yr
df = load().sort_values("decimal_year").reset_index(drop=True)
t = df["decimal_year"].to_numpy(float)
x = df["sunspot_number"].to_numpy(float)
sd, nob, yr = (df[c].to_numpy(float) for c in ("sd", "n_observations", "year"))
has_err = np.isfinite(sd) & np.isfinite(nob) & (nob > 0)
se = np.zeros_like(x)
se[has_err] = sd[has_err] / np.sqrt(nob[has_err])
W13 = np.ones(13); W13[0] = W13[-1] = 0.5; W13 /= W13.sum()
W24 = np.ones(25); W24[0] = W24[-1] = 0.5; W24 /= W24.sum()
def smooth(y, w):
h = len(w) // 2
s = np.convolve(y, w, mode="same"); s[:h] = np.nan; s[-h:] = np.nan
return s
def epochs_of(s, half, kind):
hits = [i for i in range(half, len(s) - half)
if not np.isnan(s[i - half:i + half + 1]).any()
and s[i] == (s[i - half:i + half + 1].min() if kind == "min"
else s[i - half:i + half + 1].max())]
groups, cur = [], [hits[0]]
for i in hits[1:]:
if i - cur[-1] <= 12:
cur.append(i)
else:
groups.append(cur); cur = [i]
groups.append(cur)
return np.array([float(np.mean(t[g])) for g in groups])
def relocate(s, centre, kind, halfwin=30):
i0 = int(np.argmin(np.abs(t - centre)))
lo, hi = max(6, i0 - halfwin), min(len(t) - 6, i0 + halfwin + 1)
seg = s[lo:hi]
v = np.nanmin(seg) if kind == "min" else np.nanmax(seg)
return float(np.mean(t[np.where(seg == v)[0] + lo]))
def mc_sigma(nominal, kind, w, seed):
rng = np.random.default_rng(seed)
d = np.empty((B_MC, len(nominal)))
for b in range(B_MC):
s = smooth(x + rng.normal(0.0, se), w)
d[b] = [relocate(s, c, kind) for c in nominal]
return d.std(axis=0, ddof=1)
s13, s24 = smooth(x, W13), smooth(x, W24)
ep_min, ep_max = epochs_of(s13, 48, "min"), epochs_of(s13, 48, "max")
ep_min24 = np.array([relocate(s24, c, "min") for c in ep_min])
sig_min = mc_sigma(ep_min, "min", W13, SEED)
sig_max = mc_sigma(ep_max, "max", W13, SEED + 1)
sig_m24 = mc_sigma(ep_min24, "min", W24, SEED + 2)
# ------------------------------------------------------------- phase model
def make_nll(tt, vmeas, deg=1):
N = len(tt); n = np.arange(N, dtype=float)
X = np.column_stack([n ** k for k in range(deg + 1)])
M = np.minimum.outer(np.arange(N), np.arange(N)).astype(float)
def nll(vc, vw, want=False):
C = max(vc, 0) * np.eye(N) + max(vw, 0) * M + np.diag(vmeas)
try:
L = np.linalg.cholesky(C)
except np.linalg.LinAlgError:
return (1e12, None) if want else 1e12
z = np.linalg.solve(L, X); y = np.linalg.solve(L, tt)
b, *_ = np.linalg.lstsq(z, y, rcond=None); r = y - z @ b
v = float(np.sum(np.log(np.diag(L))) + 0.5 * float(r @ r))
return (v, (b, np.linalg.inv(z.T @ z))) if want else v
return nll, N
def mle(tt, vmeas, deg=1):
nll, N = make_nll(tt, vmeas, deg)
best = min((optimize.minimize(lambda p: nll(p[0], p[1]), p0, method="L-BFGS-B",
bounds=[(0, 60), (0, 60)])
for p0 in [(.5, .01), (.01, .5), (.3, .3), (1., 1e-9), (1e-9, 1.)]),
key=lambda r: r.fun)
vc, vw = float(best.x[0]), float(best.x[1])
_, (beta, cb) = nll(vc, vw, want=True)
fixw = lambda v: optimize.minimize_scalar(lambda u: nll(u, v), bounds=(0, 60),
method="bounded") # vw fixed
fixc = lambda v: optimize.minimize_scalar(lambda u: nll(v, u), bounds=(0, 60),
method="bounded") # vc fixed
return dict(N=N, vc=vc, vw=vw, nll=float(best.fun), beta=beta, cb=cb,
fixw=fixw, fixc=fixc, nll_fn=nll)
def prof_ci(prof, v_mle, nll_min, delta, hi=60.0):
g = lambda v: 2.0 * (prof(v).fun - nll_min) - delta
out = []
for a, b in ((0.0, v_mle), (v_mle, hi)):
if b <= a or g(a) * g(b) > 0:
out.append(float(np.sqrt(max(a if g(a) < 0 else b, 0.0))))
else:
out.append(float(np.sqrt(max(optimize.brentq(g, a, b, xtol=1e-12), 0.0))))
return out
def analyse(tt, sig):
vmeas = sig ** 2 + QV
f = mle(tt, vmeas)
r_clock, r_rw = f["fixw"](0.0), f["fixc"](0.0) # sigma_w=0 ; sigma_c=0
LRc, LRr = 2 * (r_clock.fun - f["nll"]), 2 * (r_rw.fun - f["nll"])
sw_lo, sw_hi = prof_ci(f["fixw"], f["vw"], f["nll"], 1.0)
_, sc_ul = prof_ci(f["fixc"], f["vc"], f["nll"], 3.8415)
L = np.diff(tt)
return dict(N=f["N"], ncyc=int(len(L)), P=float(f["beta"][1]),
P_se=float(np.sqrt(f["cb"][1, 1])), sw=float(np.sqrt(f["vw"])),
sw_lo=sw_lo, sw_hi=sw_hi, sc=float(np.sqrt(f["vc"])), sc_ul95=sc_ul,
LR_clock=float(LRc), p_clock=0.5 * float(stats.chi2.sf(max(LRc, 0), 1)),
LR_rw=float(LRr), p_rw=0.5 * float(stats.chi2.sf(max(LRr, 0), 1)),
vc0=float(max(r_clock.x, 0.0)), meanL=float(L.mean()),
sdL=float(L.std(ddof=1)), r1=float(np.corrcoef(L[:-1], L[1:])[0, 1]),
nll=f["nll"], vmeas=vmeas)
main = analyse(ep_min, sig_min)
no_err = analyse(ep_min, np.zeros_like(sig_min))
maxima = analyse(ep_max, sig_max)
post = analyse(ep_min[6:], sig_min[6:])
sm24 = analyse(ep_min24, sig_m24)
LR_drift = 2.0 * (main["nll"] - mle(ep_min, main["vmeas"], deg=2)["nll"])
# ------------------------------------------------ simulation of both models
rng = np.random.default_rng(SEED + 7)
NC = main["ncyc"]; n_ax = np.arange(NC + 1, dtype=float)
SC0 = float(np.sqrt(main["vc0"])) # ML clock amplitude under sigma_w = 0
def sim(sc, sw, nb):
e = rng.normal(0.0, sw, (nb, NC + 1)) if sw > 0 else np.zeros((nb, NC + 1))
e[:, 0] = 0.0
return (main["P"] * n_ax + np.cumsum(e, axis=1) + rng.normal(0.0, max(sc, 1e-12), (nb, NC + 1))
+ rng.normal(0.0, np.sqrt(main["vmeas"]), (nb, NC + 1)))
def r1_of(T):
L = np.diff(T, axis=1); a, b = L[:, :-1], L[:, 1:]
az, bz = a - a.mean(1, keepdims=True), b - b.mean(1, keepdims=True)
return (az * bz).sum(1) / np.sqrt((az ** 2).sum(1) * (bz ** 2).sum(1))
def two_sided(sample, obs):
n = len(sample)
return float((2 * min((sample <= obs).sum(), (sample >= obs).sum()) + 1) / (n + 1))
r1_ck, r1_rw = r1_of(sim(SC0, 0.0, B_SIM)), r1_of(sim(main["sc"], main["sw"], B_SIM))
p_r1_ck, p_r1_rw = two_sided(r1_ck, main["r1"]), two_sided(r1_rw, main["r1"])
r1_lo, r1_hi = [float(v) for v in np.percentile(r1_rw - r1_rw.mean() + main["r1"], [16, 84])]
# exact parametric-bootstrap null distribution of the clock likelihood ratio
def quick_LR(tt):
nll, _ = make_nll(tt, main["vmeas"])
full = min((optimize.minimize(lambda p: nll(p[0], p[1]), p0, method="L-BFGS-B",
bounds=[(0, 60), (0, 60)]).fun for p0 in [(.3, .3), (1e-9, 1.)]))
null = optimize.minimize_scalar(lambda u: nll(u, 0.0), bounds=(0, 60), method="bounded").fun
return 2.0 * (null - full)
LR_null = np.array([quick_LR(T) for T in sim(SC0, 0.0, B_LR)])
p_LR_exact = float(((LR_null >= main["LR_clock"]).sum() + 1) / (B_LR + 1))
# ------------------------------------------------------ Dicke's ratio (1978)
def dicke(T):
"""Di = sum_{i=2}^n delta(i)^2 / sum_{i=2}^n (delta(i)-delta(i-1))^2, with
delta the residual from the least-squares line through the n epochs."""
T = T[None, :] if T.ndim == 1 else T
n = T.shape[1]; A = np.column_stack([np.ones(n), np.arange(n, dtype=float)])
d = T - (A @ np.linalg.lstsq(A, T.T, rcond=None)[0]).T
return (d[:, 1:] ** 2).sum(1) / (np.diff(d, axis=1) ** 2).sum(1)
NM = len(ep_min)
di_obs = float(dicke(ep_min)[0])
di_ck, di_rw = dicke(sim(SC0, 0.0, B_SIM)), dicke(sim(main["sc"], main["sw"], B_SIM))
p_di_ck = float(((di_ck >= di_obs).sum() + 1) / (B_SIM + 1))
p_di_rw = float((2 * min((di_rw <= di_obs).sum(), (di_rw >= di_obs).sum()) + 1) / (B_SIM + 1))
# ------------------------------------------------- phase structure function
KMAX = 12
ks = np.arange(1, KMAX + 1, dtype=float)
def sfun(T, P):
"""Phase structure function, with the drift removed by the endpoint estimator
-- which is the generalised-least-squares estimator of P under a random walk
-- applied identically to observed and simulated records."""
T = T[None, :] if T.ndim == 1 else T
return np.array([np.mean((T[:, k:] - T[:, :-k] - k * P) ** 2, axis=1)
for k in range(1, KMAX + 1)]).T
wts = np.arange(len(ep_min) - 1, len(ep_min) - 1 - KMAX, -1).astype(float)
A = np.column_stack([np.ones(KMAX), ks]) * np.sqrt(wts)[:, None]
wls = lambda S: np.linalg.lstsq(A, S * np.sqrt(wts), rcond=None)[0]
S_obs = sfun(ep_min, (ep_min[-1] - ep_min[0]) / NC)[0]
S_rw = sfun(*(lambda T: (T, ((T[:, -1] - T[:, 0]) / NC)[:, None]))(sim(main["sc"], main["sw"], 4000)))
S_ck = sfun(*(lambda T: (T, ((T[:, -1] - T[:, 0]) / NC)[:, None]))(sim(SC0, 0.0, 4000)))
c_obs = wls(S_obs)
sl_rw = np.array([wls(s)[1] for s in S_rw]); sl_ck = np.array([wls(s)[1] for s in S_ck])
p_sf_ck = float(((sl_ck >= c_obs[1]).sum() + 1) / (len(sl_ck) + 1))
# ------------------------------------------ rigid ephemerides and prediction
n_idx = np.arange(len(ep_min), dtype=float)
res_free = ep_min - np.polyval(np.polyfit(n_idx, ep_min, 1), n_idx)
res_tid = ep_min - (P_TIDAL * n_idx + np.mean(ep_min - P_TIDAL * n_idx))
pred = float(ep_min[-1] + main["P"])
pred_se = float(np.sqrt(main["sw"] ** 2 + main["sc"] ** 2 + main["P_se"] ** 2
+ sig_min[-1] ** 2 + QV))
ncoh = float((main["P"] / main["sw"]) ** 2)
tot_sig = np.sqrt(sig_min ** 2 + QV)
L_obs = np.diff(ep_min)
res = {
"n_months_total": int(len(t)), "n_months_missing_ssn": int(np.isnan(x).sum()),
"n_months_with_stated_error": int(has_err.sum()),
"n_months_provisional": int((~df["definitive"].to_numpy(bool)).sum()),
"record_start": float(t[0]), "record_end": float(t[-1]),
"median_monthly_se": float(np.median(se[has_err])),
"median_monthly_se_1818_1849": float(np.median(se[has_err & (yr <= 1849)])),
"median_monthly_se_2000_2026": float(np.median(se[has_err & (yr >= 2000)])),
"n_minima": int(len(ep_min)), "n_maxima": int(len(ep_max)),
"first_minimum": float(ep_min[0]), "last_minimum": float(ep_min[-1]),
"epoch_sigma_median": float(np.median(tot_sig)), "epoch_sigma_max": float(tot_sig.max()),
"epoch_sigma_max_year": float(ep_min[int(np.argmax(tot_sig))]),
"n_epochs_unmoved_by_noise": int((sig_min < 1e-6).sum()),
"epoch_quantisation_sigma": float(np.sqrt(QV)), "n_cycles": main["ncyc"], "P": main["P"],
"P_se": main["P_se"], "mean_cycle_length": main["meanL"], "sd_cycle_length": main["sdL"],
"shortest_cycle": float(L_obs.min()), "longest_cycle": float(L_obs.max()),
"sigma_w": main["sw"], "sigma_w_lo68": main["sw_lo"], "sigma_w_hi68": main["sw_hi"],
"sigma_c": main["sc"], "sigma_c_ul95": main["sc_ul95"], "sigma_c_under_clock": SC0,
"LR_clock": main["LR_clock"], "p_clock_asymptotic": main["p_clock"],
"p_clock_bootstrap": p_LR_exact, "n_bootstrap_LR": B_LR,
"significance_sigma_clock": float(stats.norm.isf(max(main["p_clock"], 1e-300))),
"LR_randomwalk": main["LR_rw"], "p_randomwalk": main["p_rw"], "r1": main["r1"],
"r1_lo68": r1_lo, "r1_hi68": r1_hi, "r1_clock_expectation": -0.5,
"r1_clock_sim_mean": float(r1_ck.mean()), "r1_clock_sim_sd": float(r1_ck.std(ddof=1)),
"p_r1_vs_clock": p_r1_ck, "r1_rw_sim_mean": float(r1_rw.mean()),
"r1_rw_sim_sd": float(r1_rw.std(ddof=1)), "p_r1_vs_randomwalk": p_r1_rw,
"dicke_ratio": di_obs, "dicke_n": int(NM),
"dicke_expect_clock": float((NM ** 2 - 1) / (2 * (NM ** 2 + 2 * NM + 3))),
"dicke_expect_randomwalk": float((NM + 2) * (NM ** 2 - 1) / (3 * (5 * NM ** 2 + 6 * NM - 3))),
"dicke_clock_sim_mean": float(di_ck.mean()), "dicke_clock_sim_sd": float(di_ck.std(ddof=1)),
"dicke_rw_sim_mean": float(di_rw.mean()), "dicke_rw_sim_sd": float(di_rw.std(ddof=1)),
"p_dicke_vs_clock": p_di_ck, "p_dicke_vs_randomwalk": p_di_rw,
"dicke_ratio_maxima": float(dicke(ep_max)[0]), "sf_kmax": KMAX, "sf_slope": float(c_obs[1]),
"sf_slope_sim_sd": float(sl_rw.std(ddof=1)), "sf_intercept": float(c_obs[0]),
"sf_clock_sim_slope_mean": float(sl_ck.mean()),
"sf_clock_sim_slope_sd": float(sl_ck.std(ddof=1)),
"sf_rw_sim_slope_mean": float(sl_rw.mean()), "p_sf_vs_clock": p_sf_ck,
"n_bootstrap_LR_exceeding": int((LR_null >= main["LR_clock"]).sum()),
"endpoint_period": float((ep_min[-1] - ep_min[0]) / NC), "sigma_w_no_meas_err": no_err["sw"],
"meas_var_fraction_of_sigma_w2": float(np.mean(main["vmeas"]) / main["sw"] ** 2),
"maxima_n_cycles": maxima["ncyc"], "maxima_P": maxima["P"], "maxima_P_se": maxima["P_se"],
"maxima_sigma_w": maxima["sw"], "maxima_sigma_c": maxima["sc"],
"maxima_LR_clock": maxima["LR_clock"], "maxima_p_clock": maxima["p_clock"],
"post1818_n_cycles": post["ncyc"], "post1818_P": post["P"], "post1818_P_se": post["P_se"],
"post1818_sigma_w": post["sw"], "post1818_sigma_c": post["sc"],
"post1818_LR_clock": post["LR_clock"], "post1818_p_clock": post["p_clock"],
"smooth24_P": sm24["P"], "smooth24_sigma_w": sm24["sw"], "smooth24_sigma_c": sm24["sc"],
"smooth24_LR_clock": sm24["LR_clock"], "smooth24_p_clock": sm24["p_clock"],
"LR_period_drift": float(LR_drift),
"p_period_drift": float(stats.chi2.sf(max(LR_drift, 0.0), 1)),
"clock_resid_rms": float(np.sqrt(np.mean(res_free ** 2))),
"clock_resid_max_abs": float(np.max(np.abs(res_free))),
"clock_resid_max_year": float(ep_min[int(np.argmax(np.abs(res_free)))]),
"tidal_period": P_TIDAL, "tidal_resid_rms": float(np.sqrt(np.mean(res_tid ** 2))),
"tidal_resid_max_abs": float(np.max(np.abs(res_tid))),
"P_minus_tidal_sigma": float((main["P"] - P_TIDAL) / main["P_se"]),
"pred_cycle26_minimum": pred, "pred_cycle26_minimum_se": pred_se,
"phase_drift_per_cycle_deg": float(360.0 * main["sw"] / main["P"]), "coherence_cycles": ncoh,
"coherence_years": float(ncoh * main["P"]),
"phase_diffusion_cycles2_per_year": float(main["sw"] ** 2 / main["P"] ** 3),
"hypothesis_supported": bool(p_LR_exact < 0.05 and main["sw_lo"] > 0 and post["p_clock"] < 0.05 and maxima["p_clock"] < 0.05)
}
for k in (1, 2, 4, 8, 12):
res[f"sf_obs_k{k}"] = float(S_obs[k - 1])
res[f"sf_rw_k{k}"] = float(S_rw[:, k - 1].mean())
res[f"sf_clock_k{k}"] = float(S_ck[:, k - 1].mean())
for k, v in res.items():
if isinstance(v, float) and not np.isfinite(v):
raise SystemExit("non-finite: " + k)
print("minima :", np.round(ep_min, 3).tolist())
print("sigma :", np.round(tot_sig, 4).tolist())
print("lengths:", np.round(L_obs, 3).tolist())
print("S(k) :", np.round(S_obs, 3).tolist())
print("RESULT_JSON: " + json.dumps(res))
4.Analysis
Analysis complete: experiment succeeded; hypothesis supported; 14 key numbers.
Results and analysis
The script ran once, cleanly, in 11.3 s on all 3332 monthly means (1749.04 to 2026.62, no missing sunspot values), locating 25 minima from 1755.12 to 2019.96 and 24 maxima. The 24 cycle lengths span 9.00 to 13.58 yr. Propagating the published per-month standard error sd/sqrt(n_observations) through 600 Monte Carlo replicates barely moves the epochs: median uncertainty 0.024 yr (set by the one-month quantisation), maximum 0.248 yr at the flat 1902 minimum, and for 14 of 25 minima the noise never displaced the epoch by a month. Measurement error is 0.37 per cent of the fitted phase variance; zeroing it changes sigma_w from 1.1547 to 1.1541 yr.
The phase model gives P = 11.035 +/- 0.236 yr, a random-walk step sigma_w = 1.155 yr per cycle (68 per cent profile interval 1.006-1.344) and a clock component on its boundary, sigma_c = 0 with a 95 per cent upper limit of 0.156 yr. The clock limit is rejected: 2 dlnL = 27.04, asymptotic p = 1.0e-7 (5.2 sigma), with no exceedance among 2000 bootstrap replicates simulated under the maximum-likelihood clock. Removing the random walk instead costs nothing (2 dlnL = 6e-12).
Both parameter-free corollaries follow. The lag-1 autocorrelation of successive lengths is +0.103 (68 per cent interval -0.099 to +0.307), consistent with the random walk's 0 (p = 0.46) and not with the clock's exact -1/2 (p = 8.5e-4). Dicke's ratio is 2.171 against expectations of 0.460 (clock, p = 5e-5) and 1.716 (random walk, p = 0.42). The phase structure function rises from 1.33 to 10.19 yr^2 over twelve cycles, tracking the random-walk simulation, not the clock's flat 5.60-6.57 yr^2. Every robustness variant agrees: maxima (1.958 yr, p = 4.9e-4), the measurement-complete 1823-onward subsample (0.855 yr, p = 1.7e-5), 24-month smoothing (1.092 yr, p = 5.2e-8); no period drift (p = 0.62).
P is indistinguishable from the proposed 11.07-yr tidal period (-0.15 sigma), yet the epochs wander about a rigid 11.07-yr ephemeris with rms 1.669 yr and a 3.98 yr excursion at 1784.7. The measured diffusion constant, 9.92e-4 squared cycles per year, gives 37.7 degrees of drift per cycle and a coherence horizon of 91 cycles (1008 yr); one cycle ahead, the cycle-26 minimum is 2031.0 +/- 1.2.
Key numbers
| Metric | Value | Interpretation |
|---|---|---|
| sigma_w (random-walk phase step) | 1.155 yr per cycle (68% CI 1.006-1.344) | The cycle phase gains an independent random increment of about one year every cycle; this is the central new measurement. |
| sigma_c (rigid-clock jitter) | 0.000 yr (95% upper limit 0.156 yr) | No component of the epoch scatter is pinned to a fixed ephemeris; any hidden chronometer must hold the phase to better than 0.16 yr, which the data exclude given the observed 1.67 yr wander. |
| Likelihood ratio against the clock | 2 dlnL = 27.04; p = 1.0e-7 asymptotic, < 5e-4 bootstrap (0 of 2000) | The clock model is rejected at 5.2 sigma on directly measured sunspot numbers alone. |
| Lag-1 autocorrelation of cycle lengths | +0.103 (68% CI -0.099 to +0.307) | A rigid clock forces exactly -1/2; the data are consistent with 0 (p = 0.46) and inconsistent with -1/2 (p = 8.5e-4). |
| Dicke's ratio Di(25) | 2.171 (clock expectation 0.460, random-walk expectation 1.716) | Dicke's own statistic, applied to the modern instrumental record, lands on the random-walk side: p = 5e-5 against the clock, p = 0.42 against the random walk. |
| Mean interval between minima | P = 11.035 +/- 0.236 yr | Indistinguishable from the proposed 11.07-yr Venus-Earth-Jupiter tidal period at -0.15 sigma; the mean period is not the discriminating quantity. |
| Wander about a rigid 11.07-yr ephemeris | rms 1.669 yr, maximum 3.98 yr at the 1784.7 minimum | Even a period fixed at the tidal value cannot keep the phase: the accumulated excursion reaches a third of a cycle. |
| Measurement-error contribution | median epoch sigma 0.024 yr, maximum 0.248 yr; 0.37% of the fitted phase variance | The published monthly dispersions are far too small to explain the phase wander; setting them to zero changes sigma_w from 1.1547 to 1.1541 yr. |
| Phase-diffusion coefficient | 9.92e-4 squared cycles per year; 37.7 deg drift per cycle | A quantitative target that stochastic dynamo models can be required to reproduce. |
| Coherence horizon | 91 cycles, about 1008 yr | After roughly a millennium the accumulated phase error equals one full cycle, setting a hard ceiling on how far ahead cycle timing can ever be extrapolated. |
| Phase structure function S(k) | 1.33, 3.06, 4.47, 8.81, 10.19 yr^2 at k = 1, 2, 4, 8, 12 cycles | Grows with lag as a random walk does (simulated 1.29, 2.45, 4.44, 7.12, 8.05) rather than saturating as a clock does (5.60, 5.64, 5.66, 6.01, 6.57). |
| Robustness variants | maxima sigma_w = 1.958 yr (p = 4.9e-4); 1823-onward 0.855 yr (p = 1.7e-5); 24-month smoothing 1.092 yr (p = 5.2e-8) | The rejection of the clock does not depend on the phase marker, on the early low-observer era, or on the smoothing kernel. |
| Secular drift of the period | 2 dlnL = 0.251, p = 0.62 | A linearly drifting period is not needed; the mean interval is stable across the record. |
| Forecast of the cycle-26 minimum | 2031.0 +/- 1.2 | A falsifiable prediction that follows from the fitted model, with an uncertainty dominated by sigma_w rather than by measurement error. |
Caveats
- Only 24 cycle intervals exist in the entire directly measured record, so the 68 per cent interval on sigma_w spans 1.01-1.34 yr and the upper limit on any clock component is correspondingly weak; the study bounds a chronometer rather than excluding one of arbitrarily small amplitude.
- The test distinguishes a memoryless random walk from a rigid clock. A slow deterministic modulation of the period, of Gleissberg type, would also make the phase structure function rise, and with 24 cycles it cannot be cleanly separated from genuine diffusion; the null of no linear period drift (p = 0.62) rules out only the simplest such alternative.
- Sunspot minima are a proxy for the phase of the underlying magnetic cycle, and near minimum the smoothed series is flat, so the marker is intrinsically noisy. The maxima cross-check gives the same verdict but a larger sigma_w (1.958 yr), showing that the numerical value of the diffusion constant is marker-dependent even though the qualitative conclusion is not.
- Only random measurement error is propagated. Systematic errors in the early SILSO version 2.0 record, where a single observer often provides all monthly values, could shift epochs coherently in a way the Monte Carlo does not capture; the 1823-onward subsample is the partial control on this and gives a smaller sigma_w (0.855 yr).
- The epoch definition quantises to the month and the flat 1810 minimum required a plateau-averaging rule, so individual epochs carry a definitional as well as a statistical uncertainty; the 24-month-smoothing variant is the check on this and changes sigma_w by about 5 per cent.
- The parametric-bootstrap p-value is limited by the 2000 replicates to p < 5e-4; the quoted 5.2 sigma comes from the asymptotic boundary-corrected mixture distribution, which the bootstrap corroborates but cannot resolve.
- The last five months of the record are provisional and the September 2026 file will be revised, but the most recent epoch used is the 2019.96 minimum, so no result depends on provisional values.
5.Paper writing
Manuscript drafted: “No Chronometer in the Sun: the Phase of the Schwabe Cycle Diffuses as a Random Walk” (≈ 2552 words).
≈ 2552 words · AI-drafted manuscript · not peer-reviewed
No Chronometer in the Sun: the Phase of the Schwabe Cycle Diffuses as a Random Walk
1. Abstract
Is the solar activity cycle paced by an internal clock, or does its phase diffuse? We locate 25 sunspot-cycle minima in the directly measured SILSO v2.0 record (1749-2026) and propagate the published per-month measurement errors into every epoch. A phase model nesting rigid-clock jitter and a random walk yields a diffusion step of 1.155 yr per cycle (68% interval 1.006-1.344) and a clock amplitude consistent with zero (<0.156 yr, 95%). The clock limit is rejected at 5.2 standard deviations. Dicke's ratio is 2.171 against 0.460 expected for a clock. Phase coherence is lost after 91 cycles.
The Schwabe cycle is the archetypal stochastically forced astrophysical oscillator, and the sharpest open question about it concerns its phase, not its amplitude. Dicke asked whether a "chronometer hidden deep in the Sun" anchors successive epochs in absolute time, so that a short cycle is systematically followed by a long one, or whether each cycle merely inherits its predecessor's phase, so that the phase performs an unbounded random walk [1]. The two pictures are physically distinct: a chronometer demands a pacemaker or an internal reservoir with memory far exceeding a cycle, whereas phase diffusion is the generic behaviour of a noise-driven limit cycle and follows from mean-field theory with fluctuating helicity [2,6].
The question is contentious. A dynamo entrained at the 11.07-yr Venus-Earth-Jupiter tidal period has been proposed, its principal empirical support being Dicke's ratio over a millennium of epochs [3]. The rebuttal is that those pre-telescopic epochs come from a reconstruction built assuming a continued 11-yr cycle, and are clocked by construction [4,8]; the exchange continues [5]. Separately, every claimed periodicity beyond the 11/22-yr band is consistent with the realization noise of a noisy limit cycle [7].
The dispute thus rests on epochs that were never measured. Here we settle it with directly observed sunspot numbers alone, on the recalibrated version 2.0 scale [9], propagating each epoch's measurement uncertainty from the published monthly dispersions. We find no chronometer: the clock is excluded at 5.2 standard deviations and the phase diffuses by 1.155 yr per cycle.
3. Model
Let be the epoch of the -th cycle minimum, . We write
with a jitter about a rigid ephemeris, the increments of a phase random walk, and the known measurement error, all in years. The covariance is
Equation (1) nests both hypotheses: is a rigid clock, whose ephemeris predicts every future epoch to forever; is pure diffusion, in which ephemeris error grows without bound.
Two parameter-free corollaries follow. Under a clock the cycle lengths are the first difference of independent jitters, an MA(1) process with , so
Second, Dicke's ratio [1], with the residual of from the least-squares line through the epochs,
has expectations
The phase structure function
rises linearly under diffusion and saturates under a clock. Diffusion finally defines
being the number of cycles after which the accumulated phase error reaches one cycle.
4. Methods
Data. We analyse the monthly mean total sunspot number, version 2.0, distributed by WDC-SILSO, Royal Observatory of Belgium, Brussels [11], retrieved 2026-09-08 from https://www.sidc.be/SILSO/DATA/SN_m_tot_V2.0.csv under CC BY-NC 4.0. The file holds 3332 monthly means from 1749.042 to 2026.623 with no missing values. We use decimal_year (mid-month date as a year fraction), sunspot_number (the dimensionless monthly mean index), sd (standard deviation of that month's daily values) and n_observations (their count). The last two are published only from 1818, for 2503 of the 3332 months; the standard error of a monthly mean is . Five recent months are provisional; no epoch used here falls within them. Version 2.0 is not numerically comparable with the version 1.0 values used before 2015 [9].
Epochs. The series is smoothed with the standard 13-month kernel (unit weights, half weight on the two end months). An epoch is any month at which the smoothed series attains its extremum over a -month window; months within 12 of one another are merged at their mean date, resolving the flat 1810 minimum. This yields 25 minima, 1755.123 to 2019.958, hence 24 cycle lengths, and 24 maxima, each quantised to the month and so carrying a variance .
Measurement uncertainty. We draw 600 Monte Carlo replicates of the monthly series, perturbing each month independently by , re-smooth, and relocate every epoch within months of its nominal position; is the replicate standard deviation, added in quadrature to the quantisation variance.
Inference. The mean is profiled out of Eq. (2) by generalised least squares and estimated by Gaussian maximum likelihood; intervals are profile-likelihood. Because lies on the parameter boundary, the asymptotic null distribution of is the equal mixture of and ; with only 24 intervals we also compute an exact -value from 2000 parametric-bootstrap replicates drawn under the maximum-likelihood clock. The discriminants (3)-(6) are calibrated against 20000 seeded simulations of each fitted model (4000 for the structure-function slope).
5. Results
Table I summarises the record and the epoch error budget. The published dispersions barely move the epochs: the median epoch uncertainty is 0.024 yr, set entirely by the one-month quantisation, and in 600 replicates the noise never displaced 14 of the 25 minima by a month. The largest, 0.248 yr, is at the flat 1902.042 minimum.
Table I. The record analysed and the propagated epoch measurement uncertainty.
| Quantity | Value |
|---|---|
Sample period; monthly means (missing; with published sd) | 1749.042-2026.623; 3332 (0; 2503) |
| Median monthly standard error (all; 1818-49; 2000-26) | 1.150; 2.194; 0.230 |
| Minima (maxima) located; first / last minimum | 25 (24); 1755.123 / 2019.958 |
| Cycle length: mean, s.d.; shortest, longest (yr) | 11.035, 1.179; 9.00, 13.58 |
| Median, maximum epoch uncertainty (yr) | 0.024, 0.248 (at 1902.042) |
| Minima unmoved by noise in 600 replicates | 14 of 25 |
| 0.0037 |
Notes. Sunspot number is dimensionless; epochs, lengths and uncertainties are in years. The epoch quantisation is yr; 24 intervals are analysed. Last row: measurement error is 0.37% of the fitted phase variance.
Table II gives the maximum-likelihood fit. The mean interval is yr, and the random-walk step is yr per cycle; the rigid-clock amplitude sits on its boundary, , with a 95% upper limit of 0.156 yr. Imposing the clock costs , an asymptotic , or 5.2 standard deviations, and no replicate of 2000 drawn under the maximum-likelihood clock reached the observed value (). Imposing pure diffusion costs nothing measurable.
Table II. Maximum-likelihood phase model, Eqs. (1)-(2), and likelihood-ratio tests. Primary sample: 25 minima, 24 intervals.
| Parameter or test | Value |
|---|---|
| (yr) | 11.035 0.236 |
| (yr per cycle) | 1.155 (68% interval 1.006 - 1.344) |
| (yr) | 0.000 (95% upper limit 0.156) |
| under the imposed clock (yr) | 1.665 |
| Clock limit : ; asymptotic | 27.04; (5.2) |
| Clock limit: bootstrap (exceedances) | (0/2000) |
| Diffusion limit : () | (0.50) |
| Secular period drift (quadratic term): () | 0.251 (0.62) |
| refitted with (yr) | 1.154 |
Notes. Intervals are profile-likelihood; the asymptotic for a boundary hypothesis uses the equal mixture of and . " under the imposed clock" is the clock amplitude fitted with forced to zero, which generates the bootstrap null.
Both parameter-free corollaries agree (Table III). The lag-1 autocorrelation of the 24 lengths is , consistent with the walk's zero and incompatible with the clock's exact . Dicke's ratio is against the 0.460 expected for a clock and 1.716 for a walk, Eq. (5). The structure function rises from 1.33 yr at one cycle to 10.19 yr at twelve, tracking the simulated walk rather than the clock's near-flat 5.60-6.57 yr; its weighted slope, 0.914 yr per cycle, agrees with and exceeds the clock's .
Table III. Parameter-free discriminants: observed values against simulations of the two fitted models.
| Statistic | Observed | Clock model | Random walk |
|---|---|---|---|
| (lag-1 autocorr.) | +0.103 (68%: 0.099, +0.307) | 0.479 0.147; | 0.048 0.199; |
| Dicke's ratio | 2.171 | 0.460 expected; 0.479 0.099; | 1.716 expected; 1.658 0.893; |
| , , (yr) | 1.333, 4.468, 10.191 | 5.602, 5.660, 6.573 | 1.289, 4.443, 8.047 |
| Weighted slope of , (yr/cycle) | 0.914 | 0.086 0.218; | 0.643 0.680 |
Notes. Model columns give the mean and standard deviation over 20000 simulations of Eq. (1) with the fitted parameters and the observed (4000 for the slope); expected is Eq. (5) at . -values are , one-sided against the clock. and yr are omitted.
The rejection survives every variant (Table IV): cycle maxima, an independent phase marker, give yr; the measurement-complete 1823-onward subsample, 0.855 yr; a 24-month kernel, 1.092 yr. Zeroing the measurement uncertainties moves from 1.1547 to 1.1541 yr.
Table IV. Robustness of the rejection of the clock.
| Variant | Intervals | (yr) | (yr) | ||
|---|---|---|---|---|---|
| Minima, 13-month kernel (primary) | 24 | 11.035 0.236 | 1.155 | 27.04 | |
| Maxima, 13-month kernel | 23 | 10.993 0.408 | 1.958 | 10.88 | |
| Minima, 1823 onward | 18 | 10.922 0.202 | 0.855 | 17.13 | |
| Minima, 24-month kernel | 24 | 10.993 | 1.092 | 28.30 |
Notes. is the asymptotic boundary-corrected value for ; rests on zero in every variant. Dicke's ratio for the 24 maxima is 1.067, again far above the clock expectation.
Table V collects the physical consequences. The fitted mean interval is indistinguishable from the proposed 11.07-yr tidal period, at standard deviations. Yet the epochs do not stay with a rigid 11.07-yr ephemeris: they wander about it with an rms of 1.669 yr and a maximum excursion of 3.98 yr, a third of a cycle, at the 1784.708 minimum. The right average period is not the same as keeping time.
Table V. Derived phase-diffusion quantities, rigid ephemerides, and the forecast.
| Quantity | Value |
|---|---|
| (cycles yr); drift per cycle (deg) | ; 37.7 |
| Coherence horizon (cycles; yr) | 91.3; 1008 |
| Rms, max residual: best rigid ephemeris; 11.07-yr (yr) | 1.669, 3.982 (at 1784.708); 1.669, 3.985 |
| ; predicted cycle-26 minimum | ; 2031.0 1.2 |
Notes. The best rigid ephemeris is the least-squares line through the 25 minima. The forecast propagates , , the uncertainty in and the measurement error of the 2019.958 epoch.
6. Discussion and Outlook
On the directly measured record alone, the Sun keeps no time. The phase gains an independent random increment of yr each cycle, and any rigid component is bounded by 0.156 yr at 95% confidence, more than tenfold below the 1.669 yr of observed wander. Dicke's statistic, undecidable with the material then available, now gives 2.171 where a clock predicts 0.460. This is what a stochastically forced dynamo predicts [2,6] and what the realization-noise reading of solar variability implies [7]; it is not what a tidally entrained, phase-locked dynamo does [3,5]. Our result does not test the tidal mechanism itself, and the fitted mean interval does agree with 11.07 yr; it excludes the phase locking that would be its observable signature. The contrary evidence rests on reconstructed epochs whose construction presupposes cycle regularity [4,8], and the instrumental record does not reproduce it.
The measured diffusion constant is a quantitative target: a dynamo model of the real Sun must reproduce cycles yr, not merely an 11-yr period and a plausible amplitude distribution. The practical consequence is a ceiling on prediction: after 91 cycles the accumulated phase error equals a full cycle, so no extrapolation of cycle timing survives a millennium however well the mean period is known, consistent with the poor performance of extrapolation against precursor methods [10]. One cycle ahead the model is testable now: the cycle-26 minimum should fall at 2031.0 1.2.
Three limitations bound the claim. First, the record holds only 24 cycle intervals, so the 68% interval on spans 1.01-1.34 yr; we bound a chronometer rather than exclude one of arbitrarily small amplitude. Second, the test separates a memoryless random walk from a rigid clock: a slow deterministic modulation of the period would also make rise, and with 24 intervals cannot be disentangled from diffusion. A quadratic mean term, allowing a linearly drifting period, is not favoured (), but that excludes only the simplest such alternative; oscillatory modulation we did not test. Third, only random measurement error is propagated. Systematic errors in the early record, where one observer often supplies every monthly value [9], could shift epochs coherently in a way the Monte Carlo cannot capture; the 1823-onward subsample is a partial control and still yields 0.855 yr. Minima are themselves a noisy phase proxy, and is marker-dependent: maxima give 1.958 yr, nearly double, though the verdict is unchanged. A single dataset underlies everything reported here.
Natural next steps are to repeat the measurement on polar-field reversal epochs and on group-number series, which sample the magnetic cycle differently, and to compare against stochastically forced dynamo simulations.
7. Acknowledgments
We thank WDC-SILSO, Royal Observatory of Belgium, for maintaining the sunspot number series, and the observers whose daily counts constitute the record analysed here.
8. References
[1] R. H. Dicke, Nature (London) 276, 676 (1978), https://www.nature.com/articles/276676b0. [2] P. Hoyng, Sol. Phys. 169, 253 (1996), https://link.springer.com/article/10.1007/BF00190603. [3] F. Stefani, A. Giesecke, and T. Weier, Sol. Phys. 294, 60 (2019), https://link.springer.com/article/10.1007/s11207-019-1447-1. [4] H.-C. Nataf, Sol. Phys. 297, 107 (2022), https://link.springer.com/article/10.1007/s11207-022-02038-w. [5] F. Stefani, J. Beer, and T. Weier, Sol. Phys. 298, 83 (2023), https://link.springer.com/article/10.1007/s11207-023-02174-x. [6] P. Charbonneau, Living Rev. Sol. Phys. 17, 4 (2020), https://link.springer.com/article/10.1007/s41116-020-00025-6. [7] R. H. Cameron and M. Schüssler, Astron. Astrophys. 625, A28 (2019), https://arxiv.org/abs/1903.05398. [8] I. G. Usoskin, Living Rev. Sol. Phys. 20, 2 (2023), https://link.springer.com/article/10.1007/s41116-023-00036-z. [9] F. Clette, L. Svalgaard, J. M. Vaquero, and E. W. Cliver, Space Sci. Rev. 186, 35 (2014), https://link.springer.com/article/10.1007/s11214-014-0074-2. [10] D. H. Hathaway, Living Rev. Sol. Phys. 12, 4 (2015), https://link.springer.com/article/10.1007/lrsp-2015-4. [11] SILSO, World Data Center, Sunspot Number and Long-term Solar Observations, Royal Observatory of Belgium, on-line Sunspot Number catalogue (1749-present), https://www.sidc.be/SILSO/, DOI: 10.24414/qnza-ac80; data file https://www.sidc.be/SILSO/DATA/SN_m_tot_V2.0.csv, retrieved 2026-09-08.
9. Supplemental Material
Would contain: the 25 minimum and 24 maximum epochs with their uncertainties and the 24 cycle lengths; profile-likelihood curves for and ; the bootstrap null distribution of the clock likelihood ratio and the simulated distributions of and ; for with both model curves; and the analysis script.
6.Review
Automated review: Minor revision (novelty 4, rigor 4, clarity 4, reproducibility 4).
| Novelty 4/5 | Rigor 4/5 | Clarity 4/5 | Reproducibility 4/5 |
A compact, well-executed Letter that settles a genuinely contested question with the right statistical tool and honest error propagation. The phase model of Eqs. (1)-(2) nests the rigid clock and the random walk, and on the 25 sunspot-cycle minima of the SILSO v2.0 record (3332 monthly means, 1749.042-2026.623, WDC-SILSO, retrieved 2026-09-08) the clock limit is rejected with 2 dlnL = 27.04 while sigma_c sits on its boundary. Every manuscript number I checked - sigma_w = 1.155 (1.006-1.344), sigma_c < 0.156, rho_1 = +0.103, Di(25) = 2.171 against 0.460 and 1.716, S(1) = 1.333 and S(12) = 10.191 yr^2, the maxima/1823-onward/24-month variants at 1.958/0.855/1.092 yr, the drift null at p = 0.62, and the 2031.0 +/- 1.2 forecast - matches the executed script and its recorded output, the sample (25 minima, 24 intervals, 24 maxima; 19 epochs from 1823) matches the code, and the data are correctly and never misleadingly described as the real SILSO series. The Letter is within length and follows the venue's conventions. What holds it back from acceptance as it stands is the treatment of uncertainty on the central number: the analysis-choice spread in sigma_w (0.855-1.958 yr) is larger than the quoted statistical interval and is not carried through to the diffusion constant or the coherence horizon, the 5.2 sigma is asymptotic and the bootstrap resolves only to 3.5 sigma, and the bound on sigma_c is stated more absolutely than the model supports. These are matters of framing and disclosure, not of re-analysis, and the qualitative conclusion - no chronometer, a diffusing phase - survives every variant the authors ran.
Strengths
- The Letter answers a well-posed, 47-year-old question (Dicke 1978) that is currently contested in the literature, and it does so using only directly measured sunspot numbers. Because the tidal-synchronisation claim rests principally on Dicke's ratio evaluated over reconstructed pre-telescopic epochs, an independent evaluation of the same statistic on the instrumental record alone (Di(25) = 2.171 against 0.460 expected for a clock) is exactly the discriminating measurement the dispute needs.
- The statistical formulation is the right one. Equations (1)-(2) nest the clock and the random walk in a single Gaussian covariance, so the two hypotheses are compared by likelihood ratio rather than by eye, and the boundary nature of sigma_w = 0 is handled correctly with the equal 50:50 chi^2_0/chi^2_1 mixture and cross-checked by 2000 parametric-bootstrap replicates drawn under the maximum-likelihood clock.
- The measurement-error budget is propagated rather than assumed. Drawing 600 Monte Carlo replicates of the monthly series from the published sd/sqrt(n_obs) and relocating each epoch gives a median epoch uncertainty of 0.024 yr and a maximum of 0.248 yr at the flat 1902.042 minimum, i.e. 0.37% of the fitted phase variance; refitting with s_n = 0 moves sigma_w only from 1.1547 to 1.1541 yr. This closes the obvious objection that the phase wander is observational noise.
- Three parameter-free discriminants (the lag-1 autocorrelation, which a rigid clock forces to exactly -1/2; Dicke's ratio against its two analytic expectations, Eq. (5); and the structure function, which must saturate under a clock) all point the same way and are calibrated against simulations of both fitted models. Agreement between a model-dependent likelihood ratio and model-independent statistics is convincing.
- The data section is exemplary for a Letter: the provider (WDC-SILSO, Royal Observatory of Belgium), the exact file URL, the retrieval date, the licence, 3332 monthly means from 1749.042 to 2026.623 with zero missing values, the 2503 months carrying published dispersions, the five provisional months, and the caution that version 2.0 is not comparable with version 1.0. Every quantity quoted in the text also appears in a numbered table.
- The Letter states a falsifiable consequence (the cycle-26 minimum at 2031.0 +/- 1.2) and a quantitative target for dynamo theory (D = 9.92e-4 cycles^2 yr^-1), rather than stopping at a null result.
Weaknesses
- The headline sigma_w = 1.155 yr (68% interval 1.006-1.344) is quoted as if statistical uncertainty dominated, but Table IV shows the estimate ranging from 0.855 yr (1823 onward) through 1.092 yr (24-month kernel) to 1.958 yr (maxima). That spread is well outside the quoted interval, so the analysis-choice systematic is comparable to, and probably larger than, the statistical error. The derived quantities that inherit sigma_w^2 - D = 9.92e-4 cycles^2 yr^-1, the 37.7 deg drift per cycle and the 91-cycle coherence horizon - are correspondingly uncertain by a factor of order two, yet they are presented as single numbers, including in the abstract ('coherence is lost after 91 cycles').
- The 5.2 standard deviations claimed for the rejection of the clock comes from the asymptotic boundary-corrected mixture evaluated at 2 dlnL = 27.04. With N = 25 epochs this is a long extrapolation into the tail, and the bootstrap, limited to 2000 replicates, can corroborate it only to p < 5e-4 (about 3.5 sigma). The manuscript reports both numbers but does not tell the reader that the exact calculation stops three orders of magnitude short of the asymptotic one; the limitations paragraph omits this entirely.
- The 95% upper limit sigma_c < 0.156 yr is a limit within the nested model, obtained while sigma_w is free. That is the right construction, but the Discussion presents it as an unqualified bound on 'any rigid component', which overstates what a single covariance model can exclude.
- No goodness-of-fit statement is made for the fitted model itself. The Gaussian likelihood assumes normal, independent random-walk increments with a constant step; nothing in the manuscript tests that assumption against the 24 observed lengths (which span 9.00-13.58 yr), and S(k) is in fact non-monotonic at the largest lags reported.
- Presentational details: the 24-month-kernel row of Table IV gives P = 10.993 with no uncertainty while every other row quotes one; sigma_w is given in 'yr per cycle' and sigma_c in 'yr' without the distinction being spelled out where the two are first compared; and the section numbering jumps from 1 to 3 (correct for the venue, which gives the opening paragraphs no heading, but it will read as an omission).
- Only one dataset underlies the entire result, and both phase markers come from the same smoothed series, so the maxima cross-check is not fully independent of the minima.
Required changes
- Quote a systematic uncertainty alongside the statistical one for sigma_w and for every quantity derived from it. State explicitly in the Results that the variant estimates span 0.855-1.958 yr, exceeding the 68% statistical interval, and propagate that spread into D, the drift per cycle and the coherence horizon (in the abstract as well, which should not assert '91 cycles' as if it were known to two figures).
- Add to the limitations that the parametric bootstrap is resolution-limited to p < 5e-4 by its 2000 replicates, so the quoted 5.2 sigma rests on the asymptotic boundary-corrected mixture, which the bootstrap supports but cannot verify at that level.
- Qualify the sigma_c bound where it is stated in the Discussion: it is a 95% profile-likelihood upper limit within the model of Eqs. (1)-(2) with sigma_w free, not a model-independent exclusion of any timing mechanism.
- Either report a goodness-of-fit check of the fitted phase model, or state plainly in the limitations that none was performed and that the Gaussian, constant-step random walk is an assumption rather than a tested description of the 24 intervals.
- State the random seed used for every stochastic step (the Monte Carlo epoch replicates, the bootstrap and the calibration simulations) in the Methods, so the numbers can be reproduced exactly; 'seeded' alone is insufficient. Give the uncertainty on P for the 24-month-kernel variant in Table IV, or mark it as not computed.
Record
§Event timeline
- Run createdQuestion: “Does the solar activity cycle keep time like a clock, or does its phase perform a random walk? A likelihood test on sunspot-cycle minima epochs in the SILSO v2.0 record with propagated measurement uncertainty” · output language: English · venue: Physics · Physical Review Letters · models: agent:claude-opus-5
- Stage started · Literature reviewAttempt 1 · agent:claude-opus-5
- awaiting_agent · Literature reviewsearch response for literature_review: literature_review-search-1.response.json
- Resume requested
- Stage started · Literature reviewAttempt 2 · agent:claude-opus-5
- Search complete · Literature review16 sources · 11,422 characters of notes
- awaiting_agent · Literature reviewcomplete_json response for literature_review: literature_review-complete_json-1.response.json
- Resume requested
- Stage started · Literature reviewAttempt 3 · agent:claude-opus-5
- Search complete · Literature review16 sources · 11,422 characters of notes
- Stage completed · Literature review
- Stage started · IdeationAttempt 1 · agent:claude-opus-5
- awaiting_agent · Ideationcomplete_json response for ideation: ideation-complete_json-1.response.json
- Resume requested
- Stage started · IdeationAttempt 2 · agent:claude-opus-5
- Awaiting approval · Ideation
- Approved · IdeationIdea 1 selected
- Stage started · ExperimentationAttempt 1 · agent:claude-opus-5
- Dataset provisioned · Experimentationsidc_sunspot_monthly · 3,332 observations · 7 variables · sha256 6383f7c67fc2
- awaiting_agent · Experimentationcomplete response for experimentation: experimentation-complete-1.response.txt
- Resume requested
- Stage started · ExperimentationAttempt 2 · agent:claude-opus-5
- Dataset provisioned · Experimentationsidc_sunspot_monthly · 3,332 observations · 7 variables · sha256 6383f7c67fc2
- awaiting_agent · Experimentationcomplete response for experimentation: experimentation-complete-1.response.txt
- Resume requested
- Stage started · ExperimentationAttempt 3 · agent:claude-opus-5
- Dataset provisioned · Experimentationsidc_sunspot_monthly · 3,332 observations · 7 variables · sha256 6383f7c67fc2
- Experiment round · ExperimentationRound 1: exit 0; result parsed (11.28s)
- Stage completed · Experimentation
- Stage started · AnalysisAttempt 1 · agent:claude-opus-5
- awaiting_agent · Analysiscomplete_json response for analysis: analysis-complete_json-1.response.json
- Resume requested
- Stage started · AnalysisAttempt 2 · agent:claude-opus-5
- Stage completed · Analysis
- Stage started · Paper writingAttempt 1 · agent:claude-opus-5
- awaiting_agent · Paper writingcomplete response for paper_writing: paper_writing-complete-1.response.txt
- Resume requested
- Stage started · Paper writingAttempt 2 · agent:claude-opus-5
- Stage completed · Paper writing
- Stage started · ReviewAttempt 1 · agent:claude-opus-5
- awaiting_agent · Reviewcomplete_json response for review: review-complete_json-1.response.json
- Resume requested
- Stage started · ReviewAttempt 2 · agent:claude-opus-5
- Awaiting approval · Review
- Approved · Review
- Run completereport=/private/tmp/claude-501/-Users-haodingresearch-Desktop-auto-research/579004ae-5819-417d-918c-9d9409997567/scratchpad/studies/physics-en/runs/32eaf23e6fe2/REPORT.md
- Resume requested
- Run completereport=/private/tmp/claude-501/-Users-haodingresearch-Desktop-auto-research/579004ae-5819-417d-918c-9d9409997567/scratchpad/studies/physics-en/runs/32eaf23e6fe2/REPORT.md