[R] How to calculate KMO?

G. Jay Kerns gkerns at ysu.edu
Wed Sep 30 16:38:21 CEST 2009


Dear Moumita,



On Wed, Sep 30, 2009 at 10:03 AM, Moumita Das
<das.moumita.online at gmail.com> wrote:
> Hi All,
> How do i calculate KMO for a dataset?
>
> *Dataset:---------------------*
>
>    m1 m2 m3 m4 m5 m6 m7 m8
> 1       2 20 20  2  1  4 14 12
> 2       9 16  3  5  2  5  5 15
> 3      18 18 18 13 17  9  2  4
> 4       7  7  2 12  2 11 11 11
> 5       7  8  5 19  5  2 20 18
> 6       7  4  7  4  7  9  3  3
> 7       5  5  5 12  5 13 13 12
> 8       6  6  4  3  5 17 17 16
> 9      12 12  4  2  4  4 14 14
> 10      5 14  6 19  6  2 20 20
> 11     13 13 13 20 10 10 10  9
> 12      3  3  3 11  6 15 15 12
> 13      2  2  2  7  5  5  6 16
> 14     11 11 10  4 10 10 10 10
> 15      1  1  1  8  4 16 16 17
> 16     23 23  3  4  3  3  3  3
> 17      4  4  6  9  8 17  8 18
> 18      8  8  5  9  7  7  7  9
> 19      6  7  8  3  8  4  4  7
> 20      8 11  9  3  2  2  2  3
>
> **
> *SPSS results for the above dataset:--------*
>
> Kaiser-Meyer-Olkin Measure of Sampling Adequacy.(KMO)
> 0.350911931549742
>
> *Got a R-function:-----* (
> http://www.opensubscriber.com/message/r-help@stat.math.ethz.ch/2776549.html)
> kmo.test <- function(df){
> ###
> ## Calculate the Kaiser-Meyer-Olkin Measure of Sampling Adequacy.
> ## Input should be a data frame or matrix, output is the KMO statistic.
> ## Formula derived from Hutcheson et al, 1999,
> ## "The multivariate social scientist," page 224, ISBN 0761952012
> ## see <http://www2.chass.ncsu.edu/garson/pa765/hutcheson.htm><http://www2.chass.ncsu.edu/garson/pa765/hutcheson.htm%3E>
> ###
> cor.sq = cor(df)^2
> cor.sumsq = (sum(cor.sq)-dim(cor.sq)[1])/2
> library(corpcor)
> pcor.sq = cor2pcor(cor(df))^2
> pcor.sumsq = (sum(pcor.sq)-dim(pcor.sq)[1])/2
> kmo = sus.cor.ss/(sus.cor.ss+sus.pcor.ss)
> return(kmo)
> }
>
> What is this object "*sus.cor.ss*"?I get errors
>> sus.cor.ss
> Error: object "sus.cor.ss" not found
>
>
> Thanks in advance
> Moumita
>


I gave the solution to this in the next message in the thread:

http://www.opensubscriber.com/message/r-help@stat.math.ethz.ch/7315408.html

If you simply copy-paste the function I wrote there into your R
session it gives the same answer as SPSS;  I just checked it myself.

This may save you some time:

D <-
structure(list(m1 = c(2L, 9L, 18L, 7L, 7L, 7L, 5L, 6L, 12L, 5L,
13L, 3L, 2L, 11L, 1L, 23L, 4L, 8L, 6L, 8L), m2 = c(20L, 16L,
18L, 7L, 8L, 4L, 5L, 6L, 12L, 14L, 13L, 3L, 2L, 11L, 1L, 23L,
4L, 8L, 7L, 11L), m3 = c(20L, 3L, 18L, 2L, 5L, 7L, 5L, 4L, 4L,
6L, 13L, 3L, 2L, 10L, 1L, 3L, 6L, 5L, 8L, 9L), m4 = c(2L, 5L,
13L, 12L, 19L, 4L, 12L, 3L, 2L, 19L, 20L, 11L, 7L, 4L, 8L, 4L,
9L, 9L, 3L, 3L), m5 = c(1L, 2L, 17L, 2L, 5L, 7L, 5L, 5L, 4L,
6L, 10L, 6L, 5L, 10L, 4L, 3L, 8L, 7L, 8L, 2L), m6 = c(4L, 5L,
9L, 11L, 2L, 9L, 13L, 17L, 4L, 2L, 10L, 15L, 5L, 10L, 16L, 3L,
17L, 7L, 4L, 2L), m7 = c(14L, 5L, 2L, 11L, 20L, 3L, 13L, 17L,
14L, 20L, 10L, 15L, 6L, 10L, 16L, 3L, 8L, 7L, 4L, 2L), m8 = c(12L,
15L, 4L, 11L, 18L, 3L, 12L, 16L, 14L, 20L, 9L, 12L, 16L, 10L,
17L, 3L, 18L, 9L, 7L, 3L)), .Names = c("m1", "m2", "m3", "m4",
"m5", "m6", "m7", "m8"), class = "data.frame", row.names = c(NA,
-20L))

kmo(D)



HTH,
Jay



***************************************************
G. Jay Kerns, Ph.D.
Associate Professor
Department of Mathematics & Statistics
Youngstown State University
Youngstown, OH 44555-0002 USA
Office: 1035 Cushwa Hall
Phone: (330) 941-3310 Office (voice mail)
-3302 Department
-3170 FAX
VoIP: gjkerns at ekiga.net
E-mail: gkerns at ysu.edu
http://people.ysu.edu/~gkerns/




More information about the R-help mailing list