reliability | R Documentation |
Revelle and Condon, (2019) reviewed the problem of reliability in a tutorial meant to useful to the theoretician as well as the practitioner. Although there are a number of functions in psych for estimating reliability of single scales, (e.g. alpha
and omega
), for split half reliability splitHalf
or for finding test-retest reliability testRetest
or multilevel reliability mlr
, the reliability
function combines several of these functions to report these recommended measures for multiple scales.
To quote from Revelle and Condon (2019) “Reliability is a fundamental problem for measurement in all of science for ‘(a)ll measurement is befuddled by error’ (p 294 McNemar, 1946). Perhaps because psychological measures are more befuddled than those of the other natural sciences, psychologists have long studied the problem of reliability.
“Issues of reliability are fundamental to understanding how correlations between observed variables are (attenuated) underestimates of the relationships between the underlying constructs, how observed estimates of a person's score are biased estimates of their latent score, and how to estimate the confidence intervals around any particular measurement. Understanding the many ways to estimate reliability as well as the ways to use these estimates allows one to better assess individuals and to evaluate selection and prediction techniques. This is not just a problem for measurement specialists but for all who want to make theoretical inferences from observed data.
“ It is no longer acceptable to report one coefficient that is only correct if all items are exactly equally good measures of a construct. Researchers are encouraged to report at least two coefficients (e.g., omega_h and omega_t) and then discuss why each is appropriate for the inference that is being made. They are discouraged from reporting just alpha unless they can justify the assumptions implicit in using it (i.e., tau equivalence and unidimensionality)." Here we make it easy to do so.
Although the alpha
and omega
functions will find reliability estimates for a single scale, and scoreItems
and scoreOverlap
will find alpha for multiple scales, it sometimes is convenient to call omega
and splitHalf
for multiple scales. reliability
takes a keys list (suitable for scoreItems
) and then finds hierarchical and total omega as well as split half reliabilities for each separate scale.
plot.reliability
takes the output of reliability
and displays it as a dot chart showing the values of both omegas as well as alpha and the distributions of split half reliabilities.
reliability(keys=NULL, items, nfactors = 2,n.obs=NA,
split = TRUE,
raw=TRUE,
plot=FALSE,
hist=FALSE,
n.sample=10000,
brute=FALSE,
check.keys=TRUE,
covar=FALSE,
fm="minres",
weighted="min")
## S3 method for class 'reliability'
plot(x,omega=TRUE,alpha=TRUE,split=TRUE,uni=TRUE,add=FALSE,
xlim=NULL, main=NULL,...)
keys |
A list of items to be scored (may be taken from a keys.list for |
items |
The matrix or data.frame of items to be scored. Can be substantially greater than the items included in keys. For just those items in each key are scored. |
nfactors |
Omega is not well defined for two factors, but for small sets of items, two is the better choice. For larger number of items per scale, 3 is probably preferable. |
n.obs |
Number of observations, if given a correlation matrix. Needed for CFI |
split |
By default, find splitHalf reliabilities as well as the omega statistics. When plotting, split implies that raw was called in reliability. |
plot |
By default, suppress the omega plots for each scale. |
raw |
If TRUE, return a list of all the possible splits (up to n.samples). Useful for graphic display. |
hist |
If TRUE then split and raw are forced to TRUE and the histograms of the split half values are drawn. (Otherwise, just return the values for later plotting) |
n.sample |
Normally defaults to 10,000. This means that for up to 16 item tests, all possible splits are found. choose(n,n/2)/2 explodes above that, eg. for all splits of the epi E scale requires 1,352,078 splits or 23.4 seconds on a MacBook Pro with a 2.4GHZ 8 core Intel Core I9. Can be done, but do you want to do so? |
brute |
Do all possible splits rather than sampling. (see |
check.keys |
By default, check that the keys are signe in the direction of the loadings on the first PCA. |
covar |
Should we use covariances rather than correlations? |
fm |
The factor extraction method to use. By default this is minres but could be "minrank" or "mle". |
weighted |
The weight parameter in iclust. Defaults to "min" |
x |
The object returned from reliability |
omega |
Add in the values of omega_h and omega_t |
uni |
Show the unidimensionality value from |
alpha |
Add the value of alpha |
add |
Allows us to merge this figure with other ones |
main |
Defaults to "Split half distributions + omega, alpha" |
xlim |
The xlim of the plot |
... |
Other graphical parameters |
reliability
is basically just a wrapper for omegah
, unidim
and splitHalf
. Revelle and Condon (2019) recommended reporting at least three reliability statistics for any scale, here we make it easy to do.
If the hist option is set to true, histgrams and density plots of the split half values for each test are also shown. The output from reliability
can be passed to error.dots
to show the reliability statistics for multiple scales graphically. It is however more useful to just call the plot.reliability
function to show the basic information.
For detailed analysis of any one scale, it is recommended to do a complete omega
analysis, perhaps combined with a splitHalf
analysis. The reliability
function is just meant for the case where the user has multiple scales (perhaps scored using scoreItems
) and then wants to get more complete reliability information for all of the scales.
Following a suggestion, the ability to not bother with keys and just do omega and split half and draw the results has been added. Either specify that keys=NULL, or just specify the items to use. (See the first example.)
plot.reliability
provides a dot chart summary of the distributions of the split half values, as well as the estimates of omega and alpha and unidimensionality. It can also be called by just issuing a plot command.
omega_h |
Omega_h is the (model based) hierarchical estimate of the general factor saturation of a scale. |
alpha |
The conventional alpha statistic (which is not model based) |
omega.tot |
A model based estimate of the total reliability of a scale |
Uni |
An experimental estimate of unidimensionality (from unidim) |
r.fit |
How well does the average r of the correlations reproduce the matrix? |
f.fit |
How well does a single factor reproduce the correlation matrix |
max.split |
The greatest split half reliability of the scale. Found by finding all possible splits (if this is < 15,000) or sampled from 15,000 possible splits. |
min.split |
The lowest split half reliability of the scale. An estimate of beta (see |
mean.r |
The average correlation of the items in the scale |
med.r |
The median correlation of the items. If this differs from the mean, that is a sign of poor scale. |
splits |
A list of the split half values for all possible splits. |
beta |
The beta statistic from ICLUST – forced to a one cluster solution. |
For much more information on reliability, see the help pages for omega
as well as the Revelle and Condon (2019) tutorial or the Revelle (in prep) chapter on reliability.
For some rare cases in some simulations, check.keys=FALSE gets a better minimum split half.
William Revelle
Revelle, William. (in prep) An introduction to psychometric theory with applications in R. Springer. Working draft available at https://personality-project.org/r/book/
Revelle, W. and Condon, D.M. (2019) Reliability from alpha to omega: A tutorial. Psychological Assessment, 31, 12, 1395-1411. https://doi.org/10.1037/pas0000754. https://osf.io/preprints/psyarxiv/2y3w9 Preprint available from PsyArxiv
Revelle, W. and Condon, D.M (2023) Using undim rather than omega in estimating undimensionality. Working draft available at https://personality-project.org/revelle/publications/rc.23.pdf
See Also omega
to find more complete output for the various omega analyses,splitHalf
to show more detail on split half estimates, scoreItems
to find scores on multiple scales using unit weights, testRetest
to find test retest reliabilities, mlr
to find multilevel reliabilities.
predicted.validity
will call reliability
and item.validity
to use the average r information to find the asymptotic validity of a set of scales for a set of criteria.
if(require(psychTools)) {
reliability(psychTools::ability) #an example of finding reliability for all items
rel <- reliability(psychTools::ability.keys,psychTools::ability) #use keys to select scales
R <- cor(psychTools::ability,use="pairwise") #find the correlations to test
rel.R <- reliability(psychTools::ability.keys,R) #this should be the same as rel
plot(rel.R) #versus all and subsets
all.equal(rel.R$result.df,rel.R$result.df ) #should be TRUE
}
reliability(bfi.keys,bfi) #reliability when some items are keyed negatively
## Not run:
#this takes a few seconds but shows nice graphic displays
if(require(psychTools)) {
spi.rel <- reliability(psychTools::spi.keys,psychTools::spi,hist=TRUE) #graph them
spi.rel #show them
#plot them using plot.reliability
plot(spi.rel) #draw the density distrbutions
plot(spi.rel,split=FALSE) #don't draw the split half density distribution
plot(spi.rel,omega=FALSE) # don't add omega values to the diagram
#or do this without the densities
#plot the first three values in a dot chart
error.dots(spi.rel$result.df[,1],sort=FALSE, xlim=c(.3,1),head=16,tail=16,
main = expression(paste(omega[h], ~~~~ alpha,~~~~ omega[t])))
#plot the omega_h values
error.dots(spi.rel$result.df[,2],sort=FALSE,pch=2,xlim=c(.3,1),head=16,tail=16,
main="",labels="",add=TRUE)#add the alpha values
error.dots(spi.rel$result.df[,3],sort=FALSE, xlim=c(.3,1),head=16,tail=16,
pch=3,labels="", main="",add=TRUE) #and the omega_t values
#or, show the smallest and greatest split half, as well as alpha
error.dots(spi.rel$result.df[,4],sort=FALSE, xlim=c(.3,1),head=16,tail=16,
main = expression(paste(beta, ~~~~ alpha,~~~~ glb)))
error.dots(spi.rel$result.df[,5],sort=FALSE,pch=5,xlim=c(.3,1),head=16,tail=16,
main="",labels="",add=TRUE)#add the GLB values
error.dots(spi.rel$result.df[,2],sort=FALSE,pch=2,xlim=c(.3,1),head=16,tail=16,
main="",labels="",add=TRUE)#add the alpha values
}
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.