1 / 35

Confirmatory Factor Analysis Using OpenMx & R

Confirmatory Factor Analysis Using OpenMx & R. (CFA ) Practical Session Timothy C. Bates. Confirmatory Factor Analysis to test theory. Are there 5 independent domains of personality? Do domains have facets? Is Locus of control the same as primary control?

kinsey
Download Presentation

Confirmatory Factor Analysis Using OpenMx & R

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Confirmatory Factor AnalysisUsing OpenMx & R (CFA) Practical SessionTimothy C. Bates

  2. Confirmatory Factor Analysisto test theory • Are there 5 independent domains of personality? • Do domains have facets? • Is Locus of control the same as primary control? • Is prosociality one thing , or three? • Is Grit independent of Conscientiousness?

  3. Prosocial Obligations • Prosociality covers several domains, e.g. • Workplace: voluntary overtime • Civic life: Giving evidence in court • Welfare of others: paying for other’s healthcare • CFA can test the fit of theories • Which hypothesised model fits best? • 3 indicators of one factor? • 3 correlated factors? • 3 independent factors?

  4. Factor structure of Prosociality • Distinct domains? Work Civic Welfare Work1 Work 2 Work 3 Civic 1 Civic 2 Civic 3 Welfare 1 Welfare 2 Welfare 3

  5. Factor structure of Prosociality • One underlying prosociality factor? Prosociality Work1 Work 2 Work 3 Civic 1 Civic 2 Civic 3 Welfare 1 Welfare 2 Welfare 3

  6. Factor structure of Prosociality • Hierarchical structure: Common and distinct factors? Prosociality Work Civic Welfare Work1 Work 2 Work 3 Civic 1 Civic 2 Civic 3 Welfare 1 Welfare 2 Welfare 3

  7. Note: These last two models are equivalent! Work Civic Welfare Work1 Work 2 Work 3 Civic 1 Civic 2 Civic 3 Welfare 1 Welfare 2 Welfare 3

  8. CFA with R & OpenMx • library(OpenMx) • What is OpenMx? • “OpenMx is free and open source software for use with R that allows estimation of a wide variety of advanced multivariate statistical models.” • Homepage: http://openmx.psyc.virginia.edu/ • # library(sem)

  9. Our data • Dataset: Midlife Study of Well-Being in the US (Midus) • Prosocial obligations - c. 1000 individuals • How much obligation do you feel… • to testify in court about an accident you witnessed?’ [civic] • to do more than most people would do on your kind of job?’ [work] • to pay more for your healthcare so that everyone had access to healthcare? [welfare]

  10. Preparatory code First we need to load OpenMx require(OpenMx) Now lets get the data (R can read data off the web) myData= read.csv("http://www.subjectpool.com/prosocial_data.csv") ? What are the names in the data? summary(myData) # We have some NAs myData= na.omit(myData) # imputation is another solution summary(myData)

  11. Core OpenMx functions • mxModel() • this will contain all the objects in our model • mxPath(): each path in our model • mxData(): the data for the model • mxRun() • Generate parameter estimates by sending the model to an optimizer • Returns a fitted model

  12. CFA on our competing models • Three competing models to test today: • One general factor • Three uncorrelated factors • Three correlated factors

  13. Model 1: One general factor Prosociality Work1 Work 2 Work 3 Civic 1 Civic 2 Civic 3 Welfare 1 Welfare 2 Welfare 3

  14. Quite a bit more code than you have used before: • We’ll go through it step-by-step

  15. Model 1 – Step 1 # Get set up latents = "F1” manifests = names(myData) observedCov = cov(myData) numSubjects= nrow(myData) # Create a model using the mxModel function cfa1<- mxModel("Common Factor Model”, type="RAM”,

  16. Model 1 – Step 2 # Here we set the measured and latent variables manifestVars= manifests, latentVars = latents,

  17. Model 1 – Step 3 # Create residual variance for manifest variables using mxPath mxPath( from=manifests, arrows=2, free=T, values=1, labels=paste("error”, 1:9, sep=“”)), # using mxPath, fix the latent factor variance to 1 mxPath( from="F1", arrows=2, free=F, values=1, labels ="varF1”), # Using mxPath, specify the factor loadings mxPath(from="F1”, to=manifests, arrows=1, free=T, values=1, labels =paste(”l”, 1:9, sep=“”)),

  18. Model 1 – Step 4 # Give mxData the covariance matrix of ‘data2’ for analysis mxData(observed=observedCov , type="cov", numObs=numSubjects) # make sure your last statement DOESN’T have a comma after it )# Close model

  19. Model 1 – Run the model # The mxRun function fits the model cfa1<- mxRun(cfa1) # Lets see the summary output summary(cfa1) # What is in a model? slotNames(cfa1@output) names(cfa1@output)

  20. Summary Output # Ideally, chi-square should be non-significant chi-square: 564.41; p: < .001 # Lower is better for AIC and BIC AIC (Mx): 510.41 BIC (Mx): 191.47 # < .06 is good fit: This model is a bad fit RMSEA: 0.15

  21. Story so far… • Model 1 (one common factor) is a poor fit to the data)

  22. Model 2 Work Civic Welfare Work1 Work 2 Work 3 Civic 1 Civic 2 Civic 3 Welfare 1 Welfare 2 Welfare 3

  23. Model 2 – Step 1 # Create a model using the mxModel function cfa3<-mxModel("Three Distinct Factors Model Path Specification", type="RAM",

  24. Model 2 – Step 2 # Here we name the measured variables manifestVars=manifests, # Here we name the latent variable latentVars=c("F1","F2", "F3"),

  25. Model 2 – Step 3 # Create residual variance for manifest variables mxPath(from=manifests,arrows=2, free=T,values=1,labels=c("error”, 1:9, sep=“”)),

  26. Model 2 – Step 4 # Specify latent factor variances mxPath(from=c("F1","F2", "F3"), arrows=2,free=F, values=1, labels=c("varF1","varF2", "varF3") ),

  27. Model 2 – Step 5 # Fix the covariance between latent factors to zero (i.e. specify the factors as uncorrelated) mxPath( from="F1", to="F2", arrows=2, free=FALSE, values=0, labels="cov1” ),

  28. Model 2 – Step 6 mxPath(from="F1”,to="F3", arrows=2, free=F, values=0, labels="cov2"), mxPath(from="F2",to="F3", arrows=2, free=F, values=0, labels="cov3"),

  29. Model 2 – Step 7 # Specify the factor loading i.e. here we specify that F1 loads on work1, 2, and 3 mxPath( from="F1", to=c("work1","work2","work3"), arrows=1, free=T, values=1, labels=c("l1","l2","l3") ), mxPath( from="F2", to=c("civic1","civic2", "civic3"), arrows=1, free=T, values=1, labels=c("l4","l5", "l6") ),

  30. Model 2 – Step 8 mxPath( from="F3", to=c("welfare1", "welfare2", "welfare3"), arrows=1, free=T,values=1, labels=c("l7", "l8", "l9") ), # Use the covariance matrix of ‘myData’ for analysis mxData(observed=cov(myData), type="cov", numObs=nrow(myData)) ) # Close the model

  31. Model 2 – Run the model # The mxRun function fits the model threeDistinctFactorFit <- mxRun(threeDistinctfactorModel) # The following line will deliver a lot of output twoFactorFit@output # Lets see the summary output summary(threeDistinctFactorFit)

  32. Summary Output # Ideally, chi-square should be non-significant chi-square: 576.50; p: <.0001 # Lower is better for AIC and BIC AIC (Mx): 522.50 BIC (Mx): 197.51 # <.08 is a reasonable fit: This model is a poor fit RMSEA: 0.16

  33. Now your turn… Install OpenMx repos <- c('http://openmx.psyc.virginia.edu/testing/') If you have your laptop: install.packages('OpenMx', repos=repos) lib <- 'C:/workspace’ install.packages('OpenMx', repos=repos, lib=lib) library(OpenMx, lib=lib)

More Related