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

Re: st: CR and AVE for factor analysis with 2 factors

 From Nick Cox <[email protected]> To "[email protected]" <[email protected]> Subject Re: st: CR and AVE for factor analysis with 2 factors Date Mon, 28 Oct 2013 16:36:34 +0000

```Your missing value is presumably the result of taking the square root
of a negative number. Is at least one of your communalities reported
as negative?

That aside you have segments like

gen nvar = e(df_m)
gen sum_factors=0
local i=1
while `i' <= nvar {
replace sum_factors = sum_factors + sqrt(communalities[`i',1])
local i=`i'+1
}

You can simplify this. First, to hold constants, use locals or
scalars, not variables. Second, use -forval- to loop here:

local nvar = e(df_m)
local sum_factors = 0
forval i = 1/`nvar' {
local sum_factors = `sum_factors'  + sqrt(communalities[`i',1]
}

Third, use Mata instead. Here is a self-contained example:

. matrix foo = (1,2,3,4)

. mata : st_numscalar("sum_factors", sum(sqrt(st_matrix("foo"))))

. scalar li
sum_factors =  6.1462644

However, none of these tricks can get round what appears to be your problem.

Nick
[email protected]

On 28 October 2013 14:11, Florian Christian Esser
<[email protected]> wrote:
> Hi everyone,
>
> I am trying to do factor analysis in order to measure two strategy
> constructs. I have 6 indicators that load on these two constructs. Now I
> want to calculate composite reliability (CR) and average variance
> extracted(AVE).
> I use the following code (here for CR):
> ___________________________________________________________________
> factor zwmdiff_1 zwpdiff_1 zwpdiff_2 zwcost_1 zwcost_2 zwcost_3, pcf
> matrix list e(Psi)
> matrix list e(L)
> matrix psi = e(Psi)'
> matrix communalities = J(rowsof(psi),1,1)
> matrix communalities = communalities - psi
> matrix colnames communalities = communalities
> matrix list communalities
> gen nvar = e(df_m)
> gen sum_factors=0
> local i=1
> while `i' <= nvar {
> replace sum_factors = sum_factors + sqrt(communalities[`i',1])
> local i=`i'+1
> }
> generate sum_psi=0
> local i=1
> while `i' <= nvar {
> replace sum_psi = sum_psi + psi[`i',1]
> local i=`i'+1
> }
> gen cr=(sum_factors*sum_factors)/((sum_factors*sum_factors)+sum_psi)
> drop nvar
> drop sum_factors
> drop sum_psi
> list cr in 1
> _________________________________________________________________
>
> The problem is that once the local macro starts running it tells me:
> _____________________________
> [...]
> (534 real changes made, 534 to missing)
> [...]
> ___________________________
>
> and accordingly there is an empty result for CR.
> If I add "factors(1)" in the command line above, I get a result, but I
> since I have two factors, I think it is not correct to do this.
>
> Does anyone know what to do here?
>
> Thanks a lot in advance.
>
> *
> *   For searches and help try:
> *   http://www.stata.com/help.cgi?search
> *   http://www.stata.com/support/faqs/resources/statalist-faq/
> *   http://www.ats.ucla.edu/stat/stata/
*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/faqs/resources/statalist-faq/
*   http://www.ats.ucla.edu/stat/stata/
```