Network psychometrics has become an alternative approach to factor analysis and item response theory in multiple fields of psychology and education, such as psychopathology, personality, measurement validation, and dimensionality determancy etc. However, individual scoring differences between psychometric network analysis and traditional psychometric modeling has not been well investigated. Some questions arise regarding individual scoring:

What will be individual scores in psychometric network analysis? Or, how can we evaluate the average level of each individuals?

If we can build individual scoring in psychometric network, what is the relationship between this scoring with factor scores.

How can we use this scoring method to evaluate measurement quality, such as reliability or validity?

To answer these questions, we first need to review how individuals are scored in factor analysis method and classical test theory. Borrowing the theoretical framework and purpose of factor scoring, we can construct the scoring method for psychometric network. Then, we can show that there are statistical relationship between network scores with factor scores. Thus, depending on the psychometric methods researchers use, they can be free to use either factor score or network score to report. They can also compute the other without constructing the other model.

Overall, the purpose of this post is to illustrate the definition, assumption, psychometric properties, usage, and interpretation of factor scores in Structural Equation Models (SEM), and how those features of factor scores compare to sum scores in Classical Test Theory (CTT). This post is inspired by Dr. Templinâ€™s 2022 presentation.

1 Definition of Test Score

In CTT, the test score is unit of analysis of the whole test, which can be statistically expressed as:

Y_{total} = T+e

Where Y_{total} denotes test scores, T denotes true score, and e denotes error. There are some assumptions:

Items are assumed exchangeable;

Expected value of e is 0;

Error e is expected to be uncorrelated with true score T

2 Scoring of Classical test theory

In classical test theory (CTT), the test score is construct as sum of item scores. CTT assumes that there is a true score exists that reflect the true ability of test takers and the observed sum scores of each individual is a combination of true score and random error.

Y_{total} = T + e

Where Y_{total} denotes a vector of observed sum scores of respondents, T denotes a vector of true scores of respondents, and e denotes the random error for respondents. True scores and random errors are independent.

2.1 CTT-based reliability

Multiple reliability coefficients have been proposed in previous literature. Each reliability has their advantages and disadvantages. Letâ€™s take the average iter-item correlation as one example. Average iter-item correlation is computed as the proportion of variance in the sum score that is due to variation in the latent trait or true score.

\text{Var}(T) is variance of true score and could be interpreted as variability in the latent trait in the context of factor analysis.

\text{Var}(e) is variance of error, and could be interpreted as measurement error

Mini example

Using a 10-item example with each having 1-5 scale.

Data Read-in

library(tidyverse)library(here)library(kableExtra)library(psych)dat_path<-'posts/2024-01-12-syllabus-adv-multivariate-esrm-6553/Lecture07/Code'conspiracy<-read.csv(here(dat_path, 'conspiracies.csv'))itemResp<-conspiracy|>select(starts_with('PolConsp'))conspiracy|>mutate(ID =1:177)|>pivot_longer(starts_with('PolConsp'), names_to ='Item', values_to ='Resp')|>mutate(Item =factor(Item, paste0('PolConsp', 1:10)))|>group_by(Item)|>summarise( Mean =mean(Resp), SD =sd(Resp), Min =min(Resp), Max =max(Resp), Skew =psych::skew(Resp))|>kable(digits =3)

Item

Mean

SD

Min

Max

Skew

PolConsp1

2.367

1.136

1

5

0.432

PolConsp2

1.955

1.112

1

5

1.050

PolConsp3

1.876

1.096

1

5

1.019

PolConsp4

2.011

1.108

1

5

0.925

PolConsp5

1.983

1.105

1

5

0.962

PolConsp6

1.893

1.003

1

5

0.887

PolConsp7

1.723

1.004

1

5

1.340

PolConsp8

1.842

0.952

1

5

0.788

PolConsp9

1.808

1.137

1

5

1.324

PolConsp10

1.520

1.056

1

5

2.224

One estimate of the internal consistency reliability of a test is Cronbachâ€™s \alpha, which summarizes the average item-test correlation.

The standard Cronbachâ€™s \alpha is .93. The average Iter-Item Correlation is .564. Ideally, the average inter-item correlation for a set of items should be between .20 and .40, suggesting that while the items are reasonably homogenous, they do contain sufficiently unique variance so as to not be isomorphic with each other (Piedmont, 2014).

library(greekLetters)tibble(nItems =2:20, alpha =nItems*rho/(1+(nItems-1)*rho))|>ggplot()+aes(x =nItems, y =alpha)+geom_point(size =3, shape =1)+geom_path(group =1)+scale_x_continuous(breaks =2:20)+scale_y_continuous(breaks =seq(0.7, 1, .025), limits =c(0.7, 1))+labs(x ='Retrospective Number of items', y =paste0("Cronbach's ", greeks('alpha')), title ='Relationship between number of items with alpha')

