mfrmpy 0.1.0a1__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.
Files changed (106) hide show
  1. mfrmpy-0.1.0a1/.gitignore +26 -0
  2. mfrmpy-0.1.0a1/LICENSE +21 -0
  3. mfrmpy-0.1.0a1/LICENSE_NOTICE.md +30 -0
  4. mfrmpy-0.1.0a1/PKG-INFO +257 -0
  5. mfrmpy-0.1.0a1/docs/analysis_scope.md +158 -0
  6. mfrmpy-0.1.0a1/docs/python_library.md +229 -0
  7. mfrmpy-0.1.0a1/examples/desktop_writing.csv +961 -0
  8. mfrmpy-0.1.0a1/locales/en.json +4898 -0
  9. mfrmpy-0.1.0a1/mfrm_app/__init__.py +8 -0
  10. mfrmpy-0.1.0a1/mfrm_app/_resources.py +12 -0
  11. mfrmpy-0.1.0a1/mfrm_app/accessibility_acceptance.py +691 -0
  12. mfrmpy-0.1.0a1/mfrm_app/assignment_context_milp.py +952 -0
  13. mfrmpy-0.1.0a1/mfrm_app/assignment_generator.py +239 -0
  14. mfrmpy-0.1.0a1/mfrm_app/assignment_mechanism.py +1406 -0
  15. mfrmpy-0.1.0a1/mfrm_app/assignment_sensitivity.py +760 -0
  16. mfrmpy-0.1.0a1/mfrm_app/basic_analysis.py +400 -0
  17. mfrmpy-0.1.0a1/mfrm_app/bias_analysis.py +1384 -0
  18. mfrmpy-0.1.0a1/mfrm_app/citation.py +62 -0
  19. mfrmpy-0.1.0a1/mfrm_app/cli.py +115 -0
  20. mfrmpy-0.1.0a1/mfrm_app/cmle.py +1732 -0
  21. mfrmpy-0.1.0a1/mfrm_app/cmle_existence.py +1360 -0
  22. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click.py +524 -0
  23. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_archive.py +662 -0
  24. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_cognitive_interview.py +600 -0
  25. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_comprehension.py +603 -0
  26. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_confirmatory_dependence.py +535 -0
  27. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_confirmatory_estimand.py +339 -0
  28. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_confirmatory_gate.py +668 -0
  29. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_confirmatory_invalidity.py +274 -0
  30. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_confirmatory_planning.py +430 -0
  31. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_confirmatory_protocol.py +885 -0
  32. mfrmpy-0.1.0a1/mfrm_app/cmle_one_click_confirmatory_workbench.py +485 -0
  33. mfrmpy-0.1.0a1/mfrm_app/cmle_person_scoring.py +129 -0
  34. mfrmpy-0.1.0a1/mfrm_app/cmle_wle_bootstrap.py +597 -0
  35. mfrmpy-0.1.0a1/mfrm_app/cmle_wle_fit.py +395 -0
  36. mfrmpy-0.1.0a1/mfrm_app/cmle_wle_uncertainty.py +291 -0
  37. mfrmpy-0.1.0a1/mfrm_app/cmle_workflow.py +602 -0
  38. mfrmpy-0.1.0a1/mfrm_app/decision_stability.py +380 -0
  39. mfrmpy-0.1.0a1/mfrm_app/design_assignment.py +600 -0
  40. mfrmpy-0.1.0a1/mfrm_app/desktop_analysis.py +872 -0
  41. mfrmpy-0.1.0a1/mfrm_app/desktop_examples.py +366 -0
  42. mfrmpy-0.1.0a1/mfrm_app/desktop_guidance.py +201 -0
  43. mfrmpy-0.1.0a1/mfrm_app/desktop_i18n.py +228 -0
  44. mfrmpy-0.1.0a1/mfrm_app/desktop_outputs.py +300 -0
  45. mfrmpy-0.1.0a1/mfrm_app/distribution.py +142 -0
  46. mfrmpy-0.1.0a1/mfrm_app/engine.py +9138 -0
  47. mfrmpy-0.1.0a1/mfrm_app/evidence.py +2602 -0
  48. mfrmpy-0.1.0a1/mfrm_app/exports.py +168 -0
  49. mfrmpy-0.1.0a1/mfrm_app/figure_presentation.py +73 -0
  50. mfrmpy-0.1.0a1/mfrm_app/fit_threshold_operating_characteristics.py +564 -0
  51. mfrmpy-0.1.0a1/mfrm_app/fit_threshold_pilot_addendum.py +271 -0
  52. mfrmpy-0.1.0a1/mfrm_app/fit_threshold_sensitivity.py +309 -0
  53. mfrmpy-0.1.0a1/mfrm_app/fit_threshold_severity.py +138 -0
  54. mfrmpy-0.1.0a1/mfrm_app/frame_bundle.py +74 -0
  55. mfrmpy-0.1.0a1/mfrm_app/generalizability.py +1106 -0
  56. mfrmpy-0.1.0a1/mfrm_app/guidance.py +622 -0
  57. mfrmpy-0.1.0a1/mfrm_app/help_contract.py +811 -0
  58. mfrmpy-0.1.0a1/mfrm_app/help_navigation.py +674 -0
  59. mfrmpy-0.1.0a1/mfrm_app/help_popovers.py +162 -0
  60. mfrmpy-0.1.0a1/mfrm_app/help_topics.py +992 -0
  61. mfrmpy-0.1.0a1/mfrm_app/ic_sensitivity.py +214 -0
  62. mfrmpy-0.1.0a1/mfrm_app/io_tables.py +335 -0
  63. mfrmpy-0.1.0a1/mfrm_app/jmle_boundary.py +54 -0
  64. mfrmpy-0.1.0a1/mfrm_app/joint_interaction.py +230 -0
  65. mfrmpy-0.1.0a1/mfrm_app/manuscript.py +226 -0
  66. mfrmpy-0.1.0a1/mfrm_app/mml_comparison_report.py +149 -0
  67. mfrmpy-0.1.0a1/mfrm_app/mml_engine_v2.py +677 -0
  68. mfrmpy-0.1.0a1/mfrm_app/mml_fixed_sd_review.py +230 -0
  69. mfrmpy-0.1.0a1/mfrm_app/mml_joint.py +311 -0
  70. mfrmpy-0.1.0a1/mfrm_app/mml_prior_sensitivity.py +404 -0
  71. mfrmpy-0.1.0a1/mfrm_app/mml_quadrature_sensitivity.py +315 -0
  72. mfrmpy-0.1.0a1/mfrm_app/mml_qualification_batch.py +849 -0
  73. mfrmpy-0.1.0a1/mfrm_app/mml_stationarity.py +593 -0
  74. mfrmpy-0.1.0a1/mfrm_app/operating_characteristics.py +837 -0
  75. mfrmpy-0.1.0a1/mfrm_app/output_qualification.py +341 -0
  76. mfrmpy-0.1.0a1/mfrm_app/person_scoring.py +428 -0
  77. mfrmpy-0.1.0a1/mfrm_app/preflight.py +185 -0
  78. mfrmpy-0.1.0a1/mfrm_app/privacy.py +135 -0
  79. mfrmpy-0.1.0a1/mfrm_app/project.py +507 -0
  80. mfrmpy-0.1.0a1/mfrm_app/project_portability.py +417 -0
  81. mfrmpy-0.1.0a1/mfrm_app/readiness.py +161 -0
  82. mfrmpy-0.1.0a1/mfrm_app/reliability.py +122 -0
  83. mfrmpy-0.1.0a1/mfrm_app/report_markup.py +66 -0
  84. mfrmpy-0.1.0a1/mfrm_app/reporting_facts.py +305 -0
  85. mfrmpy-0.1.0a1/mfrm_app/simulation/__init__.py +381 -0
  86. mfrmpy-0.1.0a1/mfrm_app/simulation/_condition_estimator.py +263 -0
  87. mfrmpy-0.1.0a1/mfrm_app/simulation/_condition_evaluation.py +344 -0
  88. mfrmpy-0.1.0a1/mfrm_app/simulation/_condition_randomization.py +313 -0
  89. mfrmpy-0.1.0a1/mfrm_app/simulation/_condition_scenario.py +142 -0
  90. mfrmpy-0.1.0a1/mfrm_app/simulation/_condition_shared.py +177 -0
  91. mfrmpy-0.1.0a1/mfrm_app/simulation/_condition_truth.py +386 -0
  92. mfrmpy-0.1.0a1/mfrm_app/simulation/assignments.py +933 -0
  93. mfrmpy-0.1.0a1/mfrm_app/simulation/conditions.py +210 -0
  94. mfrmpy-0.1.0a1/mfrm_app/simulation/cost.py +467 -0
  95. mfrmpy-0.1.0a1/mfrm_app/simulation/planning.py +727 -0
  96. mfrmpy-0.1.0a1/mfrm_app/simulation/schema.py +344 -0
  97. mfrmpy-0.1.0a1/mfrm_app/simulation/topology.py +1480 -0
  98. mfrmpy-0.1.0a1/mfrm_app/simulation/transition.py +783 -0
  99. mfrmpy-0.1.0a1/mfrm_app/structural_intervals.py +204 -0
  100. mfrmpy-0.1.0a1/mfrm_app/terminology.py +922 -0
  101. mfrmpy-0.1.0a1/mfrm_app/user_problems.py +727 -0
  102. mfrmpy-0.1.0a1/mfrm_app/ux.py +259 -0
  103. mfrmpy-0.1.0a1/mfrm_app/visual_maps.py +300 -0
  104. mfrmpy-0.1.0a1/mfrmpy/__init__.py +66 -0
  105. mfrmpy-0.1.0a1/pyproject.toml +51 -0
  106. mfrmpy-0.1.0a1/tests/test_python_library.py +169 -0
