[This question is modified based on suggestion from @ttnphns]
I am doing linear principal component analysis (PCA) based on polychoric correlations between the variables (rather than on native Pearson correlations between them). I want to compute component scores from my analysis.
I found that the component scores calculated from orthogonal rotation (i.e. with the help of eigenvectors) based on polychoric correlations are correlated (I expect components should not correlate!).
After discussing with @ttnphns, it seems that using the eigenvectors or the loadings extracted from polychoric (or tetrachoric) correlations cannot give me proper component scores - when used the usual way as it is done in PCA. Because those correlations are inferred correlations and are not Pearson correlations directly computable from the variables. There is no "direct connection" on the level of individual values between my ordinal variables and the polychoric correlations. That makes computation of proper component scores a problem. So how to compute the component scores?
The code of my analysis in R
:
Save the polychoric correlation into polycorC1
polycorC1<- polychoric(C1C_fa_[,c(1:3,5:14)])
Use the polycorC1 to run a PCA using varimax (factor = 2 as recommended by parallel analysis)
C1Cpca <- principal(polycorC1$rho, nfactor= 2, n.obs=nrow(na.omit(C1C_fa_)) , rotate='varimax', residuals=TRUE)
Calculated the component scores using matrix multiplication with the loadings from the PCA
C1C_fa_Com<- as.matrix(scale(C1C_fa_[,c(1:3,5:14)]))%*%t(pracma::pinv(C1Cpca$loadings[,1:2])
The below are the data sample I used
> polycorC1
Call: polychoric(x = C1C_fa_[, c(1:3, 5:14)])
Polychoric correlations
C01 C02 C03 C05 C06 C07 C08 C09 C10 C11 C12 C13 C14
C01 1.00
C02 0.84 1.00
C03 0.76 0.85 1.00
C05 0.56 0.65 0.69 1.00
C06 -0.30 -0.20 -0.10 -0.05 1.00
C07 -0.35 -0.41 -0.42 -0.48 0.35 1.00
C08 0.46 0.48 0.43 0.30 -0.55 -0.65 1.00
C09 -0.16 0.12 0.18 -0.23 0.58 0.49 -0.46 1.00
C10 -0.28 -0.11 -0.04 -0.11 0.63 0.53 -0.61 0.69 1.00
C11 -0.24 -0.23 -0.20 -0.28 0.45 0.55 -0.66 0.53 0.54 1.00
C12 -0.21 -0.12 -0.11 -0.13 0.52 0.61 -0.64 0.66 0.66 0.54 1.00
C13 -0.25 -0.39 -0.42 -0.43 0.32 0.65 -0.61 0.41 0.43 0.47 0.55 1.00
C14 -0.49 -0.54 -0.51 -0.54 0.25 0.49 -0.42 0.33 0.34 0.53 0.30 0.52 1.00
with tau of
1 2 3 4
C01 -0.568 -0.205 0.94 1.52
C02 0.044 0.205 1.26 1.74
C03 0.176 0.205 1.68 2.11
C05 -0.621 -0.250 1.81 2.27
C06 -1.991 -0.638 1.19 1.19
C07 -1.743 0.468 0.98 Inf
C08 -0.871 0.058 1.36 Inf
C09 -1.680 -0.058 1.03 1.03
C10 -1.813 -1.007 0.98 0.98
C11 -1.991 -1.224 0.42 0.64
C12 -2.110 -1.031 0.50 0.83
C13 -2.523 -1.322 0.33 0.45
C14 -2.110 -1.571 0.47 0.59
> head(C1C_fa_[,c(1:3,5:14)])
C01 C02 C03 C05 C06 C07 C08 C09 C10
1 3 3 3 2 2 3 3 3 3
2 1 1 1 1 2 2 4 2 2
3 3 3 4 3 3 3 1 3 5
4 1 1 1 1 5 5 1 5 5
5 3 1 1 3 2 3 4 1 1
6 2 1 1 2 3 4 2 3 3
C11 C12 C13 C14
1 2 2 3 3
2 2 2 3 5
3 5 5 4 3
4 5 5 5 5
5 3 2 2 2
6 5 5 5 5
> C1Cpca$loadings[,1:2]
RC1 RC2
C01 -0.16661714 0.81706044
C02 -0.03981366 0.93794572
C03 0.01248097 0.94517952
C05 -0.12835191 0.78302564
C06 0.71467993 -0.07219318
C07 0.66413675 -0.45425580
C08 -0.72581724 0.43025104
C09 0.85410423 0.10239328
C10 0.85163361 -0.04177471
C11 0.72659138 -0.24209655
C12 0.84231783 -0.07579838
C13 0.59548110 -0.44222574
C14 0.39604549 -0.62564654
> head(C1C_fa_Com)
C_RC1 C_RC2
1 11.635377 5.7926567
2 9.848028 -0.8181452
3 20.691296 5.1087066
4 27.176833 -5.3445258
5 7.159462 3.9442215
6 20.651074 -2.8367836