3 Scoring of Factor Analysis

In factor analysis, factor scores are computed using parameters of CFA, i.e., unique variances (\Psi), factor loadings (\Lambda) and factor correlations (\Phi). In most modern statistical software (i.e., lavaan or Mplus), factor scores are estimated by multivariate methods that use various aspects of the reduced or unreduced correlation matrix and factor analysis coefficients (Brown, 2015). A frequently used method of estimating factor scores is Thurstonâ€™s (1935) least squared regression approach, although several other strategies have been developed (e.g., Bartlett, 1937; Harman, 1976; McDonald, 1982).

Brown, T. A. (2015). Confirmatory factor analysis for applied research: Second edition. Guilford Press.

Ferrando, P. J., & Lorenzo-Seva, U. (2018). Assessing the Quality and Appropriateness of Factor Solutions and Factor Score Estimates in Exploratory Item Factor Analysis. Educational and Psychological Measurement, 78(5), 762â€“780. https://doi.org/10.1177/0013164417719308

Where \boldsymbol{\theta_i} and \boldsymbol{Y}_i are factor score estimates and item responses for individual i, respectively; \Phi is the factor correlation matrix (for example, for single factor model, \Phi is 1 \times 1 matrix ), \Psi is J \times J unique variances of items, and \Lambda is the pattern loading matrix. \boldsymbol{S} is the factor loading structure matrix with the size I \times P where I denotes number of item and P denotes number of latent factors. For unidimensional structure, \boldsymbol{S} = \boldsymbol{\Lambda}.

To derive the Thurstonâ€™s method, we can first partition joint distribution of all I items and K factor scores as

f(\boldsymbol{\theta, Y}) = f(\begin{bmatrix}\Theta\\Y\end{bmatrix}) \\
= N_{I+K}(\begin{bmatrix}\mu_\Theta \\ \mu+\Lambda'\mu_\Theta \end{bmatrix},
\begin{bmatrix}
\Phi\Lambda' \space\space\space\space\space\space\space\space\space \Phi \\
\Lambda\Phi\Lambda'+\Psi \space\space \Lambda\Phi
\end{bmatrix})
Based on relationship between conditional distribution of f(\theta|Y) and joint distribution of f(Y, \theta):

Where \mu_1 and \mu_2 are mean components of partitioned joint distribution, and \Sigma_{12} and \Sigma_{22} are [1,2] and [2,2] elements of variance components of partitioned joint distribution.Then,

Using the consipiracy theory data, we can calculate the factor scores based on the equation mention above using Thurstonâ€™s method and compare to the estimated factor score by lavaan.

lavaan code

model2<-' F1 =~ PolConsp1+PolConsp2+PolConsp3+PolConsp4+PolConsp5+PolConsp6+PolConsp7+PolConsp8+PolConsp9+PolConsp10'fit2=cfa(model =model2, data =itemResp_std, std.lv =TRUE)summary(fit2)

lavaan 0.6.17 ended normally after 20 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 20
Number of observations 177
Model Test User Model:
Test statistic 120.975
Degrees of freedom 35
P-value (Chi-square) 0.000
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Latent Variables:
Estimate Std.Err z-value P(>|z|)
F1 =~
PolConsp1 0.627 0.069 9.127 0.000
PolConsp2 0.755 0.065 11.677 0.000
PolConsp3 0.706 0.066 10.647 0.000
PolConsp4 0.734 0.065 11.234 0.000
PolConsp5 0.871 0.060 14.528 0.000
PolConsp6 0.865 0.060 14.367 0.000
PolConsp7 0.735 0.065 11.244 0.000
PolConsp8 0.865 0.060 14.361 0.000
PolConsp9 0.730 0.065 11.154 0.000
PolConsp10 0.615 0.069 8.893 0.000
Variances:
Estimate Std.Err z-value P(>|z|)
.PolConsp1 0.601 0.067 9.030 0.000
.PolConsp2 0.425 0.049 8.634 0.000
.PolConsp3 0.496 0.056 8.828 0.000
.PolConsp4 0.455 0.052 8.724 0.000
.PolConsp5 0.236 0.031 7.540 0.000
.PolConsp6 0.246 0.032 7.643 0.000
.PolConsp7 0.455 0.052 8.723 0.000
.PolConsp8 0.247 0.032 7.646 0.000
.PolConsp9 0.461 0.053 8.740 0.000
.PolConsp10 0.617 0.068 9.055 0.000
F1 1.000

Thurstonâ€™s and Bartlettâ€™s method

