The greatest lower bound solves the ``educational testing problem". That is, what is the reliability of a test? (See guttman for a discussion of the problem). Although there are many estimates of a test reliability (Guttman, 1945) most underestimate the true reliability of a test.
For a given covariance matrix of items, C, the function finds the greatest lower bound to reliability of the total score using the csdp function from the Rcsdp package.
Cov: A p * p covariance matrix. Positive definiteness is not checked.
LoBounds: A vector L=(l1...lp) of length p with lower bounds to the diagonal elements xi. The default l=(0, . . . , 0) does not imply any constraint, because positive semidefiniteness of the matrix C0+Diag(x) implies 0≤xi.
UpBounds: A vector u =(u1, . . . , up) of length p with upper bounds to the diagonal elements xi. The default is u = v.
Details
If C is a p * p-covariance matrix, v = diag(C) its diagonal (i. e. the vector of variances vi=cii), C0=C−Diag(v) is the covariance matrix with 0s substituted in the diagonal and x = the vector (x1,...,xp) the educational testing problem is (see e. g., Al-Homidan 2008)
i=1∑pxi→min(Sumi=1topxi)−>min
s.t.
C~+Diag(x)≥0C0+Diag(x)>=0
(i.e. positive semidefinite) and xi≤vi,i=1...,p. This is the same as minimizing the trace of the symmetric matrix
Additionally, function glb.algebraic allows the user to change the upper bounds xi≤vi to xi≤ui and add lower bounds li≤xi.
The greatest lower bound to reliability is applicable for tests with non-homogeneous items. It gives a sharp lower bound to the reliability of the total test score.
Caution: Though glb.algebraic gives exact lower bounds for exact covariance matrices, the estimates from empirical matrices may be strongly biased upwards for small and medium sample sizes.
glb.algebraic is wrapper for a call to function csdp of package Rcsdp (see its documentation).
If Cov is the covariance matrix of subtests/items with known lower bounds, rel, to their reliabilities (e. g. Cronbachs α), LoBounds can be used to improve the lower bound to reliability by setting LoBounds <- rel*diag(Cov).
Changing UpBounds can be used to relax constraints xi≤vi or to fix xi-values by setting LoBounds[i] < -z; UpBounds[i] <- z.
Returns
glb: The algebraic greatest lower bound
solution: The vector x of the solution of the semidefinite program. These are the elements on the diagonal of C.
status: Status of the solution. See documentation of csdp in package Rcsdp. If status is 2 or greater or equal than 4, no glb and solution is returned. If status is not 0, a warning message is generated.
Call: The calling string
References
Al-Homidan S (2008). Semidefinite programming for the educational testing problem. Central European Journal of Operations Research, 16:239-249.
Bentler PM (1972) A lower-bound method for the dimension-free measurement of internal consistency. Soc Sci Res 1:343-357.
Fletcher R (1981) A nonlinear programming problem in statistics (educational testing). SIAM J Sci Stat Comput 2:257-267.
Shapiro A, ten Berge JMF (2000). The asymptotic bias of minimum trace factor analysis, with applications to the greatest lower bound to reliability. Psychometrika, 65:413-425.
ten Berge, Socan G (2004). The greatest bound to reliability of a test and the hypothesis of unidimensionality. Psychometrika, 69:613-625.
Author(s)
Andreas Moltner
Center of Excellence for Assessment in Medicine/Baden-Wurttemberg
For an alternative estimate of the greatest lower bound, see glb.fa. For multiple estimates of reliablity, see guttman
Examples
Cv<-matrix(c(215,64,33,22,64,97,57,25,33,57,103,36,22,25,36,77),ncol=4)Cv # covariance matrix of a test with 4 subtestsCr<-cov2cor(Cv)# Correlation matrix of testsif(!require(Rcsdp)){print("Rcsdp must be installed to find the glb.algebraic")}else{ glb.algebraic(Cv)# glb of total scoreglb.algebraic(Cr)# glb of sum of standardized scores w<-c(1,2,2,1)# glb of weighted total score glb.algebraic(diag(w)%*% Cv %*% diag(w))alphas <- c(0.8,0,0,0)# Internal consistency of first test is knownglb.algebraic(Cv,LoBounds=alphas*diag(Cv))# Fix all diagonal elements to 1 but the first:lb <- glb.algebraic(Cr,LoBounds=c(0,1,1,1),UpBounds=c(1,1,1,1))lb$solution[1]# should be the same as the squared mult. corr.smc(Cr)[1]}