Person Parameter Estimation
Overview
Estimation of person parameters (abilities) for the 1, 2, 3 and 4 parameter logistic model, the (generalized) partial credit model and tests that mix dichotomous and polytomous items, under the assumption that the item parameters are known and fixed: maximum likelihood, weighted likelihood (Warm, 1989 doi:10.1007/BF02294627), maximum and expected a posteriori and robust estimation (Schuster and Yuan, 2011 doi:10.3102/1076998610396890). Further features are jackknife estimates (Wainer and Wright, 1980 doi:10.1007/BF02293910), plausible values, the person fit statistics lz, lz* (Snijders, 2001 doi:10.1007/BF02294437), infit and outfit, and the simulation of response data. Models fitted with the 'eRm' package can be passed on directly. The package is useful, e.g., when items of an item bank are given to a new sample of persons.
PP 1.0.0 rebuilds the numerical core. Every estimate is now checked against
independent reference implementations. For ordinary data (complete responses,
no extreme scores) the MLE, WLE, MAP and EAP estimates of 0.6.4-1 are
reproduced (differences below 0.001, within the convergence criterion
exac; robust estimates differ by about 0.005). Results change in the
places listed below: standard errors of MAP and robust estimates, the
jackknife, plausible values, person fit, and edge cases such as missing
responses, extreme scores and the 3PL. Function and argument names are
unchanged unless stated.
Changed results
- **Jackknife (
JKpp())**: the standard error now follows the textbook formula for pseudovalues; it is larger than before (by a factor of about L − 1, L = number of items) and comparable to the MLE/WLE standard error. The jackknife runs over the answered items only (before: all items), leave-one-out samples without a finite estimate are counted in the new columnexcludedwith a warning, and the EAP jackknife works for mixed tests.
Show all changes in 1.0.0Hide the rest of the changes in 1.0.0
- **AMT jackknife** (
cmeth = "AMT"): now the AMT-robustified jackknife of Wainer & Wright (1980): Andrews' sine estimator (c = 2.1, MAD scale), applied to the pseudovalues of the right and of the wrong answers separately and averaged with the group sizes as weights. - **MAP standard errors** now include the prior.
- **Robust estimates**: the standard error is the sandwich form with the Huber weights, and the estimate solves its weighted estimating equation to the accuracy
exac(before up to 3e-3 off). - **WLE/MLE for the 3PL**: the estimator is now a safeguarded Newton method per person. Persons for whom the iteration oscillated without converging are now estimated or flagged by
status. - **Plausible values (
PV())** are drawn from the posterior on a grid (approx = FALSE) or from a normal distribution with its mean and SD (approx = TRUE, default). Both use the prior of each person and work with missing responses. The Metropolis-Hastings sampler is gone, and its argumentsthinning,burninandmultare ignored with a warning. - **EAP estimates** are computed on an adaptive grid with log-likelihoods, which also works for long tests (products of probabilities underflowed there).
- **Person fit (
Pfit())**: lz\* uses the answered items only, so it works with missing responses; infit and outfit of the PCM take the number of categories from the item parameters and respect the slopes of the GPCM; the jackknife SE of lz uses person-specific priors. Results are no longer rounded (p values of 0.0004 were shown as 0). - Scalar
mu,sigma2or item parameters are recycled to the persons or items. - The key for detecting duplicated response patterns could, in rare cases, treat different patterns as equal. The option
killdupliis gone (see Deprecated). - Numerically stable item probabilities (no overflow in the 4PL, log-sum-exp in the GPCM), also in
sim_4pl()andsim_gpcm().
Breaking changes
PV()needs an estimate with a prior, i.e.type = "eap"or"map"; it stops for MLE, WLE and robust estimates. These have no prior any more:muandsigma2given there are ignored with a warning and stored asNA.- Persons whose estimating equation has no root inside
range(new argument, defaultc(-6, 6)) get the bound with status"boundary"and a warning (before: NaN or drifting values). Persons without any response getNA(before:+Inf); for EAP the prior mean and SD. - The results are numbered by person in the order of the response matrix; row names of
respmare not carried over (use a person variable inPPass()for ids). PPass()on eRm objects: the methodPPass.Rmis replaced byPPass.eRm, and the result ofPPass()is a data.frame of classppasswith the new columnstatus. Fortype = "eap"and"robust"it contains the estimates only (with a message).sim_4pl()andsim_gpcm()draw differently, so simulated data are not identical to 0.6.4-1 for the same seed.- Removed:
lzstar_mixed(),Pfit_lzstarmix()andprint_personfit_summary()(new in 0.6.4-1).Pfit()now gives lz and lz\* for all models (lz\* after Sinharay, 2016, with the correction of the estimation type),summary()of its result replaces the printed summary.Pfit()takes the item parameters from the estimation object. - The element
$iparof estimation objects (the processed input in the 0.6.4 layout) is no longer part of the result; the estimates are in$estimates. JKpp(maxsteps, exac)default to the values of the estimation object (before 500 and 0.001).Pfit(pp, fitindices, SE): the argumentrespmis removed, the responses come from the estimation object. UsePfit(res)instead ofPfit(respm = X, pp = res). The estimation objects of 0.6.4-1 did not contain the rows of persons with an extreme score (MLE) and of duplicated patterns, so the responses had to be passed again; the new objects have one row per person.
New features
- Every result has
$estimates, a data.frame withestimate,SE,nstepsandstatus("ok","extreme","boundary","no_response","not_converged") per person;coef()andas.data.frame()methods.JKpp()returns$estimateswithL,excludedandstatus. - New arguments
rangeandverboseinPP_4pl(),PP_gpcm()andPPall(). Defaults are unified:maxsteps = 100,exac = 0.001. Pfit()works for all models (1PL–4PL, PCM, GPCM and mixed tests), for MLE, WLE and MAP, with missing responses. Jackknife SEs for all four statistics (new columnsin_se,ou_se),print()andsummary().PPass():- no longer needs
modandmodel2est: the model (1PL to 4PL, PCM, GPCM or a mixed test) follows from the item parameters, as inPP_4pl(); both are ignored with a warning. Before,modonly switched betweenPP_4pl(),PP_gpcm()andPPall(), andmod = "MIXED"did not work. - works with a matrix;
itemscan be given by name; the other columns (e.g. an id) are kept as person variables. - takes every eRm model: RM, LLTM, RSM, PCM, LRSM and LPCM, also with several time points and groups, including group contrasts, for which eRm gives no person parameters. Its maximum likelihood estimates equal
eRm::person.parameter(). eRm is not needed at run time. print()andsummary()give an overview with the persons flagged by the person fit;JKpp()andPV()work directly on the result.plot()for the results ofPPass(),PP_4pl(),PP_gpcm()andPPall()(help page?"pp-plots"), drawn with the new dependency tinyplot:which = "fit": person fit map, the fit statistic against the estimate with the flagged persons labelled;which = "precision": the standard error of each person and of the whole test, 1/sqrt(I(theta)) from the known item parameters, below the distribution of the estimates and with the location of every item;which = "profile": observed against expected scores of the answered items of single persons, with the unexpected answers labelled.sim_mixed()simulates tests of 4PL and GPCM items.PPall():slopes,lowerAandupperAare optional;PP_4pl()withlowerAbut withoutslopesfits the 3PL with slopes 1.- Input checks with clear messages for all arguments.
- No startup message, no
cat()output and no warning for the default prior.
Deprecated
- The options of
ctrlinPP_4pl(),PP_gpcm()andPPall()are ignored with a warning:killdupli(estimate duplicated response patterns once) andskipcheck(skip the checks of the responses) saved time with the old estimation routine, which iterated all persons together. Every person is now estimated separately, and the checks always run.JKpp(ctrl)had no effect already in 0.6.4-1 and is ignored with a warning, too. PPall(model2est)is ignored with a warning: the model of each item follows fromthres(one threshold: 4PL item, several: GPCM item). A dichotomous item declared as"GPCM"was the same as a 4PL item with asymptotes 0 and 1.findmodel()shows the model of each item.$resPP(estimation objects) and$resjk(jackknife) are kept as aliases of the 0.6.4 layout; use$estimates.
Performance
The C++ core estimates every person separately with its own convergence
check (before: all persons iterated until the slowest converged). Median
times on 5000 persons × 40 items: 1PL–3PL estimates 0.02 s (before
0.3–2.9 s), EAP 0.03 s (0.8 s); GPCM with 2000 × 20: 0.01 s (0.2–1.3 s);
JKpp() on 500 × 40: 0.05 s (142 s); PV() 150 times and sim_gpcm()
400 times faster.
Documentation
- New vignettes: "Getting started with PP", "Person fit with PP" and "Person assessment with PPass, also for eRm models".
- Examples are part of the help pages.
Maintenance
- Manuel Reif is the maintainer again. The repository moved to <https://github.com/manuelreif/PP>.
- PP needs R >= 4.0 (before 3.0) and imports tinyplot for the new plots.
From NEWS.md in the release
Install
Health
- OK13 OK2026-09-08
- ERROR12 OK, 1 ERROR2026-09-07
- OK13 OK2026-08-05
- NOTE12 OK, 1 NOTE2026-08-01
- OK12 OK2026-04-25
Show 2 earlier changesHide 2 earlier changes
- ERROR11 OK, 2 NOTE, 1 ERROR2026-04-18
- NOTE12 OK, 2 NOTE2026-03-10
Documentation
- Help pages
- 16includes a package overview page
- Examples that run
- 100%13 run in a plain check
- Exported functions with examples
- 100%
- Documented parameters
- 100%
- Return-value docs
- 100%
- Help pages citing references
- 50%
Downloads
Repository
- PRs merged (all time)
- 100%
- Median days to close, 50 most recently updated closed issues
- 342
- Median days to close, 50 most recently updated closed PRs
- 0
Stars over time
Forks over time
Releases over time
PRs over time
- github.com/jansteinfeld/pp · last recorded on 2026-10-14
10 development-tooling and community-health practices detected across 6 families in the upstream repository
Checks run against github.com/manuelreif/pp on 2026-10-21.
The R CMD check workflow runs on Linux, macOS and Windows, and on R-devel
GitHub Pages site last deployed 2026-10-15 · The repository has a site deploy workflow
pkgdown site last built 2026-10-15
Show all practicesHide 2 practices
This repository shows signs of AI coding tools.
- Claude Codefirst seen 2026-10-05Named in .Rbuildignore: CLAUDE.mdCommits: at least 90 crediting it in the message
- Claude Opus 5.590 commits · Oct 2026
Dependencies
Installing PP adds 2 packages (1 with compiled code, 2.4 MB of source tarballs). Heaviest: Rcpp 1.8 MB, tinyplot 609 KB.
Code & Tests
Datasets
People & History
Previously maintained by Jan Steinfeld (0.6.2 to 0.6.4-1) and Reif Manuel (0.1 to 0.6.1).
Pick two releases to compare their code metrics.
- 1.0.0Latest2026-10-14 · current release · diff ↗ ·
removed 3 exports
Pfit_lzstarmix, lzstar_mixed, print_personfit_summary·added 1 export
sim_mixedlisted once in CRAN's queue
Seen in one reading of CRAN's incoming queue, at 2026-10-14 19:53 UTC, so it stayed less than the time between readings. - RR 4.6.0 released · 2026-04-24
- 0.6.4-1
- RR 4.5.0 released · 2025-04-11
- RR 4.4.0 released · 2024-04-24
- RR 4.3.0 released · 2023-04-21
- RR 4.2.0 released · 2022-04-22
- 0.6.3-112021-05-27 · diff ↗
- RR 4.1.0 released · 2021-05-18
- RR 4.0.0 released · 2020-04-24
- RR 3.6.0 released · 2019-04-26
- 0.6.22019-04-07 · diff ↗
- RR 3.5.0 released · 2018-04-23
- 0.6.1
- RR 3.4.0 released · 2017-04-21
- RR 3.3.0 released · 2016-05-03
Show 11 earlier eventsHide 11 earlier events
- RR 3.2.0 released · 2015-04-16
- 0.5.32014-09-04 · diff ↗
- 0.52014-08-30 · diff ↗ ·
removed 6 exports
PP_3PLmle, PP_3PLwle, PP_RMmle, PP_RMwle, PP_GPCMmle, PP_GPCMwleadded 8 exports
JKpp, PP_4pl, PP_gpcm, PPall, PV, findmodel, sim_4pl, sim_gpcm - RR 3.1.0 released · 2014-04-10
- 0.2-12013-12-29 · diff ↗
- RR 3.0.0 released · 2013-04-03
- 0.22012-06-22 · diff ↗
- RR 2.15.0 released · 2012-03-30
- RR 2.14.0 released · 2011-10-31
- 0.12011-09-10
- RR 2.13.0 released · 2011-04-13
Package metadata
- First published
- 2011-09-10
- Total releases
- 10 / 15 yrs
- License
- GPL-3 OSI
- Minimum R
- ≥ 4.0
- Bundled data
- 31 KB / 2 files
- Download size
- 273 KB
Cite
Cite this package
Run in R for the authors' preferred citation:
citation("PP")The package provides a citation file that builds its entry when R runs it. Run citation() to see it.
The repository also keeps a CITATION.cff.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-23, which the citation names so these numbers can be found later. More on citing and the projects behind them.