## extract factor loadings and unique varianceslambdas=as.numeric(coef(fit2)[paste0("F1=~PolConsp", 1:10)])Lambda=matrix(lambdas, ncol =1)psis=as.numeric(coef(fit2)[paste0("PolConsp", 1:10, "~~PolConsp", 1:10)])Psi=diag(sqrt(psis))Phi=diag(1)## Estimated Structural correlation matrixR=Lambda%*%Phi%*%t(Lambda)+Psi## Thurston's method# FNS_influence <- Y %*% rowSums(precision_mat) # calculate FNS based on expected influence# LNS_influence <- Y %*% precision_mat %*% rowSums(precision_mat) # calculate LNS based on expected inlfuenceTheta_thurston=as.numeric(diag(1)%*%t(Lambda)%*%solve(R)%*%t(itemResp_std))## Bartlett's methodTheta_bartlett=as.numeric(solve(t(Lambda)%*%solve(Psi)%*%Lambda)%*%t(Lambda)%*%solve(Psi)%*%t(itemResp_std))Theta_lavaan_regression=as.numeric(lavPredict(fit2, method ='regression'))Theta_lavaan_Bartlett=as.numeric(lavPredict(fit2, method ='Bartlett'))

We can find that Thurstonâ€™s method is consistent with lavaan â€™s output of factor scores:

fs=fs|>pivot_longer(c(lavaan_Bartlett, Sumscore, Thurston, Bartlett), names_to ="Method", values_to ="Score")|>mutate(Method =factor(Method, levels =c("Sumscore", "Thurston", "Bartlett", "lavaan_Bartlett")))ggplot(fs)+geom_abline(aes(slope =1, intercept =0), color ="grey")+geom_point(aes(x =lavaan_regression, y =Score, color =Method, shape =Method), size =3, alpha =.4, stroke =1.3)+labs(x ="Factor score by lavaan", y ="Factor score by Thurston's and Bartlett's method")+scale_shape_manual(values =1:4)+scale_y_continuous(limits =c(-1.1, 4))+scale_x_continuous(limits =c(-1.1, 4))+theme_classic()

3.2 Mplus

In Mplus, latent factor score estimation can have varied methods under two condition: (1) when individual level factor scores are of interests, factor scores are estimated based on either Maximum-likelihood estimators or Bayes estimators; (2) when factor scores are used for secondary analysis (dependent variables of regression models), factor scores are viewed as one type of imputed values, thus they are also known as plausible values and estimated by Bayesian imputation and Rubinâ€™s (1978) method (Asparouhov & Muthen, 2010; Rubin, 1978; von Davier et al., 2009).

Rubin, D. B. (1978). Multiple imputation for nonresponse in surveys - a phenomenological bayesian approach to nonresponse. J. Wiley & Sons, New York.

Under the first condition, according to simulation study of Asparouhov & Muthen (2010), using ML estimators and small sample size, standardized errors for factor scores is underestimated. Another finding is that the larger the absolute factor score value is the larger the standard error is. This is because large absolute factor score values are generally in the tail of the factor score distribution, i.e., in a region with fewer observations.

With continuous variable, Mplus estimates factor scores as the maximum of posterior distribution of the factor (also called the Maximum A Posterior method), which is the same as the Regression Method for factor score estimation (Asparouhov & Muthen, 2010; Skrondal & Laake, 2001). It should be noted that, with this method, using factor scores as predictors given unbiased regression slopes, but using factor scores as dependent variables gives biased slopes. With categorical variables and the maximum-likelihood estimator, Mplus estimates factor scores as the expected value of the posterior distribution of the factor, which is also called the Expected A Posteriori (EAP) method.

Asparouhov, T., & Muthen, B. (2010). Plausible values for latent variables using mplus.

Relationship between factor score and network score

The official paper will show both factor score and network score of unidimensional factor analysis is a special case of general scoring form when weight matrix is factor loadings or centrality measures.

For network model,

\hat \Sigma = \Delta(I-\Omega)^{-1}\Delta

where \Omega is a edge weight matrix or a standardized partial correlation matrix with diagonal elements as zeros, \Delta is the diagonal matrix with element \delta_{jj} =\kappa_{jj}^{-\frac{1}{2}}. That is,

\Delta = \text{diag}(\hat K)^{-\frac12}

We can derive the above Equation by assuming the precision matrix \kappa and partial correlation \omega_{jk} has following relationship:

\boldsymbol{\hat\eta_i= W \Delta^{-1}(I-\Omega)\Delta^{-1} Y_i}
\tag{2} Where \boldsymbol{W} is a 1 \times J weight matrix suggesting the â€śimportanceâ€ť of items.

