Thresholds in dichotomous models

1,547 views
Skip to first unread message

robin ghertner

unread,
Feb 10, 2013, 8:27:22 PM2/10/13
to lav...@googlegroups.com
I am new to Lavaan, and have basic experience with SEM (primarily in a CFA context). I'm running CFA models to validate psychometric assessments, where all assessment items are dichotomous.

My question refers to how to use the estimated thresholds. I have seen the post explaining thresholds for ordinal models, and read http://www.gllamm.org/SEMcat.pdf. I understand what thresholds are, but I'm not sure how to use them to evaluate my models. Any suggestions?

Robin

Sunthud Pornprasertmanit

unread,
Feb 10, 2013, 9:17:46 PM2/10/13
to lav...@googlegroups.com
Hi,

I am not sure whether you have the questions on the concept of thresholds or how to use lavaan for categorical CFA. For using categorical CFA in lavaan, here is a simple example:

library(psych)
library(lavaan)

summary(iqitems)

model <- "
reason =~ reason.4 + reason.16 + reason.17 + reason.19
"

out <- cfa(model, data=iqitems, ordered=c("reason.4", "reason.16", "reason.17", "reason.19"))
summary(out)

The ordered argument can be used to specify the name of ordered categorical variables. You may use the 'ordered' function on the variables in the data set to change the type of variables to the ordered format and lavaan will know that those variables are ordered categorical.

You may read further materials from this link:

http://users.ugent.be/~yrosseel/lavaan/AlexBeaujean.pdf

which is Alex Beaujean lecture. He has a section on categorical CFA on Slides 346-384. You may find it helpful.



Robin

--
You received this message because you are subscribed to the Google Groups "lavaan" group.
To unsubscribe from this group and stop receiving emails from it, send an email to lavaan+un...@googlegroups.com.
To post to this group, send email to lav...@googlegroups.com.
Visit this group at http://groups.google.com/group/lavaan?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Alexander Beaujean

unread,
Feb 11, 2013, 1:52:36 AM2/11/13
to lav...@googlegroups.com
For a single group model with dichotomous indicators, I find their main (evaluative) use to be in instrument development/refinement to see if they are spanning the desired range. For example, if you are using a test of individual differences, there should be a be large range of threshold values. If you are using a criterion-referenced test, you'd probably want them clustered around the cut-off. To the best of my knowledge, there are no fit indices that are functions of only model thresholds.

Best,

Alex 

robin ghertner

unread,
Feb 12, 2013, 7:18:27 AM2/12/13
to lav...@googlegroups.com
Thanks for the responses.

Alex, so you interpret the thresholds like you would Rasch item difficulties? In that case, I suppose one would expect there to be alignment between difficulties and the thresholds.

Robin

Alexander Beaujean

unread,
Feb 13, 2013, 2:43:56 AM2/13/13
to lav...@googlegroups.com
Yes. 

This is a nice overview article:
Kamata, A., & Bauer, D. J. (2008). A note on the relation between factor analytic and item response theory models. Structural Equation Modeling: A Multidisciplinary Journal, 15(1), 136 - 153. doi: 10.1080/10705510701758406

This is a more complete presentation:
Bock, R. D., & Moustaki, I. (2006). Item response theory in a general framework. In C. R. Rao & S. Sinharay (Eds.), Handbook of Statistics (Vol. 26, pp. 469-513): Elsevier.

Best,

Alex

robin ghertner

