Skip to content
GLM Playground home

Methods

How the numbers are verified

Every model on this site is fitted in TypeScript, in your browser or at build time. Those ports are only useful if they agree with the R code I submitted, so each one is tested against reference output regenerated from the original assignment code.

The pipeline

  1. 1

    Re-run the original R

    scripts/reference.R repeats the model calls from the Assignment 2 and 3 R Markdown files verbatim and writes every reproduced number at full precision to a JSON fixture; scripts/diagnostics-reference.R does the same for the 2026 model checks.

  2. 2

    Port the algorithms

    IRLS mirrors glm.fit line by line (starting values, Householder QR, convergence rule); multinomial, proportional-odds and GEE fits solve the same likelihood or estimating equations with Newton steps.

  3. 3

    Test for parity

    A vitest suite compares the ports with the fixture and with numbers printed in the original notebooks. CI runs it on every push; the table below is the same comparison, computed when this page was built.

Parity table

49 of 49 checks within tolerance. Reference: R version 4.6.1 (2026-06-24); nnet 7.3.20, MASS 7.3.65, geepack 1.3.13; for the 2026 model checks also VGAM 1.1.14, brant 0.3.0 and lme4 2.0.6. Differences are relative (absolute for values below 1).

Beetle

  • β₀ (straight line)

    R
    -60.10327943
    TS
    -60.10327943
    Δ
    9.0e-15 ≤ tolerance 1.0e-9
  • β₁ (straight line)

    R
    33.93416481
    TS
    33.93416481
    Δ
    7.7e-15 ≤ tolerance 1.0e-9
  • SE(β₁)

    R
    2.902867031
    TS
    2.902867031
    Δ
    4.3e-15 ≤ tolerance 1.0e-9
  • Residual deviance

    R
    13.63338416
    TS
    13.63338416
    Δ
    3.0e-15 ≤ tolerance 1.0e-10
  • Pearson X²

    R
    12.11328428
    TS
    12.11328428
    Δ
    1.1e-14 ≤ tolerance 1.0e-9
  • AIC

    R
    43.83142238
    TS
    43.83142238
    Δ
    9.2e-15 ≤ tolerance 1.0e-10
  • LD50

    R
    1.771173087
    TS
    1.771173087
    Δ
    3.0e-15 ≤ tolerance 1.0e-10
  • P(killed | dose 1.8)

    R
    0.7267543314
    TS
    0.7267543314
    Δ
    4.9e-15 ≤ tolerance 1.0e-10
  • β₂ (quadratic)near-collinear design

    R
    153.5606193
    TS
    153.5606193
    Δ
    2.5e-13 ≤ tolerance 1.0e-7
  • Deviance (quadratic)

    R
    5.106974528
    TS
    5.106974528
    Δ
    2.5e-14 ≤ tolerance 1.0e-9

Attitudes

  • model.5 Education slope

    R
    -0.2635160023
    TS
    -0.2635160023
    Δ
    3.9e-16 ≤ tolerance 1.0e-8
  • model.5 Female × Education

    R
    -0.08172065599
    TS
    -0.08172065599
    Δ
    8.3e-17 ≤ tolerance 1.0e-8
  • model.5 deviance

    R
    20.24417710
    TS
    20.24417710
    Δ
    2.0e-14 ≤ tolerance 1.0e-9
  • model.4 deviance

    R
    15.15999289
    TS
    15.15999289
    Δ
    2.3e-15 ≤ tolerance 1.0e-8
  • model.6 deviance

    R
    20.23682242
    TS
    20.23682242
    Δ
    5.4e-15 ≤ tolerance 1.0e-8
  • model.7 deviancealiased columns re-coded

    R
    9.947281513
    TS
    9.947281513
    Δ
    5.7e-15 ≤ tolerance 1.0e-8

Death penalty

  • [D][V][P] G²

    R
    137.9293556
    TS
    137.9293556
    Δ
    6.2e-16 ≤ tolerance 1.0e-8
  • [DV][P] G²

    R
    8.131610900
    TS
    8.131610900
    Δ
    2.0e-15 ≤ tolerance 1.0e-8
  • [DV][DP] G²

    R
    7.910160591
    TS
    7.910160591
    Δ
    3.4e-16 ≤ tolerance 1.0e-8
  • [VD][VP] G²

    R
    1.881895464
    TS
    1.881895464
    Δ
    1.2e-15 ≤ tolerance 1.0e-8
  • Logistic ~ Victim_Race deviance

    R
    1.881895464
    TS
    1.881895464
    Δ
    2.8e-15 ≤ tolerance 1.0e-8