Thus, as shown in Equation 2, we can conclude that when \boldsymbol{W \approx \Lambda}, then \boldsymbol{\hat\eta \approx \hat\theta}; when \boldsymbol{W \approx S}, then \boldsymbol{\hat\eta \approx \hat{FS}}

4 Correlation between estimated factor scores and true factor scores

When item responses and factor scores are standardized, based on Thurstonâ€™s regression method (see Equation 1), the estimated factor scores are:

The relationship between estimated factor scores and true factor scures is a simple linear regression with \Lambda'(\Lambda\Lambda'+\Psi)^{-1}\Lambda as the estimated linear slope.

For simple linear regression Y=b_0+b_1X, the Pearsonâ€™s correlation is r = b_1 * \frac{S_X}{S_Y}. Then, when both \hat \theta_i and \theta_i^T are normal distributed, then the correlation between estimated and true factor score is as:

dat<-expand.grid(lambda=seq(.1,.9,.1), J =c(6, 12 , 24), N =c(100, 500, 1000))|>as.data.frame()|>rowwise()|>mutate(cor =corr_true_est_theta(lambda =lambda, J =J, N =N), J =factor(J, levels =c(6, 12 , 24)), N =factor(N, levels =c(100, 500, 1000)))ggplot(dat)+geom_point(aes(x=lambda, y =cor, col =J))+geom_path(aes(x=lambda, y =cor, group =J, col =J))+scale_x_continuous(breaks =seq(.1,.9,.1))+scale_y_continuous(breaks =seq(.1, 1,.1))+facet_wrap(~N)+labs(x =greekLetters::greeks("lambda"), title ="Unscaled Correlation between Estimated Factor scores and True Factor Scores")+theme_bw()