unread,
Oct 2, 2013, 2:45:26 PM10/2/13
to lav...@googlegroups.com
I'm exploring Rasch and binary CFA to understand how they align. For Rasch modeling, I use Winsteps. I planned on doing two things:
- Running a congeneric (i.e. unequal loadings) CFA and comparing the loadings to the estimated discrimination parameters from Winsteps (even though it's a Rasch model, Winsteps still estimates a discrimination parameter to test for fit, see: http://www.winsteps.com/winman/index.htm?discrim.htm)
- Running a tau-equivalent model (i.e. equal loadings), and setting factor variance=1. Compare the estimated thresholds to the Rasch estimated item difficulties.

So far I've got three issues. First, the discrimination parameters from Winsteps don't align well with the factor loadings, and have a negative correlation (-0.12). I know some difference will be due to the estimator (lavaan uses WLS while I think Winsteps uses JMLE), but these results seem way too far off.

Second, the thresholds and Rasch measures also don't align, with correlation of 0.24.

The third issue I've had, which may be the reason for the second, is that when I fix my loadings to be equal, all of a sudden the common loading is negative, when none of the unconstrained loadings were negative.

Something seems really off here. My lavaan syntax is:

Unconstrained loadings:

x<-"
dt=~
LDPAR614+
LDPAR702+
LDPAR613+
LDPAR720+
LDPAR773+
LDPAR694+
LDPAR697+
LDPAR716+
LDPAR691+
LDPAR771
"

Constained loadings:
x<-"
dt=~
LDPAR614+
equal('dt=~LDPAR614')*LDPAR702+
equal('dt=~LDPAR614')*LDPAR613+
equal('dt=~LDPAR614')*LDPAR720+
equal('dt=~LDPAR614')*LDPAR773+
equal('dt=~LDPAR614')*LDPAR694+
equal('dt=~LDPAR614')*LDPAR697+
equal('dt=~LDPAR614')*LDPAR716+
equal('dt=~LDPAR614')*LDPAR691+
equal('dt=~LDPAR614')*LDPAR771
"

Model command:
fit<-cfa(x,data=comp_scored,std.lv = TRUE,ordered=c(
    'LDPAR702',
    'LDPAR614',
    'LDPAR613',
    'LDPAR720',
    'LDPAR773',
    'LDPAR694',
    'LDPAR697',
    'LDPAR716',
    'LDPAR691',
    'LDPAR771')
)

robin ghertner

unread,
Oct 3, 2013, 1:51:41 AM10/3/13
to lav...@googlegroups.com
I think I figured it out - it had nothing to do with Lavaan, but something screwed up in my Winsteps code. Please ignore this message.

yrosseel

unread,
Oct 3, 2013, 4:34:07 AM10/3/13
to lav...@googlegroups.com
On 10/02/2013 08:45 PM, robin ghertner wrote:

> Constained loadings:
> x<-"
> dt=~
> LDPAR614+
> equal('dt=~LDPAR614')*LDPAR702+
> equal('dt=~LDPAR614')*LDPAR613+
> equal('dt=~LDPAR614')*LDPAR720+
> equal('dt=~LDPAR614')*LDPAR773+
> equal('dt=~LDPAR614')*LDPAR694+
> equal('dt=~LDPAR614')*LDPAR697+
> equal('dt=~LDPAR614')*LDPAR716+
> equal('dt=~LDPAR614')*LDPAR691+
> equal('dt=~LDPAR614')*LDPAR771
> "

Just a remark: the 'equal()*' modifier can still be used, but it is much
easier to use labels; equal labels imply equal parameter values, eg:

x <- '
dt =~ a*LDPAR614 +
a*LDPAR702 +
a*LDPAR613 +
a*DPAR720 +
a*LDPAR773 +
a*LDPAR694 +
a*LDPAR697 +
a*LDPAR716 +
a*LDPAR691 +
a*LDPAR771
'

(and not the single quotes instead of the double quotes, although the
latter will work too in most circumstances).

Yves.

Robin G

unread,
Oct 3, 2013, 9:53:42 PM10/3/13
to lav...@googlegroups.com
Thanks! These tips are always helpful.




--
You received this message because you are subscribed to a topic in the Google Groups "lavaan" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/lavaan/hQA4wfCYvnQ/unsubscribe.
To unsubscribe from this group and all its topics, send an email to lavaan+unsubscribe@googlegroups.com.

To post to this group, send email to lav...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages