Stats for

Psychometrics and Measurement

Item Response Theory (IRT)

IRT models how answering each item depends on the trait being measured.

Item response theory takes people's answers to a set of yes/no items and models how the chance of a yes on each item rises with the one trait they share.

Example

Which statements on a short social-anxiety checklist best tell more anxious people from less anxious ones, and where on the anxiety scale does each one work? Eight hundred adults answered yes or no to eight statements, such as “I avoid parties and social gatherings.”

One Trait + 3+ Yes/No Items + Several Hundred People → Item Response Theory (IRT)
Estimates
How each item relates to one underlying trait
Observations
Independent
Parametric
Yes
Headline Statistic
a
Key Estimate
Discrimination Parameter
Groups
1

The Basics

When to Use It

Use it when a set of yes/no (or right/wrong) items is meant to measure one trait, you have several hundred people, and you want to know how each item behaves: how common or rare it is on the trait's scale, how sharply it separates people, and where along the scale the whole set measures well or poorly. This page covers the two-parameter logistic (2PL) model; the Rasch (one-parameter) model fixes every item's steepness to be equal, and the three-parameter model adds a floor for guessing. Choose the Rasch model when you want the plain total to be the score, the 3PL when low scorers can guess right, and test whether the 2PL's extra steepness parameters are needed (see Uncertainty). For items with several ordered answers, such as 1-to-5 ratings, the same ideas carry over to Samejima's graded response model. For example:

  • Which statements on a short social-anxiety checklist best tell more anxious people from less anxious ones, and where on the anxiety scale does each one work?
  • Does a 10-item depression screener measure mild depression as precisely as severe depression?
  • Which questions on a 12-item research-methods quiz are too easy to tell strong students apart?

Vocabulary You Need

Definition Latent Trait (\theta)

The characteristic a test or scale is meant to measure, such as social anxiety, depression or reading ability, which can't be observed directly and is inferred from how people answer the items. Item response theory places people on a line for this trait, written θ (“theta”), usually scaled so that the population has a mean of 0 and a standard deviation of 1: θ = 1 is one standard deviation above average. A person's θ is estimated, never known, so it always comes with a standard error. Also called the ability (in educational testing), the latent variable or the factor. Glossary →

Definition Item Characteristic Curve (P(\theta))

For one yes/no item, the probability of answering yes (or correctly) at each level of the trait θ. In the two-parameter logistic model it's an S-shaped curve, P(θ) = 1 / (1 + e^(−a(θ − b))): near 0 for people far below the item's difficulty b, exactly .50 at θ = b, and near 1 far above it, with the discrimination a setting how steeply it climbs. Plotting every item's curve on one set of axes shows at a glance which items are easy or hard and which separate people sharply. Also called the item response function or trace line. Glossary →

Definition Discrimination Parameter (a)

The steepness of an item's characteristic curve. A high a means the chance of a yes jumps quickly as the trait passes the item's difficulty, so the item tells people just below it from people just above it very well; a low a means the chance creeps up slowly, and the answer says little about where someone stands. It's the item response theory counterpart of a factor loading or an item–total correlation. Its size depends on the scaling: some programs use the normal distribution's cumulative S curve (the normal ogive) instead of the logistic one, or multiply by D = 1.7 to match it. The two curves nearly coincide when the logistic a is about 1.7 times the normal-ogive one, so check which convention a table uses before comparing values. Also called the slope. Glossary →

Definition Difficulty Parameter (b)

Where on the trait an item sits: the value of θ at which the chance of a yes is exactly .50 in the one- and two-parameter models. It's on the same scale as the people, so an item with b = 1 is one that people one standard deviation above average endorse half the time. Low (negative) b means a common symptom or an easy question; high b means a rare symptom or a hard one. For symptom items it's often called severity or location. Unlike the classical item difficulty, the proportion who say yes, it's on the trait's scale rather than tied to how many people in one sample said yes. That scale is set by the sample (its mean is 0 and its SD 1), so if the model fits, b's estimated in two different samples differ by a shift and stretch of the scale, which linking removes, and the items keep their order and spacing. Glossary →

Definition Item Information (I(\theta))

How precisely an item pins down θ at each trait level. For a two-parameter item it's a²P(θ)(1 − P(θ)): largest, a²/4, at θ = b, where the answer is least predictable, and falling away on both sides, faster for steeper items. Item informations add up to the test information, and the test's standard error at each trait level is 1 ÷ √(test information). So precision isn't one number for everyone, as the classical standard error of measurement assumes: a test measures best where its items sit and poorly where it has none. Glossary →

Definition Conditional Standard Error (SE(\hat{\theta}))

In item response theory, the standard error of a trait estimate at a given trait level θ: SE(θ) = 1 ÷ √I(θ), where I(θ) is the test information there. Information is the reciprocal of the estimate's variance, so the standard error is one over its square root. It's conditional on θ: small where the items measure precisely, usually near the middle of their difficulties, and large at the extremes, where few items sit. Classical test theory instead gives one standard error of measurement for everyone, SD × √(1 − reliability). Strictly, 1 ÷ √I(θ) is the large-sample standard error of a maximum-likelihood estimate of θ. EAP (expected a posteriori) scores come with a posterior SD instead, which also leans on the population distribution and is usually a little smaller. Glossary →

