# [R] nearest correlation to polychoric

William Revelle lists at revelle.net
Sat Jul 14 00:31:10 CEST 2007

```Jens,
An alternative solution to the improper matrix
problem is to do a principal factor solution
rather than a maximum likelihood  factor analysis
solution.   In the following discussion, I am
using the factor.pa  (principal factor) function
from my psych package.

pr <- structure(c(1, 0.477, 0.644, 0.478, 0.651, 0.826, 0.477, 1, 0.516,
0.233, 0.682, 0.75, 0.644, 0.516, 1, 0.599, 0.581, 0.742, 0.478,
0.233, 0.599, 1, 0.741, 0.8, 0.651, 0.682, 0.581, 0.741, 1, 0.798,
0.826, 0.75, 0.742, 0.8, 0.798, 1), .Dim = c(6, 6))

I did a factor.pa(pr,2) and got

PA1  PA2
[1,] 0.52 0.54
[2,] 0.13 0.92
[3,] 0.56 0.49
[4,] 0.97 0.11
[5,] 0.63 0.58
[6,] 0.73 0.70

PA1   PA2
Proportion Var 0.412 0.369
Cumulative Var 0.412 0.781

This compares to a factanal solution on the nearcor solution
nr <- nearcor(pr)\$cor
f2 <- factanal(cov=nr, factors=2)

Factor1 Factor2
[1,] 0.735   0.388
[2,] 0.868   0.123
[3,] 0.534   0.523
[4,] 0.151   0.986
[5,] 0.508   0.660
[6,] 0.740   0.669

Factor1 Factor2
Proportion Var   0.401   0.382
Cumulative Var   0.401   0.784

The factor congruence of the two solutions is

round(factor.congruence(f2,p2),2)
PA1  PA2
Factor1 0.74 0.99
Factor2 1.00 0.68

However, when I do the same analysis on your
second demo set, in one run I got a Haywood case
for the principal factors.
f2 <- factor.pa(hcor,2,n.obs=400)

PA1   PA2
x1        0.87
x2        0.65
x3 -0.10  0.64
x4        0.56
y1  0.51
y2  0.63
y3  0.78
y4  1.13

PA1   PA2
Proportion Var 0.32 0.240
Cumulative Var 0.32 0.560

but not for the factanal of the nearcor solution for the hcor problem:
ncor <- nearcor(hcor)\$cor
m2 <- factanal(covmat=ncor,factors=2,n.obs=400)

Factor1 Factor2
[1,]          0.899
[2,] -0.168   0.569
[3,]          0.647
[4,]          0.583
[5,]  0.468
[6,]  0.683
[7,]  0.877  -0.100
[8,]  0.997

Factor1 Factor2
Proportion Var   0.311   0.238
Cumulative Var   0.311   0.549

However, once again, the factor congruence coefficients are very good:

round(factor.congruence(m2,f2),2)
PA1   PA2
Factor1  0.99 -0.09
Factor2 -0.09  1.00

Then, I did a number of runs comparing principal
axes to the hetcor data (what you call hcor),
factanal  to the original data ( what you call
xcor, and factanal solutions to the nearcor
solution (ncor).  The general pattern is that
principal axes of the polychoric (hcor) matrix
tends to match the factanal solutions to the
original data better than factanal of the nearcor
matrix does the original matrix.

round(factor.congruence(f2,n2),2)   #compare
principal axes to mle of nearcor solution
Factor1 Factor2
PA1    0.98    0.17
PA2    0.18    0.99
>        round(factor.congruence(f2,x2),2)
>#compare principal axes to mle of original data
Factor1 Factor2
PA1    0.92    0.07
PA2    0.10    0.95
>        round(factor.congruence(n2,x2),2)
>#compare mle of original to mle of nearcor
Factor1 Factor2
Factor1    0.92    0.02
Factor2    0.03    0.94

Thanks for posting the nearcor algorithm and function.

At 8:42 PM +0200 7/13/07, Jens Oehlschlägel wrote:
>Dimitris,
>
>Thanks a lot for the quick response with the
>pointer to posdefify. Using its logic as an
>afterburner to the algorithm of Higham seems to
>work.
>
>Martin,
>
>>  Jens, could you make your code (mentioned
>>below) available to the community, or even
>>donate to be included as a new method of
>>posdefify() ?
>
>Nice opportunity to give-back. Below is the R
>code for nearcor and .Rd help file. A quite
>natural place for nearcor would be John Fox'
>package polycor, what do you think?
>
>John?
>
>Best regards
>
>Jens Oehlschlägel

{nearcor function and help file deleted --- see original posting}

Bill

--
William Revelle		http://personality-project.org/revelle.html
Professor			http://personality-project.org/personality.html
Department of Psychology             http://www.wcas.northwestern.edu/psych/
Northwestern University	http://www.northwestern.edu/
Use R for statistics:                          http://personality-project.org/r

```