---title: 'Sum Score, Factor Score, and Reliability'author: 'Jihong Zhang'date: 'Mar 12 2024'categories: - Scoring - Reliability - CTT - Factor Analysisexecute: warning: false message: falsecitation: trueformat: html: code-fold: true code-line-numbers: falsebibliography: references.bibcsl: apa.csl---Network psychometrics has become an alternative approach to factor analysis and item response theory in multiple fields of psychology and education, such as psychopathology, personality, measurement validation, and dimensionality determancy etc. However, individual scoring differences between psychometric network analysis and traditional psychometric modeling has not been well investigated. Some questions arise regarding individual scoring:1. What will be individual scores in psychometric network analysis? Or, how can we evaluate the average level of each individuals?2. If we can build individual scoring in psychometric network, what is the relationship between this scoring with factor scores.3. How can we use this scoring method to evaluate measurement quality, such as reliability or validity?To answer these questions, we first need to review how individuals are scored in factor analysis method and classical test theory. Borrowing the theoretical framework and purpose of factor scoring, we can construct the scoring method for psychometric network. Then, we can show that there are statistical relationship between network scores with factor scores. Thus, depending on the psychometric methods researchers use, they can be free to use either factor score or network score to report. They can also compute the other without constructing the other model.Overall, the purpose of this post is to illustrate the definition, assumption, psychometric properties, usage, and interpretation of factor scores in Structural Equation Models (SEM), and how those features of factor scores compare to sum scores in Classical Test Theory (CTT). This post is inspired by Dr. Templin's [2022 presentation](https://jonathantemplin.com/wp-content/uploads/2022/10/sem15pre906_lecture11.pdf).## Definition of Test ScoreIn CTT, the test score is unit of analysis of the whole test, which can be statistically expressed as:$$Y_{total} = T+e$$Where $Y_{total}$ denotes test scores, $T$ denotes true score, and $e$ denotes error. There are some assumptions:1. Items are assumed exchangeable;2. Expected value of $e$ is 0;3. Error $e$ is expected to be uncorrelated with true score $T$## Scoring of Classical test theoryIn classical test theory (CTT), the test score is construct as sum of item scores. CTT assumes that there is a true score exists that reflect the true ability of test takers and the observed sum scores of each individual is a combination of true score and random error.$$Y_{total} = T + e$$Where $Y_{total}$ denotes a vector of observed sum scores of respondents, $T$ denotes a vector of true scores of respondents, and $e$ denotes the random error for respondents. True scores and random errors are independent.### CTT-based reliabilityMultiple reliability coefficients have been proposed in previous literature. Each reliability has their advantages and disadvantages. Let's take the average iter-item correlation as one example. Average iter-item correlation is computed as the proportion of variance in the sum score that is due to variation in the latent trait or true score.We can derive the reliability as following:$$\text{Var}(Y_{total}) = \text{Var}(T+e) = \text{Var}(T)+\text{Var}(e)+2\text{Cov}(T,e)$$But, since T and e are assumed independent $\text{Cov}(T, e) = 0$, so,$$\text{Var}(Y_{total}) = \text{Var}(T)+\text{Var}(e)$$Then, reliability can be computed as:$$\rho = \frac{\text{Var}(T)}{\text{Var}(Y)} = \frac{\text{Var}(T)}{\text{Var}(T)+\text{Var}(e)} $$Where,- $\text{Var}(T)$ is variance of true score and could be interpreted as variability in the latent trait in the context of factor analysis.- $\text{Var}(e)$ is variance of error, and could be interpreted as measurement error#### Mini exampleUsing a 10-item example with each having 1-5 scale.```{r}#| code-fold: true#| code-summary: 'Data Read-in'library(tidyverse)library(here)library(kableExtra)library(psych)dat_path <-'posts/2024-01-12-syllabus-adv-multivariate-esrm-6553/Lecture07/Code'conspiracy <-read.csv(here(dat_path, 'conspiracies.csv'))itemResp <- conspiracy |>select(starts_with('PolConsp'))conspiracy |>mutate(ID =1:177) |>pivot_longer(starts_with('PolConsp'), names_to ='Item', values_to ='Resp') |>mutate(Item =factor(Item, paste0('PolConsp', 1:10))) |>group_by(Item) |>summarise(Mean =mean(Resp),SD =sd(Resp),Min =min(Resp),Max =max(Resp),Skew = psych::skew(Resp) ) |>kable(digits =3)```One estimate of the internal consistency reliability of a test is <mark>Cronbach's $\alpha$</mark>, which summarizes the average item-test correlation.The standard Cronbach's $\alpha$ is .93. The average Iter-Item Correlation is .564. Ideally, the average inter-item correlation for a set of items should be between .20 and .40, suggesting that while the items are reasonably homogenous, they do contain sufficiently unique variance so as to not be isomorphic with each other [@piedmont2014].```{r}#| code-summary: "Reliability by psych package"kable(alpha(itemResp)$total, digits =3)```Using factor analysis and `lavaan`, we can reproduce average inter-item correlations assuming items are tau-equavalent:- Item responses are standardized (mean as 0, variance as 1)- Factor loadings are constrained to be equal as 1- Residual variances of items are constrained to be equalThen, iter-item correlation and Cronbach's alpha can be computed as:$$\rho = \frac{\text{Var}(\theta)}{\text{Var}(\theta)+\text{Var}(\psi)}$$$$\alpha = \frac{N\rho}{\sigma^2 +(N-1)\rho}$$where N is sample size, $\rho$ is average iter-item correlation, and $\sigma^2$ are average item variances and equal to 1 if items are standardized.```{r}#| code-summary: 'iter-item correlation by lavaan'library(lavaan)itemResp_std <- itemResp |>mutate(across(everything(), scale))unifac_model <-'F1 =~ 1*PolConsp1+1*PolConsp2+1*PolConsp3+1*PolConsp4+1*PolConsp5+1*PolConsp6+1*PolConsp7+1*PolConsp8+1*PolConsp9+1*PolConsp10PolConsp1 ~~equal("e1")*PolConsp1PolConsp2 ~~equal("e1")*PolConsp2PolConsp3 ~~equal("e1")*PolConsp3PolConsp4 ~~equal("e1")*PolConsp4PolConsp5 ~~equal("e1")*PolConsp5PolConsp6 ~~equal("e1")*PolConsp6PolConsp7 ~~equal("e1")*PolConsp7PolConsp8 ~~equal("e1")*PolConsp8PolConsp9 ~~equal("e1")*PolConsp9PolConsp10~~equal("e1")*PolConsp10'fit =cfa(model = unifac_model, data = itemResp_std, std.lv =FALSE)# summary(fit)Var_F1 =as.numeric(coef(fit)['F1~~F1'])Var_errors=as.numeric(coef(fit)[1])rho = Var_F1 / (Var_F1 + Var_errors) # reliability rho # average iter-item correlation``````{r}#| code-summary: "Cronbach's alpha by lavaan"Cron_alpha =10*rho / (1+ (10-1)*rho )Cron_alpha # Cronbach's alpha```Cronbach's alpha is related to number of items:```{r}#| code-summary: 'Correlation between alpha and test length'#| code-fold: true#| fig-align: centerlibrary(greekLetters) tibble(nItems =2:20, alpha = nItems*rho / (1+ (nItems-1)*rho )) |>ggplot() +aes(x = nItems, y = alpha) +geom_point(size =3, shape =1) +geom_path(group =1) +scale_x_continuous(breaks =2:20) +scale_y_continuous(breaks =seq(0.7, 1, .025), limits =c(0.7, 1)) +labs(x ='Retrospective Number of items', y =paste0("Cronbach's ", greeks('alpha')),title ='Relationship between number of items with alpha')```## Scoring of Factor AnalysisIn factor analysis, factor scores are computed using parameters of CFA, i.e., unique variances ($\Psi$), factor loadings ($\Lambda$) and factor correlations ($\Phi$). In most modern statistical software (i.e., lavaan or Mplus), factor scores are estimated by multivariate methods that use various aspects of the reduced or unreduced correlation matrix and factor analysis coefficients [@brownConfirmatoryFactorAnalysis2015]. A frequently used method of estimating factor scores is Thurston's (1935) least squared regression approach, although several other strategies have been developed (e.g., Bartlett, 1937; Harman, 1976; McDonald, 1982).For confirmatory factor analysis that is identified, the scoring method discussed by Thurston (1935) and Thomson (1934) has the closed form [@ferrando2018; @skrondalRegressionFactorScores2001]:$$\text{EAP}(\boldsymbol{\theta}_i) = \boldsymbol{\Phi}\boldsymbol{\Lambda}'\boldsymbol{R}^{-1}\boldsymbol{Y}_i=\boldsymbol{S}'\boldsymbol{R}^{-1}\boldsymbol{Y}_i$$ {#eq-thurston}and $\boldsymbol{R}$ is the the estimated item covaraince matrix:$$\boldsymbol{R} = \boldsymbol{\Lambda}\boldsymbol{\Phi}\boldsymbol{\Lambda}'+\boldsymbol{\Psi}$$Where $\boldsymbol{\theta_i}$ and $\boldsymbol{Y}_i$ are factor score estimates and item responses for individual $i$, respectively; $\Phi$ is the factor correlation matrix (for example, for single factor model, $\Phi$ is 1 $\times$ 1 matrix ), $\Psi$ is $J \times J$ unique variances of items, and $\Lambda$ is the pattern loading matrix. $\boldsymbol{S}$ is the factor loading structure matrix with the size $I \times P$ where $I$ denotes number of item and $P$ denotes number of latent factors. For unidimensional structure, $\boldsymbol{S} = \boldsymbol{\Lambda}$.To derive the Thurston's method, we can first partition joint distribution of all $I$ items and $K$ factor scores as$$f(\boldsymbol{\theta, Y}) = f(\begin{bmatrix}\Theta\\Y\end{bmatrix}) \\= N_{I+K}(\begin{bmatrix}\mu_\Theta \\ \mu+\Lambda'\mu_\Theta \end{bmatrix},\begin{bmatrix}\Phi\Lambda' \space\space\space\space\space\space\space\space\space \Phi \\\Lambda\Phi\Lambda'+\Psi \space\space \Lambda\Phi\end{bmatrix})$$ Based on relationship between conditional distribution of $f(\theta|Y)$ and joint distribution of $f(Y, \theta)$:$$\boldsymbol{\mu^*=\mu_1+\Sigma_{12}\Sigma_{22}^{-1}(Y-\mu_2)}$$Where $\mu_1$ and $\mu_2$ are mean components of partitioned joint distribution, and $\Sigma_{12}$ and $\Sigma_{22}$ are \[1,2\] and \[2,2\] elements of variance components of partitioned joint distribution.Then,$$f(\boldsymbol{\theta|Y}) = \mu_\Theta + \Phi\Lambda'(\Lambda\Phi\Lambda'+\Psi)^{-1}(Y'-(\mu+\Lambda'\mu_\Theta))$$Assume factor scores and item responses are standardized, $\mu_\Theta = 0$ and $\mu = 0$, then this is equivalent to @eq-thurston.Alternatively, using [Bartlett's (1937, 1938)]{.underline} method [@skrondalRegressionFactorScores2001], factor scores can be estimated as:$$\text{EAP}(\boldsymbol{\theta_i}) = \boldsymbol{(\Lambda'\Psi^{-1}\Lambda)^{-1}\Lambda'\Psi^{-1}Y_i}$$### lavaanUsing the consipiracy theory data, we can calculate the factor scores based on the equation mention above using Thurston's method and compare to the estimated factor score by `lavaan`.```{r}#| code-summary: 'lavaan code'model2 <-' F1 =~ PolConsp1+PolConsp2+PolConsp3+PolConsp4+PolConsp5+PolConsp6+PolConsp7+PolConsp8+PolConsp9+PolConsp10'fit2 =cfa(model = model2, data = itemResp_std, std.lv =TRUE)summary(fit2)``````{r}#| code-summary: "Thurston's and Bartlett's method"## extract factor loadings and unique varianceslambdas =as.numeric(coef(fit2)[paste0("F1=~PolConsp", 1:10)])Lambda =matrix(lambdas, ncol =1)psis =as.numeric(coef(fit2)[paste0("PolConsp", 1:10, "~~PolConsp", 1:10)])Psi =diag(sqrt(psis))Phi =diag(1)## Estimated Structural correlation matrixR = Lambda %*% Phi %*%t(Lambda) + Psi## Thurston's method# FNS_influence <- Y %*% rowSums(precision_mat) # calculate FNS based on expected influence# LNS_influence <- Y %*% precision_mat %*% rowSums(precision_mat) # calculate LNS based on expected inlfuenceTheta_thurston =as.numeric(diag(1) %*%t(Lambda) %*%solve(R) %*%t(itemResp_std))## Bartlett's methodTheta_bartlett =as.numeric(solve(t(Lambda) %*%solve(Psi) %*% Lambda) %*%t(Lambda) %*%solve(Psi) %*%t(itemResp_std))Theta_lavaan_regression =as.numeric(lavPredict(fit2, method ='regression'))Theta_lavaan_Bartlett =as.numeric(lavPredict(fit2, method ='Bartlett'))```We can find that Thurston's method is consistent with `lavaan` 's output of factor scores:```{r}#| code-summary: 'Comparison'fs =tibble(lavaan_regression = Theta_lavaan_regression,lavaan_Bartlett = Theta_lavaan_Bartlett,Thurston = Theta_thurston,Bartlett = Theta_bartlett,Sumscore =as.numeric(scale(rowSums(itemResp)))) cor(fs)fs = fs |>pivot_longer(c(lavaan_Bartlett, Sumscore, Thurston, Bartlett), names_to ="Method", values_to ="Score") |>mutate(Method =factor(Method, levels =c("Sumscore", "Thurston", "Bartlett", "lavaan_Bartlett")))ggplot(fs) +geom_abline(aes(slope =1, intercept =0), color ="grey") +geom_point(aes(x = lavaan_regression, y = Score, color = Method, shape = Method), size =3, alpha = .4, stroke =1.3) +labs(x ="Factor score by lavaan", y ="Factor score by Thurston's and Bartlett's method") +scale_shape_manual(values =1:4) +scale_y_continuous(limits =c(-1.1, 4)) +scale_x_continuous(limits =c(-1.1, 4)) +theme_classic()```### MplusIn Mplus, latent factor score estimation can have varied methods under two condition: (1) when individual level factor scores are of interests, factor scores are estimated based on either Maximum-likelihood estimators or Bayes estimators; (2) when factor scores are used for secondary analysis (dependent variables of regression models), factor scores are viewed as one type of imputed values, thus they are also known as plausible values and estimated by Bayesian imputation and Rubin's (1978) method [@rubinMultipleImputationNonresponse1978; @asparouhovPlausibleValuesLatent2010; @vondavierWhatArePlausible2009].Under the first condition, according to simulation study of @asparouhovPlausibleValuesLatent2010, [using ML estimators and small sample size]{.underline}, standardized errors for factor scores is underestimated. Another finding is that the larger the absolute factor score value is the larger the standard error is. This is because large absolute factor score values are generally in the tail of the factor score distribution, i.e., in a region with fewer observations.With continuous variable, Mplus estimates factor scores as the maximum of posterior distribution of the factor (also called the *Maximum A Posterior* method), which is the same as the Regression Method for factor score estimation [@asparouhovPlausibleValuesLatent2010; @skrondalRegressionFactorScores2001]. It should be noted that, with this method, using factor scores as predictors given unbiased regression slopes, but using factor scores as dependent variables gives biased slopes. With categorical variables and the maximum-likelihood estimator, Mplus estimates factor scores as the expected value of the posterior distribution of the factor, which is also called the Expected A Posteriori (EAP) method.::: callout-note## Relationship between factor score and network scoreThe official paper will show both factor score and network score of unidimensional factor analysis is a special case of general scoring form when weight matrix is factor loadings or centrality measures.:::![Correlation between factor scores and network scores](Sim_FactorScore_NetworkScore_Correlation.png){fig-align="center"}For network model,$$\hat \Sigma = \Delta(I-\Omega)^{-1}\Delta$$where $\Omega$ is a edge weight matrix or a standardized partial correlation matrix with diagonal elements as zeros, $\Delta$ is the diagonal matrix with element $\delta_{jj} =\kappa_{jj}^{-\frac{1}{2}}$. That is,$$\Delta = \text{diag}(\hat K)^{-\frac12}$$We can derive the above Equation by assuming the precision matrix $\kappa$ and partial correlation $\omega_{jk}$ has following relationship:$$\omega_{jk} = -\frac{\kappa_{jk}}{\sqrt{\kappa_{jj}}\sqrt{\kappa_{kk}}}$$Then, since the diagnal elements of matrix $\Omega$ are zeros, it is easy to show that$$\hat K = \text{diag}{(\hat K)}^{\frac12}(I-\Omega)\text{diag}{(\hat K)}^{\frac12}$$$$\hat \Sigma = \hat K^{-1} = \text{diag}{(\hat K)}^{-\frac12}(I-\Omega)^{-1}\text{diag}{(\hat K)}^{-\frac12}$$For factor analysis,$$\hat \Sigma = \boldsymbol{\Lambda \Phi \Lambda'+\Psi}$$We can show that$$(I-\Omega)^{-1} = \Delta^{-1}(\boldsymbol{\Lambda \Phi \Lambda'+\Psi})\Delta^{-1}$$Thus,$$I - \Omega = \Delta(\boldsymbol{\Lambda \Phi \Lambda'+\Psi})^{-1}\Delta$$Based on @eq-thurston Thurston's regression method, we know that$$\boldsymbol{\hat \theta_i = \Lambda'(\Lambda \Phi \Lambda'+\Psi)^{-1}Y_i \\= \Lambda' \Delta^{-1}(I-\Omega)\Delta^{-1}Y_i}$$Then, if we set general scoring formular as$$\boldsymbol{\hat\eta_i= W \Delta^{-1}(I-\Omega)\Delta^{-1} Y_i}$$ {#eq-generalform} Where $\boldsymbol{W}$ is a $1 \times J$ weight matrix suggesting the "importance" of items.Thus, as shown in @eq-generalform, we can conclude that when $\boldsymbol{W \approx \Lambda}$, then $\boldsymbol{\hat\eta \approx \hat\theta}$; when $\boldsymbol{W \approx S}$, then $\boldsymbol{\hat\eta \approx \hat{FS}}$## Correlation between estimated factor scores and true factor scoresWhen item responses and factor scores are standardized, based on Thurston's regression method (see @eq-thurston), the estimated factor scores are:$$\hat\theta_i =\Lambda'R^{-1}Y_i \\=\Lambda'(\Lambda\Lambda'+\Psi)^{-1}(\Lambda\theta_i^T+e_i) \\=\Lambda'(\Lambda\Lambda'+\Psi)^{-1}\Lambda\theta_i^T+\Lambda'(\Lambda\Lambda'+\Psi)^{-1}e_i$$The relationship between estimated factor scores and true factor scures is a [**simple linear regression**]{.underline} with $\Lambda'(\Lambda\Lambda'+\Psi)^{-1}\Lambda$ as the estimated linear slope.For simple linear regression $Y=b_0+b_1X$, the Pearson's correlation is $r = b_1 * \frac{S_X}{S_Y}$. Then, when both $\hat \theta_i$ and $\theta_i^T$ are normal distributed, then the correlation between estimated and true factor score is as:$$r_{\hat\theta\theta^T}^{Turston}= \Lambda'(\Lambda'\Lambda+\Psi)^{-1}\Lambda\frac{S_{\theta^T}}{S_{\hat\theta}} $$Using R, we can estimate "unscaled" correlation for $\lambda = .7$ and $J = 6$ as```{r}#| fig-height: 10#| code-fold: falsesuppressMessages(library(tidyverse))set.seed(1234)corr_true_est_theta <-function(lambda, J, N) { Lambdas =matrix(rep(lambda, J), ncol =1) Psi =diag(1- lambda^2, J) corr <-t(Lambdas) %*%solve(Lambdas %*%t(Lambdas) + Psi) %*% Lambdas true_fac_score =rnorm(N, 0, 1) Y =t(Lambdas %*% true_fac_score) + mvtnorm::rmvnorm(N, sigma = Psi) est_fac_score =as.numeric(t(Lambdas) %*%solve(Lambdas %*%t(Lambdas) + Psi) %*%t(Y)) corr = corr * (sd(true_fac_score)/sd(est_fac_score)) corr}corr_true_est_theta(lambda =0.7, J =6, N =500)``````{r}#| fig-height: 5#| fig-align: center#| code-fold: falsedat <-expand.grid(lambda=seq(.1,.9,.1), J =c(6, 12 , 24), N =c(100, 500, 1000)) |>as.data.frame() |>rowwise() |>mutate(cor =corr_true_est_theta(lambda = lambda, J = J, N = N),J =factor(J, levels =c(6, 12 , 24)),N =factor(N, levels =c(100, 500, 1000)))ggplot(dat) +geom_point(aes(x=lambda, y = cor, col = J)) +geom_path(aes(x=lambda, y = cor, group = J, col = J)) +scale_x_continuous(breaks =seq(.1,.9,.1)) +scale_y_continuous(breaks =seq(.1, 1,.1)) +facet_wrap(~ N) +labs(x = greekLetters::greeks("lambda"), title ="Unscaled Correlation between Estimated Factor scores and True Factor Scores") +theme_bw()```