Assumptions

1. One Underlying Trait Your items all measure one and the same trait.
What It Means
A single common factor is enough to reproduce how the items go together (with several constructs, each construct's items measure one trait). Coefficients built on a one-factor model, such as omega and alpha, and item-level models such as IRT, describe how well the items measure one trait only if there really is one. A scale made of distinct parts, such as worry and bodily symptoms, breaks it; score and analyze each part separately, or use a model with several factors.
Applies To
Items
How to Check
Start from the scale's content and theory. Then fit a one-factor model (or, with several constructs, one factor per construct) and look at its fit (the chi-square test, RMSEA, SRMR) and at the residual correlations it leaves between pairs of items. For right/wrong or yes/no items, fit that model to tetrachoric correlations (in lavaan, declare the items ordered, which uses WLSMV) or as a one-factor IRT model with its own fit statistics (M2, RMSEA, SRMSR); fit indices from ordinary Pearson correlations are misleading for 0/1 items. An exploratory factor analysis or parallel analysis can suggest how many factors there are. A high omega or alpha is not evidence of unidimensionality: several correlated factors can produce one.
How Much It Matters
A lot. The 2PL has room for only one trait. If the checklist mixed, say, fear of being judged with fear of performing, the a's and b's would describe a blend of the two, and people's θ scores would mean different things depending on which items they endorsed. A minor second factor matters little; a strong one needs a different model.

If It's Violated

  • Alternative Test Exploratory Factor Analysis (EFA). Find out how many traits the items measure, then fit a separate model to each set, or a multidimensional IRT model.
  • Design Change Score and model each distinct part of the checklist on its own.
2. Local Independence Once you know someone's trait level, their answers to different items are unrelated.
What It Means
Items go together only because they all reflect the same trait. Among people at the same trait level, a yes on one item makes a yes on another no more likely. One trait can be enough overall and still leave a pair of items linked by something extra. Pairs of items that share something extra, such as near-identical wording, a common passage or one item that gives away another, break it: the model then counts their overlap as trait, overstating how steep those items are and how precisely people are measured.
Applies To
Items
How to Check
Read the items for pairs that repeat each other or depend on each other. After fitting the model, look at the residual correlations between pairs of items (Yen's Q3, read against the average Q3 rather than 0, since with few items Q3 runs below zero even when the assumption holds; or the local dependence statistics most IRT programs print): pairs the model leaves strongly related point to a violation. An overall fit statistic such as M2 can miss a single bad pair.
How Much It Matters
Some to a lot. One pair of near-duplicate items makes both look steeper than they are and makes everyone's θ look more precise than it is. Many such pairs can distort the whole calibration.

If It's Violated

  • Design Change Keep one of two items that ask the same thing in different words.
  • Correction Add the dependent items into one small rated item (a testlet) and model it with a graded response model.
3. Right Curve Shape Each item's chance of a yes follows the model's S-shaped curve.
What It Means
In the two-parameter model, the chance of a yes rises from 0 to 1 along a logistic S curve with a steepness and a location of its own. Items whose curve has a floor above 0 (people guessing, or saying yes for reasons unrelated to the trait), a ceiling below 1 or a bend in the wrong place don't fit it, and their a and b then describe the wrong shape.
Applies To
Items
How to Check
Plot each item's observed proportion of yes answers against people's estimated trait level, with the model's curve on top (item fit plots), and look at item fit statistics such as S-X², which compares each item's observed and predicted yes rates among people with the same total score; a small p flags a misfitting item. For multiple-choice tests, ask whether low scorers could guess the right answer; if so, a three-parameter model may fit better.
How Much It Matters
Some. A poorly fitting item mostly distorts its own a and b; people's θ scores change little unless several items misfit the same way. It matters more when the parameters are used to build a short form or a computerized adaptive test.

If It's Violated

  • Alternative Test A three-parameter model adds a floor for items people can get right by guessing. It needs larger samples to estimate well.
  • Proceed with Caveat Report the misfitting item and check whether the conclusions change without it.
4. Normal Trait in the Population The trait is spread like a bell curve among the people you sampled.
What It Means
Marginal maximum likelihood estimates the a's and b's by averaging over a normal curve of trait levels, and EAP scores are pulled toward that curve's middle. For symptoms in a community sample, where most people have few, the real spread is often skewed instead, with a pile-up at the low end.
Applies To
Observations
How to Check
Look at the total scores for a pile-up at zero (here 48 of 800 people, 6%, said no to everything). Then fit a model that estimates the trait's shape from the data and compare it with the normal one: in mirt, add dentype = "Davidian-4" or "empiricalhist" to mirt() and compare the two fits with anova(). Here the Davidian curve fits no better than the normal one, χ²(4) = 4.22, p = .38.
How Much It Matters
Some. A skewed trait mostly biases the b's of items at the thin end of the curve and the scores of people with extreme answer patterns, such as all no's. The a's and the ordering of people change less.

If It's Violated

  • Alternative Test Fit a model that estimates the trait's distribution instead of assuming it: an empirical histogram, a Davidian curve or Ramsay-curve IRT. These need large samples to estimate the shape well.
  • Proceed with Caveat Say that a normal trait was assumed, and read the b's of the rarest items and the scores of all-no or all-yes patterns loosely.
5. Independent Observations The people (or other units) in your study don't influence each other.
What It Means
Each person's data comes from a separate, unconnected source, so knowing one person's scores tells you nothing about anyone else's. In designs that measure people more than once, their own scores are meant to be related; it's different people who must be independent. Methods built for clustered data, such as multilevel models and GEE, also allow members of the same group to be related, as long as the analysis names the grouping; then it's the groups that must be independent.
Applies To
Observations
How to Check
By design, not by a test. Did each person contribute their own data, with no clusters such as roommates, couples, therapy groups or classrooms whose members influence each other? If there are clusters, does the analysis model every one of them?
How Much It Matters
Some. People answering in clusters (the same classroom or clinic) leave the parameter estimates roughly right but make their standard errors too small.

If It's Violated

  • Alternative Test Multilevel SEM. A multilevel IRT model, or a multilevel factor model, separates differences within and between clusters.
  • Proceed with Caveat Say how people were grouped and treat the standard errors as too small.

Limitations

This Is Not Your Test If…

What It Doesn't Tell You

  • Whether the checklist measures social anxiety. The model says the eight statements hang together as one trait and how each relates to it, not that the trait is social anxiety rather than, say, general shyness. That's a question of validity.
  • Whether the scale's zero means anything. θ = 0 is the average of these 800 adults, and one unit is their standard deviation. A different population would put the same people somewhere else.
  • Who else. If the model fits in each group, the a's and b's from another group differ from these only by a shift and stretch of the trait scale (which linking removes); without linking, the numbers themselves aren't comparable. Whether a statement works the same way for, say, men and women is a separate question, differential item functioning.
  • How to diagnose anyone. A θ of 1.5 says a person is well above these adults' average, give or take about 0.57 (the posterior SD of an EAP score there). It isn't a clinical cutoff, and the checklist wasn't compared with a diagnosis.
  • That a flat item is useless. “I avoid making phone calls” adds little here, but a statement can be worth keeping for its content or for another population.

Common Mistakes

  • Don'tReport one standard error of measurement for everyone from an IRT model.

    InsteadReport the standard error at several trait levels, or plot it. Precision changes along the trait.

  • Don'tRead b as the proportion of people who said yes.

    InsteadRead b as a trait level, in standard deviations. The proportion saying yes is classical item difficulty.

  • Don'tTreat two people with the same total as having the same θ under the 2PL.

    InsteadScore them from their full answer patterns. Under the 2PL, yeses to steep items count for more, so which items they endorsed matters, not just how many. Only under the Rasch model does the total carry everything.

  • Don'tFit a 2PL to a small sample and trust every a to two decimals.

    InsteadReport the standard errors of a and b, and treat items with wide ones as provisional.

  • Don'tTake a good overall fit statistic as proof that every item fits.

    InsteadCheck item fit and residual correlations between item pairs as well.

  • Don'tCompare discrimination values from programs that use different scaling constants.

    InsteadCheck whether the program includes D = 1.7 (normal-ogive metric) or not (logistic metric), and convert before comparing.

  • Don'tReport 1 ÷ √I(θ) as the standard error of a person's EAP score.

    InsteadReport the posterior SD for EAP scores, and 1 ÷ √I(θ) for maximum-likelihood scores or for the test's precision at each trait level.

Result Decoder

Interpretation Guidelines

Benchmarks Discrimination Parameter
  • a ≤ 0 None

    The item doesn't separate people at all, or runs backward: people higher on the trait are less likely to say yes. Check the wording and scoring.

  • .01 ≤ a < .35 Very Low

    The curve is nearly flat. An answer says almost nothing about where the person stands.

  • .35 ≤ a < .65 Low

    The chance of a yes rises only gradually with the trait.

  • .65 ≤ a < 1.35 Moderate

    A clear rise across the middle of the curve. Typical of useful items.

  • 1.35 ≤ a < 1.70 High

    A steep rise. The item separates people near its difficulty well.

  • a ≥ 1.70 Very High

    A very steep rise. The item separates people near its difficulty sharply, but tells you little about anyone far from it.

Baker (2001) offered these labels for a on the logistic metric with no 1.7 constant, which is what mirt reports. For the normal-ogive metric, or a program that includes D = 1.7, divide these cutoffs by 1.7. They are conventions for describing items, not pass marks: whether an item is worth keeping also depends on where it sits on the trait and what the scale is for.

More about effect size ↓

How It's Reported

Equation Form

Example

a = 0.58 to 2.00, b = −1.41 to 1.57 (Table 1); SE(θ̂) = 0.57 at θ = 0, 0.54 at θ = 0.44, 0.82 at θ = 2; M2(20) = 14.19, p = .821, RMSEA = .000

Table 1. Two-Parameter Logistic Model of the Eight Social-Anxiety Statements

Example
YesaSE_abSE_bI_{\max}
1. I feel nervous talking to people I don't know .7500.910.13−1.410.190.21
2. I worry that others will see me blush or sweat .6290.960.12−0.650.110.23
3. I avoid parties and social gatherings .4582.000.240.150.061.00
4. I stay quiet in groups so I won't draw attention .5511.310.15−0.210.070.43
5. I avoid making phone calls .3890.580.100.840.180.08
6. I dread social events for days beforehand .3531.990.240.500.070.99
7. I leave social events early because I feel anxious .2351.610.201.060.100.64
8. I avoid eating or drinking in front of others .1451.580.221.570.140.63

Note. N = 800. Yes = proportion answering yes; a = discrimination; b = difficulty, in standard deviations of the trait; Imax = the item's information at its peak, θ = b (a²/4). Standard errors from the observed information matrix; SE(b) by the delta method. Logistic metric (no 1.7 scaling constant). Marginal maximum likelihood, EM algorithm, 61 quadrature points.

Full Text (APA Style)

Example

A two-parameter logistic model, fitted by marginal maximum likelihood (mirt, 61 quadrature points), fit the eight social-anxiety statements well, M2(20) = 14.19, p = .821, RMSEA = .000 (90% upper limit .019), SRMSR = .02. Discriminations ranged from 0.58 (“I avoid making phone calls”) to 2.00 (“I avoid parties and social gatherings”), and difficulties from −1.41 (“I feel nervous talking to people I don't know”) to 1.57 (“I avoid eating or drinking in front of others”), in standard deviations of the trait (Table 1). The checklist measured most precisely at θ = 0.44, where test information peaked at 3.46 and the standard error of a trait estimate was 0.54; the standard error rose to 0.82 at θ = 2 and 1.25 at θ = −2. Two respondents who each said yes to three statements received different EAP scores, −0.50 (SD = 0.56) and 0.18 (SD = 0.50), because they endorsed statements of different steepness.

  • Name the model, the software, the estimation method and the scaling (logistic, with or without D = 1.7), so readers can compare your a's with others'.
  • Give every item's a and b with standard errors in a table, in the order the items were asked.
  • Report precision at several trait levels (or plot the standard error), not one reliability for everyone.
  • Say how person scores were estimated (EAP, MAP or maximum likelihood); they differ most for people who say yes to everything or nothing.

Reading Each Piece

The equation form above, piece by piece, in this order: how big, then how certain.

a6 = 1.99 “I dread social events for days beforehand” separates people very sharply near its difficulty, very high by the benchmarks above. “I avoid making phone calls,” at 0.58, is low: whether someone avoids calls says little about their social anxiety, perhaps because people avoid calls for many other reasons. Benchmarks ↑
b6 = 0.50 Dreading events for days is a moderately severe sign: it takes anxiety half an SD above average to make a yes as likely as a no. The difficulties run from −1.41 (nervous with strangers, which most people say yes to) to 1.57 (avoiding eating in front of others, which only quite anxious people say yes to).
I6(b) = 0.99 Statement 6 does its best work near θ = 0.50 and adds little for people far above or below it. The phone-call statement never gives more than 0.08, a twelfth as much, at any level (Table 1).
SE(θ̂) = 0.57 at θ = 0 For a person of average anxiety, the checklist's estimate is typically off by about half an SD; at 0.44 the error is smallest, 0.54. For very anxious people (θ = 2) it's 0.82, and for people with very little social anxiety (θ = −2, two SDs below average) it's 1.25, more than the whole population's SD: the checklist can barely tell them apart. On a trait scale with SD 1, 1 − SE² works like a reliability at that level: about .68 at average anxiety, .71 at the peak and only .32 at θ = 2. Averaged over everyone, mirt's marginal reliability is .68.
θ̂A = −0.50 Person A sits about half an SD below average in social anxiety, with a posterior SD of 0.56: plausibly anywhere from about −1.6 to 0.6.
θ̂B = 0.18 Person B also said yes three times but sits slightly above average, 0.68 SD higher than A, because two of B's yeses came from the steepest statements (a ≈ 2), while A's came from the three flattest. Their posterior SD, 0.50, is a little smaller: B's answers fall where the checklist measures best.

Calculations

The Running Example

Example

The social-anxiety checklist study: 800 adults, eight yes/no statements, one S-shaped curve fitted to each statement.

There's no hypothesis to test. The targets are each statement's discrimination a and difficulty b in the population of adults like these, and each person's trait level \theta, on a scale where the population averages 0 with an SD of 1. The standard errors say how precisely each is estimated.

What Your Data Should Look Like

One row per person and one column per item, each scored 1 (yes, or correct) or 0 (no, or wrong), with any reverse-worded items already flipped so that 1 always means more of the trait. Leave out the ID column and any other variables. Missing answers can stay blank; marginal maximum likelihood uses whatever each person answered, as long as whether an answer is missing doesn't depend on what it would have been.

Example
personnervous_strangersworry_blushingavoid_partiesquiet_in_groupsavoid_phone_callsdread_eventsleave_earlyavoid_eating_in_public
111111110
210000000
301111100
410010000
511000100
611001000
… 794 more rows
ItempItem–Total r
Nervous Strangers.75.27
Worry Blushing.63.31
Avoid Parties.46.48
Quiet in Groups.55.39
Avoid Phone Calls.39.22
Dread Events.35.48
Leave Early.24.39
Avoid Eating in Public.15.34
Total M (SD)3.51 (2.01)

N = 800. The total adds the 8 items; each item's r is with the total of the other 7 (the corrected item–total correlation).

p is the proportion scoring 1 on the item (a right answer, or a yes).

Simulated data.

Download all 800 rows (data.csv)

Napkin Math

The whole test, one idea at a time. Under each heading, a line says why the step matters, and the green note reads the equation in plain English with the social-anxiety checklist study's numbers. Collapse all to read just the headings: they tell the whole story on their own.

  1. 1. Estimate How Sharply Each Statement Separates More Anxious People from Less Anxious Ones

    The model gives every statement its own S-shaped curve for the chance of a yes, and a is how steep that curve is. The trait itself is never observed, so the software estimates all eight curves at once by marginal maximum likelihood: it averages over everyone's possible anxiety levels, weighted by a normal curve, and finds the a's and b's that make the 800 answer patterns most likely (the EM algorithm). Table 1 lists all eight.

    a_6

    = 1.99

    a_6 is the steepness for statement 6, “I dread social events for days beforehand,” 1.99, tied with “I avoid parties” (2.00) as the sharpest. “I avoid making phone calls” is the flattest at 0.58.

  2. 2. Find the Anxiety Level Where Each Statement Kicks In

    Software estimates each curve as a straight line on the log-odds scale, aθ + d. The curve crosses a 50% chance of yes where that line crosses zero, and that trait level is the difficulty b.

    b = -\dfrac{d}{a} =-\dfrac{-1.003}{1.994}

    = 0.50

    d_6 = −1.003

    d_6 is statement 6's intercept, −1.003, the log-odds of a yes for someone of average anxiety, and a_6 its 1.994 slope. −(−1.003) ÷ 1.994 = 0.50: people half a standard deviation above average say yes half the time.

  3. 3. Turn the Two Numbers into a Curve

    With a and b in hand, the curve gives the chance of a yes for anyone. Comparing two trait levels shows how much the steepness matters.

    P(\theta) = \dfrac{1}{1 + e^{-a(\theta - b)}} =\dfrac{1}{1 + e^{-1.994\,(1 - 0.503)}}

    P_6(1) = .73

    P_6(0) = .27

    \theta = 1 is someone one SD above average in anxiety. 1.994 × (1 − 0.503) = 0.99, so the chance is 1 ÷ (1 + e^−0.99) = .73. For someone exactly average (\theta = 0) it's .27: one SD of anxiety takes the chance of a yes from about 1 in 4 to about 3 in 4.

  4. 4. Measure How Much One Statement Tells Us at Each Anxiety Level

    A statement is most informative where its answer is hardest to predict, at a 50% chance of yes, and more so the steeper it is. Far from its difficulty, nearly everyone gives the same answer, so the answer says little.

    I_j(\theta) = a_j^2 \, P_j(\theta)\,\bigl[1 - P_j(\theta)\bigr] =1.994^2 \times .50 \times .50

    = 0.99

    I_6(2) = 0.18

    At \theta = b, P = .50, so I_6 = 1.994^2 \times .25 = 3.98 × .25 = 0.99. At \theta = 2, where P_6 = .95, it drops to 0.18.

  5. 5. Add Up the Statements to See Where the Checklist Measures Best

    With local independence, each statement's information simply adds. The total shows where on the anxiety scale the checklist as a whole is sharp and where it's blunt.

    I(\theta) = \sum_{j} I_j(\theta) =0.14 + 0.21 + 0.98 + 0.42 + 0.08 + 0.78 + 0.34 + 0.18

    I(0) = 3.13

    \theta_{\text{peak}} = 0.44

    I(\theta_{\text{peak}}) = 3.46

    I(2) = 1.47

    I(-2) = 0.64

    \sum_j I_j(0) adds the eight statements' information at average anxiety (\theta = 0), from 0.08 for phone calls to 0.98 for avoiding parties, to 3.13. It peaks at 3.46 just above average (\theta = 0.44), falls to 1.47 at \theta = 2 and to 0.64 at \theta = -2, where almost everyone says no to almost everything.

  6. 6. Turn Information into a Standard Error at Each Anxiety Level

    More information means a more precise estimate of a person's trait. The standard error is one over the square root of the information, so it changes along the scale instead of being one number for everyone. Strictly, it's the large-sample standard error of a maximum-likelihood estimate of θ; the EAP scores in step 8 come with a posterior SD instead, which is usually a little smaller because it also leans on the population distribution.

    SE(\hat{\theta}) = \dfrac{1}{\sqrt{I(\theta)}} =\dfrac{1}{\sqrt{3.13}}

    = 0.57

    SE(\theta_{\text{peak}}) = 0.54

    SE(2) = 0.82

    SE(-2) = 1.25

    I(0) is the checklist's 3.13 at average anxiety. 1 ÷ √3.13 = 1 ÷ 1.77 = 0.57 SD. At \theta = 2 it's 1 ÷ √1.47 = 0.82, and at \theta = -2, 1 ÷ √0.64 = 1.25.

  7. 7. Check Whether the One-Trait Model Fits the Statement and Pair Proportions

    Everything above assumes one trait drives all eight answers. M2 compares how often each statement, and each pair of statements, got a yes with how often the fitted model says they should. If the statements shared a second trait, pairs from it would get a yes together more often than predicted. A good fit is consistent with one trait but doesn't prove it, so the pair-by-pair checks in Uncertainty back it up.

    M_2 = N \, \hat{\mathbf{e}}^{\top} \hat{\mathbf{C}} \, \hat{\mathbf{e}} =800 \times 0.01774

    M_2 = 14.19

    df = 20

    p = .821

    \text{RMSEA} = .000

    \hat{\mathbf{e}} holds the gaps between the observed and predicted proportions for the 8 statements and 28 pairs, and \hat{\mathbf{C}} weights them by how much they'd vary by chance. 800 × 0.0177 = 14.19 on 36 − 16 = 20 df. M2's null hypothesis is that the model is right: if the one-trait model were exactly right, an M2 at least this large would turn up about 82% of the time (p = .821). RMSEA = .000.

  8. 8. Estimate Each Person's Anxiety from Their Pattern of Answers

    A person's trait estimate uses which statements they said yes to, not just how many. How well a trait level explains someone's answers, the likelihood, is the product of P for each yes and 1 − P for each no. Under the 2PL that depends on the yeses weighted by each statement's a, so yeses to steep statements count for more; under the Rasch model, with equal a's, only the number of yeses matters. The EAP estimate averages every possible anxiety level, weighted by how well it explains the person's answers and how common it is in the population.

    \hat{\theta}_{\text{EAP}} = \dfrac{\sum_q \theta_q \, L(\mathbf{x} \mid \theta_q)\, w_q}{\sum_q L(\mathbf{x} \mid \theta_q)\, w_q}

    = −0.50

    SD_A = 0.56

    \hat{\theta}_B = 0.18

    SD_B = 0.50

    Person A said yes to statements 1, 2 and 5 (nervous with strangers, worried about blushing, avoids phone calls), the flattest three; person B to 1, 3 and 6 (nervous with strangers, avoids parties, dreads events). Both said yes three times, but \hat{\theta}_{\text{EAP}} is −0.50 for A and 0.18 for B.

Run It in Software

The code below reads the running example's data from data.csv; save it in the same folder you run the code from.

SPSS (version 30, as documented by IBM)

SPSS Statistics has no built-in procedure for item response models. The practical route is R's free mirt package (below), run on the same data saved as a CSV file.

Inside SPSS you can prepare the data and get the classical item statistics that IRT builds on: recode any reverse-worded items so that 1 always means more of the trait, then run Analyze → Scale → Reliability Analysis, and under Statistics check Item and Scale if item deleted, for each item's proportion endorsed (its mean) and corrected item–total correlation.

Or paste this syntax:

SAVE TRANSLATE OUTFILE='data.csv'
  /TYPE=CSV /FIELDNAMES /REPLACE.

Reading the Output

The CSV file has the person ID in its first column and then one column per statement, coded 0 and 1, which is what the R code below expects (it drops the ID).

Output laid out from this page's computed results, not captured from a live run; labels and layout may differ slightly in your version.

R
library(mirt)

anxiety <- read.csv("data.csv")
items <- anxiety[, -1]                      # drop the person ID
fit <- mirt(items, model = 1, itemtype = "2PL", SE = TRUE)

coef(fit, IRTpars = TRUE, simplify = TRUE)$items[, c("a", "b")]
coef(fit, IRTpars = TRUE, printSE = TRUE)   # with standard errors
M2(fit)
summary(fit)                                # standardized loadings (F1)

# Test information and its standard error at three trait levels
info <- testinfo(fit, Theta = c(-2, 0, 2))
cbind(info, SE = 1 / sqrt(info))

# EAP scores for two people who both said yes to three statements
fscores(fit, method = "EAP", full.scores.SE = TRUE,
        response.pattern = rbind(c(1, 1, 0, 0, 1, 0, 0, 0),
                                 c(1, 0, 1, 0, 0, 1, 0, 0)))

plot(fit, type = "trace")                   # every statement's curve
plot(fit, type = "info")                    # test information

Read the item table first (a, then b, with their standard errors in the list below it), then the fit, then the precision and the person scores. Printing fit itself also shows how many EM iterations it took and the log-likelihood.

                               a          b
nervous_strangers      0.9064023 -1.4114587
worry_blushing         0.9564745 -0.6543111
avoid_parties          2.0033904  0.1454668
quiet_in_groups        1.3088886 -0.2059688
avoid_phone_calls      0.5822952  0.8383392
dread_events           1.9942705  0.5030995
leave_early            1.6055738  1.0560889
avoid_eating_in_public 1.5834780  1.5656170
$nervous_strangers
        a      b  g  u
par 0.906 -1.411  0  1
SE  0.131  0.185 NA NA

$worry_blushing
        a      b  g  u
par 0.956 -0.654  0  1
SE  0.124  0.110 NA NA

$avoid_parties
        a     b  g  u
par 2.003 0.145  0  1
SE  0.240 0.059 NA NA

$quiet_in_groups
        a      b  g  u
par 1.309 -0.206  0  1
SE  0.151  0.074 NA NA

$avoid_phone_calls
        a     b  g  u
par 0.582 0.838  0  1
SE  0.101 0.183 NA NA

$dread_events
        a     b  g  u
par 1.994 0.503  0  1
SE  0.242 0.065 NA NA

$leave_early
        a     b  g  u
par 1.606 1.056  0  1
SE  0.196 0.099 NA NA

$avoid_eating_in_public
        a     b  g  u
par 1.583 1.566  0  1
SE  0.216 0.143 NA NA

$GroupPars
    MEAN_1 COV_11
par      0      1
SE      NA     NA

          M2 df     p RMSEA RMSEA_5 RMSEA_95 SRMSR   TLI CFI
stats 14.194 20 0.821     0       0    0.019  0.02 1.008   1
                          F1    h2
nervous_strangers      0.470 0.221
worry_blushing         0.490 0.240
avoid_parties          0.762 0.581
quiet_in_groups        0.610 0.372
avoid_phone_calls      0.324 0.105
dread_events           0.761 0.579
leave_early            0.686 0.471
avoid_eating_in_public 0.681 0.464

                       SE.F1
nervous_strangers      0.053
worry_blushing         0.048
avoid_parties          0.038
quiet_in_groups        0.044
avoid_phone_calls      0.050
dread_events           0.039
leave_early            0.044
avoid_eating_in_public 0.050

SS loadings:  3.032 
Proportion Var:  0.379 

Factor correlations: 

   F1
F1  1
          info        SE
[1,] 0.6359995 1.2539251
[2,] 3.1278724 0.5654256
[3,] 1.4716985 0.8243100
         F1 SE_F1
[1,] -0.502 0.561
[2,]  0.176 0.500

mirt stops the EM when no estimate moves by more than 0.0001, so its values can differ from Table 1 in the third or fourth decimal (avoid_parties' a is 2.0034 here and 2.0040 in the table). Add TOL = 1e-10 to mirt() and they match Table 1 to six decimals, standard errors included. mirt uses the logistic metric with no 1.7 constant, and IRTpars = TRUE converts its slope-and-intercept estimates (a1, d) to a and b. summary() turns each a into a standardized factor loading (F1), and h2 is its square.

Output from a real run: R 4.6.1 (mirt 1.47), run 2026-10-03.

Python
import pandas as pd
from girth import twopl_mml

anxiety = pd.read_csv("data.csv")
items = anxiety.drop(columns="person")
result = twopl_mml(items.to_numpy().T)      # girth wants items in rows

print(result["Discrimination"].round(3))
print(result["Difficulty"].round(3))
[0.906 0.956 2.003 1.309 0.582 1.993 1.604 1.582]
[-1.412 -0.656  0.141 -0.209  0.838  0.5    1.056  1.569]

The first line is each statement's discrimination (a) and the second its difficulty (b), in file order. girth (installed with pip install girth; its latest release, 0.8.0, dates from 2021) fits the same 2PL by marginal maximum likelihood on the logistic metric, but with its own numerical settings, so its estimates differ from mirt's in the third decimal. twopl_mml doesn't return standard errors, M2 or information functions; for those, use mirt in R.

Output from a real run: Python 3.9.6 (girth 0.8.0), run 2026-10-03.

Impact

Effect Size

There's no single effect size here. The size measure is each item's discrimination, a: how much the log-odds of a yes rise for each standard deviation of the trait. Because the trait is standardized, a's from different items can be compared directly, and Baker's (2001) labels give a rough reading.

P_6(\theta) = \dfrac{1}{1 + e^{-1.99(\theta - 0.50)}}

For “I dread social events for days beforehand,” each SD of anxiety multiplies the odds of a yes by e^1.99, about 7.3, very high discrimination. For “I avoid making phone calls” it's e^0.58, about 1.8, low.

Some programs report a for a different S shape, the normal distribution's cumulative curve (the normal ogive), instead of the logistic one. The two curves nearly coincide when the logistic a is about 1.7 times the normal-ogive one, which is where the 1.702 below and the D = 1.7 in some programs come from.

If you think in factor-analysis terms, a converts to a standardized loading, (a/1.702) ÷ √(1 + (a/1.702)²), which is what mirt's summary() prints: .76 for the dread statement and .32 for phone calls. Whether an item is worth keeping depends on where it sits as well as how steep it is: a steep item placed where the checklist already has plenty of information adds less than a moderate one placed where it has none.

Benchmarks Discrimination Parameter at a Glance
None
a ≤ 0
Very Low
.01 ≤ a < .35
Low
.35 ≤ a < .65
Moderate
.65 ≤ a < 1.35
High
1.35 ≤ a < 1.70
Very High
a ≥ 1.70

Full benchmarks and caveats ↑

Uncertainty

The item parameters come with standard errors rather than p-values. You could test whether an item's a differs from 0, but for any item worth keeping that's never in doubt; the useful questions are how precise each estimate is and whether the model fits.

“I dread social events for days beforehand” has a = 1.99 with a standard error of 0.24, so a rough 95% range is 1.99 ± 1.96 × 0.24, about 1.52 to 2.47: high to very high discrimination either way. The phone-call statement's 0.58 ± 0.20 runs from low to moderate.

The one test that does matter is whether the model fits. M2's null hypothesis is that the model is right, so here a small p is the warning sign. There's no sign of misfit: M₂(20) = 14.19, p = .821 (Maydeu-Olivares & Joe, 2006), and RMSEA = .000, with a 90% upper limit of .019. That's consistent with a one-trait model, not proof of it. Like any fit test, M2 flags trivial misfit in very large samples and can miss one bad item or one dependent pair in any sample, so read it with item fit and residual correlations, not on its own. Here mirt's item fit statistic S-X², which compares each statement's observed and predicted yes rates among people with the same total score, flags no statement: the smallest p is .17, for phone calls. Its pair-by-pair local-dependence statistics (residuals(fit, type = "LD")) show no pair of statements that goes together more than the one trait predicts. Yen's Q3 residual correlations agree, read against their average (−.10 here), since with few items they tend to sit below zero even when the model is right.

Is the 2PL needed, or would equal steepness do? The Rasch model is the 2PL with every a equal, so a likelihood-ratio test compares the two. Here the 2PL fits far better, χ²(7) = 81.64, p < .001, and has the lower AIC (7196 vs 7264) and BIC (7271 vs 7306). In mirt, fit both and run anova(rasch_fit, fit).

Precision and Sample Size

Power is the chance that a study detects an effect that's really there. Item parameters aren't tested against zero, so power in that sense doesn't apply. What you plan instead is precision: enough people that each a and b is pinned down well enough to act on. Standard errors shrink roughly with the square root of the sample size, at least in large samples. Which items are hardest to pin down depends on the parameter: b is least precise for flat items and for items far from where most people sit, while a is least precise, in absolute terms, for steep items.

With 800 adults, the dread statement's a has a standard error of 0.24. With 200, the square-root rule says about 0.48, and that's roughly what software prints at that size. But in 500 simulated samples of 200 from this fitted model, the estimates spread wider than that, with a long upper tail: 95% fell between 1.27 and 3.54, anywhere from moderate to very high. The least precise b's would be those of the flat phone-call statement and of “nervous with strangers,” whose difficulty sits well below most people.

Plan for precision: pick the widest standard error you could live with for the items you care about, and remember that items at the edges of the trait need more people. Fitting the model to simulated data like yours at a few sample sizes is the most direct way to check. There's no calculator for this test.

Other Info

Follow-Up and Post Hoc Tests

None. This page estimates rather than tests, so there are no follow-up comparisons to run.

References

  • Embretson, S. E., & Reise, S. P. (2000). Item response theory for psychologists. Lawrence Erlbaum Associates.
  • de Ayala, R. J. (2009). The theory and practice of item response theory. Guilford Press.
  • Baker, F. B. (2001). The basics of item response theory (2nd ed.). ERIC Clearinghouse on Assessment and Evaluation. https://files.eric.ed.gov/fulltext/ED458219.pdf
    “The typical information function looks somewhat like that shown in Figure 6-1, and different ability levels are estimated with differing degrees of precision.” (Chapter 6, p. 107)
    “These relations hold when one interprets the values of the discrimination parameter under a logistic model for the item characteristic curve.” (Table 2-4, p. 34)
    “The actual slope at θ = b is a/4, but considering a to be the slope at b is an acceptable approximation that makes interpretation of the parameter easier in practice.” (p. 22)
    “The difficulty parameter, denoted by b, is defined as the point on the ability scale at which the probability of correct response to the item is .5.” (p. 22)
    “Thus, the information function tells us how well each ability level is being estimated.” (Chapter 6, p. 107)
    “From equation 6-1, the amount of information at a given ability level is the reciprocal of this variance.” (Chapter 6, p. 106)
    “it means that the precision with which an examinee's ability is estimated depends upon where the examinee's ability is located on the ability scale.” (Chapter 6, pp. 107–108)
  • Bock, R. D., & Aitkin, M. (1981). Marginal maximum likelihood estimation of item parameters: Application of an EM algorithm. Psychometrika, 46(4), 443–459. https://doi.org/10.1007/BF02293801
    “Maximum likelihood estimation of item parameters in the marginal distribution, integrating over the distribution of ability, becomes practical when computing procedures based on an EM algorithm are used.” (Abstract)
  • Chalmers, R. P. (2012). mirt: A multidimensional item response theory package for the R environment. Journal of Statistical Software, 48(6), 1–29. https://doi.org/10.18637/jss.v048.i06
    “D is a scaling adjustment (usually 1.702) used to make the logistic metric more closely correspond to the traditional normal ogive metric” (Section 2, p. 3)
  • Maydeu-Olivares, A., & Joe, H. (2006). Limited information goodness-of-fit testing in multidimensional contingency tables. Psychometrika, 71(4), 713–732. https://doi.org/10.1007/s11336-005-1295-9
    “These statistics are quadratic forms in marginal residuals up to order r.” (Abstract)
  • Dunn, T. J., Baguley, T., & Brunsden, V. (2014). From alpha to omega: A practical solution to the pervasive problem of internal consistency estimation. British Journal of Psychology, 105(3), 399–412. https://doi.org/10.1111/bjop.12046
    “Unidimensionality is a requisite for all the models considered here.” (A practical alternative to alpha)
  • Orlando, M., & Thissen, D. (2000). Likelihood-based item-fit indices for dichotomous item response theory models. Applied Psychological Measurement, 24(1), 50–64. https://doi.org/10.1177/01466216000241003

Spot an error? Something still confusing? Tell us at support@statsforpsychology.com.