@@ -0,0 +1,26 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ .Python
5
+ .venv/
6
+ .venv-win/
7
+ venv/
8
+ env/
9
+ .pytest_cache/
10
+ .playwright-cli/
11
+ .mypy_cache/
12
+ .ruff_cache/
13
+ /dist/
14
+ /build/
15
+ /*.egg-info/
16
+ .DS_Store
17
+ .streamlit/secrets.toml
18
+ benchmark_*.csv
19
+ *_benchmark.csv
20
+ parity_fixture/
21
+ validation/generated/
22
+ *.log
23
+ backups/
24
+
25
+ # Local source archives for retained research evidence
26
+ /validation/source_snapshots/
mfrmpy-0.1.0a1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ryuya-dot-com
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.
@@ -0,0 +1,30 @@
1
+ # License and Responsible Use Notice
2
+
3
+ This repository is released under the MIT License unless a file explicitly
4
+ states otherwise. The MIT License permits commercial and non-commercial use,
5
+ copying, modification, distribution, sublicensing, and sale, provided that the
6
+ copyright notice and license notice are included in substantial copies of the
7
+ software or associated documentation.
8
+
9
+ The project intentionally does not use a NonCommercial license such as
10
+ CC BY-NC, because that would conflict with the intended permission for
11
+ commercial use, including paid teaching, consulting, training, and hosted
12
+ demonstrations.
13
+
14
+ The software and documentation are provided "as is", without warranty of any
15
+ kind. Users are responsible for checking data privacy, model assumptions,
16
+ statistical suitability, external validation evidence, and institutional
17
+ requirements before using outputs for reports, assessment decisions, placement,
18
+ certification, employment, or other high-stakes purposes.
19
+
20
+ Do not imply that the project authors, external package authors, or referenced
21
+ software projects endorse your analysis, deployment, product, service, or
22
+ publication unless you have separate written permission.
23
+
24
+ ## 日本語の案内
25
+
26
+ このアプリはMITライセンスで提供し、研究・教育・業務・商用での利用を許可します。
27
+ データの取扱い、分析の適用判断、結果の解釈・利用、およびそれに基づく判断は利用者の責任です。
28
+ アプリと文書は無保証で提供されます。再配布時は著作権表示とライセンス表示を保持してください。
29
+ 第三者の構成要素にはそれぞれのライセンスが適用されます。
30
+ MITライセンスの全文は[LICENSE](LICENSE)を参照してください。
@@ -0,0 +1,257 @@
1
+ Metadata-Version: 2.5
2
+ Name: mfrmpy
3
+ Version: 0.1.0a1
4
+ Summary: Many-facet Rasch analysis and balanced generalizability studies
5
+ Project-URL: Homepage, https://github.com/Ryuya-dot-com/MFRM_Python_Application
6
+ Project-URL: Documentation, https://github.com/Ryuya-dot-com/MFRM_Python_Application/blob/main/docs/python_library.md
7
+ Project-URL: Issues, https://github.com/Ryuya-dot-com/MFRM_Python_Application/issues
8
+ Author: Ryuya Komuro
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ License-File: LICENSE_NOTICE.md
12
+ Keywords: MFRM,Rasch,generalizability,psychometrics,rating
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Scientific/Engineering
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: numpy>=1.24
21
+ Requires-Dist: pandas>=2.0
22
+ Requires-Dist: scipy>=1.10
23
+ Provides-Extra: figures
24
+ Requires-Dist: matplotlib>=3.8; extra == 'figures'
25
+ Provides-Extra: test
26
+ Requires-Dist: pytest>=8; extra == 'test'
27
+ Description-Content-Type: text/markdown
28
+
29
+ # mfrmpy: Many-facet Rasch analysis in Python
30
+
31
+ `mfrmpy` brings the supported MFRM Desktop calculations to Python scripts and
32
+ notebooks. It uses the same Python engine as the existing MFRM Web and desktop
33
+ applications. It does not require R, FACETS, Streamlit or Tkinter for analysis.
34
+
35
+ The initial API is a **pre-release**. Available analyses are RSM/PCM with JMLE
36
+ or fixed-population-SD MML, diagnostics, conditional bias, selected structural
37
+ intervals, a separate joint-interaction model, and balanced observed-score G/D
38
+ studies. Numerical eligibility checks and interpretation limits remain in
39
+ force. Availability on PyPI is not statistical validation or certification.
40
+
41
+ ## Installation
42
+
43
+ For a published pre-release:
44
+
45
+ ```bash
46
+ python -m pip install --pre mfrmpy
47
+ ```
48
+
49
+ For Matplotlib figures and offline HTML reports:
50
+
51
+ ```bash
52
+ python -m pip install --pre 'mfrmpy[figures]'
53
+ ```
54
+
55
+ During release preparation, install the built wheel instead:
56
+
57
+ ```bash
58
+ python -m pip install dist/mfrmpy-0.1.0a1-py3-none-any.whl
59
+ ```
60
+
61
+ Python 3.11 and 3.12 are the initial validation targets. Core dependencies are
62
+ NumPy, pandas and SciPy. This distribution provides a library, not the
63
+ standalone desktop executable or the Web app launcher. Those applications
64
+ remain available from the
65
+ [application repository](https://github.com/Ryuya-dot-com/MFRM_Python_Application).
66
+
67
+ ## First analysis
68
+
69
+ Ratings must be in long form: one row per observed rating, with separate
70
+ person, facet and score columns. Specify the full intended integer rating
71
+ range, even when an endpoint is absent from the observations. Missing ratings
72
+ are not zero scores. The bundled example is synthetic.
73
+
74
+ ```python
75
+ import mfrmpy
76
+
77
+ data = mfrmpy.load_example()
78
+ analysis = mfrmpy.analyze(
79
+ data,
80
+ person_col="Person",
81
+ facet_cols=["Rater", "Task", "Criterion"],
82
+ score_col="Score",
83
+ rating_min=0,
84
+ rating_max=5,
85
+ model="RSM",
86
+ method="JMLE",
87
+ )
88
+
89
+ for title, frame, note in mfrmpy.tables(analysis):
90
+ print(title)
91
+ print(frame.head())
92
+ print(note)
93
+
94
+ mfrmpy.save_project("writing.mfrm", analysis)
95
+ restored = mfrmpy.load_project("writing.mfrm") # no refitting
96
+ ```
97
+
98
+ Use `pandas.read_csv("ratings.csv", dtype={"Person": str, "Rater": str})`
99
+ for your own data, adjusting the ID columns as needed. Explicit string types
100
+ preserve leading zeroes. The input/design audit remains part of the returned
101
+ analysis and tables; inspect it before interpreting estimates.
102
+
103
+ ## Models and supplementary requests
104
+
105
+ `analyze` is the shared application service, not a second implementation of
106
+ the estimators. It returns a retained-analysis dictionary and does not display
107
+ an interface. Its MFRM settings are:
108
+
109
+ | Setting | Meaning / default |
110
+ |---|---|
111
+ | `person_col`, `facet_cols`, `score_col` | Required column names; `facet_cols` is a list |
112
+ | `rating_min`, `rating_max` | Required integer rubric endpoints, minimum < maximum |
113
+ | `model`, `method` | `"RSM"` / `"PCM"`; `"JMLE"` / `"MML"`; defaults RSM and JMLE |
114
+ | `step_facet` | Required for PCM; one selected facet with separate step structures |
115
+ | `maxit`, `reltol` | Maximum iterations (400) and stopping tolerance (1e-6) |
116
+ | `quad_points`, `population_prior_sd` | Fixed-SD MML quadrature count (15) and normal population SD (1.0) |
117
+ | `anchors`, `group_anchors` | Fixed-level / group-mean anchor records under the existing identification rules |
118
+ | `compute_pca` | Optional residual diagnostics; default `False` |
119
+ | `umean`, `uscale` | Reporting origin (0) and positive scale multiplier (1); canonical logits are retained |
120
+ | `progress` | Optional callback receiving phase names, not percentages |
121
+
122
+ Keep `keep_original=True`, `estimate_population_sd=False` and `mml_engine="EM"`.
123
+ Other choices, bounded GPCM and latent regression are outside this initial
124
+ public interface. A numerical termination flag alone is not evidence that
125
+ inference is valid; the returned output qualifications also matter.
126
+
127
+ Example requests, supplied **when fitting**, are:
128
+
129
+ ```python
130
+ analysis = mfrmpy.analyze(
131
+ data,
132
+ person_col="Person",
133
+ facet_cols=["Rater", "Task", "Criterion"],
134
+ score_col="Score",
135
+ rating_min=0,
136
+ rating_max=5,
137
+ model="PCM",
138
+ step_facet="Criterion",
139
+ method="MML",
140
+ population_prior_sd=1.0,
141
+ bias_requests=[{"facet_a": "Rater", "facet_b": "Task"}],
142
+ interval_requests=[{"facet": "Rater", "difference": ["R1", "R2"], "level": 0.95}],
143
+ joint_settings={"facet_a": "Rater", "facet_b": "Task"},
144
+ )
145
+ ```
146
+
147
+ Replace the contrast labels with levels that actually occur in your data.
148
+ Conditional bias holds the main calibration fixed and does not establish
149
+ statistical significance or fairness. Joint interaction fits a **separate**
150
+ fixed-N(0,1), unit-weight model and retains its result separately. Selected
151
+ structural intervals require fixed-SD, unit-weight RSM/PCM and suitable
152
+ identification, termination, boundaries, information and quadrature checks.
153
+ They are pointwise asymptotic intervals, with no finite-sample coverage
154
+ guarantee. Holm adjustment of joint tests does not make intervals simultaneous.
155
+
156
+ Unavailable/failed interval or joint requests remain recorded with a reason;
157
+ they do not silently erase a completed baseline fit. For details, see the
158
+ [analysis scope](https://github.com/Ryuya-dot-com/MFRM_Python_Application/blob/main/docs/analysis_scope.md).
159
+
160
+ ## G study and D study without an MFRM fit
161
+
162
+ These analyze observed scores in a complete, balanced design with one or two
163
+ random facets, at least two levels of each factor and one observation per cell.
164
+ The score need not be an integer for G/D analysis. For example:
165
+
166
+ ```python
167
+ import pandas as pd
168
+
169
+ ratings = pd.DataFrame([
170
+ {"Person": str(p), "Rater": str(r), "Task": str(t),
171
+ "Score": 0.4*p + 0.3*r + 0.2*t + 0.1*((p+r+t) % 3)}
172
+ for p in range(8) for r in range(3) for t in range(2)
173
+ ])
174
+ gd_analysis = mfrmpy.analyze(
175
+ ratings,
176
+ workflow="gd",
177
+ gd_settings={
178
+ "object_facet": "Person",
179
+ "random_facets": ["Rater", "Task"],
180
+ "score_col": "Score",
181
+ "target_population": "Comparable persons, raters and tasks",
182
+ "selected_plan": {"Rater": 4, "Task": 2},
183
+ },
184
+ )
185
+ for title, frame, note in mfrmpy.tables(gd_analysis):
186
+ print(title, frame, note, sep="\n")
187
+ ```
188
+
189
+ Unsupported designs return an unavailable result with a reason. G is for
190
+ relative decisions and Phi for absolute decisions. These are not MFRM person
191
+ reliability. G/Phi intervals and multivariate G-theory are unavailable. A fixed
192
+ conditioning facet can be specified through `gd_settings["fixed_condition"]`
193
+ under the existing desktop rules; it does not add another random facet.
194
+
195
+ ## Results, plots and saved projects
196
+
197
+ The stable public surface is the names in `mfrmpy.__all__`. The bundled
198
+ `mfrm_app` modules are implementation details, including experimental methods
199
+ outside the supported scope. Do not rely on their private functions or treat
200
+ their presence as a supported public API.
201
+
202
+ | Function | Result |
203
+ |---|---|
204
+ | `analyze(data, **settings)` | Retained analysis dictionary, including inputs, settings, identities and qualification |
205
+ | `tables(analysis)` | List of `(title, pandas.DataFrame, note)` tuples, with current output restrictions applied |
206
+ | `load_example()` | A new DataFrame containing the bundled synthetic writing example |
207
+ | `save_project(path, analysis)` | Atomically write a validated `.mfrm` archive |
208
+ | `load_project(path)` | Validate and restore an archive without refitting; malformed archives raise `ProjectError` |
209
+ | `plot(analysis, kind="wright", **options)` | Matplotlib Figure; requires `figures` extra |
210
+ | `report_html(analysis, **options)` | Standalone HTML string; requires `figures` extra |
211
+
212
+ `analysis["result"]` and `analysis["diagnostics"]` retain raw MFRM output;
213
+ `analysis["gd_analysis"]` retains G/D results. Treat the nested implementation
214
+ schema as provisional in this pre-release. For reporting, use `tables`, keeping
215
+ the notes and `Use`/`Reason` information. A blank interval or SE is unavailable,
216
+ not zero. General MML tables, person-score uncertainty and automatic equivalence
217
+ claims retain their existing inferential restrictions.
218
+
219
+ With the optional figures dependency installed:
220
+
221
+ ```python
222
+ from pathlib import Path
223
+
224
+ step_facet = analysis["fit_settings"].get("step_facet")
225
+ level = str(data[step_facet].iloc[0]) if step_facet else None
226
+ figure = mfrmpy.plot(analysis, "wright", level=level)
227
+ figure.savefig("wright.png", dpi=300)
228
+ Path("report.html").write_text(mfrmpy.report_html(analysis), encoding="utf-8")
229
+ ```
230
+
231
+ Other figure kinds include `"pathway"`, `"category"`, `"bias"`, `"interval"`,
232
+ `"joint"`, `"gd"` and `"pca"` when the required results are present. PCM Wright
233
+ maps and category curves require `level` (a step-facet level); supplementary requests use their
234
+ zero-based `index`. Retained results are reused; plotting and reopening must
235
+ not recompute estimation. Unsupported requests can produce a reason-bearing
236
+ figure rather than a numerical result.
237
+
238
+ Saved `.mfrm` projects use the existing desktop/Web archive format. New source
239
+ or dependency versions can cause current qualification checks to withhold old
240
+ interval output without altering the archived estimates. Record
241
+ `mfrmpy.__version__` and `analysis["source"]` when reporting an analysis.
242
+ The package API version and the shared engine version are distinct.
243
+
244
+ ## Privacy, license and citation
245
+
246
+ Calculations run locally. Saved projects and exported reports can retain
247
+ ratings and person/rater IDs; store and share them according to your research
248
+ requirements. Use synthetic data for bug reports.
249
+
250
+ MIT licensed; see
251
+ [LICENSE](https://github.com/Ryuya-dot-com/MFRM_Python_Application/blob/main/LICENSE)
252
+ and the
253
+ [responsible-use notice](https://github.com/Ryuya-dot-com/MFRM_Python_Application/blob/main/LICENSE_NOTICE.md).
254
+ Cite Ryuya Komuro, *mfrmpy*, the installed package version, and
255
+ https://github.com/Ryuya-dot-com/MFRM_Python_Application, together with the
256
+ statistical methods actually used. Source and issue reporting are maintained
257
+ in that repository.
@@ -0,0 +1,158 @@
1
+ # Analyses, interpretation and reporting limits
2
+
3
+ [Start here](../README.md) · [Windows guide](desktop_user_guide.en.md) · [日本語の操作・結果の読み方](desktop_user_guide.ja.md#分析を選ぶ)
4
+
5
+ Use this page to choose an analysis and understand what its results can support.
6
+ It describes the Web application and the desktop preview documented in this
7
+ source branch. The desktop preview includes RSM/PCM, bias diagnostics, selected
8
+ intervals, joint interactions and G/D studies; it is not yet a general desktop
9
+ release. The published Web release and this desktop preview do not have
10
+ identical controls or export formats.
11
+
12
+ ## Choose the analysis for your question
13
+
14
+ | Question | Analysis | What to distinguish |
15
+ |---|---|---|
16
+ | How do person measures, rater severity and task difficulty compare? | Many-facet RSM or PCM | RSM shares category steps. PCM allows separate steps for levels of the chosen step facet. A main rater effect is not a rater-by-task interaction. |
17
+ | Does a particular combination of facet levels differ from the main-effects pattern? | Conditional bias diagnostics | These hold the original calibration fixed. They identify patterns to investigate, without confirming the presence or absence of bias. |
18
+ | What is the uncertainty in a facet level or a planned difference? | Specified structural intervals for fixed-SD MML | Only targets passing the checks receive intervals. A difference uses the full covariance, not the sum of marginal SEs. |
19
+ | What happens when an interaction is fitted together with main effects and steps? | Desktop joint interaction analysis | This refits a separate model. It does not turn the fixed-calibration diagnostic into a joint test. |
20
+ | How would numbers of raters or tasks affect score reliability? | G study and D study | These use observed scores and a declared random-facet design, not the MFRM logit scale. |
21
+
22
+ The Web interface also provides advanced workflows such as bounded GPCM,
23
+ latent regression, anchors and linking review, residual PCA, prediction and
24
+ simulation. Their availability does not establish that every displayed
25
+ statistic can support inference. Read the explanation for the selected output.
26
+
27
+ ## Estimation and standard errors
28
+
29
+ JMLE jointly estimates person and facet parameters. Desktop MML uses EM with
30
+ a fixed normal population SD; the SD is a setting, not an estimated result.
31
+ The Web interface offers additional MML controls, including optional population
32
+ SD estimation, whose uncertainty and model-ranking uses remain unavailable.
33
+
34
+ A standard error must be interpreted for its stated target and method.
35
+ Conditional-information errors hold other parameters fixed. Structural
36
+ observed-information errors use a covariance calculation for the model
37
+ parameters. An MML person's EAP posterior SD describes a posterior distribution
38
+ with calibration fixed; it is not the ML standard error of a structural effect.
39
+ Do not treat these quantities as interchangeable because each is labelled SE.
40
+
41
+ The application does not support inferential use of general MML tables,
42
+ Person-score uncertainty, estimated population-SD uncertainty or automatic
43
+ equivalence conclusions. Selected structural intervals have the separate,
44
+ limited scope below. An available selected interval does not remove the
45
+ restrictions on other outputs.
46
+
47
+ ## Specified structural intervals
48
+
49
+ For supported unit-weight, fixed-SD RSM/PCM analyses, this output provides
50
+ pointwise asymptotic normal intervals for selected levels of a non-person
51
+ facet and a prespecified difference. It uses the full structural covariance.
52
+
53
+ The calculation checks termination, identification, parameter boundaries,
54
+ observed information and sensitivity to quadrature settings. These checks
55
+ assess numerical suitability. They do not prove that the response model fits
56
+ the population, give a strict quadrature error bound, or guarantee
57
+ finite-sample coverage.
58
+
59
+ The approximation assumes the specified response model and fixed normal
60
+ population, independent persons, ignorable assignment/missingness, an
61
+ identified interior parameter and growing information. It does not provide
62
+ simultaneous intervals, Person-score intervals or a test of equivalence.
63
+
64
+ The [English](fixed_sd_quadrature_check.en.md) and
65
+ [Japanese](fixed_sd_quadrature_check.ja.md) Web guides explain selecting,
66
+ saving and rechecking these intervals. In Desktop, register the requests in
67
+ **Settings → Bias / intervals** before running the analysis.
68
+
69
+ ## Bias diagnostics and joint interactions
70
+
71
+ Conditional bias diagnostics describe cells with the original calibration
72
+ held fixed. Sparse cells, extreme scores and disconnected rating designs can
73
+ limit what can be estimated or compared. Displayed diagnostic values do not
74
+ establish statistical significance, absence of bias or assessment fairness.
75
+
76
+ The desktop joint-interaction option fits main effects, steps and one selected
77
+ structural-facet interaction together in a separate RSM/PCM model. It uses
78
+ unit weights and a normal person population fixed at mean 0 and SD 1.
79
+ Eligible requested cells and prespecified contrasts receive pointwise
80
+ approximate Wald intervals and p values. Holm adjustment applies to the
81
+ recorded family of requested tests; it does not make the intervals simultaneous.
82
+
83
+ This model assumes independent persons, the stated response/population model,
84
+ ignorable assignment/missingness and an identified interior solution with
85
+ growing information. Numerical checks are not a finite-sample error-rate
86
+ guarantee. An interaction is evidence about the fitted model, not a verdict
87
+ about fairness or a person. The original main-effects results remain separate.
88
+
89
+ ## G studies and D studies
90
+
91
+ The supported design is completely crossed and balanced, with one or two
92
+ random facets besides the object of measurement, at least two levels of each
93
+ factor, one observation per cell and unit observation weights. Missing or
94
+ repeated cells and unsupported designs produce a reason rather than an
95
+ unsupported coefficient.
96
+
97
+ G describes relative decisions and Phi describes absolute decisions. The D
98
+ study changes planned numbers of observations under the stated design and
99
+ population assumptions. Negative estimated variance components are shown
100
+ alongside the zero-clipped components used for the coefficients. A coefficient
101
+ alone does not establish an acceptable assessment or validate a future design.
102
+
103
+ The desktop G/D entry uses the original observed scores without requiring an
104
+ MFRM fit. Multivariate G-theory and uncertainty intervals for G/Phi are not
105
+ implemented. These restrictions also apply when G/D is requested alongside MFRM.
106
+
107
+ ## When a result cannot support inference
108
+
109
+ Read the message for the particular table or figure.
110
+
111
+ - **Input or design problem:** correct the indicated column mapping, score
112
+ range, missingness or design problem. For example, unrelated rating groups
113
+ may lack a common scale. Keep the original data and document any change.
114
+ - **Numerical or boundary problem:** review the stopping reason, identification
115
+ and extreme scores. A finite displayed estimate or an optimizer stopping
116
+ flag does not establish valid inference.
117
+ - **Unsupported uncertainty method or use:** the application has not
118
+ established that use for this output. Repeatedly changing the data or
119
+ rerunning the same settings does not resolve that limitation.
120
+ - **Changed settings or a saved result from another implementation:** check
121
+ which analysis the displayed output belongs to. Reopened results retain the
122
+ saved values but are checked against current output-specific rules.
123
+
124
+ A blank SE or interval means it is unavailable, not zero. Do not infer equality,
125
+ absence of bias or a reliable ranking from missing uncertainty or a
126
+ non-significant result. Use an eligible dedicated output only within its
127
+ stated scope.
128
+
129
+ ## Comparing programs and reporting results
130
+
131
+ Match the model, data, weights, constraints, population distribution, scoring
132
+ method and numerical settings before comparing software.
133
+
134
+ In particular, this application's non-person PTMEA/PtMeaCorr correlates
135
+ observed scores with person measures. FACETS PtMea uses the signed sum of
136
+ measures for each observation. They are different diagnostics. The application's
137
+ RSM/PCM fit ZSTD follows a FACETS-style fourth-moment/Wilson–Hilferty convention
138
+ with an absolute cap of 9; the GPCM adaptation is approximate. Agreement in one
139
+ diagnostic does not establish equivalence of the programs.
140
+
141
+ AIC/AICc/BIC, model-choice LR values and automatic model recommendations remain
142
+ restricted to technical review. Residual PCA is a diagnostic requiring attention
143
+ to sparse observations, overlap and stability, not an automatic dimensionality
144
+ decision. Simulations describe their specified data-generating conditions;
145
+ they do not validate a different empirical design.
146
+
147
+ When reporting, retain the model, estimator, constraints, scoring rubric,
148
+ population-SD treatment, analysis version, uncertainty method and relevant
149
+ limitations. Preserve captions and notes with exported figures and tables.
150
+ Software citation does not replace citations for the statistical methods.
151
+
152
+ Implementation references for technical readers:
153
+ [output rules](../mfrm_app/output_qualification.py),
154
+ [structural intervals](../mfrm_app/structural_intervals.py),
155
+ [joint interactions](../mfrm_app/joint_interaction.py),
156
+ [G/D calculations](../mfrm_app/generalizability.py).
157
+ The [FACETS comparison](../validation/FACETS_WINDOWS_DESKTOP_REVIEW_20261029.md)
158
+ states the conditions and limits of its numerical checks.