Pneumoconiosis

  • Severe vs normal slopevs multinom(reltol = 1e-15)

    R
    0.1092853327
    TS
    0.1092853322
    Δ
    4.1e-10 ≤ tolerance 1.0e-6
  • Multinomial deviance

    R
    417.4495633
    TS
    417.4495633
    Δ
    7.0e-13 ≤ tolerance 1.0e-8
  • SE(severe slope)nnet Hessian

    R
    0.01646978363
    TS
    0.01646976569
    Δ
    1.8e-8 ≤ tolerance 1.0e-5
  • Proportional-odds slopevs polr(reltol = 1e-15)

    R
    0.09590408742
    TS
    0.09590408815
    Δ
    7.3e-10 ≤ tolerance 1.0e-6
  • Cut-point θ₂

    R
    4.869048624
    TS
    4.869048624
    Δ
    3.3e-11 ≤ tolerance 1.0e-6
  • Proportional-odds deviance

    R
    416.9188336
    TS
    416.9188336
    Δ
    6.7e-14 ≤ tolerance 1.0e-8
  • SE(slope)polr uses a finite-difference Hessian

    R
    0.01193789093
    TS
    0.01193657086
    Δ
    1.3e-6 ≤ tolerance 2.0e-4

Wheeze GEE

  • β age (exchangeable)vs geeglm(epsilon = 1e-14)

    R
    -0.1133849967
    TS
    -0.1133849967
    Δ
    3.7e-16 ≤ tolerance 1.0e-9
  • β smoke (exchangeable)

    R
    0.2650757406
    TS
    0.2650757406
    Δ
    2.8e-15 ≤ tolerance 1.0e-9
  • Robust SE smoke

    R
    0.1777465511
    TS
    0.1777465511
    Δ
    1.3e-15 ≤ tolerance 1.0e-8
  • Working correlation α

    R
    0.3543049158
    TS
    0.3543049158
    Δ
    2.8e-16 ≤ tolerance 1.0e-9
  • Scale φ

    R
    0.9984646059
    TS
    0.9984646059
    Δ
    1.1e-16 ≤ tolerance 1.0e-9
  • Robust SE smoke (default fit)geeglm default epsilon = 1e-4

    R
    0.1777465499
    TS
    0.1777465511
    Δ
    1.3e-9 ≤ tolerance 1.0e-7
  • Naive GLM SE smoke

    R
    0.1234730601
    TS
    0.1234730601
    Δ
    2.8e-17 ≤ tolerance 1.0e-9

Model checks (2026)

  • Beetle leverage, dose 1.72hatvalues()

    R
    0.3491434715
    TS
    0.3491434715
    Δ
    2.6e-14 ≤ tolerance 1.0e-9
  • Beetle Cook's D, dose 1.76cooks.distance()

    R
    1.033666488
    TS
    1.033666488
    Δ
    6.3e-13 ≤ tolerance 1.0e-8
  • Quasi-binomial dispersion

    R
    2.018893941
    TS
    2.018893941
    Δ
    3.1e-14 ≤ tolerance 1.0e-9
  • Quasi F test p, quadratic term

    R
    0.03285800828
    TS
    0.03285800828
    Δ
    3.3e-15 ≤ tolerance 1.0e-9
  • Profile CI for slope, loweruniroot on offset refits

    R
    28.54450924
    TS
    28.54450924
    Δ
    1.2e-16 ≤ tolerance 1.0e-8
  • Profile CI for LD50, upper

    R
    1.778679926
    TS
    1.778679926
    Δ
    1.5e-14 ≤ tolerance 1.0e-9
  • LD50, quadratic logit: profile CI upperuniroot on constrained refits

    R
    1.788363698
    TS
    1.788363698
    Δ
    2.4e-15 ≤ tolerance 1.0e-9
  • LD50, cloglog lineMASS::dose.p()

    R
    1.778204508
    TS
    1.778204508
    Δ
    7.1e-11 ≤ tolerance 1.0e-8
  • Brant X², parallel slopesbrant package

    R
    0.05135868732
    TS
    0.05135781870
    Δ
    8.7e-7 ≤ tolerance 1.0e-5
  • Separate-slopes β₂VGAM::vglm

    R
    0.09607722320
    TS
    0.09607722390
    Δ
    7.1e-10 ≤ tolerance 1.0e-7
  • AR(1) working correlation αgeeglm(corstr = 'ar1')

    R
    0.4910089758
    TS
    0.4910089758
    Δ
    2.2e-15 ≤ tolerance 1.0e-9
  • AR(1) robust SE smoke

    R
    0.1811950126
    TS
    0.1811950126
    Δ
    1.1e-15 ≤ tolerance 1.0e-8
  • QIC, exchangeablegeepack::QIC()

    R
    1829.482937
    TS
    1829.482937
    Δ
    9.6e-15 ≤ tolerance 1.0e-9
  • GLMM β smokeglmer(nAGQ = 25) stops early

    R
    0.3985632954
    TS
    0.3985626077
    Δ
    6.9e-7 ≤ tolerance 2.0e-3

Why some tolerances are looser