Bookmark and Share

Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: st: calculate alpha after polychoric factor analysis

From   "Joseph Coveney" <>
To   <>
Subject   Re: st: calculate alpha after polychoric factor analysis
Date   Wed, 15 Feb 2012 11:54:31 +0900

Seyi Soremekun wrote:

Thanks (and for the polychoric command itself). The sample size is not an issue
- all respondents answered all the questions, displaying -n- was just a check
for me  (if that is what you meant in your note?)
I'm not sure about the appropriateness of using alpha either, however, I know
that ordinal alphas are available in other types of software (Basto and Pereira
2012 J. Statistical Software 46(4)), and wondered if there was something I could
use in Stata. 
I was hoping that I could ask stata to calculate the alpha on the saved matrix
rather than a list of variables.


The Basto and Pereira article references Bruno D. Zumbo, Anne M. Gadermann and
Cornelia Zeisser, Ordinal Versions of Coefficients Alpha and Theta for Likert
Rating Scales. _Journal of Modern Applied Statistical Methods_ 6(1): 21--9,
2007), which in turn references earlier work for the formula it displays for
ordinal coefficient alpha.  If I've got the formula correctly implemented below,
then you can try something like what is illustrated.  It shouldn't be too
difficult to morph it into an ado-file, but you'd probably want to verify its
correctness with a couple of worked examples.

Joseph Coveney

version 11.2

set more off
set seed `=date("2012-02-14", "YMD")'
tempname C
matrix define `C' = I(4) * 0.45 + J(4, 4, 0.55)
drawnorm latent1 latent2 latent3 latent4, corr(`C') double n(100) clear
forvalues i = 1/4 {
	generate double u`i' = normal(latent`i')
	generate byte manifest`i' = 0
	quietly forvalues cut = 0.2(0.2)0.8 {
		replace manifest`i' = manifest`i' + 1 if u`i' > `cut'
polychoric manifest*
matrix define `C' = r(R)
factormat `C', n(100) factors(1)

tempname L Psi
matrix define `L' = e(L)
matrix define `Psi' = e(Psi)

local p = rowsof(`L')

tempname f f2 u2
scalar define `f' = 0
scalar define `f2' = 0
scalar define `u2' = 0
forvalues i = 1/`p' {
	scalar define `f' = `f' + `L'[`i', 1]
	scalar define `f2' = `f2' + `L'[`i', 1] * `L'[`i', 1]
	scalar define `u2' = `u2' + `Psi'[1, `i']
scalar define `f' = `f' / `p'
scalar define `f2' = `f2' / `p'
scalar define `u2' = `u2' / `p'

tempname pf2
scalar define `pf2' = `p' * `f' * `f'
scalar define alpha = `p' / (`p' - 1) * ///
	(`pf2' - `f2') / (`pf2' + `u2')

display in smcl as text "Ordinal alpha = " as result %06.4f alpha

alpha latent*
alpha manifest*, std


*   For searches and help try:

© Copyright 1996–2018 StataCorp LLC   |   Terms of use   |   Privacy   |   Contact us   |   Site index