confirmatory factor analysis using openmx r
Download
Skip this Video
Download Presentation
Confirmatory Factor Analysis Using OpenMx & R

Loading in 2 Seconds...

play fullscreen
1 / 35

Confirmatory Factor Analysis Using OpenMx & R - PowerPoint PPT Presentation


  • 116 Views
  • Uploaded on

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?

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Confirmatory Factor Analysis Using OpenMx & R' - kinsey


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
confirmatory factor analysis using openmx r

Confirmatory Factor AnalysisUsing OpenMx & R

(CFA) Practical SessionTimothy C. Bates

confirmatory factor analysis to test theory
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?
prosocial obligations
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?
factor structure of prosociality
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

factor structure of prosociality1
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

factor structure of prosociality2
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

note these last two models are equivalent
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

cfa with r openmx
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)
our data
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]
preparatory code
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)

core openmx functions
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
cfa on our competing models
CFA on our competing models
  • Three competing models to test today:
    • One general factor
    • Three uncorrelated factors
    • Three correlated factors
model 1 one general factor
Model 1: One general factor

Prosociality

Work1

Work 2

Work 3

Civic

1

Civic

2

Civic 3

Welfare 1

Welfare 2

Welfare 3

slide14

Quite a bit more code than you have used before:

    • We’ll go through it step-by-step
model 1 step 1
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”,

model 1 step 2
Model 1 – Step 2

# Here we set the measured and latent variables

manifestVars= manifests,

latentVars = latents,

model 1 step 3
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=“”)),

model 1 step 4
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

model 1 run the model
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([email protected])

names([email protected])

summary output
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

story so far
Story so far…
  • Model 1 (one common factor) is a poor fit to the data)
model 2
Model 2

Work

Civic

Welfare

Work1

Work 2

Work 3

Civic

1

Civic

2

Civic 3

Welfare 1

Welfare 2

Welfare 3

model 2 step 1
Model 2 – Step 1

# Create a model using the mxModel function

cfa3<-mxModel("Three Distinct Factors Model Path Specification",

type="RAM",

model 2 step 2
Model 2 – Step 2

# Here we name the measured variables

manifestVars=manifests,

# Here we name the latent variable

latentVars=c("F1","F2", "F3"),

model 2 step 3
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=“”)),

model 2 step 4
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")

),

model 2 step 5
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”

),

model 2 step 6
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"),

model 2 step 7
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")

),

model 2 step 8
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

model 2 run the model
Model 2 – Run the model

# The mxRun function fits the model

threeDistinctFactorFit <- mxRun(threeDistinctfactorModel)

# The following line will deliver a lot of output

[email protected]

# Lets see the summary output

summary(threeDistinctFactorFit)

summary output1
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

now your turn
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)

ad