Alpha is an estimate of the amount of variance in a test due to one factor, if and only if the test is in fact unifactorial and all items have equal covariances. Violations of the tau equivalence assumption are less important than the unidimensional assumption.
Alpha can be found in two different forms, from the correlation matrix (which is the equivalent of standardizing the items) or from the raw items. In the former case, \[\alpha = \frac{k\bar{r}}{1+(k-1)\bar{r}}\].
In the later case, \[\alpha = \frac{V_t - \sum{v_i}}{V_t}*\frac{k}{k-1}\] where \(V_t\) is the total test variance and \(v_i\) is each item variance and there are k items.
The greatest difference in how to estimate alpha is whether is using standardized or unstandardized alpha. Estimates based upon the correlations will give different estimates than those based upon the raw data. The alpha
function, if given raw data, will report both the standardized and the unstandardized values. omega
and splitHalf
just report the standardized version.
In the first example I compare raw and standardized alpha using the Neuroticism items from the bfi
data set. These items are all keyed in the same direction.
Thus, I use items 16-20 of the bfi
data set. (This is done to avoid the problem of reverse keying).
library(psych)
a1 <- alpha(bfi[16:20])
print(a1$total,digits=6) #show just the alpha stats
## raw_alpha std.alpha G6(smc) average_r S/N ase mean sd
## 0.813963 0.814675 0.799126 0.467854 4.39592 0.0056071 3.16227 1.19633
names(a1) #what other objects are there to explore
## [1] "total" "alpha.drop" "item.stats" "response.freq" "keys" "scores"
## [7] "nvar" "boot.ci" "boot" "Unidim" "Fit" "call"
## [13] "title"
o1 <- omega(bfi[16:20],2,plot=FALSE) #although not a good idea to use omega for only 5 items, the alpha will work.
## Loading required namespace: GPArotation
##
## Three factors are required for identification -- general factor loadings set to be equal.
## Proceed with caution.
## Think about redoing the analysis with alternative values of the 'option' setting.
print(o1$alpha)#print the alpha from omega
## [1] 0.8145354
sp <- splitHalf(bfi[16:20])
print(sp$alpha,digits=6)
## [1] 0.814675
gut <- guttman(bfi[16:20]) #note that Guttman has been deprecated
## Warning: Guttman has been deprecated. The use of the splitHalf function is recommended
print(gut$lambda.3,digits=6)
## [1] 0.814535
The alpha
function reports two estimates of alpha, the unstandardized and the standardized. omega
and splitHalf
just report the standardized version. The standardized versions agree with each other to the 5th decimal. They do not agree with the raw alpha, indicating that the items differ in their variance.
Things become a little more complicated if some of the items should be reverse scored. alpha
will provide a warning if items should be reversed, but will not reverse items unless you ask. splitHalf
warns and reverses, omega
just reverses (and indicates this with a signed loading) but does not warn. guttman
neither warns nor does it reverse (and has been deprecated).
a2 <- alpha(bfi[1:5]) #warning because one item is bad and should be reversed
## Warning in alpha(bfi[1:5]): Some items were negatively correlated with the total scale and probably
## should be reversed.
## To do this, run the function again with the 'check.keys=TRUE' option
## Some items ( A1 ) were negatively correlated with the total scale and
## probably should be reversed.
## To do this, run the function again with the 'check.keys=TRUE' option
print(a2$total,digits=6) #show just the alpha stats
## raw_alpha std.alpha G6(smc) average_r S/N ase mean sd
## 0.431456 0.459819 0.533169 0.145479 0.851232 0.0162882 4.21673 0.736851
a3 <- alpha(bfi[1:5],check.keys=TRUE) #this reverses 1 item
## Warning in alpha(bfi[1:5], check.keys = TRUE): Some items were negatively correlated with total scale and were automatically reversed.
## This is indicated by a negative sign for the variable name.
print(a3$total,digits=3)
## raw_alpha std.alpha G6(smc) average_r S/N ase mean sd
## 0.703 0.713 0.683 0.332 2.48 0.00895 4.65 0.898
o2 <- omega(bfi[1:5],2,plot=FALSE) #we just want alpha
##
## Three factors are required for identification -- general factor loadings set to be equal.
## Proceed with caution.
## Think about redoing the analysis with alternative values of the 'option' setting.
print(o2$alpha)#print the alpha from omega
## [1] 0.7126594
sp <- splitHalf(bfi[1:5])
## Warning in splitHalf(bfi[1:5]): Some items were negatively correlated with total scale and were
## automatically reversed.
print(sp$alpha,digits=6)
## [1] 0.713029
rbfi <- reverse.code("A1",bfi[1:5]) #reverse code A1
rgut <- guttman(rbfi) #note that Guttman has been deprecated
## Warning: Guttman has been deprecated. The use of the splitHalf function is recommended
print(rgut$lambda.3,digits=6)
## [1] 0.712659