Skip to content

Person Parameter Estimation

1packages depend
5.8Kdownloads / year
96.6%test coverage
13/13flavors OK

Overview

About

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.

Changes in 1.0.0

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 column excluded with 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 arguments thinning, burnin and mult are 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, sigma2 or 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 killdupli is gone (see Deprecated).
  • Numerically stable item probabilities (no overflow in the 4PL, log-sum-exp in the GPCM), also in sim_4pl() and sim_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: mu and sigma2 given there are ignored with a warning and stored as NA.
  • Persons whose estimating equation has no root inside range (new argument, default c(-6, 6)) get the bound with status "boundary" and a warning (before: NaN or drifting values). Persons without any response get NA (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 respm are not carried over (use a person variable in PPass() for ids).
  • PPass() on eRm objects: the method PPass.Rm is replaced by PPass.eRm, and the result of PPass() is a data.frame of class ppass with the new column status. For type = "eap" and "robust" it contains the estimates only (with a message).
  • sim_4pl() and sim_gpcm() draw differently, so simulated data are not identical to 0.6.4-1 for the same seed.
  • Removed: lzstar_mixed(), Pfit_lzstarmix() and print_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 $ipar of 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 argument respm is removed, the responses come from the estimation object. Use Pfit(res) instead of Pfit(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 with estimate, SE, nsteps and status ("ok", "extreme", "boundary", "no_response", "not_converged") per person; coef() and as.data.frame() methods. JKpp() returns $estimates with L, excluded and status.
  • New arguments range and verbose in PP_4pl(), PP_gpcm() and PPall(). 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 columns in_se, ou_se), print() and summary().
  • PPass():
  • no longer needs mod and model2est: the model (1PL to 4PL, PCM, GPCM or a mixed test) follows from the item parameters, as in PP_4pl(); both are ignored with a warning. Before, mod only switched between PP_4pl(), PP_gpcm() and PPall(), and mod = "MIXED" did not work.
  • works with a matrix; items can 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() and summary() give an overview with the persons flagged by the person fit; JKpp() and PV() work directly on the result.
  • plot() for the results of PPass(), PP_4pl(), PP_gpcm() and PPall() (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, lowerA and upperA are optional; PP_4pl() with lowerA but without slopes fits 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 ctrl in PP_4pl(), PP_gpcm() and PPall() are ignored with a warning: killdupli (estimate duplicated response patterns once) and skipcheck (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 from thres (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

CRAN checks
13OK
Slowest check: 7.6 min · r-oldrel-windows-x86_64
Status changes
  • 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
Advisories

none known

Documentation

In release 1.0.0
README· In the repository, left out of the releaseVignettesYes · 3 · dynamicNEWSYes · 100% structured · mentions 1.0.0Citation fileYes · computed when R runs itWebsiteYes · pkgdown
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

5.8K
CRAN downloads in the past year
Rank #5,237 · ~16/day · ~481/mo
Daily download trend is not available in this view yet.
74930 days
1.6K90 days
5.8K1 year
Compare downloads with other packages →
Also on386 r2u6 autocran156 c2d4u

Repository

3Stars
4Forks
0Open issues
0Open PRs
2Releases
244Commits
4Commit identities
rirtperson-parameterperson-fit
License file reads as GPL-3.0 · 244 commits · Last activity 2026-10-15
Responsiveness
How these are sampled
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

2023-03-10 · 22026-10-15 · 3
Earlier repositories
PracticesBeta

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.

Continuous integration (3)
GitHub ActionsR CMD check workflowTravis CI (config file)

The R CMD check workflow runs on Linux, macOS and Windows, and on R-devel

Docs source (3)
pkgdown

GitHub Pages site last deployed 2026-10-15 · The repository has a site deploy workflow

pkgdown site last built 2026-10-15

Reproducibility and dev environment (1)
Makefile
CRAN release process (1)
cran-comments.md
Show all practicesHide 2 practices
Research and citation (1)
CITATION.cff
Git structural (1)
.gitattributes
How this is detected·Detection ruleset v4 (2026-10-20)
AI coding toolsBeta

This repository shows signs of AI coding tools.

  • Claude Codefirst seen 2026-10-05
    Named in .Rbuildignore: CLAUDE.md
    Commits: at least 90 crediting it in the message
Models named in its commits
  • Claude Opus 5.590 commits · Oct 2026
Counts are commits, not lines of code. Commits by a tool's accounts count once across all of its accounts. Commits crediting it are the largest count among its credit lines, a minimum.How this is detected·Detection ruleset v4 (updated 2026-09-27)

Dependencies

Declared dependencies
7 external dependencies (excludes base and recommended)

Installing PP adds 2 packages (1 with compiled code, 2.4 MB of source tarballs). Heaviest: Rcpp 1.8 MB, tinyplot 609 KB.

Depends (1)
R >= 4.0
Imports (5)
graphicsRcppstatstinyplotutils
LinkingTo (1)
Enhances (0)
none
Reverse dependencies
1direct
0indirect
Imports 1
Depends, Imports or LinkingTo, most downloaded first

Datasets

People & History

People (2)
Maintainer since 1.0.0 (2026), Author
Author · added in 0.6.2

Previously maintained by Jan Steinfeld (0.6.2 to 0.6.4-1) and Reif Manuel (0.1 to 0.6.1).

Releases (10)

Pick two releases to compare their code metrics.

  • 1.0.0Latest
    record
    2026-10-14 · current release · diff ↗ ·
    removed 3 exports
    Pfit_lzstarmix, lzstar_mixed, print_personfit_summary
    added 1 export
    sim_mixed
    ·
    listed 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.
  • R
    R 4.6.0 released · 2026-04-24
  • 0.6.4-1
    record
    2026-04-21 · diff ↗ ·
    added 3 exports
    Pfit_lzstarmix, lzstar_mixed, print_personfit_summary
  • R
    R 4.5.0 released · 2025-04-11
  • R
    R 4.4.0 released · 2024-04-24
  • R
    R 4.3.0 released · 2023-04-21
  • R
    R 4.2.0 released · 2022-04-22
  • 0.6.3-11
    record
    2021-05-27 · diff ↗
  • R
    R 4.1.0 released · 2021-05-18
  • R
    R 4.0.0 released · 2020-04-24
  • R
    R 3.6.0 released · 2019-04-26
  • 0.6.2
    record
    2019-04-07 · diff ↗
  • R
    R 3.5.0 released · 2018-04-23
  • 0.6.1
    record
    2017-05-13 · diff ↗ ·
    added 2 exports
    PPass, Pfit
  • R
    R 3.4.0 released · 2017-04-21
  • R
    R 3.3.0 released · 2016-05-03
Show 11 earlier eventsHide 11 earlier events
  • R
    R 3.2.0 released · 2015-04-16
  • 0.5.3
    record
    2014-09-04 · diff ↗
  • 0.5
    record
    2014-08-30 · diff ↗ ·
    removed 6 exports
    PP_3PLmle, PP_3PLwle, PP_RMmle, PP_RMwle, PP_GPCMmle, PP_GPCMwle
    added 8 exports
    JKpp, PP_4pl, PP_gpcm, PPall, PV, findmodel, sim_4pl, sim_gpcm
  • R
    R 3.1.0 released · 2014-04-10
  • 0.2-1
    record
    2013-12-29 · diff ↗
  • R
    R 3.0.0 released · 2013-04-03
  • 0.2
    record
    2012-06-22 · diff ↗
  • R
    R 2.15.0 released · 2012-03-30
  • R
    R 2.14.0 released · 2011-10-31
  • 0.1
    record
    2011-09-10
  • R
    R 2.13.0 released · 2011-04-13
Across CRAN, the median accepted release of the past year spent 23 hours in the queue, 90% under 11 days.How queue time is measured

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
Appears in task views

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.

APA

Balamuta, J. J. (2026). R Observatory: Metrics for PP version 1.0.0 [Data set]. HJJB, LLC. Data release v2026-10-23. https://doi.org/10.5281/zenodo.21843040

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.

Report a problem with this page →

Privacy choices

These apply to this browser and are stored on this device only. Nothing about your choice is sent to us.

Read the privacy policy