Written and maintained by CASRAI Editorial Board
Published · Last updated
On this page
Who this is for: researchers and analysts who have item-level survey or test data in R and need descriptive statistics, a reliability coefficient and an exploratory factor analysis from one package. After reading you can install psych, run the four core steps on a built-in dataset, read the output and cite the package version you used.
Short answer: psych is a CRAN package maintained by William Revelle, described on CRAN as a general-purpose toolbox developed originally for personality, psychometric theory and experimental psychology, with a focus on multivariate analysis and scale construction. Install it with install.packages("psych") and load it with library(psych). The workflow below runs describe(), alpha(), fa.parallel() and fa() in that order.
What the psych package is used for in research
The package covers the routine steps of building and checking a questionnaire or test scale: descriptive statistics for every item, reliability estimates (Cronbach’s alpha and Guttman’s Lambda 6 through alpha(); omega coefficients through omega()), principal components (principal()) and exploratory factor analysis (fa()). The package home page at the Personality Project lists these as its main entry points, and CRAN lists the package vignette “Scoring scales with psych” for item scoring. For the underlying concepts see our dictionary entries on research questionnaires, operational definitions and survey research methods.
Rather than reproduce the reference manual, this page orders the functions by the decisions you face: check the items, estimate reliability, decide how many factors to keep, then fit the factor model.
Install and load psych
psych is distributed on CRAN, the official R package repository (version 2.6.9, published 2026-09-30, as read on 2026-11-12).
- Install once:
install.packages("psych") - Load in each session:
library(psych) - Optional companion: the psychTools package on CRAN supplies additional data and helper functions used in the psych vignettes.
If ggplot2 is also loaded, both packages provide a function named alpha. Call psych::alpha() explicitly so reliability analysis runs the function you intend.
Step-by-step: from item data to a factor solution
The example uses bfi, a dataset that ships with psych: 2,800 observations on 28 variables, made up of 25 personality items plus gender, education and age. The items are five sets of five (A1–A5 agreeableness, C1–C5 conscientiousness, E1–E5 extraversion, N1–N5 neuroticism, O1–O5 openness), answered on a 6-point scale from “Very Inaccurate” to “Very Accurate”. The data come from the International Personality Item Pool, collected through the Synthetic Aperture Personality Assessment web project.
Step 1. Describe your data with describe()
library(psych) data(bfi) describe(bfi[, 1:5])
describe() returns one row per variable with the number of valid cases, mean, standard deviation, median, trimmed mean (trim defaults to 0.1), mad (median absolute deviation), minimum, maximum, skew, kurtosis and standard error. Missing values are removed by default (na.rm = TRUE). To describe by group use the formula form, for example describe(SATV + SATQ ~ gender, data = sat.act), taken from the function’s help page.
Step 2. Reliability with alpha()
alpha(bfi[, 1:5], check.keys = TRUE)
The default is check.keys = FALSE: the function warns when some items may need reversing but does not reverse them, because the documentation says users missed reversed items even when warned. With check.keys = TRUE the function reverses items that load negatively on the first principal component. In the bfi data, the package’s example scoring key marks A1 as reverse-scored, so this is the case the argument exists for.
The result contains raw_alpha (based on covariances), std.alpha (based on correlations), G6(smc) (Guttman’s Lambda 6), average_r and median_r (inter-item correlations), item.stats (item-whole correlations) and alpha.drop, the statistics recomputed with each item dropped in turn. Set n.iter above 1 for bootstrap confidence intervals. For omega coefficients see the vignette “Finding omega coefficients” on the Personality Project site.
Step 3. Choose the number of factors with fa.parallel()
fa.parallel(bfi[, 1:25])
Parallel analysis plots the eigenvalues of your data against eigenvalues from resampled data and from a random normal matrix of the same size (n.iter trials, default 20). The help page states that sharp breaks in the plot suggest the number of components or factors to extract; in practice you retain those whose observed eigenvalues sit above the random-data line. Printing the result lists the observed eigenvalues that exceed the simulated ones. The default is fm = "minres" and fa = "both", so both principal components and factor eigenvalues are shown. If you only hold a correlation matrix, give the number of cases in n.obs.
Step 4. Fit the factor model with fa()
fa(bfi[, 1:25], nfactors = 5, rotate = "oblimin", fm = "minres")
The defaults are nfactors = 1, rotate = "oblimin" and fm = "minres", so set nfactors to the number you chose in step 3. Rotation options include orthogonal choices such as "varimax" and oblique choices such as "promax" and "oblimin"; factoring methods include "pa" (principal axis), "ml" (maximum likelihood) and "minres". Choose a method and rotation on theoretical grounds and report them.
Output and how to read it
| Output element | Function | What it tells you (per the package documentation) |
|---|---|---|
| skew, kurtosis, se | describe() | Distribution shape and standard error for each item. |
| raw_alpha, std.alpha | alpha() | Alpha from covariances and from correlations. |
| alpha.drop | alpha() | The reliability statistics with each item dropped in turn. |
| Loadings | fa() | The factor loading matrix; for oblique rotations it is taken from the pattern matrix. |
| h2, u2 | fa() | Communalities and uniquenesses. |
| com | fa() | Hoffman’s complexity index for each item. |
| SS loadings | fa() | Variance accounted for by each factor. |
For an item-level view of a scale, read alpha.drop alongside item.stats: an item whose removal raises alpha, or whose item-whole correlation is low, is a candidate for review, not automatic deletion. For descriptive statistics with other R tools see summary statistics in R, and see the mirt guide when you move from factor analysis to item response theory.
Troubleshooting
- Warning about items that may need reversing. This is the
alpha()check described above. Review the item wording, then either pass the reverse-scored items throughkeysor setcheck.keys = TRUE.warnings = FALSEsuppresses the message, which hides a real problem if you have not checked the keying. - You only have a correlation matrix.
alpha()accepts a covariance or correlation matrix, andfa.parallel()needsn.obsset to the number of cases behind it. - Missing data.
alpha()andfa()use pairwise correlations by default (use = "pairwise"); state this in your methods section. - Wrong
alphafunction runs. Usepsych::alpha()when ggplot2 is loaded. - Ordinal items.
fa.parallel()acceptscor = "poly"for polychoric correlations, among other options listed on its help page.
Reporting and citing
For reproducibility, report the psych version (2.6.9 at the time of this page) and the R version, the factoring method (fm), the rotation, how the number of factors was chosen, and how missing values were handled. R generates the preferred reference when you run citation("psych"), and packageVersion("psych") returns the installed version.
Related free tools
| Tool | Relationship to psych | Source |
|---|---|---|
| psychTools | Companion CRAN package with data and helper functions for the psych vignettes. | Personality Project; CRAN |
| GPArotation | R package that psych imports for factor rotations. | CRAN psych page (Imports field) |
| mirt | Free R package for multidimensional item response theory, the next step after factor analysis of item data. | CASRAI guide |
| jamovi | Free statistics application with a point-and-click interface, for users who do not want to write R code. | CASRAI dictionary |
FAQ
What is the psych package in R?
psych is a CRAN package for psychometrics and multivariate analysis, maintained by William Revelle. CRAN describes it as a general-purpose toolbox developed originally for personality, psychometric theory and experimental psychology, focused on multivariate analysis and scale construction.
How do I install psych?
Run install.packages("psych") once, then library(psych) at the start of each session.
Which psych functions give Cronbach’s alpha and factor analysis?
alpha() returns Cronbach’s alpha and Guttman’s Lambda 6; fa() fits exploratory factor analysis; fa.parallel() helps choose the number of factors; principal() does principal components.
Should I use alpha or omega?
The package provides both; the vignette “Finding omega coefficients” explains omega. Report which coefficient you computed and with which function, and do not present alpha as evidence that a scale is unidimensional.
Sources
- CRAN, psych package page (version 2.6.9, published 2026-09-30), read 2026-11-12: cran.r-project.org/web/packages/psych
- Personality Project, psych package home and vignettes, read 2026-11-12: personality-project.org/r/psych
- RDocumentation, psych 2.6.9 help pages for
describe,alpha,fa.parallel,faandbfi, read 2026-11-12: rdocumentation.org/packages/psych







