stmmlib 0.2.0__tar.gz → 0.2.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- stmmlib-0.2.5/CHANGELOG.md +232 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/LICENSE +21 -21
- stmmlib-0.2.5/MANIFEST.in +2 -0
- {stmmlib-0.2.0/stmmlib.egg-info → stmmlib-0.2.5}/PKG-INFO +229 -215
- {stmmlib-0.2.0 → stmmlib-0.2.5}/README.md +194 -180
- stmmlib-0.2.5/docs/API.md +154 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/pyproject.toml +54 -52
- {stmmlib-0.2.0 → stmmlib-0.2.5}/setup.cfg +4 -4
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/__init__.py +30 -30
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/_backend.py +153 -153
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/_utils.py +197 -175
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/__init__.py +17 -17
- stmmlib-0.2.5/stmmlib/beta/beta_nll.py +138 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/config.py +108 -108
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/criteria.py +187 -247
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/design.py +222 -222
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/diagnose.py +168 -168
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/diagnostics.py +94 -94
- stmmlib-0.2.5/stmmlib/beta/engine/__init__.py +19 -0
- stmmlib-0.2.5/stmmlib/beta/engine/finalize.py +289 -0
- stmmlib-0.2.5/stmmlib/beta/engine/gradient.py +188 -0
- stmmlib-0.2.5/stmmlib/beta/engine/hessian.py +70 -0
- stmmlib-0.2.5/stmmlib/beta/engine/hooks.py +132 -0
- stmmlib-0.2.5/stmmlib/beta/engine/likelihood.py +165 -0
- stmmlib-0.2.5/stmmlib/beta/engine/optimize.py +296 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/fit.py +599 -598
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/gpu_solvers.py +169 -169
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/inference.py +340 -403
- stmmlib-0.2.5/stmmlib/beta/laplace.py +70 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/lrt_fixed.py +551 -551
- stmmlib-0.2.5/stmmlib/beta/mode.py +263 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/moran_panel.py +733 -733
- stmmlib-0.2.5/stmmlib/beta/numerics.py +123 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/plot_data.py +252 -252
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/precision.py +98 -98
- stmmlib-0.2.5/stmmlib/beta/prior.py +182 -0
- stmmlib-0.2.5/stmmlib/beta/regression.py +102 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/report.py +373 -373
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/result.py +712 -696
- stmmlib-0.2.5/stmmlib/beta/schur.py +90 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/simulation.py +344 -343
- stmmlib-0.2.5/stmmlib/beta/solvers.py +365 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/beta/structure.py +56 -56
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/diagnostics_suite.py +663 -663
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/__init__.py +1 -1
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/blup.py +241 -252
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/covariance.py +607 -599
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/design.py +312 -312
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/diagnostics.py +308 -308
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/gls.py +285 -285
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/hessian.py +200 -197
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/lrt_fixed.py +289 -289
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/models.py +535 -528
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/optimization.py +361 -361
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/simulation.py +186 -186
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/summary.py +277 -277
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/transforms.py +417 -419
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/gaussian/variance_decomp.py +191 -191
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/lrt.py +74 -74
- stmmlib-0.2.5/stmmlib/mse/__init__.py +11 -0
- stmmlib-0.2.5/stmmlib/mse/_beta.py +92 -0
- stmmlib-0.2.5/stmmlib/mse/_common.py +76 -0
- stmmlib-0.2.5/stmmlib/mse/_gaussian.py +73 -0
- stmmlib-0.2.5/stmmlib/mse/bootstrap.py +159 -0
- stmmlib-0.2.5/stmmlib/mse_bootstrap.py +17 -0
- stmmlib-0.2.5/stmmlib/output_format.py +18 -0
- stmmlib-0.2.5/stmmlib/output_format_beta.py +14 -0
- stmmlib-0.2.5/stmmlib/output_format_normal.py +12 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/registry.py +326 -326
- stmmlib-0.2.5/stmmlib/reporting/__init__.py +23 -0
- stmmlib-0.2.0/stmmlib/output_format.py → stmmlib-0.2.5/stmmlib/reporting/_common.py +148 -148
- stmmlib-0.2.0/stmmlib/output_format_beta.py → stmmlib-0.2.5/stmmlib/reporting/beta.py +299 -299
- stmmlib-0.2.0/stmmlib/output_format_normal.py → stmmlib-0.2.5/stmmlib/reporting/normal.py +118 -118
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib/stmm.py +282 -265
- {stmmlib-0.2.0 → stmmlib-0.2.5/stmmlib.egg-info}/PKG-INFO +229 -215
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib.egg-info/SOURCES.txt +35 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib.egg-info/requires.txt +0 -1
- stmmlib-0.2.5/tests/test_ar1_global_variance.py +84 -0
- stmmlib-0.2.5/tests/test_architecture.py +87 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_all.py +152 -152
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_config.py +80 -80
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_criteria.py +44 -44
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_ebp.py +80 -80
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_input_guards.py +65 -65
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_lrt_fixed.py +539 -539
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_penalty.py +46 -46
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_regression.py +39 -39
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_beta_report_certificate.py +73 -73
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_bugfix_b1_b4.py +51 -51
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_coverage_gaps.py +50 -50
- stmmlib-0.2.5/tests/test_custom_columns_gaussian.py +60 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_diagnostics_suite.py +57 -57
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_fixed_effects_diag.py +45 -45
- stmmlib-0.2.5/tests/test_formula_guard.py +48 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_gaussian_all.py +96 -85
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_gaussian_lrt.py +157 -157
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_gaussian_m5_eblup.py +60 -60
- stmmlib-0.2.5/tests/test_golden.py +130 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_grad_analytic.py +82 -82
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_lrt.py +54 -54
- stmmlib-0.2.5/tests/test_mse_bootstrap.py +104 -0
- stmmlib-0.2.5/tests/test_mustfix_audit.py +261 -0
- stmmlib-0.2.5/tests/test_nested_time_variance.py +54 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_predict_interval.py +46 -46
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_random_effects_diag.py +70 -70
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_registry_equation.py +34 -34
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_universal.py +25 -25
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_universal_api.py +35 -35
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_validate_assumptions.py +49 -49
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_variance_ci.py +41 -41
- {stmmlib-0.2.0 → stmmlib-0.2.5}/tests/test_w_edge_cases.py +112 -112
- stmmlib-0.2.0/stmmlib/beta/solvers.py +0 -2021
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib.egg-info/dependency_links.txt +0 -0
- {stmmlib-0.2.0 → stmmlib-0.2.5}/stmmlib.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `stmmlib`. Format follows Keep-a-Changelog; versions
|
|
4
|
+
follow Semantic Versioning.
|
|
5
|
+
|
|
6
|
+
## [0.2.5] - 2026-11-15
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- Gaussian flat and SEBLUP models forward `prov_col`/`kab_col` to the fitting
|
|
11
|
+
core. Custom-named grouping columns are now excluded from the fixed-effect
|
|
12
|
+
design; before, only the literal names `prov`/`kab` were skipped, so a frame
|
|
13
|
+
carrying e.g. `provinsi`/`kabupaten` leaked those text columns into `X`
|
|
14
|
+
(numpy dtype error, or a silently wrong design).
|
|
15
|
+
- A non-numeric response or predictor in a Gaussian fit raises `ValueError`
|
|
16
|
+
naming the offending column, matching the Beta path, instead of numpy's
|
|
17
|
+
"could not convert string to float".
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- `seblup_rao_yu_it` accepts `prov_col`/`kab_col` (default `None`); existing
|
|
22
|
+
positional calls are unchanged.
|
|
23
|
+
|
|
24
|
+
### Notes
|
|
25
|
+
|
|
26
|
+
- Beta fits can differ by roughly `1e-4` in log-likelihood when the caller
|
|
27
|
+
permutes rows: the standardisation means are summed in frame order, and the
|
|
28
|
+
auto-prior refit is a threshold branch that can flip near its boundary.
|
|
29
|
+
Sort the frame before fitting when a bit-stable reproduction matters.
|
|
30
|
+
|
|
31
|
+
## [0.2.4] - 2026-11-14
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- Packaging layout only, no behavior change. Output formatting moved into
|
|
36
|
+
`stmmlib.reporting` (`_common`, `beta`, `normal`) and the MSE bootstrap into
|
|
37
|
+
`stmmlib.mse` (`_common`, `_beta`, `_gaussian`, `bootstrap`). The flat
|
|
38
|
+
`stmmlib.output_format*` modules and `stmmlib.mse_bootstrap` remain as
|
|
39
|
+
compatibility shims, so existing imports keep working. Stale `__pycache__`
|
|
40
|
+
directories were removed from the source tree.
|
|
41
|
+
- The Beta Laplace engine was split into single-purpose modules under
|
|
42
|
+
`stmmlib.beta.engine` (likelihood, gradient, hooks, optimize, finalize,
|
|
43
|
+
hessian, numerics). `stmmlib.beta.solvers` re-exports every previous name,
|
|
44
|
+
so existing imports keep working. Point estimates and likelihoods are
|
|
45
|
+
unchanged by the split.
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
|
|
49
|
+
- Gaussian fits are invariant to input row order: `y` and `X` are sorted with
|
|
50
|
+
the prepared design before fitting instead of keeping caller order.
|
|
51
|
+
- `build_V` uses the time design for `time_scope="global"`. The area-major
|
|
52
|
+
time block was used for both scopes, so a global AR(1) fit silently ignored
|
|
53
|
+
the shared time factor.
|
|
54
|
+
- The Gaussian Hessian uses the correct sign and backend, so `se_theta` is
|
|
55
|
+
available and finite for the IID model.
|
|
56
|
+
- Gaussian, Beta, and Beta-simulation spatial interaction covariances are
|
|
57
|
+
area-major (`kron(qa, I_T)`). The transposed Kronecker order disagreed with
|
|
58
|
+
the design matrix.
|
|
59
|
+
- Beta cAIC and `df_hat` use the same precision builder as the fit engine
|
|
60
|
+
(`build_beta_Q`), so criteria cannot drift from the fitted prior.
|
|
61
|
+
- `predict_interval` on a Beta fit raises `ValueError` when `vcov` is missing
|
|
62
|
+
instead of returning a point interval that looked like an interval.
|
|
63
|
+
- The fixed-effect intercept SE uses the full delta method, including the
|
|
64
|
+
covariance between the intercept and the other fixed effects.
|
|
65
|
+
- Gaussian IID BLUP uses `G Z' V^{-1} e` instead of the scaled residual, which
|
|
66
|
+
is only equivalent for a diagonal `G`.
|
|
67
|
+
|
|
68
|
+
## [0.2.3] - 2026-11-13
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
|
|
72
|
+
- `formula` is now rejected with `NotImplementedError` at the public entry
|
|
73
|
+
points. It was accepted and silently ignored, so a caller could believe the
|
|
74
|
+
design matrix matched the formula while it contained every non-skipped
|
|
75
|
+
column.
|
|
76
|
+
|
|
77
|
+
### Fixed
|
|
78
|
+
|
|
79
|
+
- AR(1) models with `time_scope="global"` (M4, M11) exposed `sigma2_u` in the
|
|
80
|
+
parameter layout while `build_V` and `build_G_time` only read `sigma2_eta`.
|
|
81
|
+
The likelihood was invariant to the reported variance. The layout now always
|
|
82
|
+
uses `sigma2_eta` for AR(1), matching `stlmm5lib`. Results for M4 and M11
|
|
83
|
+
change.
|
|
84
|
+
- M6 and M13 now estimate a separate IID time variance (`sigma2_time`). The
|
|
85
|
+
time block used to reuse `sigma2_kab`, so the fitted model had one parameter
|
|
86
|
+
fewer than the registry declares. This matches `stlmm5lib` in R. Results for
|
|
87
|
+
M6 and M13 change.
|
|
88
|
+
|
|
89
|
+
### Added
|
|
90
|
+
|
|
91
|
+
- Parametric bootstrap MSE of the area-level predictor: `mse_ebp(fit)` for
|
|
92
|
+
Beta and `mse_eblup(fit)` for Gaussian, in `stmmlib/mse_bootstrap.py`.
|
|
93
|
+
Single layer by design: beta and theta are fixed while generating, the
|
|
94
|
+
refit re-estimates them, and the target is the realized area mean of the
|
|
95
|
+
drawn random effects. No second-order bias correction (see the design doc
|
|
96
|
+
and the thesis method section). Flat models only in v1.
|
|
97
|
+
- CI matrix for Python 3.10 to 3.14 on Linux plus Windows 3.12, and a build
|
|
98
|
+
job that runs `python -m build` and `twine check`.
|
|
99
|
+
- Golden numeric tests for Beta IID+AR(1), Gaussian SAR+IID, and Gaussian
|
|
100
|
+
IID+AR(1), captured from 0.2.2.
|
|
101
|
+
- Architecture tests: a file-size ratchet and a ban on cross-family imports.
|
|
102
|
+
|
|
103
|
+
## [0.2.2] - 2026-11-13
|
|
104
|
+
|
|
105
|
+
### Fixed
|
|
106
|
+
|
|
107
|
+
- README claims now match the code:
|
|
108
|
+
- M7/M14 area effect is nested IID, not nested SAR. The Beta path says so
|
|
109
|
+
explicitly, and the Gaussian nested covariance does not use `W`.
|
|
110
|
+
- GPU acceleration is PyTorch-only and applies to the Beta inner solves;
|
|
111
|
+
the Gaussian path stays on CPU.
|
|
112
|
+
- Removed the spatial block cross-validation claim: the package does not
|
|
113
|
+
implement it.
|
|
114
|
+
- Holdout prediction is Beta-only (`ebp_newdata`), and that method rejects
|
|
115
|
+
nested and interaction models.
|
|
116
|
+
- The quick-start report call uses `summary(strict=True)` and describes the
|
|
117
|
+
certificate warning accurately.
|
|
118
|
+
- Citation version and LICENSE link now point at the current release and
|
|
119
|
+
absolute GitHub URLs, so they work on PyPI.
|
|
120
|
+
|
|
121
|
+
### Changed
|
|
122
|
+
|
|
123
|
+
- The `gpu` extra no longer pulls `cupy-cuda12x`; only the PyTorch path is
|
|
124
|
+
used for acceleration.
|
|
125
|
+
- The sdist now ships `CHANGELOG.md` and `docs/API.md` through `MANIFEST.in`,
|
|
126
|
+
because the README references the API reference.
|
|
127
|
+
- Added Documentation and Changelog project URLs to the package metadata.
|
|
128
|
+
- The package docstring now describes the actual GPU path (PyTorch/CUDA for
|
|
129
|
+
the Beta inner solves).
|
|
130
|
+
- License metadata now uses the SPDX expression `MIT` with
|
|
131
|
+
`setuptools>=77` and no deprecated license classifier.
|
|
132
|
+
|
|
133
|
+
## [0.2.1] - 2026-11-12
|
|
134
|
+
|
|
135
|
+
### Fixed
|
|
136
|
+
|
|
137
|
+
- The Gaussian optimiser's default iteration cap went from 200 to 500. On
|
|
138
|
+
scipy 1.11 the AR(1) profile likelihood needs 223 iterations (scipy 1.18
|
|
139
|
+
needs 196), so the old default reported not-converged for a fit that does
|
|
140
|
+
converge. An explicit `max_iter` is still honoured exactly: the fit then
|
|
141
|
+
reports not-converged rather than running past the cap.
|
|
142
|
+
|
|
143
|
+
### Changed
|
|
144
|
+
|
|
145
|
+
- Installation section now states that `pip install stmmlib` pulls NumPy,
|
|
146
|
+
SciPy and pandas automatically, notes that the `dev` extra needs a source
|
|
147
|
+
checkout because the tests are not part of the wheel, and gives a
|
|
148
|
+
one-line verification command.
|
|
149
|
+
- Version moved to 0.2.1 so a rebuild from this branch cannot collide with
|
|
150
|
+
the published 0.2.0 filenames on PyPI.
|
|
151
|
+
|
|
152
|
+
## [0.2.0] - 2026-11-11
|
|
153
|
+
|
|
154
|
+
### Added
|
|
155
|
+
|
|
156
|
+
- Fixed-effect inference in both families. Wald is the default; a
|
|
157
|
+
restricted-refit likelihood ratio test is available with
|
|
158
|
+
`inference="lrt"` and `lrt_terms=[...]`.
|
|
159
|
+
- Beta: `stmm(..., family="beta", inference="lrt")` or the universal
|
|
160
|
+
entry point `stmmlib.beta.lrt_fixed.lrt_fixed_effects(fit, data, terms=...)`;
|
|
161
|
+
supports `lrt_deadline_s` and `method="refine"` (Newton ascent on the
|
|
162
|
+
restricted model) or `method="plain"` (re-runs the solver's own
|
|
163
|
+
optimiser). A refit that does not reach the restricted maximum does not
|
|
164
|
+
report a p-value.
|
|
165
|
+
- Gaussian: same API. Likelihoods are compared with ML (REML
|
|
166
|
+
likelihoods are not comparable across fixed-effects designs); the
|
|
167
|
+
caller's REML fit is untouched. The certificate is the likelihood:
|
|
168
|
+
two independent starts must agree, and the restricted likelihood may
|
|
169
|
+
not exceed the full one. The fixed-effects table shows variable
|
|
170
|
+
names (not `beta_0`) and, in LRT mode, p (LRT) with the Wald p-value
|
|
171
|
+
kept at `fit["inference"]["pvalue_wald"]`.
|
|
172
|
+
- Gaussian fits now carry `coef_names` (real predictor names), `x_cols`,
|
|
173
|
+
`X`, `y`, `model`, `lrt_family` — the Gaussian tables are readable.
|
|
174
|
+
- Convergence certificate for the Beta family: `fit.certificate`
|
|
175
|
+
(`valid`, `optimum_valid`, `grad_norm`, `hessian_pd`, `near_pd_applied`).
|
|
176
|
+
`fit.summary(strict=True)` hides Wald inference when the certificate is
|
|
177
|
+
not inference-grade.
|
|
178
|
+
- Input guards: Beta response outside (0,1) or NaN predictors raise at the
|
|
179
|
+
door; unbalanced panels warn; non-contiguous area/time codes raise; W
|
|
180
|
+
ordering is warned about.
|
|
181
|
+
- Suite doubles to 150+ tests (inference switch, LRT both families, input
|
|
182
|
+
guards, universal API, Satterthwaite honesty).
|
|
183
|
+
|
|
184
|
+
### Fixed
|
|
185
|
+
|
|
186
|
+
- The restricted refit could not find the restricted maximum on the thesis
|
|
187
|
+
panel (step dominated by bound-active coordinates, then clipped to an
|
|
188
|
+
empty move). The Newton ascent is now projected onto the KKT active
|
|
189
|
+
set and the Armijo test uses the realised displacement; all six terms
|
|
190
|
+
certify `ok` and D agrees with the Wald z\u00b2 statistic.
|
|
191
|
+
- A silently wrong Gaussian model: the seblup and nested paths skipped
|
|
192
|
+
the literal `"y"` while the response is read from `response_col`, so any
|
|
193
|
+
other response name made the response a predictor of itself. The skip
|
|
194
|
+
list now comes from the names actually in use.
|
|
195
|
+
- A predictor literally named `prov` or `kab` was silently dropped by the
|
|
196
|
+
grouping-column convention in both families; the paths now warn and say
|
|
197
|
+
how to rename it.
|
|
198
|
+
- The Beta summary printed "efek-waktu 11 level" in every report (a
|
|
199
|
+
literal from one panel). It now prints the fitted number of periods.
|
|
200
|
+
- `df_method="satterthwaite"` is honest: it warns that it uses residual
|
|
201
|
+
degrees of freedom and documents the `df_method="normal"` alternative.
|
|
202
|
+
- A predictor named `y` now raises a clear collision error instead of a
|
|
203
|
+
misleading "response must be in (0,1)" message.
|
|
204
|
+
|
|
205
|
+
### Changed
|
|
206
|
+
|
|
207
|
+
- `stmm()` validates the family against the model registry:
|
|
208
|
+
`beta_regression` cannot be fitted as if it were a Gaussian model, and
|
|
209
|
+
unknown `area`/`time` types raise instead of producing
|
|
210
|
+
`logLik=nan` / `status=invalid` silently.
|
|
211
|
+
- The registry's `time_scope` is honored by the Gaussian family
|
|
212
|
+
(previously re-derived from sar+ar1); the seblup and nested families
|
|
213
|
+
carry it too.
|
|
214
|
+
- Nested Beta models print cAIC / R\u00b2 as `n/a` with the reason
|
|
215
|
+
(conditional criteria are flat-model only), not a bare `nan`.
|
|
216
|
+
- Comments and docstrings no longer quote thesis measurements; `stmmlib/
|
|
217
|
+
note/` moved to `docs/notes/`; the package builds clean sdist/wheel.
|
|
218
|
+
- Default LRT behaviour: the untested terms carry NaN p-values under
|
|
219
|
+
the LRT header; Wald p-values stay available.
|
|
220
|
+
- `beta/__init__.py` documents the actual modules; README is a general
|
|
221
|
+
reference (not a thesis-bound note), lists both families' LRT and the
|
|
222
|
+
test-suite workflow.
|
|
223
|
+
|
|
224
|
+
## [0.1.0] - 2026-11-10
|
|
225
|
+
|
|
226
|
+
Initial public reference implementation: Gaussian and Beta families, one
|
|
227
|
+
API, 14 model structures (m1-m14) + `beta_regression`, spatial (IID, SAR,
|
|
228
|
+
nested, SEBLUP Rao-Yu) and temporal (IID, AR(1)) random effects, optional
|
|
229
|
+
interactions, Gaussian ML/REML, Beta Laplace-approximated ML, EBLUP/EBP
|
|
230
|
+
prediction, GPU backend via CuPy/PyTorch.
|
|
231
|
+
|
|
232
|
+
[0.1.0]: initial public reference implementation (2026-11-10).
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Ghardapaty Ghiffary
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ghardapaty Ghiffary
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|