# T1 Refractive–Axial Joint Assessment

Interface release 2026.09.13-r5. English and Chinese research companion. MIT license. Calculation code, percentile references, Excel workbooks and R functions remain at 2026.09.13-r4.

Website: https://t1-joint-assessment.pages.dev (English); https://t1-joint-assessment.pages.dev/zh.html (Chinese).

## Compact interface update

The bilingual interface now combines each reference cutoff and comparison label on one row, keeps a short explanation below each percentile bar, and shows the joint group in a compact pale-coloured row. Counts, group observations and detailed explanations remain expandable. Blank inputs no longer show a redundant instruction; input-change and error messages are retained. This is a presentation update only: calculations, ties, thresholds, eligibility checks and all downloadable Excel/R functions are unchanged.

## Percentile positions in the development cohort

The two result cards now show separate percentile positions against the 3,827-child development cohort. A2 probability and absolute T1 SE difference retain their original values and cutoffs. The percentile interval is `[100 × count(reference < value) / N, 100 × count(reference <= value) / N]`. Equal values stay tied. This is a tied-position interval, not a confidence interval, individual disease probability or severity scale. Displayed positions have one decimal place. A very narrow interval with coincident rounded endpoints is labelled approximately. The percentile does not determine the original four-group classification.

For A2, ranking uses the original linear predictor eta, which is strictly monotonic in logistic probability, so platform-specific final-bit differences in exponentials do not split identical scores. No coefficients, cutoffs or probability outputs are changed. Reference values and queries are not rounded or compared with an added tolerance. The public reference tables contain separate score/count and SE/count distributions only, with no IDs, outcomes or paired individual records.

Fictional example: baseline AL difference 0.20 mm and signed growth difference 0.06 mm/6 months give A2 probability 6.3290545874% and percentile P87.4. An SE difference of 0.375 D has 2,653 children below and 382 equal: its tied interval is P69.3–P79.3. These are development-cohort comparisons, not population norms.

R: `opo_reference_position(baseline_mm, growth_mm6, se_D)` returns `status`, `n`, `a2` and `se`; each valid position includes `below`, `equal`, `lower` and `upper` (percent scale). It applies the existing input guards. `opo_joint_assess()` remains compatible. Run `Rscript test_reference_positions.R` for the focused example and guards. JavaScript uses `OPORank.position('a2', eta)` or `OPORank.position('se', se_D)`; its A2 value is eta, not a probability. Excel adds a separate percentile-reference tab. Its 40-position display rail is schematic; the numeric percentile bounds are authoritative.

## Use

1. Enter the baseline absolute interocular axial-length difference (mm), the signed interocular growth difference standardised to six months (mm/6 months), and the current absolute interocular spherical-equivalent (SE) difference (D).
2. Select **Calculate**. A2 probability and current SE difference appear separately, each beside its study reference cutoff. Changing an input clears the old results. **Fictional example** fills fictional values; **Clear** removes them.
3. Open details only when needed. A four-group diagram highlights the group matching the inputs and shows its conditions, including the SE interval. This is a cutoff-defined group, not a personal percentile rank. The displayed group observations are research-group results, not an individual joint probability.

For example, 6.33% exceeds the study's A2 reference cutoff, displayed as 3.54%. These cutoffs define the study groups; they are not treatment thresholds or a basis for calling an individual low risk. Decisions use full precision, not the rounded display. The calculator does not recommend treatment or follow-up intervals.

## Conversion helpers

The axial helper uses right/left T0 and T1 measurements and a known actual interval in months. It fixes the longer eye at T0; it does not reorder the eyes at T1. The baseline absolute difference is `abs(right_T0 - left_T0)`. The signed growth difference is the growth in the T0-longer eye minus growth in the T0-shorter eye, multiplied by `6 / interval_months`. Negative growth differences are valid. Months have no default and must be within the study's 4–8-month T1 window. Equal T0 lengths do not determine signed orientation; use inputs already derived under the study rules.

The separate SE helper returns `abs(right_T1_SE - left_T1_SE)`. It accepts signed SE measurements. Preview the helper results, then explicitly apply them. In Excel, choose the input source: the two axial inputs switch together, while SE switches independently. Manual entries remain available. Excel is macro-free and recalculates automatically; it has no simulated buttons.

## Intended scope

Research companion for the study population: age 6–14 years at T0, baseline interocular SE difference no greater than 0.50 D, and T1 SE difference below 1.00 D, with the study's other eligibility requirements. T0 is baseline and T1 is reassessment 4–8 months later. The displayed A2 probability concerns the study-defined T2 incident anisometropia outcome. Missing or invalid inputs, negative absolute differences, and T1 SE difference at or above 1.00 D stop prediction. Eligibility is not established by entering three numbers.

The interface has no analytics, clinical-data upload, cookies, or input storage. Calculations run in the browser. The hosting provider may process ordinary page-request metadata; the calculator does not send entered measurements. Downloaded HTML works offline alongside its CSS and JavaScript files.

## Calculation and reproducibility

`x = 10 * baseline_mm`; `g = 10 * growth_mm6`.

`eta = -4.78405979380143 + 0.6696684016643029 * x + 1.2501430016860613 * g`

`p = 1 / (1 + exp(-eta))`, evaluated in a numerically stable form.

The A2 upper group requires `p > 0.03543760156428906`; the SE upper group requires `SE_difference > 0.375 D`. Equality belongs to the lower group. The joint branch requires both conditions (AND), corresponding to Supplementary Fig. S3. SE is not included in the A2 formula.

The source archive includes `frozen_spec.json` for exact coefficients, cutoffs, fixed Wilson intervals, and source hashes. These are developer/reproducibility materials, not an additional user input. No quantiles, model fits, bootstrap results, or research-group intervals are recalculated.

`joint_assess.R` uses base R only. The three-argument entry point remains `opo_joint_assess(baseline_mm, growth_mm6, se_D)`. Independent helpers are `opo_derive_axial(right_T0_mm, left_T0_mm, right_T1_mm, left_T1_mm, interval_months)` and `opo_derive_se(right_T1_SE_D, left_T1_SE_D)`; see the function definitions for argument names. Run `Rscript test_joint_assess.R` from the source-archive folder to check fictional examples, all nine strict boundary combinations and helper guards. This release was checked with R 4.5.2; no historical package versions are inferred.

Aggregate references sum to 3,827 children/136 events in development and 980/32 in the later cohort. The later group exceeding both cutoffs has 21/106; the other groups total 11/874. These aggregate observations are not individual joint probabilities.

## Files and license

`index.html` is English and `zh.html` is Chinese. The same `joint_core.js` serves both. `downloads/` includes the two Excel workbooks, R function and this readme. The source ZIP also supplies fictional examples, tests and exact constants. Only this standalone calculator software and its support files are released under MIT. The complete study analysis archive, manuscript, reviewer correspondence and patient-level data are not part of this release. Permanent deposition of the complete study analysis archive remains separate.
