# philchalmers/mirt architecture

> Architecture diagram of the GitHub repository philchalmers/mirt, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/philchalmers/mirt
- Repository: https://github.com/philchalmers/mirt

## Overview

mirt is an R package for fitting item response theory (IRT) and related latent-variable models to discrete response data. The principal workflow is to provide response data and a model, estimate item and latent-trait parameters, then inspect results or derive scores and diagnostics. Separate capabilities include multi-group and mixed-effects analyses, latent-class and mixture models, and probabilistic unfolding. The README documents these capabilities; sampled C++ excerpts support the item-trace and E-step roles, but do not establish all R-level call wiring.

Main entry points: [`R/mirt.R`](https://github.com/philchalmers/mirt/blob/main/R/mirt.R) (Fit API), [`R/EMstep.group.R`](https://github.com/philchalmers/mirt/blob/main/R/EMstep.group.R) (EM estimation), [`R/01-itemclass.R`](https://github.com/philchalmers/mirt/blob/main/R/01-itemclass.R) (Item models), [`R/multipleGroup.R`](https://github.com/philchalmers/mirt/blob/main/R/multipleGroup.R) (Multiple groups)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_model["Model setup"]
  node_fit_api["Fit API<br/>[mirt.R]"]
  node_model_spec["Model specification<br/>[mirt.model.R]"]
  node_prepare["Prepare data<br/>[04-PrepData.R]"]
  node_items["Item models<br/>[01-itemclass.R]"]
end

subgraph group_fit["Model estimation"]
  node_em["EM estimation<br/>[EMstep.group.R]"]
  node_mhrm["MHRM estimation<br/>[MHRM.group.R]"]
  node_likelihood["Likelihood<br/>[07-calcLogLik.R]"]
end

subgraph group_variants["Model variants"]
  node_multi_group["Multiple groups<br/>[multipleGroup.R]"]
  node_mixed["Mixed effects<br/>[mixedmirt.R]"]
  node_latent_classes["Latent classes<br/>[mdirt.R]"]
  node_mixture["Mixture models<br/>[Mixture-methods.R]"]
  node_unfolding["Unfolding models<br/>[Discrete-methods.R]"]
end

subgraph group_analysis["Scoring and analysis"]
  node_scores["Trait scores<br/>[fscores.R]"]
  node_item_analysis["Item analysis<br/>[itemfit.R]"]
  node_model_fit["Fit diagnostics<br/>[M2.R]"]
  node_dif["DIF analysis<br/>[DIF.R]"]
end

subgraph group_compute["Numerical core"]
  node_trace["Item probabilities<br/>[traceLinePts.cpp]"]
  node_estep["Expectation step<br/>[Estep.cpp]"]
  node_derivatives["Parameter derivatives<br/>[dpars.cpp]"]
end

node_analyst(("Analyst"))
node_responses["Response data"]

node_analyst -->|"fits model"| node_fit_api
node_responses -->|"supplies responses"| node_fit_api
node_fit_api -->|"prepares data"| node_prepare
node_fit_api -->|"uses specification"| node_model_spec
node_fit_api -->|"builds item models"| node_items
node_fit_api -->|"estimates by EM"| node_em
node_fit_api -->|"estimates by MHRM"| node_mhrm
node_fit_api -->|"evaluates likelihood"| node_likelihood
node_multi_group -->|"supports group fitting"| node_em
node_mixed -->|"supports mixed fitting"| node_mhrm
node_latent_classes -->|"fits class models"| node_em
node_mixture -->|"fits mixture models"| node_em
node_unfolding -->|"computes probabilities"| node_trace
node_items -->|"computes item traces"| node_trace
node_em -->|"computes expectations"| node_estep
node_em -->|"computes derivatives"| node_derivatives
node_fit_api -->|"derives scores"| node_scores
node_fit_api -->|"supports item analysis"| node_item_analysis
node_fit_api -->|"checks model fit"| node_model_fit
node_fit_api -->|"analyzes DIF"| node_dif
node_analyst -->|"requests analysis"| node_multi_group
node_analyst -->|"requests analysis"| node_mixed
node_analyst -->|"requests analysis"| node_latent_classes
node_analyst -->|"requests analysis"| node_mixture
node_analyst -->|"requests analysis"| node_unfolding

click node_fit_api "https://github.com/philchalmers/mirt/blob/main/R/mirt.R"
click node_model_spec "https://github.com/philchalmers/mirt/blob/main/R/mirt.model.R"
click node_prepare "https://github.com/philchalmers/mirt/blob/main/R/04-PrepData.R"
click node_items "https://github.com/philchalmers/mirt/blob/main/R/01-itemclass.R"
click node_em "https://github.com/philchalmers/mirt/blob/main/R/EMstep.group.R"
click node_mhrm "https://github.com/philchalmers/mirt/blob/main/R/MHRM.group.R"
click node_likelihood "https://github.com/philchalmers/mirt/blob/main/R/07-calcLogLik.R"
click node_multi_group "https://github.com/philchalmers/mirt/blob/main/R/multipleGroup.R"
click node_mixed "https://github.com/philchalmers/mirt/blob/main/R/mixedmirt.R"
click node_latent_classes "https://github.com/philchalmers/mirt/blob/main/R/mdirt.R"
click node_mixture "https://github.com/philchalmers/mirt/blob/main/R/Mixture-methods.R"
click node_unfolding "https://github.com/philchalmers/mirt/blob/main/R/Discrete-methods.R"
click node_scores "https://github.com/philchalmers/mirt/blob/main/R/fscores.R"
click node_item_analysis "https://github.com/philchalmers/mirt/blob/main/R/itemfit.R"
click node_model_fit "https://github.com/philchalmers/mirt/blob/main/R/M2.R"
click node_dif "https://github.com/philchalmers/mirt/blob/main/R/DIF.R"
click node_trace "https://github.com/philchalmers/mirt/blob/main/src/traceLinePts.cpp"
click node_estep "https://github.com/philchalmers/mirt/blob/main/src/Estep.cpp"
click node_derivatives "https://github.com/philchalmers/mirt/blob/main/src/dpars.cpp"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_fit_api,node_model_spec,node_prepare,node_items toneBlue
class node_em,node_mhrm,node_likelihood toneAmber
class node_multi_group,node_mixed,node_latent_classes,node_mixture,node_unfolding toneMint
class node_scores,node_item_analysis,node_model_fit,node_dif toneRose
class node_trace,node_estep,node_derivatives,node_analyst,node_responses toneIndigo
```

## Components

### Model setup

- [Fit API](https://github.com/philchalmers/mirt/blob/main/R/mirt.R): `R/mirt.R`
- [Model specification](https://github.com/philchalmers/mirt/blob/main/R/mirt.model.R): `R/mirt.model.R`
- [Prepare data](https://github.com/philchalmers/mirt/blob/main/R/04-PrepData.R): `R/04-PrepData.R`
- [Item models](https://github.com/philchalmers/mirt/blob/main/R/01-itemclass.R): `R/01-itemclass.R`

### Model estimation

- [EM estimation](https://github.com/philchalmers/mirt/blob/main/R/EMstep.group.R): `R/EMstep.group.R`
- [MHRM estimation](https://github.com/philchalmers/mirt/blob/main/R/MHRM.group.R): `R/MHRM.group.R`
- [Likelihood](https://github.com/philchalmers/mirt/blob/main/R/07-calcLogLik.R): `R/07-calcLogLik.R`

### Model variants

- [Multiple groups](https://github.com/philchalmers/mirt/blob/main/R/multipleGroup.R): `R/multipleGroup.R`
- [Mixed effects](https://github.com/philchalmers/mirt/blob/main/R/mixedmirt.R): `R/mixedmirt.R`
- [Latent classes](https://github.com/philchalmers/mirt/blob/main/R/mdirt.R): `R/mdirt.R`
- [Mixture models](https://github.com/philchalmers/mirt/blob/main/R/Mixture-methods.R): `R/Mixture-methods.R`
- [Unfolding models](https://github.com/philchalmers/mirt/blob/main/R/Discrete-methods.R): `R/Discrete-methods.R`

### Scoring and analysis

- [Trait scores](https://github.com/philchalmers/mirt/blob/main/R/fscores.R): `R/fscores.R`
- [Item analysis](https://github.com/philchalmers/mirt/blob/main/R/itemfit.R): `R/itemfit.R`
- [Fit diagnostics](https://github.com/philchalmers/mirt/blob/main/R/M2.R): `R/M2.R`
- [DIF analysis](https://github.com/philchalmers/mirt/blob/main/R/DIF.R): `R/DIF.R`

### Numerical core

- [Item probabilities](https://github.com/philchalmers/mirt/blob/main/src/traceLinePts.cpp): `src/traceLinePts.cpp`
- [Expectation step](https://github.com/philchalmers/mirt/blob/main/src/Estep.cpp): `src/Estep.cpp`
- [Parameter derivatives](https://github.com/philchalmers/mirt/blob/main/src/dpars.cpp): `src/dpars.cpp`

### Other components

- **Analyst**
- **Response data**

## Connections

- Analyst → Fit API: fits model
- Response data → Fit API: supplies responses
- Fit API → Prepare data: prepares data
- Fit API → Model specification: uses specification
- Fit API → Item models: builds item models
- Fit API → EM estimation: estimates by EM
- Fit API → MHRM estimation: estimates by MHRM
- Fit API → Likelihood: evaluates likelihood
- Multiple groups → EM estimation: supports group fitting
- Mixed effects → MHRM estimation: supports mixed fitting
- Latent classes → EM estimation: fits class models
- Mixture models → EM estimation: fits mixture models
- Unfolding models → Item probabilities: computes probabilities
- Item models → Item probabilities: computes item traces
- EM estimation → Expectation step: computes expectations
- EM estimation → Parameter derivatives: computes derivatives
- Fit API → Trait scores: derives scores
- Fit API → Item analysis: supports item analysis
- Fit API → Fit diagnostics: checks model fit
- Fit API → DIF analysis: analyzes DIF
- Analyst → Multiple groups: requests analysis
- Analyst → Mixed effects: requests analysis
- Analyst → Latent classes: requests analysis
- Analyst → Mixture models: requests analysis
- Analyst → Unfolding models: requests analysis
