Bastão de Asclépio & Distribuição Normal

Bastão de Asclépio & Distribuição Normal

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
# suppressMessages(library(MVLM, warn.conflicts=FALSE))
suppressMessages(library(apaTables, warn.conflicts=FALSE))
suppressMessages(library(aplpack, warn.conflicts=FALSE))
suppressMessages(library(bruceR, warn.conflicts=FALSE))
suppressMessages(library(calculus, warn.conflicts=FALSE))
suppressMessages(library(car, warn.conflicts=FALSE))
suppressMessages(library(cellWise, warn.conflicts=FALSE))
suppressMessages(library(cluster, warn.conflicts=FALSE))
suppressMessages(library(corrplot, warn.conflicts=FALSE))
suppressMessages(library(DescTools, warn.conflicts=FALSE))
suppressMessages(library(diptest, warn.conflicts=FALSE))
suppressMessages(library(dplyr, warn.conflicts=FALSE))
suppressMessages(library(EGAnet, warn.conflicts=FALSE))
suppressMessages(library(ellipse, warn.conflicts=FALSE))
suppressMessages(library(far, warn.conflicts=FALSE))
suppressMessages(library(fmsb, warn.conflicts=FALSE))
suppressMessages(library(GGally, warn.conflicts=FALSE))
suppressMessages(library(ggfortify, warn.conflicts=FALSE))
suppressMessages(library(ggplot2, warn.conflicts=FALSE))
suppressMessages(library(HSAUR2, warn.conflicts=FALSE))
suppressMessages(library(knitr, warn.conflicts=FALSE))
suppressMessages(library(lava, warn.conflicts=FALSE))
suppressMessages(library(lavaan, warn.conflicts=FALSE))
suppressMessages(library(lawstat, warn.conflicts=FALSE))
suppressMessages(library(lfda, warn.conflicts=FALSE))
suppressMessages(library(MASS, warn.conflicts=FALSE))
suppressMessages(library(MatchIt, warn.conflicts=FALSE)) # distancia robusta
suppressMessages(library(matlib, warn.conflicts=FALSE))
suppressMessages(library(matrixcalc, warn.conflicts=FALSE))
suppressMessages(library(MatrixModels, warn.conflicts=FALSE))
suppressMessages(library(matrixStats, warn.conflicts=FALSE))
suppressMessages(library(MomTrunc, warn.conflicts=FALSE))
suppressMessages(library(MVA, warn.conflicts=FALSE)) # An Introduction to Applied Multivariate Analysis with R
suppressMessages(library(MVar, warn.conflicts=FALSE))
suppressMessages(library(mvdalab, warn.conflicts=FALSE))
suppressMessages(library(MVN, warn.conflicts=FALSE))
suppressMessages(library(mvtnorm, warn.conflicts=FALSE))
suppressMessages(library(performance, warn.conflicts=FALSE))
suppressMessages(library(plotly, warn.conflicts=FALSE))
suppressMessages(library(polycor, warn.conflicts=FALSE))
suppressMessages(library(ppcor, warn.conflicts=FALSE))
suppressMessages(library(pracma, warn.conflicts=FALSE))
suppressMessages(library(psych, warn.conflicts=FALSE))
suppressMessages(library(qcc, warn.conflicts=FALSE))
suppressMessages(library(qgraph, warn.conflicts=FALSE))
suppressMessages(library(rcompanion, warn.conflicts=FALSE))
suppressMessages(library(reticulate, warn.conflicts=FALSE))
suppressMessages(library(rgl, warn.conflicts=FALSE))
suppressMessages(library(scatterplot3d, warn.conflicts=FALSE))
suppressMessages(library(semPlot, warn.conflicts=FALSE))

Incluir

  • matrixNormal::I, matrixNormal::J, matrixNormal::tr

  • biotools::cov2pcov: Partial Covariance Matrix

  • biotools::D2.disc: Discriminant Analysis Based on Mahalanobis Distance

  • biotools::mvpaircomp: Multivariate Pairwise Comparisons

  • biotools::singh: Importance of Variables According to the Singh (1981) Criterion

  • bruceR

    • bruceR::CFA
    • bruceR::lavaan_summary
    • bruceR::EFA
    • bruceR::PCA
    • bruceR::Alpha
    • bruceR::cor_diff
    • bruceR::Corr
    • bruceR::Describe
    • bruceR::RECODE
    • bruceR::model_summary
    • bruceR::regress
    • bruceR::EMMEANS
    • bruceR::GLM_summary
    • bruceR::HLM_summary
    • bruceR::TTEST
    • bruceR::MANOVA: https://psychbruce.github.io/bruceR/reference/MANOVA.html

Material

Pensamento

“Não é paradoxo dizer que nos nossos momentos de inspiração mais teórica podemos estar o mais próximo possível de nossas aplicações mais práticas.”

WHITEHEAD, AN apud BOYER, CB (1974) História da matemática. São Paulo: Blücher/EDUSP, p. 419.

Sumário

  1. Aspectos de análise multivariada
  2. Álgebra matricial e vetor estocástico
  3. Geometria amostral e amostragem aleatória
  4. Distribuição normal multivariada
  5. Inferência sobre vetor de média
  6. Comparação de várias médias multivariadas
  7. Modelo de regressão linear multivariada
  8. Componentes principais
  9. Análise de fatores e inferência sobre matriz de covariância
  10. Análise de correlação canônica
  11. Discriminação e classificação
  12. Clusterização, métodos de distância e ordination

Pré-requisitos do Capítulo 9

Introdução

A análise fatorial tem uma história marcada por controvérsias. Seu início moderno remonta às tentativas, no início do século XX, de Karl Pearson, Charles Spearman e outros de definir e mensurar a inteligência. Em razão dessa associação inicial com construtos como a inteligência, a análise fatorial foi desenvolvida principalmente por cientistas interessados em psicometria. As disputas sobre as interpretações psicológicas dos primeiros estudos e a limitação dos recursos computacionais dificultaram o avanço inicial da técnica como método estatístico. O advento dos computadores de alta velocidade reavivou o interesse teórico e computacional na análise fatorial. A maioria das técnicas originais foi abandonada, e as controvérsias iniciais foram resolvidas com os desenvolvimentos recentes. Ainda assim, é verdade que cada aplicação da técnica deve ser avaliada por seus próprios méritos para determinar seu sucesso.

O objetivo essencial da análise fatorial é descrever, se possível, as relações de covariância entre muitas variáveis em termos de poucas variáveis subjacentes, não observáveis, chamadas fatores. Em essência, o modelo fatorial é motivado pelo seguinte raciocínio: suponha que as variáveis possam ser agrupadas segundo suas correlações. Isto é, suponha que todas as variáveis dentro de um grupo sejam altamente correlacionadas entre si, mas apresentem correlações pequenas com variáveis de outros grupos. Então, é plausível supor que cada grupo de variáveis represente um único construto subjacente — um fator — responsável pelas correlações observadas.

Por exemplo, as correlações entre escores de testes em clássicos, francês, inglês, matemática e música, coletados por Spearman, sugeriram um fator subjacente de “inteligência”. Outro conjunto de variáveis, representando medidas de aptidão física, poderia corresponder a um segundo fator. É esse tipo de estrutura que a análise fatorial busca confirmar.

A análise fatorial pode ser vista como uma extensão da análise de componentes principais (PCA). Ambas podem ser interpretadas como tentativas de aproximar a matriz de covariância populacional \(\boldsymbol{\Sigma}\).

Entretanto, a aproximação baseada no modelo de análise fatorial é mais elaborada. A questão central da análise fatorial é verificar se os dados observados são consistentes com uma estrutura previamente especificada.

Modelo fatorial exploratório ortogonal

O vetor aleatório observável (manifesto) \(\mathbf{X}\), com \(p\) componentes, tem média \(\boldsymbol{\mu}\) e matriz de covariância \(\boldsymbol{\Sigma}\). O modelo fatorial postula que \(\mathbf{X}\) depende linearmente de algumas poucas variáveis aleatórias não observáveis (latentes) \(F_1, F_2, \ldots, F_m\), chamadas fatores comuns, e de \(p\) fontes adicionais de variação \(\varepsilon_1, \varepsilon_2, \ldots, \varepsilon_p\), chamadas erros ou, às vezes, fatores específicos.

Em particular, o modelo de análise fatorial é dado por

\[ \begin{aligned} X_1 - \mu_1 &= \ell_{11}F_1 + \ell_{12}F_2 + \cdots + \ell_{1m}F_m + \varepsilon_1 \\ X_2 - \mu_2 &= \ell_{21}F_1 + \ell_{22}F_2 + \cdots + \ell_{2m}F_m + \varepsilon_2 \\ &\vdots \\ X_p - \mu_p &= \ell_{p1}F_1 + \ell_{p2}F_2 + \cdots + \ell_{pm}F_m + \varepsilon_p \end{aligned} \tag{9-1} \]

ou, em notação matricial,

\[ \underset{p \times 1}{\mathbf{X}} - \underset{p \times 1}{\boldsymbol{\mu}} = \underset{p \times m}{\mathbf{L}}\;\underset{m \times 1}{\mathbf{F}} + \underset{p \times 1}{\boldsymbol{\varepsilon}} \tag{9-2} \]

O coeficiente \(\ell_{ij}\) é chamado de carga fatorial (loading) da \(i\)-ésima variável sobre o \(j\)-ésimo fator, de modo que a matriz \(\mathbf{L}\) é a matriz de cargas fatoriais (factor loadings). Observe que o erro específico \(\varepsilon_i\) está associado apenas à variável \(X_i\).

Como observa Maxwell [12], em muitas investigações os termos \(\varepsilon_i\) tendem a ser combinações de erro de medição e de fatores que estão exclusivamente associados às variáveis individuais.

As \(p\) desvios \(X_1 - \mu_1, X_2 - \mu_2, \ldots, X_p - \mu_p\) são expressos em termos de \(p + m\) variáveis aleatórias \(F_1, F_2, \ldots, F_m, \varepsilon_1, \varepsilon_2, \ldots, \varepsilon_p\), que são não observáveis (latentes).

Essa característica distingue o modelo fatorial da regressão multivariada, em que as variáveis independentes (ocupando aqui a posição de \(\mathbf{F}\)) podem ser observadas. No modelo fatorial, \(\mathbf{F}\) é estimável.

Dado o grande número de quantidades não observáveis, uma verificação direta do modelo fatorial a partir das observações de \(X_1, X_2, \ldots, X_p\) é inviável. No entanto, com algumas suposições adicionais sobre os vetores aleatórios \(\mathbf{F}\) e \(\boldsymbol{\varepsilon}\), o modelo

\[ \mathbf{X} - \boldsymbol{\mu} = \mathbf{L}\mathbf{F} + \boldsymbol{\varepsilon} \] implica certas relações de covariância que podem ser verificadas estatisticamente.

Assumimos que

\[ \begin{align} \mathbb{E}(\mathbf{F}) &= \underset{m \times 1}{\mathbf{0}} \qquad \mathbb{C}(\mathbf{F}) = \mathbb{E}(\mathbf{F}\mathbf{F}^{\prime}) = \underset{m \times m}{\mathbf{I}}\\ \mathbb{E}(\boldsymbol{\varepsilon}) &= \underset{p \times 1}{\mathbf{0}} \qquad \mathbb{C}(\boldsymbol{\varepsilon}) = \mathbb{E}(\boldsymbol{\varepsilon}\boldsymbol{\varepsilon}^{\prime}) = \underset{p \times p}{\boldsymbol{\Psi}}= \begin{bmatrix} \psi_1 & 0 & \cdots & 0 \\ 0 & \psi_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \psi_p \end{bmatrix} \end{align} \tag{9-3} \]

Além disso, supomos que \(\mathbf{F}\) e \(\boldsymbol{\varepsilon}\) são independentes, de modo que

\[ \mathbb{C}(\boldsymbol{\varepsilon}, \mathbf{F}) = \mathbb{E}(\boldsymbol{\varepsilon}\mathbf{F}^{\prime}) = \underset{p \times m}{\mathbf{0}} \]

Essas suposições, juntamente com o modelo em (9-2) definem o modelo fatorial ortogonal.

Em resumo, o modelo fatorial ortogonal com \(m\) fatores comuns é expresso por

\[ \underset{p \times 1}{\mathbf{X}} = \underset{p \times 1}{\boldsymbol{\mu}}+ \underset{p \times m}{\mathbf{L}}\; \underset{m \times 1}{\mathbf{F}}+ \underset{p \times 1}{\boldsymbol{\varepsilon}} \tag{9-4} \]

sendo que

\(\mu_i\): esperança da variável \(i\)

\(\varepsilon_i\): fator específico da variável \(i\)

\(F_j\): fator comum \(j\)

\(\ell_{ij}\): carga da variável \(i\) sobre o fator \(j\)

Os vetores aleatórios não observáveis \(\mathbf{F}\) e \(\boldsymbol{\varepsilon}\) satisfazem as condições

\[ \begin{aligned} &\mathbf{F} \text{ e } \boldsymbol{\varepsilon} \text{ são não correlacionados} \\\\ &\mathbb{E}(\mathbf{F}) = \underset{m \times 1}{\mathbf{0}} \quad \mathbb{C}(\mathbf{F}) = \underset{m \times m}{\mathbf{I}} \\ &\mathbb{E}(\boldsymbol{\varepsilon}) = \underset{p \times 1}{\mathbf{0}} \quad \mathbb{C}(\boldsymbol{\varepsilon}) = \underset{p \times p}{\boldsymbol{\Psi}} \text{, sendo que } \boldsymbol{\Psi} \text{ é diagonal} \end{aligned} \]

Permitir que os fatores \(\mathbf{F}\) sejam correlacionados, de modo que \(\mathbb{C}(\mathbf{F})\) não seja diagonal, conduz ao modelo fatorial oblíquo. Esse modelo apresenta algumas dificuldades adicionais de estimação e não será discutido neste texto. (Ver [10].)

O modelo fatorial ortogonal implica uma estrutura de covariância para \(\mathbf{X}\).

A partir do modelo em (9-4):

\[ \begin{aligned} \left(\mathbf{X} - \boldsymbol{\mu}\right) \left(\mathbf{X} - \boldsymbol{\mu}\right)^{\prime} &= (\mathbf{L}\mathbf{F} + \boldsymbol{\varepsilon}) (\mathbf{L}\mathbf{F} + \boldsymbol{\varepsilon})^{\prime} \\ &= (\mathbf{L}\mathbf{F} + \boldsymbol{\varepsilon}) \left((\mathbf{L}\mathbf{F})^{\prime} + \boldsymbol{\varepsilon}^{\prime}\right) \\ \left(\mathbf{X} - \boldsymbol{\mu}\right) \left(\mathbf{X} - \boldsymbol{\mu}\right)^{\prime}&= \mathbf{L}\mathbf{F}(\mathbf{F}\mathbf{L})^{\prime} + \boldsymbol{\varepsilon}(\mathbf{L}\mathbf{F})^{\prime} + \mathbf{L}\mathbf{F}\boldsymbol{\varepsilon}^{\prime} + \boldsymbol{\varepsilon}\boldsymbol{\varepsilon}^{\prime} \end{aligned} \]

Portanto,

\[ \begin{aligned} \boldsymbol{\Sigma} &= \mathbb{C}(\mathbf{X}) = \mathbb{E}\left[(\mathbf{X} - \boldsymbol{\mu})(\mathbf{X} - \boldsymbol{\mu})^{\prime}\right] \\ &= \mathbf{L}\mathbb{E}(\mathbf{F}\mathbf{F}^{\prime})\mathbf{L}^{\prime} + \mathbb{E}(\boldsymbol{\varepsilon}\mathbf{F}^{\prime})\mathbf{L}^{\prime} + \mathbf{L}\mathbb{E}(\mathbf{F}\boldsymbol{\varepsilon}^{\prime}) + \mathbb{E}(\boldsymbol{\varepsilon}\boldsymbol{\varepsilon}^{\prime}) \\ \boldsymbol{\Sigma} &= \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi} \end{aligned} \]

de acordo com (9-3), uma vez que \(\mathbb{C}(\boldsymbol{\varepsilon}, \mathbf{F}) = \mathbf{0}\) pela independência entre \(\mathbf{F}\) e \(\boldsymbol{\varepsilon}\).

Além disso, pelo modelo em (9-4):

\[ (\mathbf{X} - \boldsymbol{\mu})\mathbf{F}^{\prime} = (\mathbf{L}\mathbf{F} + \boldsymbol{\varepsilon})\mathbf{F}^{\prime} = \mathbf{L}\mathbf{F}\mathbf{F}^{\prime} + \boldsymbol{\varepsilon}\mathbf{F}^{\prime} \]

Logo,

\[ \mathbb{C}(\mathbf{X}, \mathbf{F}) = \mathbb{E}(\mathbf{X} - \boldsymbol{\mu})\mathbf{F}^{\prime} = \mathbf{L}\mathbb{E}(\mathbf{F}\mathbf{F}^{\prime}) + \mathbb{E}(\boldsymbol{\varepsilon}\mathbf{F}^{\prime}) = \mathbf{L} \]

Estrutura de covariância do modelo fatorial ortogonal:

  1. \(\mathbb{C}(\mathbf{X}) = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}\)

ou, em termos escalares,

\[ \begin{align} \mathbb{V}(X_i) &= \sum_{j=1}^{m}{\ell_{ij}^2} + \psi_i\\ \mathbb{C}(X_i, X_k) &= \sum_{j=1}^{m}{\ell_{ij}\ell_{kj}} \end{align} \tag{9-5} \]

  1. \(\mathbb{C}(\mathbf{X}, \mathbf{F}) = \mathbf{L}\)

ou, elemento a elemento,

\[ \mathbb{C}(X_i, F_j) = \ell_{ij} \] O modelo \(\underset{p \times 1}{\mathbf{X}} + \underset{p \times 1}{\boldsymbol{\mu}} = \underset{p \times m}{\mathbf{L}}\; \underset{m \times 1}{\mathbf{F}} + \underset{p \times 1}{\boldsymbol{\varepsilon}}\) é linear nos fatores comuns.

Se as \(p\) variáveis de resposta \(\mathbf{X}\) estiverem de fato relacionadas a fatores subjacentes, mas de forma não linear, por exemplo

\[ X_1 - \mu_1 = \ell_{11} F_1 F_3 + \varepsilon_1 \qquad X_2 - \mu_2 = \ell_{21} F_2 F_3 + \varepsilon_2 \]

e assim por diante, então a estrutura de covariância

\[ \boldsymbol{\Sigma} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi} \]

dada por (9-5) pode não ser adequada.

A suposição de linearidade é, portanto, fundamental na formulação do modelo fatorial tradicional.

A parcela da variância da \(i\)-ésima variável explicada pelos \(m\) fatores comuns é chamada de comunalidade da variável \(i\) .

A parcela de \(\mathbb{V}(X_i)\) devida ao fator específico é chamada de unicidade (uniqueness), ou variância específica (specific variance).

Denotando a comunalidade da variável \(i\) por \(h_i^2\), obtemos a partir de (9-5):

\[ \sigma_{ii} = \underbrace{\sum_{j=1}^{m}{\ell_{ij}^2}}_{\text{comunalidade}}+ \underbrace{\psi_i}_{\text{variância específica}} \]

ou seja,

\[ h_i^2 = \sum_{j=1}^{m}{\ell_{ij}^2} \tag{9-6} \]

e portanto

\[ \mathbb{V}(X_{i})=\sigma_{ii} = h_i^2 + \psi_i\\ i = 1, 2, \ldots, p \]

A comunalidade \(h_i^2\) é a soma dos quadrados das cargas fatoriais da variável \(i\) sobre os \(m\) fatores comuns.

Exemplo 9.1: Verificação de \(\boldsymbol{\Sigma} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}\) para dois fatores

Considere a matriz de covariância

\[ \underset{4\times 4}{\boldsymbol{\Sigma}} = \begin{bmatrix} 19 & 30 & 2 & 12 \\ 30 & 57 & 5 & 23 \\ 2 & 5 & 38 & 47 \\ 12 & 23 & 47 & 68 \end{bmatrix} \]

A igualdade

\[ \underbrace{\begin{bmatrix} 19 & 30 & 2 & 12 \\ 30 & 57 & 5 & 23 \\ 2 & 5 & 38 & 47 \\ 12 & 23 & 47 & 68 \end{bmatrix}}_{\Sigma} = \underbrace{ \begin{bmatrix} 4 & 1 \\ 7 & 2 \\ -1 & 6 \\ 1 & 8 \end{bmatrix} }_{\mathbf{L}} \underbrace{ \begin{bmatrix} 4 & 7 & -1 & 1 \\ 1 & 2 & 6 & 8 \end{bmatrix} }_{\mathbf{L}^{\prime}} + \underbrace{ \begin{bmatrix} 2 & 0 & 0 & 0 \\ 0 & 4 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 3 \end{bmatrix} }_{\boldsymbol{\Psi}} \]

Pode-se verificar a igualdade por álgebra matricial. Assim, \(\boldsymbol{\Sigma}\) tem a estrutura de um modelo fatorial ortogonal com \(m=2\) fatores comuns:

\[ \underset{4\times 2}{\mathbf{L}} = \begin{bmatrix} 4 & 1 \\ 7 & 2 \\ -1 & 6 \\ 1 & 8 \end{bmatrix} \qquad \underset{4\times 4}{\boldsymbol{\Psi}} = \begin{bmatrix} 2 & 0 & 0 & 0 \\ 0 & 4 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 3 \end{bmatrix} \]

A comunalidade de \(X_1\), a partir de (9-6), é

\[ h_1^2 = \ell_{11}^2 + \ell_{12}^2 = 4^2 + 1^2 = 17 \]

A variância de \(X_1\) decompõe-se como

\[ \sigma_{11} = (\ell_{11}^2 + \ell_{12}^2) + \psi_1 = h_1^2 + \psi_1 \]

ou seja,

\[ \underbrace{19}_{\mathbb{V}(X_1)} = \underbrace{4^2 + 1^2}_{\text{comunalidade}} + \underbrace{2}_{\text{variância específica}} = 17 + 2 \]

Uma decomposição semelhante ocorre para as demais variáveis.

\[\Diamond\]

Contagem de parâmetros e limitações do modelo

O modelo fatorial supõe que as \(p + \dfrac{p(p-1)}{2} = \dfrac{p(p+1)}{2}\) variâncias e covariâncias de \(\mathbf{X}\) podem ser reproduzidas a partir das \(mp\) cargas fatoriais \(\ell_{ij}\) e das \(p\) variâncias específicas \(\psi_i\), totalizando \(p(m+1)\) parâmetros.

Quando \(m=p\), qualquer matriz de covariância \(\boldsymbol{\Sigma}\) pode ser reproduzida exatamente como \(\boldsymbol{\Sigma}=\mathbf{L}\mathbf{L}^{\prime}\), de modo que \(\boldsymbol{\Psi}\) pode ser a matriz nula. Contudo, é quando \(m\) é pequeno em relação a \(p\) que a análise fatorial é mais útil: o modelo fornece uma explicação mais simples da covariação em \(\mathbf{X}\) com menos parâmetros do que os \(\dfrac{p(p+1)}{2}\) necessários para descrever \(\boldsymbol{\Sigma}\).

Por exemplo, para \(p=12\) e um modelo apropriado com \(m=2\),

\[ \dfrac{p(p+1)}{2}=\dfrac{12\cdot 13}{2}=78 \qquad p(m+1) - \frac{1}{2}m(m-1) =12\cdot 3-1=35 \]

A parcela \(\frac{1}{2}m(m-1)\) dos parâmetros do modelo fatorial decorre da matriz \(\mathbf{T}\) ortogonal, pois eles não são identificáveis e precisam ser removidos do total de parâmetros.

Assim, os \(78\) elementos de \(\boldsymbol{\Sigma}\) são descritos por \(35\) parâmetros \(\ell_{ij}\) e \(\psi_i\) do modelo fatorial.

Note que há, na realidade, 37 parâmetros no modelo fatorial, sendo que dois deles são fixos e unitários. Estes dois parâmetros fixos são as variâncias unitários dos dois fatores. Portanto, há 35 parâmetros livres e 2 fixos.

O número de graus de liberdade do modelo fatorial ortogonal é:

\[ \begin{align} \text{df} &= \dfrac{p(p+1)}{2} - p(m+1)+ \frac{1}{2}m(m-1)\\ &= 78-35\\ \text{df} &= 43 \end{align} \]

Dessa forma, a quantidade de “observações” (fontes de informação) independentes para um eventual teste de hipótese nula do modelo é a quantidade de momentos centrados de segunda ordem; não é o número de unidades observacionais.

Se \(m=1\), número mínimo de variáveis manifestas para que \(\text{df}\ge1\) é \(p=4\), sendo que \(\text{df}=2\).

Se \(m=2\), número mínimo de variáveis manifestas para que \(\text{df}\ge1\) é \(p=5\), sendo que \(\text{df}=1\).

Se \(m=3\), número mínimo de variáveis manifestas para que \(\text{df}\ge1\) é \(p=7\), sendo que \(\text{df}=3\).

Entretanto, na prática, muitas matrizes de covariância não admitem a fatoração \(\boldsymbol{\Sigma}=\mathbf{L}\mathbf{L}^{\prime}+\boldsymbol{\Psi}\) quando o número de fatores \(m\) é muito menor que \(p\). O exemplo a seguir ilustra um problema que pode surgir ao se tentar determinar os parâmetros \(\ell_{ij}\) e \(\psi_i\) apenas a partir das variâncias e covariâncias observadas.

Exemplo 9.2: Inexistência de uma solução adequada

Sejam \(p=3\) e \(m=1\), e suponha que as variáveis aleatórias \(X_1\), \(X_2\) e \(X_3\) possuam a seguinte matriz de covariância definida positiva:

\[ \underset{3\times3}{\boldsymbol{\Sigma}}= \begin{bmatrix} 1 & 0.9 & 0.7 \\ 0.9 & 1 & 0.4 \\ 0.7 & 0.4 & 1 \end{bmatrix} \]

Pelo modelo fatorial (9-4), obtemos:

\[ \begin{aligned} X_1 - \mu_1 &= \ell_{11}F_1 + \varepsilon_1 \\ X_2 - \mu_2 &= \ell_{21}F_1 + \varepsilon_2 \\ X_3 - \mu_3 &= \ell_{31}F_1 + \varepsilon_3 \end{aligned} \]

A estrutura de covariância em (9-5) implica que

\[ \boldsymbol{\Sigma} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi} \]

ou, de forma escalar,

\[ \begin{aligned} 1 &= \ell_{11}^2 + \psi_1, \qquad &0.90 &= \ell_{11}\ell_{21} \qquad &0.70 &= \ell_{11}\ell_{31} \\ 1 &= \ell_{21}^2 + \psi_2, \qquad &0.40 &= \ell_{21}\ell_{31} \\ 1 &= \ell_{31}^2 + \psi_3 \end{aligned} \]

O par de equações

\[ 0.70 = \ell_{11}\ell_{31} \qquad 0.40 = \ell_{21}\ell_{31} \]

implica que

\[ \ell_{21} = \left(\dfrac{0.40}{0.70}\right)\ell_{11} \]

Substituindo esse resultado na equação \(0.90 = \ell_{11}\ell_{21}\), temos

\[ \ell_{11}^2 = 1.575 \quad \text{ou} \quad \ell_{11} = \pm 1.255 \]

Como \(\mathbb{V}(F_1)=1\) (por hipótese) e \(\mathbb{V}(X_1)=1\), tem-se que
\(\ell_{11} = \mathbb{C}(X_1,F_1)=\mathrm{Corr}(X_1,F_1)\).
Ora, um coeficiente de correlação não pode exceder a unidade (em módulo), logo \(|\ell_{11}|=1.255\) é excessivo.

Além disso, a equação

\[ 1 = \ell_{11}^2 + \psi_1 \quad \Rightarrow \quad \psi_1 = 1 - \ell_{11}^2 \]

produz

\[ \psi_1 = 1 - 1.575 = -0.575 \]

o que é insatisfatório, pois fornece um valor negativo para \(\mathbb{V}(\varepsilon_1)=\psi_1\).

Portanto, neste exemplo com \(m=1\), é possível obter uma solução numérica única para as equações \(\boldsymbol{\Sigma}=\mathbf{L}\mathbf{L}^{\prime}+\boldsymbol{\Psi}\); contudo, essa solução não é consistente com a interpretação estatística dos coeficientes e, portanto, não constitui uma solução adequada.

## Exemplo 9.2 – Inexistência de solução adequada com m = 1

## Matriz de covariância Σ (3x3)
Sigma <- matrix(c(1,   0.9, 0.7,
                  0.9, 1,   0.4,
                  0.7, 0.4, 1),
                nrow = 3, byrow = TRUE)
colnames(Sigma) <- rownames(Sigma) <- c("X1","X2","X3")

Sigma
    X1  X2  X3
X1 1.0 0.9 0.7
X2 0.9 1.0 0.4
X3 0.7 0.4 1.0
print(
  GGally::ggcorr(data=NULL,
                 name="",
                 cor_matrix=Sigma,
                 geom="tile",
                 min_size=0,
                 max_size=10, 
                 nbreaks=6,
                 digits=2,
                 label=TRUE,
                 label_round=2,
                 label_size=4)
)
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2

## Extraindo covariâncias cruzadas
sigma12 <- Sigma[1, 2]  # Cov(X1, X2) = 0.9
sigma13 <- Sigma[1, 3]  # Cov(X1, X3) = 0.7
sigma23 <- Sigma[2, 3]  # Cov(X2, X3) = 0.4

l11_sq <- (sigma12 * sigma13) / sigma23
l11_sq
[1] 1.575
## Valor de l11 (apenas para ilustrar; o sinal ± é irrelevante para o problema)
l11 <- sqrt(l11_sq)
l11
[1] 1.25499
## Obtendo l21 e l31:
l21 <- sigma12 / l11
l31 <- sigma13 / l11

c(l11 = l11, l21 = l21, l31 = l31)
      l11       l21       l31 
1.2549900 0.7171372 0.5577734 
## Calculando as variâncias específicas ψ1, ψ2, ψ3:
psi1 <- 1 - l11^2
psi2 <- 1 - l21^2
psi3 <- 1 - l31^2

c(psi1 = psi1, psi2 = psi2, psi3 = psi3)
      psi1       psi2       psi3 
-0.5750000  0.4857143  0.6888889 
## Matriz de cargas L (3x1) e matriz diagonal Ψ:
L   <- matrix(c(l11, l21, l31), ncol = 1)
Psi <- diag(c(psi1, psi2, psi3))

L
          [,1]
[1,] 1.2549900
[2,] 0.7171372
[3,] 0.5577734
Psi
       [,1]      [,2]      [,3]
[1,] -0.575 0.0000000 0.0000000
[2,]  0.000 0.4857143 0.0000000
[3,]  0.000 0.0000000 0.6888889
## Reconstruindo Σ via modelo fatorial Σ̂ = L L' + Ψ
Sigma_modelo <- tcrossprod(L) + Psi
Sigma_modelo
     [,1] [,2] [,3]
[1,]  1.0  0.9  0.7
[2,]  0.9  1.0  0.4
[3,]  0.7  0.4  1.0
## Diferença entre Σ observada e Σ do modelo:
Sigma - Sigma_modelo
   X1           X2           X3
X1  0 0.000000e+00 0.000000e+00
X2  0 0.000000e+00 5.551115e-17
X3  0 5.551115e-17 0.000000e+00
## Diagnóstico automático:
cat("\nTeste de adequação do modelo com m = 1:\n")

Teste de adequação do modelo com m = 1:
if (any(abs(L) > 1)) {
  cat("Problema: pelo menos uma carga fatorial tem |l_ij| > 1 (correlação impossível).\n")
}
Problema: pelo menos uma carga fatorial tem |l_ij| > 1 (correlação impossível).
if (any(diag(Psi) < 0)) {
  cat("Problema: pelo menos uma variância específica ψ_j é negativa (variância inválida).\n")
}
Problema: pelo menos uma variância específica ψ_j é negativa (variância inválida).
if (!any(abs(L) > 1) && !any(diag(Psi) < 0)) {
  cat("Modelo com m = 1 é estatisticamente aceitável (não é o caso deste exemplo).\n")
}

## EFA com 1 fator, sem restrição de variâncias positivas (para deixar aparecer Heywood)
fit_efa1 <- lavaan::efa(
  output = "lavaan",
  data       = NULL,
  sample.cov = Sigma,
  sample.nobs = 200,
  nfactors   = 1,
  rotation   = "none",
  bounds     = "none"   # default "pos.var" 
)
Warning: lavaan->lav_object_post_check():  
   some estimated ov variances are negative
## Resumo do modelo
lavaan::summary(fit_efa1, fit.measures = TRUE, standardized = TRUE)
lavaan 0.6-20 ended normally after 25 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         6

  Rotation method                                 NONE

  Number of observations                           200

Model Test User Model:
                                                      
  Test statistic                                 0.000
  Degrees of freedom                                 0

Model Test Baseline Model:

  Test statistic                               624.713
  Degrees of freedom                                 3
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    1.000
  Tucker-Lewis Index (TLI)                       1.000

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)               -537.503
  Loglikelihood unrestricted model (H1)       -537.503
                                                      
  Akaike (AIC)                                1087.006
  Bayesian (BIC)                              1106.795
  Sample-size adjusted Bayesian (SABIC)       1087.787

Root Mean Square Error of Approximation:

  RMSEA                                          0.000
  90 Percent confidence interval - lower         0.000
  90 Percent confidence interval - upper         0.000
  P-value H_0: RMSEA <= 0.050                       NA
  P-value H_0: RMSEA >= 0.080                       NA

Standardized Root Mean Square Residual:

  SRMR                                           0.000

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  f1 =~ efa                                                             
    X1                1.252    0.054   23.267    0.000    1.252    1.255
    X2                0.715    0.066   10.914    0.000    0.715    0.717
    X3                0.556    0.068    8.236    0.000    0.556    0.558

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .X1               -0.572    0.122   -4.704    0.000   -0.572   -0.575
   .X2                0.483    0.060    8.096    0.000    0.483    0.486
   .X3                0.685    0.072    9.553    0.000    0.685    0.689
    f1                1.000                               1.000    1.000
## Matrizes de parâmetros estimados (não padronizados)
est <- lavaan::inspect(fit_efa1, "est")  # lista com $lambda, $theta, etc.

L_hat   <- est$lambda            # cargas fatoriais
Theta   <- est$theta             # matriz de erros (Ψ)
Psi_hat <- diag(Theta)           # variâncias específicas

## Matriz de covariância reproduzida Σ_hat = ΛΛ' + Ψ
Sigma_hat <- lavaan::inspect(fit_efa1, "cov.ov")  # Σ̂ dos observáveis

## Resíduos Σ - Σ_hat
Sigma_res <- Sigma - Sigma_hat

cat("\nCargas fatoriais estimadas (Lambda):\n")

Cargas fatoriais estimadas (Lambda):
print(L_hat)
      f1
X1 1.252
X2 0.715
X3 0.556
cat("\nVariâncias específicas estimadas (diag(Theta)):\n")

Variâncias específicas estimadas (diag(Theta)):
print(Psi_hat)
        X1         X2         X3 
-0.5721250  0.4832857  0.6854444 
cat("\nMatriz de covariância reproduzida Σ_hat:\n")

Matriz de covariância reproduzida Σ_hat:
print(Sigma_hat)
      X1    X2    X3
X1 0.995            
X2 0.895 0.995      
X3 0.696 0.398 0.995
cat("\nResíduos Σ - Σ_hat (devem ser ~0, salvo arredondamento):\n")

Resíduos Σ - Σ_hat (devem ser ~0, salvo arredondamento):
print(Sigma_res)
      X1    X2    X3
X1 0.005            
X2 0.005 0.005      
X3 0.004 0.002 0.005
## Diagnóstico de admissibilidade
cat("\nDiagnóstico do modelo de 1 fator:\n")

Diagnóstico do modelo de 1 fator:
if (any(abs(L_hat) > 1)) {
  cat("- Pelo menos uma carga fatorial tem |loading| > 1 (correlação impossível).\n")
}
- Pelo menos uma carga fatorial tem |loading| > 1 (correlação impossível).
if (any(Psi_hat < 0)) {
  cat("- Pelo menos uma variância específica ψ_j é negativa (Heywood, modelo inadmissível).\n")
}
- Pelo menos uma variância específica ψ_j é negativa (Heywood, modelo inadmissível).
if (!any(abs(L_hat) > 1) && !any(Psi_hat < 0)) {
  cat("- Nenhum problema óbvio de admissibilidade detectado.\n")
}

\[\Diamond\]

Ambiguidade inerente e rotação fatorial

Quando \(m>1\), existe sempre uma ambiguidade inerente associada ao modelo fatorial.

Para compreender isso, seja \(\mathbf{T}\) uma matriz ortogonal \(m\times m\), de modo que \(\mathbf{T}\mathbf{T}^{\prime}=\mathbf{T}^{\prime}\mathbf{T}=\mathbf{I}\).

Então, a expressão em (9-2) pode ser escrita como

\[ \underset{p\times1}{\mathbf{X}} - \underset{p\times1}{\boldsymbol{\mu}} = \underset{p\times m}{\mathbf{L}}\;\underset{m\times1}{\mathbf{F}} + \underset{p\times1}{\boldsymbol{\varepsilon}} = \underset{p\times m}{\mathbf{L}}\;\mathbf{T}\mathbf{T}^{\prime}\underset{m\times1}{\mathbf{F}} + \underset{p\times1}{\boldsymbol{\varepsilon}} = \underset{p\times m}{\mathbf{L}^{\ast}}\;\underset{m\times1}{\mathbf{F}^{\ast}} + \underset{p\times1}{\boldsymbol{\varepsilon}} \tag{9-7} \]

sendo que

\[ \mathbf{L}^{\ast} = \mathbf{L}\mathbf{T} \qquad \mathbf{F}^{\ast} = \mathbf{T}^{\prime}\mathbf{F} \]

Como

\[ \mathbb{E}(\mathbf{F}^{\ast}) = \mathbf{T}^{\prime}\mathbb{E}(\mathbf{F}) = \mathbf{0} \qquad \mathbb{C}(\mathbf{F}^{\ast}) = \mathbf{T}^{\prime}\mathbb{C}(\mathbf{F})\mathbf{T} = \mathbf{T}^{\prime}\mathbf{T} = \underset{m\times m}{\mathbf{I}} \]

é impossível, com base nas observações de \(\mathbf{X}\), distinguir as cargas fatoriais \(\mathbf{L}\) de \(\mathbf{L}^{\ast}\).

Os fatores \(\mathbf{F}\) e \(\mathbf{F}^{\ast}=\mathbf{T}^{\prime}\mathbf{F}\) têm as mesmas propriedades estatísticas; assim, ainda que \(\mathbf{L}^{\ast}\) difira de \(\mathbf{L}\), ambas geram a mesma matriz de covariância \(\boldsymbol{\Sigma}\).

De fato,

\[ \boldsymbol{\Sigma} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi} = \mathbf{L}\mathbf{T}\mathbf{T}^{\prime}\mathbf{L}^{\prime} + \boldsymbol{\Psi} = (\mathbf{L}^{\ast})(\mathbf{L}^{\ast})^{\prime} + \boldsymbol{\Psi} \tag{9-8} \]

Essa ambiguidade justifica a rotação fatorial, pois matrizes ortogonais representam rotações (ou reflexões) no sistema de coordenadas de \(\mathbf{X}\), sem alterar a estrutura de covariância.

Identificação e rotação

As cargas fatoriais \(\mathbf{L}\) são determinadas considerando uma matriz ortogonal \(\mathbf{T}\). Assim,

\[ \mathbf{L}^{\ast} = \mathbf{L}\mathbf{T} \tag{9-9} \]

e \(\mathbf{L}\) fornecem a mesma representação.

As comunalidades, dadas pelos elementos diagonais de

\[ \mathbf{L}\mathbf{L}^{\prime} = (\mathbf{L}^{\ast})(\mathbf{L}^{\ast})^{\prime} \]

também não são afetadas pela escolha de \(\mathbf{T}\).

Estimação e escore fatorial

A análise do modelo fatorial prossegue impondo condições que permitam estimar unicamente \(\mathbf{L}\) e \(\boldsymbol{\Psi}\).

A matriz de cargas é então rotacionada (multiplicada por uma matriz ortogonal), sendo a rotação determinada por algum critério de “facilidade de interpretação”.

Uma vez obtidas as cargas e variâncias específicas, os fatores são identificados e valores estimados para os próprios fatores (denominados escores fatoriais) são frequentemente construídos.

Métodos de Estimação

Dadas observações \(\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_n\) em \(p\) variáveis geralmente correlacionadas, a análise fatorial busca responder à questão:

O modelo fatorial (9-4), com um pequeno número de fatores, representa adequadamente os dados?

Em essência, esse problema de modelagem estatística é tratado tentando verificar a relação de covariância expressa em (9-5).

A matriz de covariância amostral \(\mathbf{S}\) é um estimador da matriz de covariância populacional desconhecida \(\boldsymbol{\Sigma}\).
Se os elementos fora da diagonal de \(\mathbf{S}\) forem pequenos, ou se os da matriz de correlação amostral \(\mathbf{R}\) forem essencialmente zero, então as variáveis não estão relacionadas e a análise fatorial não será útil.

Nessas circunstâncias, os fatores específicos desempenham o papel dominante, enquanto o principal objetivo da análise fatorial é determinar alguns poucos fatores comuns importantes.

Se \(\boldsymbol{\Sigma}\) parecer desviar-se significativamente de uma matriz diagonal, então um modelo fatorial pode ser considerado, e o problema inicial é estimar as cargas fatoriais \(\ell_{ij}\) e as variâncias específicas \(\psi_i\).

Serão considerados dois dos métodos mais populares de estimação de parâmetros: o método de componentes principais e o método da máxima verossimilhança.

A solução obtida por qualquer desses métodos pode ser rotacionada para simplificar a interpretação dos fatores, como descrito na Seção 9.4.
É sempre prudente tentar mais de um método de solução; se o modelo fatorial for adequado ao problema em questão, as soluções devem ser consistentes entre si.

Os métodos atuais de estimação e rotação exigem cálculos iterativos que devem ser realizados em computador. Vários programas computacionais estão atualmente disponíveis para essa finalidade.

Método de Componentes Principais

A decomposição espectral de (2-20) fornece uma fatoração da matriz de covariância \(\boldsymbol{\Sigma}\).

Seja \(\boldsymbol{\Sigma}\) associada a pares autovalor–autovetor \((\lambda_i, \mathbf{e}_i)\), com \(\lambda_1 \ge \lambda_2 \ge \cdots \ge \lambda_p \ge 0\).
Então,

\[ \boldsymbol{\Sigma} = \sum_{i=1}^{p}{\lambda_i \mathbf{e}_i\mathbf{e}_i^{\prime}} \]

ou, de forma matricial,

\[ \boldsymbol{\Sigma} = \begin{bmatrix} \sqrt{\lambda_1}\mathbf{e}_1 & \sqrt{\lambda_2}\mathbf{e}_2 & \cdots & \sqrt{\lambda_p}\mathbf{e}_p \end{bmatrix} \begin{bmatrix} \sqrt{\lambda_1}\mathbf{e}_1^{\prime} \\[3pt] \sqrt{\lambda_2}\mathbf{e}_2^{\prime} \\[3pt] \vdots \\[3pt] \sqrt{\lambda_p}\mathbf{e}_p^{\prime} \end{bmatrix} \tag{9-10} \]

Essa fatoração satisfaz a estrutura de covariância prescrita para o modelo fatorial, assumindo tantos fatores quanto variáveis (\(m=p\)) e variâncias específicas \(\psi_i=0\) para todo \(i\).
A matriz de cargas fatoriais \(\mathbf{L}\) tem sua \(j\)‑ésima coluna dada por \(\sqrt{\lambda_j}\,\mathbf{e}_j\). Assim, podemos escrever

\[ \underset{p\times p}{\boldsymbol{\Sigma}} = \underset{p\times p}{\mathbf{L}}\; \underset{p\times p}{\mathbf{L}^{\prime}} + \underset{p\times p}{\mathbf{0}} = \mathbf{L}\mathbf{L}^{\prime} \tag{9-11} \]

Exceto pela escala \(\sqrt{\lambda_j}\), as cargas fatoriais do \(j\)‑ésimo fator são os coeficientes do \(j\)‑ésimo componente principal da população.

Embora a representação fatorial de \(\boldsymbol{\Sigma}\) em (9‑11) seja exata, ela não é particularmente útil: emprega tantos fatores comuns quanto variáveis e não permite variação nos fatores específicos \(\boldsymbol{\varepsilon}\) do modelo (9‑4).

Modelos de maior interesse são aqueles que explicam a estrutura de covariância em termos de apenas alguns poucos fatores comuns.

Se os últimos \(p - m\) autovalores são pequenos, uma abordagem comum é negligenciar a contribuição de \(\sum_{i=m+1}^{p}{\lambda_i \mathbf{e}_i\mathbf{e}_i^{\prime}}\) na decomposição espectral de (9‑10).

Negligenciando essa contribuição, obtemos a aproximação

\[ \boldsymbol{\Sigma} \approx \begin{bmatrix} \sqrt{\lambda_1}\mathbf{e}_1 & \sqrt{\lambda_2}\mathbf{e}_2 & \cdots & \sqrt{\lambda_m}\mathbf{e}_m \end{bmatrix} \begin{bmatrix} \sqrt{\lambda_1}\mathbf{e}_1^{\prime} \\[3pt] \sqrt{\lambda_2}\mathbf{e}_2^{\prime} \\[3pt] \vdots \\[3pt] \sqrt{\lambda_m}\mathbf{e}_m^{\prime} \end{bmatrix} = \underset{p\times m}{\mathbf{L}}\;\underset{m\times p}{\mathbf{L}^{\prime}} \tag{9-12} \]

A representação aproximada em (9‑12) supõe que os fatores específicos \(\boldsymbol{\varepsilon}\) em (9‑4) são de importância secundária e podem ser ignorados na fatoração de \(\boldsymbol{\Sigma}\).

Se os fatores específicos forem incluídos no modelo, suas variâncias podem ser tomadas como os elementos diagonais de \(\boldsymbol{\Sigma} - \mathbf{L}\mathbf{L}^{\prime}\), conforme definido em (9‑12), sendo que os zeros são impostos, i.e.:

\[ \text{diag}(\boldsymbol{\Sigma} - \mathbf{L}\mathbf{L}^{\prime})=\boldsymbol{\Psi}=\begin{bmatrix} \psi_1 & 0 & \cdots & 0 \\ 0 & \psi_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \psi_p \end{bmatrix} \] sendo que \(\psi_i = \sigma_{ii} - \sum_{j=1}^{m} \ell_{ij}^2,\quad i = 1, 2, \ldots, p\).

Considerando fatores específicos, obtemos a aproximação (os zeros são impostos!):

\[ \begin{align} \boldsymbol{\Sigma} &\approx \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}\\ &= \begin{bmatrix} \sqrt{\lambda_1}\mathbf{e}_1 & \sqrt{\lambda_2}\mathbf{e}_2 & \cdots & \sqrt{\lambda_m}\mathbf{e}_m \end{bmatrix} \begin{bmatrix} \sqrt{\lambda_1}\mathbf{e}_1^{\prime} \\[3pt] \sqrt{\lambda_2}\mathbf{e}_2^{\prime} \\[3pt] \vdots \\[3pt] \sqrt{\lambda_m}\mathbf{e}_m^{\prime} \end{bmatrix} +\\ &\quad \begin{bmatrix} \psi_1 & 0 & \cdots & 0 \\ 0 & \psi_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \psi_p \end{bmatrix} \end{align} \tag{9-13} \]

Para aplicar essa abordagem a um conjunto de dados \(\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_n\), é costume primeiramente centralizar as observações subtraindo a média amostral \(\bar{\mathbf{x}}\).

As observações centradas são dadas por

\[ \mathbf{x}_j - \bar{\mathbf{x}} = \begin{bmatrix} x_{1j} - \bar{x}_1 \\ x_{2j} - \bar{x}_2 \\ \vdots \\ x_{pj} - \bar{x}_p \end{bmatrix} \qquad j = 1, 2, \ldots, n \tag{9-14} \]

as quais possuem a mesma matriz de covariância amostral \(\mathbf{s}\) das observações originais.

Nos casos em que as unidades das variáveis não são comensuráveis, é geralmente desejável trabalhar com as variáveis padronizadas:

\[ \mathbf{z}_j = \begin{bmatrix} \dfrac{x_{1j} - \bar{x}_1}{\sqrt{s_{11}}} \\[6pt] \dfrac{x_{2j} - \bar{x}_2}{\sqrt{s_{22}}} \\[6pt] \vdots \\[6pt] \dfrac{x_{pj} - \bar{x}_p}{\sqrt{s_{pp}}} \end{bmatrix} \qquad j = 1, 2, \ldots, n \]

A matriz de covariância amostral dessas variáveis padronizadas é a matriz de correlação amostral \(\mathbf{r}\) das observações \(\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_n\).

A padronização evita o problema de uma variável com variância muito grande influenciar indevidamente a determinação das cargas fatoriais.

A representação em (9‑13), quando aplicada à matriz de covariância amostral \(\mathbf{s}\) ou à matriz de correlação amostral \(\mathbf{s}\), é conhecida como solução por componentes principais (PCA).

Essa denominação decorre do fato de que as cargas fatoriais correspondem aos coeficientes escalonados dos primeiros componentes principais amostrais. (Ver Capítulo 8.)

Solução por Componentes Principais do Modelo Fatorial

A análise fatorial por componentes principais da matriz de covariância amostral \(\mathbf{s}\) é especificada em termos de seus pares autovalor–autovetor
\((\hat{\lambda}_1, \hat{\mathbf{e}}_1), (\hat{\lambda}_2, \hat{\mathbf{e}}_2), \ldots, (\hat{\lambda}_p, \hat{\mathbf{e}}_p)\), com \(\hat{\lambda}_1 \ge \hat{\lambda}_2 \ge \cdots \ge \hat{\lambda}_p>0\).

Seja \(m < p\) o número de fatores comuns. Então, a matriz de cargas fatoriais estimadas \(\left\{\tilde{\ell}_{ij}\right\}\) é dada por

\[ \underset{p\times m}{\tilde{\mathbf{L}}} = \begin{bmatrix} \sqrt{\hat{\lambda}_1}\,\hat{\mathbf{e}}_1 & \sqrt{\hat{\lambda}_2}\,\hat{\mathbf{e}}_2 & \cdots & \sqrt{\hat{\lambda}_m}\,\hat{\mathbf{e}}_m \end{bmatrix} \tag{9-15} \]

As variâncias específicas estimadas são fornecidas pelos elementos diagonais da matriz
\(\mathbf{s} - \tilde{\mathbf{L}}\tilde{\mathbf{L}}^{\prime}\), de modo que

\[ \underset{p\times p}{\tilde{\boldsymbol{\Psi}}} = \begin{bmatrix} \tilde{\psi}_1 & 0 & \cdots & 0 \\ 0 & \tilde{\psi}_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & \tilde{\psi}_p \end{bmatrix}, \qquad \tilde{\psi}_i = s_{ii} - \sum_{j=1}^{m} \tilde{\ell}_{ij}^2 \tag{9-16} \]

As comunalidades são estimadas por

\[ \tilde{h}_i^2 = \sum_{j=1}^{m} \tilde{\ell}_{ij}^2 \tag{9-17} \]

A análise fatorial por componentes principais da matriz de correlação amostral é obtida substituindo-se \(\mathbf{r}\) no lugar de \(\mathbf{s}\).

Seleção do número de fatores comuns

Na solução por componentes principais, as cargas estimadas para um dado fator não mudam quando o número de fatores é aumentado.

Por exemplo, se \(m = 1\),

\[ \tilde{\mathbf{L}} = \left[\sqrt{\hat{\lambda}_1}\,\hat{\mathbf{e}}_1\right] \]

e, se \(m = 2\),

\[ \tilde{\mathbf{L}} = \left[\sqrt{\hat{\lambda}_1}\,\hat{\mathbf{e}}_1 \quad\sqrt{\hat{\lambda}_2}\,\hat{\mathbf{e}}_2\right] \]

sendo que \((\hat{\lambda}_1, \hat{\mathbf{e}}_1)\) e \((\hat{\lambda}_2, \hat{\mathbf{e}}_2)\) são os dois primeiros pares autovalor–autovetor de \(\mathbf{s}\) (ou \(\mathbf{r}\)).

Pela definição de \(\tilde{\psi}_i\), os elementos diagonais de \(\mathbf{s}\) são iguais aos elementos diagonais de \(\tilde{\mathbf{s}}=\tilde{\mathbf{L}}\tilde{\mathbf{L}}^{\prime} + \tilde{\boldsymbol{\Psi}}\).

No entanto, os elementos fora da diagonal de \(\mathbf{s}\) geralmente não são reproduzidos por \(\tilde{\mathbf{s}}=\tilde{\mathbf{L}}\tilde{\mathbf{L}}^{\prime} + \tilde{\boldsymbol{\Psi}}\).

A questão prática, então, é:

Como escolher o número de fatores \(m\)?

Se o número de fatores comuns não for determinado a priori (por teoria ou trabalhos prévios), a escolha de \(m\) pode ser baseada nos autovalores estimados, de modo análogo à análise de componentes principais.

Considera-se a matriz residual

\[ \mathbf{s} - (\tilde{\mathbf{L}}\tilde{\mathbf{L}}^{\prime} + \tilde{\boldsymbol{\Psi}})= \mathbf{s} -\tilde{\mathbf{s}} \tag{9-18} \]

resultante da aproximação de \(\mathbf{s}\) pela solução de componentes principais.

Os elementos diagonais dessa matriz são zero, e, se os demais elementos também forem pequenos, o modelo com \(m\) fatores pode ser considerado adequado.

Analiticamente, temos

\[ \text{Soma dos quadrados dos elementos de }\mathbf{s} -\tilde{\mathbf{s}} \le \sum_{i=m}^{p}{\hat{\lambda}_{i+1}^2} \tag{9-19} \]

Um valor pequeno para a soma dos quadrados dos autovalores negligenciados implica erros de aproximação igualmente pequenos.

Idealmente, os primeiros fatores comuns devem explicar uma proporção substancial da variância amostral das variáveis.

A contribuição do primeiro fator comum para a variância amostral \(s_{ii}\) é \(\tilde{\ell}_{i1}^2\).

A contribuição para a variância amostral total

\[ \text{tr}(\mathbf{s})=\sum_{i=1}^{p}{s_{ii}}, \] do primeiro fator comum é então:

\[ \sum_{j=1}^{p} \tilde{\ell}_{j1}^2=\hat{\lambda}_1 \]

Em geral, a proporção da variância amostral total explicada pelo j‑ésimo fator é dada por

\[ \text{Prop da var tot devido ao j‑ésimo fator} = \begin{cases} \dfrac{\hat{\lambda}_j}{\sum_{i=1}^{p}{s_{ii}}}, & \text{se } \mathbf{s} \\[8pt] \dfrac{\hat{\lambda}_j}{p}, & \text{se } \mathbf{r} \end{cases} \tag{9-20} \]

O critério (9‑20) é frequentemente usado como regra heurística para determinar o número adequado de fatores comuns.

Um número apropriado de fatores é aquele que explica uma proporção “suficiente” da variância total.

Outra convenção, comum em programas computacionais, é definir \(m\) igual ao número de autovalores positivos de \(\mathbf{s}\) ou ao número de autovalores de \(\mathbf{r}\) maiores que 1.

Essas regras devem ser aplicadas com cautela: o ideal é reter poucos fatores que ofereçam interpretação satisfatória e bom ajuste aos dados.

Exemplo 9.3: Análise fatorial de dados de preferência do consumidor

Em um estudo de preferência do consumidor, uma amostra aleatória de clientes avaliou vários atributos de um novo produto.

As respostas, em uma escala diferencial semântica de 7 pontos, foram tabuladas e construída a matriz de correlação dos atributos:

\[ \mathbf{r}=\begin{bmatrix} 1.00 & 0.02 & 0.96 & 0.42 & 0.01 \\ 0.02 & 1.00 & 0.13 & 0.71 & 0.85 \\ 0.96 & 0.13 & 1.00 & 0.50 & 0.11 \\ 0.42 & 0.71 & 0.50 & 1.00 & 0.79 \\ 0.01 & 0.85 & 0.11 & 0.79 & 1.00 \end{bmatrix} \]

Os valores destacados na matriz mostram que as variáveis (1, 3) e (2, 5) formam grupos, enquanto a variável 4 está mais próxima do grupo (2, 5) do que do grupo (1, 3).

Diante desses resultados e do pequeno número de variáveis, espera-se que as relações lineares observadas possam ser explicadas por, no máximo, dois ou três fatores comuns.

Os dois primeiros autovalores da matriz \(\mathbf{r}\) são \(\hat{\lambda}_1 = 2.85\) e \(\hat{\lambda}_2 = 1.81\), sendo os únicos maiores que 1.

Portanto, \(m = 2\) fatores comuns explicam uma proporção acumulada de

\[ \dfrac{\hat{\lambda}_1 + \hat{\lambda}_2}{p} = \dfrac{2.85 + 1.81}{5} = 0.93 \]

isto é, 93% da variância amostral total (padronizada).

As cargas fatoriais, comunalidades e variâncias específicas estimadas usando (9‑15), (9‑16) e (9‑17) são apresentadas na Tabela 9.1.

A tabela a seguir apresenta as cargas fatoriais estimadas \(\tilde{\ell}_{ij} = \sqrt{\hat{\lambda}_i}\,\hat{e}_{ij}\),
as comunalidades \(\tilde{h}_i^2\), e as variâncias específicas \(\tilde{\psi}_i = 1 - \tilde{h}_i^2\) obtidas no Exemplo 9.3.

Tabela 9.1: Cargas fatoriais, comunalidades e variâncias específicas

Variável \(F_1\) \(F_2\) \(\tilde{h}_i^2\) \(\tilde{\psi}_i\)
1. Gosto .56 .82 .98 .02
2. Bom custo-benefício .78 -.53 .88 .12
3. Sabor .65 .75 .98 .02
4. Adequado para lanche .94 -.10 .89 .11
5. Fornece energia .80 -.54 .93 .07

Autovalores: 2.85, 1.81

Proporção acumulada da variância amostral total (padronizada):

  • Primeiro fator: 0.571
  • Dois fatores: 0.932

As altas comunalidades indicam que os dois fatores explicam grande parte da variância das cinco variáveis observadas,
confirmando que um modelo com dois fatores ortogonais é suficiente para representar adequadamente as correlações originais.

Verificação da reconstituição da matriz de correlação:

\[ \begin{align} \tilde{\mathbf{L}}\tilde{\mathbf{L}}^{\prime} + \tilde{\boldsymbol{\Psi}} &= \begin{bmatrix} .56 & .82 \\ .78 & -.53 \\ .65 & .75 \\ .94 & -.10 \\ .80 & -.54 \end{bmatrix} \begin{bmatrix} .56 & .78 & .65 & .94 & .80 \\ .82 & -.53 & .75 & -.10 & -.54 \end{bmatrix} +\\ &\qquad\begin{bmatrix} .02 & 0 & 0 & 0 & 0 \\ 0 & .12 & 0 & 0 & 0 \\ 0 & 0 & .02 & 0 & 0 \\ 0 & 0 & 0 & .11 & 0 \\ 0 & 0 & 0 & 0 & .07 \end{bmatrix}\\ \tilde{\mathbf{L}}\tilde{\mathbf{L}}^{\prime} + \tilde{\boldsymbol{\Psi}}&= \begin{bmatrix} 1.00 & .01 & .97 & .44 & .00 \\ .01 & 1.00 & .11 & .79 & .91 \\ .97 & .11 & 1.00 & .53 & .11 \\ .44 & .79 & .53 & 1.00 & .81 \\ .00 & .91 & .11 & .81 & 1.00 \end{bmatrix} \end{align} \]

A matriz resultante reproduz quase exatamente a matriz de correlação \(\mathbf{r}\).

Assim, de forma descritiva, um modelo com dois fatores fornece um bom ajuste aos dados.

As comunalidades (.98, .88, .98, .89, .93) indicam que os dois fatores explicam grande parte da variância amostral de cada variável.

A interpretação dos fatores não é feita neste ponto, pois, como discutido na Seção 9.2, as cargas fatoriais são únicas apenas até uma rotação ortogonal. A rotação frequentemente revela uma estrutura mais simples e facilita a interpretação — esse exemplo será retomado após a discussão sobre rotação fatorial (Exemplo 9.9 e Painel 9.1).

Note que a matriz de correlação não é homogênea. Isso sugere a existência de mais de um fator comum.

No contexto de análise de componentes principais (PCA), é possível interpretar as duas componentes principais extraídas. A primeira componente principal expressa um índice geral de preferência do consumidor (cargas fatoriais elevadas e positivas). A segunda componente principal expressa um índice que contrapõe preferência hedônica (carga fatorial positiva) e preferência econômica (carga fatorial positiva).

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
r <- matrix(c(
  1.00, 0.02, 0.96, 0.42, 0.01,
  0.02, 1.00, 0.13, 0.71, 0.85,
  0.96, 0.13, 1.00, 0.50, 0.11,
  0.42, 0.71, 0.50, 1.00, 0.79,
  0.01, 0.85, 0.11, 0.79, 1.00
), nrow = 5, byrow = TRUE)
colnames(r) <- rownames(r) <- c("Gosto", "CustoBenef", "Sabor", "Lanche", "Energia")
print(r)
           Gosto CustoBenef Sabor Lanche Energia
Gosto       1.00       0.02  0.96   0.42    0.01
CustoBenef  0.02       1.00  0.13   0.71    0.85
Sabor       0.96       0.13  1.00   0.50    0.11
Lanche      0.42       0.71  0.50   1.00    0.79
Energia     0.01       0.85  0.11   0.79    1.00
n <- 200
p <- dim(r)[1]
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 200 p = 5 m = 2 df = 1
print(
  GGally::ggcorr(data=NULL,
                 name="Preferência do Consumidor",
                 cor_matrix=r,
                 geom="tile",
                 min_size=0,
                 max_size=10, 
                 nbreaks=6,
                 digits=2,
                 label=TRUE,
                 label_round=2,
                 label_size=4)
)

## 1) calcular um layout fixo sem plotar
set.seed(123)  # só para o layout ser reprodutível
q_tmp <- qgraph::qgraph(
  r,
  graph      = "cor",
  sampleSize = n,
  minimum    = "sig",
  bonf       = TRUE,
  layout     = "spring",
  DoNotPlot  = TRUE  # <- calcula, mas não desenha
)

layout_fix <- q_tmp$layout  # <- matriz de coordenadas dos nós

## 2) rede de correlações, agora usando layout_fix
qgraph::qgraph(
  r, 
  graph      = "cor", 
  sampleSize = n,
  minimum    = "sig",
  bonf       = TRUE,
  layout     = layout_fix,  # <- aqui entra o layout fixo
  shape      = "rectangle",
  vsize      = 8,
  label.cex  = 1.6,
  labels     = colnames(r),
  label.prop = 0,
  theme      = "gray",
  title      = "Taxa de retorno de ação EUA (cor)",
  details    = FALSE
)

## 3) rede glasso, com o MESMO layout
suppressWarnings(qgraph::qgraph(
  r, 
  graph      = "glasso", 
  sampleSize = n,
  layout     = layout_fix,  # <- mesmo layout, só mudam as arestas
  shape      = "rectangle",
  vsize      = 8,
  label.cex  = 1.6,
  labels     = colnames(r),
  label.prop = 0,
  theme      = "gray",
  title      = "Taxa de retorno de ação EUA (glasso)",
  details    = FALSE
))
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

eig <- eigen(r, symmetric = TRUE)
lambda <- eig$values
E <- eig$vectors  # colunas = autovetores unitários

dt <- data.frame(1:length(lambda),format(as.numeric(lambda), 
                                     digits=2, 
                                     nsmall=2))
names(dt) <- c("component","value")
print(dt)
  component value
1         1 2.853
2         2 1.806
3         3 0.204
4         4 0.102
5         5 0.034
plot(lambda, 
     main="Preferência do Consumidor (cor)",
     xlab="Componente", ylab="Autovalor", 
     type="o", pch=16, axes=FALSE)
axis(1, at=1:length(lambda))
axis(2)
abline(h=1,col="darkgray",lty=2)

sv1maior <- lambda[1]
sv2maior <- lambda[2]
H <- NA
if(sv2maior>0) {H <- sv1maior/sv2maior}
cat("FirstAV/SecondAV = H = ",round(sv1maior,2),"/",round(sv2maior,2)," ~ ",round(H,2),"\n",sep="")
FirstAV/SecondAV = H = 2.85/1.81 ~ 1.58
cat("\t- if < 2: first order\n")
    - if < 2: first order
cat("\t- if > 3: unifactor\n")
    - if > 3: unifactor
cat("\t- otherwise: bifactor\n")
    - otherwise: bifactor
if (H <= 2) {txt <- "\tpossible first order model, av1/av2 <= 2"}
if (H > 2 & H <= 3) {txt <- "\tpossible bifactor model, 2 < av1/av2 <= 3"}
if (H > 3) {txt <- "\tpossible unifactor model, av1/av2 > 3"}
cat(txt)
    possible first order model, av1/av2 <= 2
# Matriz de cargas: j-ésima coluna = sqrt(lambda_j) * e_j
L <- cbind( sqrt(lambda[1]) * E[,1], sqrt(lambda[2]) * E[,2] )
colnames(L) <- paste0("F", 1:m)
rownames(L) <- rownames(r)
print(L, digits=3)
              F1     F2
Gosto      0.560 -0.816
CustoBenef 0.777  0.524
Sabor      0.645 -0.748
Lanche     0.939  0.105
Energia    0.798  0.543
h2  <- rowSums(L^2)
psi <- 1 - h2
prop1 <- lambda[1] / nrow(r)                 # proporção explicada pelo 1º fator
prop2 <- sum(lambda[1:2]) / nrow(r)          # proporção acumulada por 2 fatores

print(round(c(prop1 = prop1, prop2 = prop2), 3))
prop1 prop2 
0.571 0.932 
tab <- cbind(Load_F1 = L[,1], Load_F2 = L[,2],
             h2 = h2, psi = psi)
print(round(tab, 2))
           Load_F1 Load_F2   h2  psi
Gosto         0.56   -0.82 0.98 0.02
CustoBenef    0.78    0.52 0.88 0.12
Sabor         0.65   -0.75 0.98 0.02
Lanche        0.94    0.10 0.89 0.11
Energia       0.80    0.54 0.93 0.07
r_hat <- tcrossprod(L) + diag(psi)
colnames(r_hat) <- rownames(r_hat) <- rownames(r)
round(r_hat, 2)
           Gosto CustoBenef Sabor Lanche Energia
Gosto       1.00       0.01  0.97   0.44    0.00
CustoBenef  0.01       1.00  0.11   0.78    0.91
Sabor       0.97       0.11  1.00   0.53    0.11
Lanche      0.44       0.78  0.53   1.00    0.81
Energia     0.00       0.91  0.11   0.81    1.00
print(round(r - r_hat, 3))
            Gosto CustoBenef  Sabor Lanche Energia
Gosto       0.000      0.013 -0.012 -0.020   0.006
CustoBenef  0.013      0.000  0.020 -0.075  -0.055
Sabor      -0.012      0.020  0.000 -0.028   0.001
Lanche     -0.020     -0.075 -0.028  0.000  -0.017
Energia     0.006     -0.055  0.001 -0.017   0.000
pca.m2 <- psych::principal(r = r,
                           covar = FALSE,
                           nfactors = m,
                           rotate = "none",
                           n.obs = n)
psych::fa.plot(pca.m2)

print(pca.m2,
      sort=FALSE, 
      digits=2, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = r, nfactors = m, rotate = "none", n.obs = n, 
    covar = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
            PC1   PC2   h2    u2 com
Gosto      0.56  0.82 0.98 0.021 1.8
CustoBenef 0.78 -0.52 0.88 0.121 1.8
Sabor      0.65  0.75 0.98 0.024 2.0
Lanche     0.94 -0.10 0.89 0.107 1.0
Energia    0.80 -0.54 0.93 0.068 1.8

                       PC1  PC2
SS loadings           2.85 1.81
Proportion Var        0.57 0.36
Cumulative Var        0.57 0.93
Proportion Explained  0.61 0.39
Cumulative Proportion 0.61 1.00

Mean item complexity =  1.7
Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is  0.03 
 with the empirical chi square  4.34  with prob <  0.037 

Fit based upon off diagonal values = 1
print(pca.m2$loadings,
      sort=TRUE, 
      digits=2, 
      cut=0.0)

Loadings:
           PC1   PC2  
CustoBenef  0.78 -0.52
Lanche      0.94 -0.10
Energia     0.80 -0.54
Gosto       0.56  0.82
Sabor       0.65  0.75

                PC1  PC2
SS loadings    2.85 1.81
Proportion Var 0.57 0.36
Cumulative Var 0.57 0.93
# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                                covmat = r,
                                n.obs = n,
                                rotation = "none",
                                factors = m,
                                scores = "none")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="path",
                  whatLabels="no",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  sizeInt=4,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

Nota: 1. Esta é a solução por componentes principais: não há rotação e os fatores são construídos diretamente dos dois maiores autovalores/autovetores da matriz de correlação.

\[\Diamond\]

Exemplo 9.4: Análise fatorial de dados de taxa de retorno de ações dos EUA

Conjuntos de dados de preço de ações consistindo de \(n=100\) taxas semanais de retorno em \(p=5\) ações foram introduzidos no Exemplo 8.5. Nesse exemplo, as duas primeiras componentes principais amostrais foram obtidas a partir de \(\mathbf{r}\). Tomando \(m=1\) e \(m=2\), podemos facilmente obter soluções de componentes principais para o modelo fatorial ortogonal. Especificamente, as cargas fatoriais estimadas são os coeficientes das componentes principais amostrais (autovetores de \(\mathbf{r}\)), escalonados pela raiz quadrada dos autovalores correspondentes. As cargas fatoriais estimadas, comunalidades, variâncias específicas e a proporção da variância amostral total (padronizada) explicada por cada fator para as soluções com \(m=1\) e \(m=2\) estão na Tabela 9.2. Assim, por exemplo, com \(m=2\),

\[ \tilde{h}_1^2 \;=\; (.723)^2 + (-.437)^2 \;=\; .73 \]

A matriz residual correspondente à solução com \(m=2\) fatores é

\[ \mathbf{r} - \tilde{\mathbf{r}} = \mathbf{r} - \tilde{\mathbf{L}}\,\tilde{\mathbf{L}}^{\prime} - \tilde{\boldsymbol{\Psi}} = \begin{bmatrix} 0.000 & -0.099 & -0.185 & -0.025 & 0.056\\ -0.099 & 0.000 & -0.134 & 0.014 & -0.054\\ -0.185 & -0.134 & 0.000 & 0.003 & 0.006\\ -0.025 & 0.014 & 0.003 & 0.000 & -0.156\\ 0.056 & -0.054 & 0.006 & -0.156 & 0.000 \end{bmatrix} \]

A proporção da variância total explicada pela solução com dois fatores é apreciavelmente maior do que pela solução com um fator. No entanto, para \(m=2\), \(\tilde{\mathbf{L}}\,\tilde{\mathbf{L}}^{\prime}\) produz números que são, em geral, maiores do que as correlações amostrais. Isso é particularmente verdadeiro para \(r_{45}\).

Parece bastante claro que o primeiro fator, \(F_1\), representa condições econômicas gerais e pode ser chamado de fator de mercado. Todas as ações carregam fortemente neste fator, e as cargas são aproximadamente iguais. O segundo fator contrasta as ações químicas com as ações de petróleo. (As químicas têm cargas relativamente grandes e negativas, e as de petróleo têm grandes cargas positivas neste fator.) Assim, \(F_2\) parece diferenciar ações em diferentes indústrias e pode ser chamado de fator de indústria. Em resumo, as taxas de retorno parecem ser determinadas por condições gerais de mercado e atividades que são exclusivas das diferentes indústrias, bem como por um fator residual ou específico da empresa. Essa é essencialmente a mesma conclusão alcançada pelo exame das componentes principais amostrais no Exemplo 8.5.

Tabela 9.2: Cargas fatoriais, comunalidades e variâncias específicas (soluções \(m=1\) e \(m=2\))

Variável Solução de 1 fator Solução de 2 fatores
Cargas fatoriais estimadas \(F_1\) Variâncias específicas \(\tilde{\psi}_i = 1 - \tilde{h}_i^2\) Cargas fatoriais estimadas \(F_1\) Cargas fatoriais estimadas \(F_2\)
1. J P Morgan .732 .46 .732 −.437
2. Citibank .831 .31 .831 −.280
3. Wells Fargo .726 .47 .726 −.374
4. Royal Dutch Shell .605 .63 .605 .694
5. ExxonMobil .563 .68 .563 .719

Proporção cumulativa da variância total (padronizada) explicada:

suppressMessages(suppressWarnings(invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
Dados <- read.delim("JW6Data/T8-4.DAT", header = FALSE)
colnames(Dados) <- c("JPM", "Citi", "WF", "RDS", "EM")
r <- cor(Dados, use = "complete.obs", method = "pearson")
print(round(r, 3))
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.632 0.510 0.115 0.154
Citi 0.632 1.000 0.574 0.322 0.213
WF   0.510 0.574 1.000 0.182 0.146
RDS  0.115 0.322 0.182 1.000 0.683
EM   0.154 0.213 0.146 0.683 1.000
n <- nrow(Dados)
p <- ncol(Dados)
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 103 p = 5 m = 2 df = 1
print(psych::describe(Dados), digits=4)
     vars   n   mean     sd median trimmed    mad     min    max  range    skew
JPM     1 103 0.0011 0.0208 0.0034  0.0013 0.0217 -0.0459 0.0485 0.0943 -0.1128
Citi    2 103 0.0007 0.0209 0.0017  0.0002 0.0207 -0.0598 0.0525 0.1123  0.0893
WF      3 103 0.0016 0.0150 0.0003  0.0010 0.0130 -0.0362 0.0407 0.0769  0.3222
RDS     4 103 0.0040 0.0269 0.0063  0.0045 0.0245 -0.0539 0.0620 0.1159 -0.1267
EM      5 103 0.0040 0.0277 0.0052  0.0045 0.0249 -0.0636 0.0784 0.1420 -0.1173
     kurtosis     se
JPM   -0.5367 0.0021
Citi   0.3767 0.0021
WF     0.0108 0.0015
RDS   -0.4341 0.0026
EM     0.3017 0.0027
suppressWarnings(GGally::ggpairs(Dados)+ggplot2::theme_bw()) 

print(
   GGally::ggcorr(data=NULL,
                  name="Taxa de retorno de ação EUA (cor)",
                  cor_matrix=r,
                  geom="tile",
                  min_size=0,
                  max_size=10, 
                  nbreaks=6,
                  digits=2,
                  label=TRUE,
                  label_round=2,
                  label_size=4)
)

## 1) calcular um layout fixo sem plotar
set.seed(123)  # só para o layout ser reprodutível
q_tmp <- qgraph::qgraph(
   r,
   graph      = "cor",
   sampleSize = n,
   minimum    = "sig",
   bonf       = TRUE,
   layout     = "spring",
   DoNotPlot  = TRUE  # <- calcula, mas não desenha
)

layout_fix <- q_tmp$layout  # <- matriz de coordenadas dos nós

## 2) rede de correlações, agora usando layout_fix
qgraph::qgraph(
   r, 
   graph      = "cor", 
   sampleSize = n,
   minimum    = "sig",
   bonf       = TRUE,
   layout     = layout_fix,  # <- aqui entra o layout fixo
   shape      = "rectangle",
   vsize      = 8,
   label.cex  = 1.6,
   labels     = colnames(r),
   label.prop = 0,
   theme      = "gray",
   title      = "Taxa de retorno de ação EUA (cor)",
   details    = FALSE
)

## 3) rede glasso, com o MESMO layout
suppressWarnings(qgraph::qgraph(
   r, 
   graph      = "glasso", 
   sampleSize = n,
   layout     = layout_fix,  # <- mesmo layout, só mudam as arestas
   shape      = "rectangle",
   vsize      = 8,
   label.cex  = 1.6,
   labels     = colnames(r),
   label.prop = 0,
   theme      = "gray",
   title      = "Taxa de retorno de ação EUA (glasso)",
   details    = FALSE
))

eig <- eigen(r, symmetric = TRUE)
lambda <- eig$values
E <- eig$vectors  # colunas = autovetores unitários

dt <- data.frame(1:length(lambda),format(as.numeric(lambda), 
                                         digits=2, 
                                         nsmall=2))
names(dt) <- c("component","value")
print(dt)
  component value
1         1  2.44
2         2  1.41
3         3  0.50
4         4  0.40
5         5  0.26
plot(lambda, 
     xlab="Componente", ylab="Autovalor", 
     type="o", pch=16, axes=FALSE)
axis(1, at=1:length(lambda))
axis(2)
abline(h=1,col="darkgray",lty=2)

sv1maior <- lambda[1]
sv2maior <- lambda[2]
H <- NA
if(sv2maior>0) {H <- sv1maior/sv2maior}
cat("FirstAV/SecondAV = H = ",round(sv1maior,2),"/",round(sv2maior,2)," ~ ",round(H,2),"\n",sep="")
FirstAV/SecondAV = H = 2.44/1.41 ~ 1.73
cat("\t- if < 2: first order\n")
    - if < 2: first order
cat("\t- if > 3: unifactor\n")
    - if > 3: unifactor
cat("\t- otherwise: bifactor\n")
    - otherwise: bifactor
if (H <= 2) {txt <- "\tpossible first order model, av1/av2 <= 2"}
if (H > 2 & H <= 3) {txt <- "\tpossible bifactor model, 2 < av1/av2 <= 3"}
if (H > 3) {txt <- "\tpossible unifactor model, av1/av2 > 3"}
cat(txt)
    possible first order model, av1/av2 <= 2
# Matriz de cargas: j-ésima coluna = sqrt(lambda_j) * e_j
L <- cbind( sqrt(lambda[1]) * E[,1], sqrt(lambda[2]) * E[,2] )
colnames(L) <- paste0("F", 1:m)
rownames(L) <- rownames(r)
print(L, digits=3)
         F1     F2
JPM  -0.732  0.437
Citi -0.831  0.280
WF   -0.726  0.374
RDS  -0.605 -0.694
EM   -0.563 -0.719
h2  <- rowSums(L^2)
psi <- 1 - h2
prop1 <- lambda[1] / nrow(r)                 # proporção explicada pelo 1º fator
prop2 <- sum(lambda[1:2]) / nrow(r)          # proporção acumulada por 2 fatores

print(round(c(prop1 = prop1, prop2 = prop2), 3))
prop1 prop2 
0.487 0.769 
tab <- cbind(Load_F1 = L[,1], Load_F2 = L[,2],
             h2 = h2, psi = psi)
print(round(tab, 3))
     Load_F1 Load_F2    h2   psi
JPM   -0.732   0.437 0.727 0.273
Citi  -0.831   0.280 0.770 0.230
WF    -0.726   0.374 0.667 0.333
RDS   -0.605  -0.694 0.847 0.153
EM    -0.563  -0.719 0.834 0.166
r_hat <- tcrossprod(L) + diag(psi)
colnames(r_hat) <- rownames(r_hat) <- rownames(r)
round(r_hat, 3)
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.731 0.695 0.140 0.099
Citi 0.731 1.000 0.708 0.308 0.266
WF   0.695 0.708 1.000 0.180 0.140
RDS  0.140 0.308 0.180 1.000 0.839
EM   0.099 0.266 0.140 0.839 1.000
print(round(r - r_hat, 3))
        JPM   Citi     WF    RDS     EM
JPM   0.000 -0.099 -0.185 -0.025  0.056
Citi -0.099  0.000 -0.134  0.014 -0.054
WF   -0.185 -0.134  0.000  0.003  0.006
RDS  -0.025  0.014  0.003  0.000 -0.156
EM    0.056 -0.054  0.006 -0.156  0.000
pca.m2 <- psych::principal(r = r,
                           covar = FALSE,
                           nfactors = m,
                           rotate = "none",
                           n.obs = n)
psych::fa.plot(pca.m2)

print(pca.m2,
      sort=FALSE, 
      digits=4, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = r, nfactors = m, rotate = "none", n.obs = n, 
    covar = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
        PC1     PC2     h2     u2   com
JPM  0.7323 -0.4365 0.7268 0.2732 1.631
Citi 0.8312 -0.2805 0.7695 0.2305 1.225
WF   0.7262 -0.3739 0.6671 0.3329 1.495
RDS  0.6047  0.6940 0.8473 0.1527 1.963
EM   0.5631  0.7186 0.8335 0.1665 1.892

                         PC1    PC2
SS loadings           2.4373 1.4070
Proportion Var        0.4875 0.2814
Cumulative Var        0.4875 0.7689
Proportion Explained  0.6340 0.3660
Cumulative Proportion 0.6340 1.0000

Mean item complexity =  1.6
Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is  0.0965 
 with the empirical chi square  19.1658  with prob <  1.198e-05 

Fit based upon off diagonal values = 0.9452
print(pca.m2$loadings,
      sort=TRUE, 
      digits=4, 
      cut=0.0)

Loadings:
     PC1     PC2    
JPM   0.7323 -0.4365
Citi  0.8312 -0.2805
WF    0.7262 -0.3739
RDS   0.6047  0.6940
EM    0.5631  0.7186

                  PC1    PC2
SS loadings    2.4373 1.4070
Proportion Var 0.4875 0.2814
Cumulative Var 0.4875 0.7689
# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                                covmat = r,
                                n.obs = n,
                                rotation = "none",
                                factors = m,
                                scores = "none")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="path",
                  whatLabels="no",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  edge.label.cex=1,
                  nCharNodes=4,
                  sizeLat=10,
                  sizeMan=10,
                  sizeInt=4,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

A seguir são apresentados resultados de análise fatorial ortogonal usando matriz de covariância.

suppressMessages(suppressWarnings(invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
Dados <- read.delim("JW6Data/T8-4.DAT", header = FALSE)
colnames(Dados) <- c("JPM", "Citi", "WF", "RDS", "EM")
r <- cor(Dados, use = "complete.obs", method = "pearson")
print(round(r, 3))
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.632 0.510 0.115 0.154
Citi 0.632 1.000 0.574 0.322 0.213
WF   0.510 0.574 1.000 0.182 0.146
RDS  0.115 0.322 0.182 1.000 0.683
EM   0.154 0.213 0.146 0.683 1.000
s <- cov(Dados, use = "complete.obs", method = "pearson")
print(signif(s, 3))
          JPM     Citi       WF      RDS       EM
JPM  4.33e-04 0.000276 1.59e-04 6.41e-05 8.90e-05
Citi 2.76e-04 0.000439 1.80e-04 1.81e-04 1.23e-04
WF   1.59e-04 0.000180 2.24e-04 7.34e-05 6.05e-05
RDS  6.41e-05 0.000181 7.34e-05 7.22e-04 5.08e-04
EM   8.90e-05 0.000123 6.05e-05 5.08e-04 7.66e-04
n <- nrow(Dados)
p <- ncol(Dados)
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 103 p = 5 m = 2 df = 1
corrplot::corrplot(corr=r, 
                   is.corr=TRUE,
                   #method="number",
                   diag=FALSE,
                   title="Taxa de retorno de ação EUA: cor",
                   order="hclust",
                   hclust.method="ward.D",
                   tl.col="black",
                   addrect=2)

corrplot::corrplot(corr=s,
                   is.corr=FALSE,
                   #method="number",
                   diag=TRUE,
                   title="Taxa de retorno de ação EUA: cov",
                   order="hclust",
                   hclust.method="ward.D",
                   tl.col="black",
                   addrect=2)

eig <- eigen(r, symmetric = TRUE)
lambda <- eig$values
E <- eig$vectors  # colunas = autovetores unitários

dt <- data.frame(1:length(lambda),format(as.numeric(lambda), 
                                         digits=2, 
                                         nsmall=2))
names(dt) <- c("component","value")
print(dt)
  component value
1         1  2.44
2         2  1.41
3         3  0.50
4         4  0.40
5         5  0.26
plot(lambda, 
     xlab="Componente", ylab="Autovalor: cor", 
     type="o", pch=16, axes=FALSE)
axis(1, at=1:length(lambda))
axis(2)
abline(h=1,col="darkgray",lty=2)

sv1maior <- lambda[1]
sv2maior <- lambda[2]
H <- NA
if(sv2maior>0) {H <- sv1maior/sv2maior}
cat("FirstAV/SecondAV = H = ",round(sv1maior,2),"/",round(sv2maior,2)," ~ ",round(H,2),"\n",sep="")
FirstAV/SecondAV = H = 2.44/1.41 ~ 1.73
cat("\t- if < 2: first order\n")
    - if < 2: first order
cat("\t- if > 3: unifactor\n")
    - if > 3: unifactor
cat("\t- otherwise: bifactor\n")
    - otherwise: bifactor
if (H <= 2) {txt <- "\tpossible first order model, av1/av2 <= 2"}
if (H > 2 & H <= 3) {txt <- "\tpossible bifactor model, 2 < av1/av2 <= 3"}
if (H > 3) {txt <- "\tpossible unifactor model, av1/av2 > 3"}
cat(txt)
    possible first order model, av1/av2 <= 2
eig <- eigen(s, symmetric = TRUE)
lambda <- eig$values
E <- eig$vectors  # colunas = autovetores unitários

dt <- data.frame(1:length(lambda),format(as.numeric(lambda), 
                                         digits=2, 
                                         nsmall=2))
names(dt) <- c("component","value")
print(dt)
  component   value
1         1 0.00137
2         2 0.00070
3         3 0.00025
4         4 0.00014
5         5 0.00012
plot(lambda, 
     xlab="Componente", ylab="Autovalor: cov", 
     type="o", pch=16, axes=FALSE)
axis(1, at=1:length(lambda))
axis(2)

sv1maior <- lambda[1]
sv2maior <- lambda[2]
H <- NA
if(sv2maior>0) {H <- sv1maior/sv2maior}
cat("FirstAV/SecondAV = H = ",round(sv1maior,2),"/",round(sv2maior,2)," ~ ",round(H,2),"\n",sep="")
FirstAV/SecondAV = H = 0/0 ~ 1.95
cat("\t- if < 2: first order\n")
    - if < 2: first order
cat("\t- if > 3: unifactor\n")
    - if > 3: unifactor
cat("\t- otherwise: bifactor\n")
    - otherwise: bifactor
if (H <= 2) {txt <- "\tpossible first order model, av1/av2 <= 2"}
if (H > 2 & H <= 3) {txt <- "\tpossible bifactor model, 2 < av1/av2 <= 3"}
if (H > 3) {txt <- "\tpossible unifactor model, av1/av2 > 3"}
cat(txt)
    possible first order model, av1/av2 <= 2
pca.m2 <- psych::principal(r = s,
                           covar = TRUE,
                           nfactors = 2,
                           rotate = "none",
                           n.obs = n)
psych::fa.plot(pca.m2)

print(pca.m2,
      sort=FALSE, 
      digits=4, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = s, nfactors = 2, rotate = "none", n.obs = n, 
    covar = TRUE)
Unstandardized loadings (pattern matrix) based upon covariance matrix
        PC1     PC2        h2        u2     H2     U2
JPM  0.0082  0.0166 0.0003420 9.128e-05 0.7893 0.2107
Citi 0.0114  0.0151 0.0003573 8.145e-05 0.8143 0.1857
WF   0.0057  0.0091 0.0001160 1.080e-04 0.5179 0.4821
RDS  0.0236 -0.0066 0.0006015 1.210e-04 0.8325 0.1675
EM   0.0241 -0.0085 0.0006521 1.136e-04 0.8516 0.1484

                         PC1    PC2
SS loadings           0.0014 0.0007
Proportion Var        0.5293 0.2713
Cumulative Var        0.5293 0.8006
Proportion Explained  0.6611 0.3389
Cumulative Proportion 0.6611 1.0000

 Standardized loadings (pattern matrix)
     item    PC1     PC2     h2     u2
JPM     1 0.3959  0.7954 0.7893 0.2107
Citi    2 0.5426  0.7211 0.8143 0.1857
WF      3 0.3826  0.6095 0.5179 0.4821
RDS     4 0.8791 -0.2443 0.8325 0.1675
EM      5 0.8699 -0.3080 0.8516 0.1484

                   PC1    PC2
SS loadings     2.1271 1.6786
Proportion Var  0.4254 0.3357
Cumulative Var  0.4254 0.7611
Cum. factor Var 0.5589 1.0000

Mean item complexity =  1.5
Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is  0 
 with the empirical chi square  0  with prob <  0.9983 

Fit based upon off diagonal values = 1
print(pca.m2$loadings,
      sort=TRUE, 
      digits=4, 
      cut=0.0)

Loadings:
     PC1     PC2    
JPM   0.0082  0.0166
Citi  0.0114  0.0151
WF    0.0057  0.0091
RDS   0.0236 -0.0066
EM    0.0241 -0.0085

                  PC1   PC2
SS loadings    0.0014 7e-04
Proportion Var 0.0003 1e-04
Cumulative Var 0.0003 4e-04
# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                                covmat = s,
                                n.obs = n,
                                rotation = "none",
                                factors = m,
                                scores = "none")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="path",
                  whatLabels="no",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  edge.label.cex=1,
                  nCharNodes=4,
                  sizeLat=10,
                  sizeMan=10,
                  sizeInt=4,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

Método da Máxima Verossimilhança

Se os fatores comuns \(\mathbf{F}\) e os fatores específicos \(\boldsymbol{\varepsilon}\) puderem ser assumidos como normalmente distribuídos, então podem ser obtidas estimativas de máxima verossimilhança das cargas fatoriais e das variâncias específicas. Quando \(\mathbf{F}_j\) e \(\boldsymbol{\varepsilon}_j\) são conjuntamente normais, as observações

\[ \mathbf{X}_j - \boldsymbol{\mu} = \mathbf{L}\mathbf{F}_j + \boldsymbol{\varepsilon}_j \]

também são normais, e a partir de (4–16), a verossimilhança é

\[ \begin{align} \ell(\boldsymbol{\mu}, \boldsymbol{\Sigma}) &= ((2\pi)^{p} |\boldsymbol{\Sigma}|)^{-\frac{n}{2}} \times \\ &\exp \left(-\frac{1}{2}\mathrm{tr}\left(\boldsymbol{\Sigma}^{-1}\left(\sum_{j=1}^{n}(\mathbf{x}_j - \bar{\mathbf{x}})(\mathbf{x}_j - \bar{\mathbf{x}})^{\prime} + n(\bar{\mathbf{x}} - \boldsymbol{\mu})(\bar{\mathbf{x}} - \boldsymbol{\mu})^{\prime}\right)\right)\right) \\ \ell(\boldsymbol{\mu}, \boldsymbol{\Sigma}) &= ((2\pi)^{p} |\boldsymbol{\Sigma}|)^{-\frac{n-1}{2}}\times\\ &\quad\exp \left(-\frac{1}{2}\mathrm{tr}\left(\boldsymbol{\Sigma}^{-1}\left(\sum_{j=1}^{n}(\mathbf{x}_j - \bar{\mathbf{x}})(\mathbf{x}_j - \bar{\mathbf{x}})^{\prime}\right)\right)\right) \times \\ &\qquad ((2\pi)^{p} |\boldsymbol{\Sigma}|)^{-\frac{1}{2}}\times\\ &\quad\exp \left(-\frac{n}{2}(\bar{\mathbf{x}} - \boldsymbol{\mu})^{\prime}\boldsymbol{\Sigma}^{-1}(\bar{\mathbf{x}} - \boldsymbol{\mu})\right)\\ \ell(\boldsymbol{\mu}, \mathbf{L}, \boldsymbol{\Psi}) &= ((2\pi)^{p} |\mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}|)^{-\frac{n-1}{2}}\times\\ &\quad\exp \left(-\frac{1}{2}\mathrm{tr}\left((\mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi})^{-1}\left(\sum_{j=1}^{n}(\mathbf{x}_j - \bar{\mathbf{x}})(\mathbf{x}_j - \bar{\mathbf{x}})^{\prime}\right)\right)\right) \times \\ &\qquad ((2\pi)^{p} |\mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}|)^{-\frac{1}{2}}\times\\ &\quad\exp \left(-\frac{n}{2}(\bar{\mathbf{x}} - \boldsymbol{\mu})^{\prime}(\mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi})^{-1}(\bar{\mathbf{x}} - \boldsymbol{\mu})\right) \end{align} \tag{9–25} \]

o que depende de \(\mathbf{L}\) e \(\boldsymbol{\Psi}\) através de \(\boldsymbol{\Sigma} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}\).
Este modelo ainda não está bem definido, devido à multiplicidade de escolhas para \(\mathbf{L}\) tornada possível por transformações ortogonais.

É desejável tornar \(\mathbf{L}\) bem definida impondo a condição de unicidade computacionalmente conveniente

\[ \mathbf{L}^{\prime}\boldsymbol{\Psi}^{-1}\mathbf{L} = \boldsymbol{\Delta} \tag{9–26} \]

sendo que \(\boldsymbol{\Delta}\) é uma matriz diagonal.

As estimativas de máxima verossimilhança \(\hat{\mathbf{L}}\) e \(\hat{\boldsymbol{\Psi}}\) devem ser obtidas por maximização numérica de (9–25).

Felizmente, programas de computador eficientes já existem que permitem obter essas estimativas com bastante facilidade.

Resumimos agora alguns fatos sobre estimadores de máxima verossimilhança, e, por ora, confiamos no computador para realizar os detalhes numéricos.

Resultado 9.1. Sejam \(\mathbf{X}_1, \mathbf{X}_2, \ldots, \mathbf{X}_n\) uma amostra aleatória de \(\mathcal{N}_p(\boldsymbol{\mu}, \boldsymbol{\Sigma})\), sendo que \(\boldsymbol{\Sigma} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}\) é a matriz de covariância para o modelo de \(m\) fatores comuns de (9–4).
Os estimadores de máxima verossimilhança \(\hat{\mathbf{L}}\), \(\hat{\boldsymbol{\Psi}}\) e \(\hat{\boldsymbol{\mu}} = \bar{\mathbf{x}}\) maximizam (9–25) sujeitos à condição \(\hat{\mathbf{L}}^{\prime}\hat{\boldsymbol{\Psi}}^{-1}\hat{\mathbf{L}}\) ser diagonal.

As estimativas de máxima verossimilhança das comunalidades são

\[ \hat{h}_i^2 = \sum_{j=1}^{m}{\hat{\ell}_{ij}^2}, \quad \text{para } i = 1, 2, \ldots, p \tag{9–27} \]

Assim,

\[ \text{Prop var amostral tot devida ao } j\text{-ésimo fator} = \dfrac{\sum_{i=1}^{p}{\hat{\ell}_{ij}^2}}{\sum_{i=1}^{p}{s_{ii}}} \tag{9–28} \]

Demonstração:

Pela propriedade de invariância das estimativas de máxima verossimilhança (ver Seção 4.3), as funções de \(\mathbf{L}\) e \(\boldsymbol{\Psi}\) são estimadas pelas mesmas funções de \(\hat{\mathbf{L}}\) e \(\hat{\boldsymbol{\Psi}}\).

Em particular, as comunalidades \(h_i^2 = \sum_{j=1}^{m}{\ell_{ij}^2}\) têm como estimativas de máxima verossimilhança \(\hat{h}_i^2 = \sum_{j=1}^{m}{\hat{\ell}_{ij}^2}\).

\[\Diamond\]

Se, como em (8–10), as variáveis forem padronizadas de modo que \(\mathbf{z} = \mathbf{V}^{-1/2}(\mathbf{x} - \boldsymbol{\mu})\), então a matriz de covariância \(\boldsymbol{\rho}\) de \(\mathbf{z}\) tem a representação

\[ \boldsymbol{\rho} = \mathbf{V}^{-1/2}\boldsymbol{\Sigma}\mathbf{V}^{-1/2} = (\mathbf{V}^{-1/2}\mathbf{L})(\mathbf{V}^{-1/2}\mathbf{L})^{\prime} + \mathbf{V}^{-1/2}\boldsymbol{\Psi}\mathbf{V}^{-1/2} \tag{9–29} \]

Assim, \(\boldsymbol{\rho}\) possui uma fatoração análoga à de (9–5) com matriz de cargas \(\mathbf{L}_z = \mathbf{V}^{-1/2}\mathbf{L}\) e matriz de variâncias específicas \(\boldsymbol{\Psi}_z = \mathbf{V}^{-1/2}\boldsymbol{\Psi}\mathbf{V}^{-1/2}\).

Pela propriedade de invariância dos estimadores de máxima verossimilhança, o estimador de máxima verossimilhança da matriz \(\boldsymbol{\rho}\) é

\[ \hat{\boldsymbol{\rho}} = (\hat{\mathbf{V}}^{-1/2}\hat{\mathbf{L}})(\hat{\mathbf{V}}^{-1/2}\hat{\mathbf{L}})^{\prime} + \hat{\mathbf{V}}^{-1/2}\hat{\boldsymbol{\Psi}}\hat{\mathbf{V}}^{-1/2} = \hat{\mathbf{L}}_z\hat{\mathbf{L}}_z^{\prime} + \hat{\boldsymbol{\Psi}}_z \tag{9–30} \]

sendo que \(\hat{\mathbf{V}}^{-1/2}\) e \(\hat{\mathbf{L}}\) são os estimadores de máxima verossimilhança de \(\mathbf{V}^{-1/2}\) e \(\mathbf{L}\), respectivamente. (Ver Suplemento 9A.)

Como consequência da fatoração em (9–30), sempre que a análise de máxima verossimilhança se refere à matriz de correlação, chamamos

\[ \hat{h}_i^2 = \sum_{j=1}^{m}{\hat{\ell}_{ij}^2}, \quad i = 1, 2, \ldots, p \tag{9–31} \]

as estimativas de máxima verossimilhança das comunalidades,
e avaliamos a importância dos fatores com base em

\[ \text{Prop var amostral tot (padron) devido ao } j\text{-ésimo fator} = \dfrac{\sum_{i=1}^{p}{\hat{\ell}_{ij}^2}}{p} \tag{9–32} \]

Para evitar notações tediosas, os \(\hat{\ell}_{ij}\) precedentes denotam os elementos de \(\hat{\mathbf{L}}_z\).

Comentário. Normalmente, as observações são padronizadas e uma matriz de correlação amostral é analisada por fatores. A matriz de correlação amostral \(\mathbf{r}\) é inserida em \(((n-1)/n)\mathbf{s}\) na função de verossimilhança de (9–25), e as estimativas de máxima verossimilhança \(\hat{\mathbf{L}}_z\) e \(\hat{\boldsymbol{\Psi}}_z\) são obtidas usando um computador. Embora a verossimilhança em (9–25) seja apropriada para \(\mathbf{s}\), de forma surpreendente, essa prática é equivalente a obter as estimativas de máxima verossimilhança \(\hat{\mathbf{L}}\) e \(\hat{\boldsymbol{\Psi}}\) com base na matriz de covariância amostral \(\mathbf{s}\), definindo \(\hat{\mathbf{L}}_z = \hat{\mathbf{V}}^{-1/2}\hat{\mathbf{L}}\) e \(\hat{\boldsymbol{\Psi}}_z = \hat{\mathbf{V}}^{-1/2}\hat{\boldsymbol{\Psi}}\hat{\mathbf{V}}^{-1/2}\). Aqui, \(\hat{\mathbf{V}}^{-1/2}\) é a matriz diagonal com o recíproco dos desvios-padrão amostrais (calculados com divisor \(\sqrt{n}\)) na diagonal principal.

Indo na direção oposta, dadas as cargas fatoriais estimadas \(\hat{\mathbf{L}}_z\) e as variâncias específicas \(\hat{\boldsymbol{\Psi}}_z\) obtidas a partir de \(\mathbf{r}\), encontramos que as estimativas de máxima verossimilhança resultantes para uma análise fatorial da matriz de covariância \(((n-1)/n)\mathbf{s}\) são \(\hat{\mathbf{L}} = \hat{\mathbf{V}}^{1/2}\hat{\mathbf{L}}_z\) e \(\hat{\boldsymbol{\Psi}} = \hat{\mathbf{V}}^{1/2}\hat{\boldsymbol{\Psi}}_z\hat{\mathbf{V}}^{1/2}\), ou

\[ \hat{\ell}_{ij} = \hat{\ell}_{z,ij}\sqrt{\hat{\sigma}_{ii}} \quad \text{e} \quad \hat{\psi}_i = \hat{\psi}_{z,i}\hat{\sigma}_{ii} \]

sendo que \(\hat{\sigma}_{ii}\) é a variância amostral calculada com divisor \(n\).

A distinção entre divisores pode ser ignorada nas soluções de componentes principais.

\[\Diamond\]

A equivalência entre fatorar \(\mathbf{s}\) e \(\mathbf{r}\) tem sido, aparentemente, confundida em muitas discussões publicadas sobre análise fatorial. (Ver Suplemento 9A.)

Exemplo 9.5: Análise fatorial de dados de retornos de ações usando o método de máxima verossimilhança

Os dados de retornos de ações dos Exemplos 8.5 e 9.4 foram reanalisados supondo um modelo fatorial com \(m = 2\) fatores e utilizando o método de máxima verossimilhança. As cargas fatoriais estimadas, comunalidades, variâncias específicas e a proporção da variância amostral total (padronizada) explicada por cada fator estão na Tabela 9.3.

Os valores correspondentes para a solução com \(m = 2\) fatores obtida pelo método de componentes principais (ver Exemplo 9.4) também são apresentados. As comunalidades correspondentes à fatoração de máxima verossimilhança de \(\mathbf{r}\) são da forma [ver (9-31)]

\[ \hat{h}_i^{2} = \hat{\ell}_{i1}^{2} + \hat{\ell}_{i2}^{2} \]

Assim, por exemplo,

\[ \hat{h}_1^{2} = (.115)^{2} + (.765)^{2} = .58 \] Tabela 9.3

Cargas fatoriais (ML) Variâncias específicas Cargas fatoriais (PC) Variâncias específicas
Variável \(F_1\) \(F_2\) \(\hat{\psi}_i = 1 - \hat{h}_i^{2}\) \(F_1\) \(F_2\) \(\tilde{\psi}_i = 1 - \tilde{h}_i^{2}\)
1. JP Morgan .115 .755 .42 .732 -.437 .27
2. Citibank .322 .788 .27 .831 -.280 .23
3. Wells Fargo .182 .652 .54 .726 -.374 .33
4. Royal Dutch Shell 1.000 -.000 .00 .605 .694 .15
5. ExxonMobil .683 -.032 .53 .563 .719 .17
Proporção acumulada da variância amostral total (padronizada) explicada
Máxima verossimilhança: \(F_1 = .323,\quad F_1 & F_2 = .647\)
Componentes principais: \(F_1 = .487,\quad F_1 & F_2 = .769\)

Nota. A solução de máxima verossimilhança apresenta um caso de Heywood: a variância específica estimada para Royal Dutch Shell é igual a \(0.00\), indicando que as equações de máxima verossimilhança produziram carga(s) fatoriais tais que uma variância específica deveria ser negativa. O software ajusta ligeiramente as cargas para manter \(\hat{\psi}_i > 0\).

A matriz residual é

\[ \mathbf{r} - \hat{\mathbf{r}} =\mathbf{r} - \hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} - \hat{\boldsymbol{\Psi}} \;=\; \begin{bmatrix} 0 & .001 & -.002 & .000 & .052 \\ .001 & 0 & .002 & .000 & -.033 \\ -.002 & .002 & 0 & .000 & .001 \\ .000 & .000 & .000 & 0 & .000 \\ .052 & -.033 & .001 & .000 & 0 \end{bmatrix} \]

Os elementos de \(\mathbf{r} - \hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} - \hat{\boldsymbol{\Psi}}\) são muito menores do que aqueles da matriz residual correspondente à fatoração por componentes principais de \(\mathbf{r}\) apresentada no Exemplo 9.4. Com essa base, preferimos o método de máxima verossimilhança e tipicamente o apresentamos em exemplos subsequentes.

A proporção cumulativa da variância total da amostra explicada pelos fatores é maior para a fatoração por componentes principais do que para a fatoração por máxima verossimilhança. Não é surpreendente que esse critério tipicamente favoreça a fatoração por componentes principais. Cargas fatoriais obtidas por uma análise fatorial por componentes principais estão relacionadas aos componentes principais, os quais, por construção, possuem uma propriedade de otimização de variância. [Ver a discussão anterior à equação (8-19).]

Focando na solução de máxima verossimilhança, observamos que todas as variáveis têm cargas positivas em \(F_{1}\). Chamamos esse fator de fator mercado, assim como fizemos na solução por componentes principais. A interpretação do segundo fator não é tão clara como aparentou ser na solução por componentes principais. As ações de bancos possuem cargas grandes e positivas, enquanto as ações de petróleo possuem cargas desprezíveis no segundo fator, \(F_{2}\). Nesta perspectiva, o segundo fator diferencia ações de bancos de ações de petróleo e poderia ser chamado de fator indústria. Alternativamente, o segundo fator poderia simplesmente ser chamado de fator setor setor bancário.

Os padrões das cargas fatoriais iniciais para a solução de máxima verossimilhança são restringidos pela condição de unicidade de que

\[ \hat{\mathbf{L}}^{\prime} \hat{\boldsymbol{\Psi}}^{-1} \hat{\mathbf{L}} \] seja uma matriz diagonal. Portanto, padrões fatoriais úteis frequentemente não são revelados até que os fatores sejam rotacionados (ver Seção 9.4).

suppressMessages(suppressWarnings(invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
Dados <- read.delim("JW6Data/T8-4.DAT", header = FALSE)
colnames(Dados) <- c("JPM", "Citi", "WF", "RDS", "EM")
r <- cor(Dados, use = "complete.obs", method = "pearson")
print(round(r, 3))
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.632 0.510 0.115 0.154
Citi 0.632 1.000 0.574 0.322 0.213
WF   0.510 0.574 1.000 0.182 0.146
RDS  0.115 0.322 0.182 1.000 0.683
EM   0.154 0.213 0.146 0.683 1.000
n <- nrow(Dados)
p <- ncol(Dados)
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 103 p = 5 m = 2 df = 1
print(psych::describe(Dados), digits=4)
     vars   n   mean     sd median trimmed    mad     min    max  range    skew
JPM     1 103 0.0011 0.0208 0.0034  0.0013 0.0217 -0.0459 0.0485 0.0943 -0.1128
Citi    2 103 0.0007 0.0209 0.0017  0.0002 0.0207 -0.0598 0.0525 0.1123  0.0893
WF      3 103 0.0016 0.0150 0.0003  0.0010 0.0130 -0.0362 0.0407 0.0769  0.3222
RDS     4 103 0.0040 0.0269 0.0063  0.0045 0.0245 -0.0539 0.0620 0.1159 -0.1267
EM      5 103 0.0040 0.0277 0.0052  0.0045 0.0249 -0.0636 0.0784 0.1420 -0.1173
     kurtosis     se
JPM   -0.5367 0.0021
Citi   0.3767 0.0021
WF     0.0108 0.0015
RDS   -0.4341 0.0026
EM     0.3017 0.0027
suppressWarnings(GGally::ggpairs(Dados)+ggplot2::theme_bw())

print(
  GGally::ggcorr(
    data       = NULL,
    name       = "Taxa de retorno de ação EUA (cor)",
    cor_matrix = r,
    geom       = "tile",
    min_size   = 0,
    max_size   = 10,
    nbreaks    = 6,
    digits     = 2,
    label      = TRUE,
    label_round= 2,
    label_size = 4
  )
)

## 1) calcular um layout fixo sem plotar
set.seed(123)  # só para o layout ser reprodutível
q_tmp <- qgraph::qgraph(
  r,
  graph      = "cor",
  sampleSize = n,
  minimum    = "sig",
  bonf       = TRUE,
  layout     = "spring",
  DoNotPlot  = TRUE  # <- calcula, mas não desenha
)

layout_fix <- q_tmp$layout  # <- matriz de coordenadas dos nós

## 2) rede de correlações, agora usando layout_fix
qgraph::qgraph(
  r, 
  graph      = "cor", 
  sampleSize = n,
  minimum    = "sig",
  bonf       = TRUE,
  layout     = layout_fix,  # <- aqui entra o layout fixo
  shape      = "rectangle",
  vsize      = 8,
  label.cex  = 1.6,
  labels     = colnames(r),
  label.prop = 0,
  theme      = "gray",
  title      = "Taxa de retorno de ação EUA (cor)",
  details    = FALSE
)

## 3) rede glasso, com o MESMO layout
suppressWarnings(qgraph::qgraph(
  r, 
  graph      = "glasso", 
  sampleSize = n,
  layout     = layout_fix,  # <- mesmo layout, só mudam as arestas
  shape      = "rectangle",
  vsize      = 8,
  label.cex  = 1.6,
  labels     = colnames(r),
  label.prop = 0,
  theme      = "gray",
  title      = "Taxa de retorno de ação EUA (glasso)",
  details    = FALSE
))

eig <- eigen(r, symmetric = TRUE)
lambda <- eig$values
E <- eig$vectors  # colunas = autovetores unitários

dt <- data.frame(1:length(lambda),format(as.numeric(lambda), 
                                         digits=2, 
                                         nsmall=2))
names(dt) <- c("component","value")
print(dt)
  component value
1         1  2.44
2         2  1.41
3         3  0.50
4         4  0.40
5         5  0.26
plot(lambda, 
     xlab="Componente", ylab="Autovalor", 
     type="o", pch=16, axes=FALSE)
axis(1, at=1:length(lambda))
axis(2)
abline(h=1,col="darkgray",lty=2)

sv1maior <- lambda[1]
sv2maior <- lambda[2]
H <- NA
if(sv2maior>0) {H <- sv1maior/sv2maior}
cat("FirstAV/SecondAV = H = ",round(sv1maior,2),"/",round(sv2maior,2)," ~ ",round(H,2),"\n",sep="")
FirstAV/SecondAV = H = 2.44/1.41 ~ 1.73
cat("\t- if < 2: first order\n")
    - if < 2: first order
cat("\t- if > 3: unifactor\n")
    - if > 3: unifactor
cat("\t- otherwise: bifactor\n")
    - otherwise: bifactor
if (H <= 2) {txt <- "\tpossible first order model, av1/av2 <= 2"}
if (H > 2 & H <= 3) {txt <- "\tpossible bifactor model, 2 < av1/av2 <= 3"}
if (H > 3) {txt <- "\tpossible unifactor model, av1/av2 > 3"}
cat(txt)
    possible first order model, av1/av2 <= 2
# Matriz de cargas: j-ésima coluna = sqrt(lambda_j) * e_j
L <- cbind( sqrt(lambda[1]) * E[,1], sqrt(lambda[2]) * E[,2] )
colnames(L) <- paste0("F", 1:m)
rownames(L) <- rownames(r)
print(L, digits=3)
         F1     F2
JPM  -0.732  0.437
Citi -0.831  0.280
WF   -0.726  0.374
RDS  -0.605 -0.694
EM   -0.563 -0.719
h2  <- rowSums(L^2)
psi <- 1 - h2
prop1 <- lambda[1] / nrow(r)                 # proporção explicada pelo 1º fator
prop2 <- sum(lambda[1:2]) / nrow(r)          # proporção acumulada por 2 fatores

print(round(c(prop1 = prop1, prop2 = prop2), 3))
prop1 prop2 
0.487 0.769 
tab <- cbind(Load_F1 = L[,1], Load_F2 = L[,2],
             h2 = h2, psi = psi)
print(round(tab, 3))
     Load_F1 Load_F2    h2   psi
JPM   -0.732   0.437 0.727 0.273
Citi  -0.831   0.280 0.770 0.230
WF    -0.726   0.374 0.667 0.333
RDS   -0.605  -0.694 0.847 0.153
EM    -0.563  -0.719 0.834 0.166
r_hat <- tcrossprod(L) + diag(psi)
colnames(r_hat) <- rownames(r_hat) <- rownames(r)
round(r_hat, 3)
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.731 0.695 0.140 0.099
Citi 0.731 1.000 0.708 0.308 0.266
WF   0.695 0.708 1.000 0.180 0.140
RDS  0.140 0.308 0.180 1.000 0.839
EM   0.099 0.266 0.140 0.839 1.000
print(round(r - r_hat, 3))
        JPM   Citi     WF    RDS     EM
JPM   0.000 -0.099 -0.185 -0.025  0.056
Citi -0.099  0.000 -0.134  0.014 -0.054
WF   -0.185 -0.134  0.000  0.003  0.006
RDS  -0.025  0.014  0.003  0.000 -0.156
EM    0.056 -0.054  0.006 -0.156  0.000
# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                                covmat = r,
                                n.obs = n,
                                rotation = "none",
                                factors = m,
                                scores = "none")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

cat("\nCommunalities:\n")

Communalities:
print(round(1-fit$uniquenesses,2))
 JPM Citi   WF  RDS   EM 
0.58 0.73 0.46 1.00 0.47 
print(fit, digits=3, cutoff=0.0, sort=TRUE)

Call:
factanal(x = NULL, factors = m, covmat = r, n.obs = n, scores = "none",     rotation = "none")

Uniquenesses:
  JPM  Citi    WF   RDS    EM 
0.417 0.275 0.542 0.005 0.530 

Loadings:
     Factor1 Factor2
RDS   0.997  -0.007 
EM    0.685   0.026 
JPM   0.121   0.754 
Citi  0.328   0.786 
WF    0.188   0.650 

               Factor1 Factor2
SS loadings      1.622   1.610
Proportion Var   0.324   0.322
Cumulative Var   0.324   0.646

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 1.97 on 1 degree of freedom.
The p-value is 0.16 
load <- fit$loadings[,1:m]
print(load, digits=3)
     Factor1 Factor2
JPM    0.121  0.7543
Citi   0.328  0.7857
WF     0.188  0.6502
RDS    0.997 -0.0071
EM     0.685  0.0263
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "none",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                                 NONE

  Number of observations                           103

Fit measures:
                    aic      bic    sabic chisq df pvalue   cfi rmsea
  nfactors = 2 1307.115 1344.001 1299.778 2.039  1  0.153 0.994   0.1

Eigenvalues correlation matrix:

    ev1     ev2     ev3     ev4     ev5 
  2.437   1.407   0.501   0.400   0.255 

Standardized loadings: (* = significant at 1% level)

         f1      f2       unique.var   communalities
JPM   0.764*  0.000            0.416           0.584
Citi  0.828*  0.200            0.275           0.725
WF    0.672*  0.083            0.542           0.458
RDS   0.150   0.989*           0.000           1.000
EM    0.134   0.671*           0.532           0.468

                              f1    f2 total
Sum of sq (obliq) loadings 1.760 1.474 3.235
Proportion of total        0.544 0.456 1.000
Proportion var             0.352 0.295 0.647
Cumulative var             0.352 0.647 0.647

Factor correlations: (* = significant at 1% level)

       f1      f2 
f1      1         
f2      0       1 
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "none",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

# Calculate composite reliability from estimated factor-model parameters
print(semTools::compRelSEM(fit))
   f1    f2 
0.538 0.458 

Exemplo 9.6: Análise fatorial de dados de decatlo olímpico

Linden [11] originalmente conduziu um estudo de análise fatorial de resultados de decatlo olímpico para todas as 160 largadas completas desde o fim da Segunda Guerra Mundial até meados da década de 1970. Seguindo a abordagem dele, examinamos agora as \(n = 280\) largadas completas no período de 1960 até 2004. Os valores registrados para cada prova foram padronizados e os sinais das provas cronometradas foram trocados de forma que pontuações altas sejam boas para todas as provas. Também analisamos a matriz de correlação, que, com base em todos os \(280\) casos, é

\[ \mathbf{r} = \begin{bmatrix} 1.000 & .6386 & .4752 & .3227 & .5520 & .3262 & .3509 & .4008 & .1821 & -.0352 \\ .6386 & 1.0000 & .4953 & .5668 & .4706 & .3520 & .3998 & .5167 & .3102 & .1012 \\ .4752 & .4953 & 1.0000 & .4357 & .2539 & .2812 & .7926 & .4728 & .4682 & -.0120 \\ .3227 & .5668 & .4357 & 1.0000 & .3449 & .3503 & .3657 & .6040 & .2344 & .2380 \\ .5520 & .4706 & .2539 & .3449 & 1.0000 & .1546 & .2100 & .2553 & .1600 & .4125 \\ .3262 & .3520 & .2812 & .3503 & .1546 & 1.0000 & .4009 & .4179 & .1712 & .0002 \\ .3509 & .3998 & .7926 & .3657 & .2100 & .4009 & 1.0000 & .4509 & .3511 & .2395 \\ .4008 & .5167 & .4728 & .6040 & .2553 & .4179 & .4509 & 1.0000 & .3151 & 1.0000 \\ .1821 & .3102 & .4682 & .2344 & .1600 & .1712 & .3511 & .3151 & 1.0000 & .0983 \\ -.0352 & .1012 & -.0120 & .2380 & .4125 & .0002 & .2395 & 1.0000 & .0983 & 1.0000 \end{bmatrix} \]

A partir de uma perspectiva de análise fatorial por componentes principais, os quatro primeiros autovalores, \(4.21\), \(1.39\), \(1.06\), \(0.92\), de \(\mathbf{r}\) sugerem uma solução fatorial com \(m = 3\) ou \(m = 4\). Uma interpretação subsequente, bastante parecida com a análise original de Linden, reforça a escolha \(m = 4\).

Nesse caso, os dois métodos de solução produziram resultados muito diferentes. Para a fatoração por componentes principais, todas as provas, exceto a corrida de 1500 metros, têm cargas positivas grandes no primeiro fator. Esse fator pode ser rotulado como habilidade atlética global. O fator \(2\), que apresenta cargas elevadas na corrida de 400 metros e na corrida de 1500 metros, pode ser chamado de fator de resistência aeróbica em corrida. Os fatores restantes não podem ser facilmente interpretados.

Para o método de máxima verossimilhança, o primeiro fator parece ser um fator de habilidade atlética global, mas o padrão de cargas não é tão forte como na solução por componentes principais. O segundo fator é principalmente um fator de força de membros superiores porque arremesso de peso e arremesso de disco apresentam cargas elevadas nesse fator. O terceiro fator é resistência em corrida, pois as provas de 400 metros e 1500 metros apresentam cargas elevadas. Novamente, o quarto fator não é facilmente identificado, embora possa ter alguma relação com a habilidade de salto ou força de pernas. Voltaremos à interpretação dos fatores no Exemplo 9.11 após a discussão sobre rotação fatorial.

A solução de quatro fatores baseada em componentes principais explica grande parte da variância amostral total (padronizada), embora as variâncias específicas estimadas sejam grandes em alguns casos (por exemplo, o lançamento de dardo). Isso sugere que algumas provas podem exigir atributos unique ou específicos não requeridos pelas outras provas. A solução de quatro fatores baseada em máxima verossimilhança explica uma parcela menor da variância total amostral, mas, como as matrizes residuais a seguir indicam, as estimativas \(\mathbf{L}\) e \(\boldsymbol{\Psi}\) produzidas pelo método de máxima verossimilhança reproduzem \(\mathbf{r}\) melhor do que as estimativas \(\mathbf{L}\) e \(\boldsymbol{\Psi}\) do método por componentes principais.

Tabela 9.4 (Componentes principais). Dados do decatlo olímpico.

Variável F1 F2 F3 F4 \(\tilde{\psi}_i = 1 - \tilde{h}_i^2\)
Corrida de 100 m .696 .022 -.468 -.416 .12
Salto em distância .793 .075 -.255 -.115 .29
Arremesso de peso .771 -.434 .197 -.112 .17
Salto em altura .711 .181 .005 .367 .33
Corrida de 400 m .605 .549 -.045 -.397 .17
100 m com barreiras .513 -.083 -.372 .561 .28
Lançamento de disco .690 -.456 .289 -.078 .23
Salto com vara .761 .162 .018 .304 .30
Lançamento de dardo .518 -.252 .519 -.074 .39
Corrida de 1500 m .220 .746 .493 .085 .15
Proporção acumulada da variância total explicada .42 .56 .67 .76

Tabela 9.4 (Máxima verossimilhança). Dados do decatlo olímpico.

Variável F1 F2 F3 F4 \(\hat{\psi}_i = 1 - \hat{h}_i^2\)
Corrida de 100 m .993 -.069 -.021 .002 .01
Salto em distância .665 .252 .239 .220 .39
Arremesso de peso .530 .777 -.141 -.079 .09
Salto em altura .363 .428 .421 .424 .33
Corrida de 400 m .571 .019 .620 -.305 .20
100 m com barreiras .343 .189 .090 .323 .73
Lançamento de disco .402 .718 -.102 -.095 .30
Salto com vara .440 .407 .390 .263 .42
Lançamento de dardo .218 .461 .084 -.085 .73
Corrida de 1500 m -.016 .091 .609 -.145 .60
Proporção acumulada da variância total explicada .27 .45 .57 .62

As matrizes residuais são, respectivamente, para o método de componentes principais,

\[ \mathbf{r} - \tilde{\mathbf{r}} = \mathbf{r}- \tilde{\mathbf{L}}\tilde{\mathbf{L}}^{\prime} - \tilde{\boldsymbol{\Psi}} \]

e, para o método de máxima verossimilhança,

\[ \mathbf{r} - \hat{\mathbf{r}} = \mathbf{r} - \hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} - \hat{\boldsymbol{\Psi}} \]

suppressMessages(suppressWarnings(invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
# Matriz de correlação r do decatlo 
r <- matrix(c(
   1.000,  .6386, .4752, .3227, .5520, .3262, .3509, .4008, .1821, -.0352,
   .6386, 1.0000, .4953, .5668, .4706, .3520, .3998, .5167, .3102,  .1012,
   .4752,  .4953, 1.0000, .4357, .2539, .2812, .7926, .4728, .4682, -.0120,
   .3227,  .5668, .4357, 1.0000, .3449, .3503, .3657, .6040, .2344,  .2380,
   .5520,  .4706, .2539, .3449, 1.0000, .1546, .2100, .2553, .1600,  .4125,
   .3262,  .3520, .2812, .3503, .1546, 1.0000, .4009, .4179, .1712,  .0002,
   .3509,  .3998, .7926, .3657, .2100, .4009, 1.0000, .4509, .3511,  .2395,
   .4008,  .5167, .4728, .6040, .2553, .4179, .4509, 1.0000, .3151,  .2395,
   .1821,  .3102, .4682, .2344, .1600, .1712, .3511, .3151, 1.0000,  .0983,
   -.0352,  .1012,-.0120, .2380, .4125, .0002, .2395, .2395, .0983, 1.0000
), nrow = 10, byrow = TRUE)

colnames(r) <- rownames(r) <- c(
   "R100m", "SaltoDst", "LncPeso", "SaltoAlt", "R400m",
   "R110mBar", "LncDisc", "SaltoVar", "LncDard", "R1500m"
)

n <- 280
p <- dim(r)[1]
m <- 4
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 280 p = 10 m = 4 df = 11
print(
   GGally::ggcorr(data=NULL,
                  name="Decatlo olímpico", 
                  cor_matrix=r,
                  geom="tile",
                  min_size=0,
                  max_size=10, 
                  nbreaks=6,
                  digits=2,
                  label=TRUE,
                  label_round=2,
                  label_size=4)
)

## 1) calcular um layout fixo sem plotar
set.seed(123)  # só para o layout ser reprodutível
q_tmp <- qgraph::qgraph(
   r,
   graph      = "cor",
   sampleSize = n,
   minimum    = "sig",
   bonf       = TRUE,
   layout     = "spring",
   DoNotPlot  = TRUE  # <- calcula, mas não desenha
)

layout_fix <- q_tmp$layout  # <- matriz de coordenadas dos nós

## 2) rede de correlações, agora usando layout_fix
qgraph::qgraph(
   r, 
   graph      = "cor", 
   sampleSize = n,
   minimum    = "sig",
   bonf       = TRUE,
   layout     = layout_fix,  # <- aqui entra o layout fixo
   shape      = "rectangle",
   vsize      = 8,
   label.cex  = 1.6,
   labels     = colnames(r),
   label.prop = 0,
   theme      = "gray",
   title      = "Decatlo olímpico (cor)",
   details    = FALSE
)

## 3) rede glasso, com o MESMO layout
suppressWarnings(qgraph::qgraph(
   r, 
   graph      = "glasso", 
   sampleSize = n,
   layout     = layout_fix,  # <- mesmo layout, só mudam as arestas
   shape      = "rectangle",
   vsize      = 8,
   label.cex  = 1.6,
   labels     = colnames(r),
   label.prop = 0,
   theme      = "gray",
   title      = "Decatlo olímpico (glasso)",
   details    = FALSE
))

eig <- eigen(r, symmetric = TRUE)
lambda <- eig$values
E <- eig$vectors  # colunas = autovetores unitários

dt <- data.frame(1:length(lambda),format(as.numeric(lambda), 
                                         digits=2, 
                                         nsmall=2))
names(dt) <- c("component","value")
print(dt)
   component value
1          1  4.22
2          2  1.30
3          3  1.10
4          4  0.93
5          5  0.73
6          6  0.64
7          7  0.42
8          8  0.34
9          9  0.22
10        10  0.11
plot(lambda, 
     xlab="Componente", ylab="Autovalor", 
     type="o", pch=16, axes=FALSE)
axis(1, at=1:length(lambda))
axis(2)
abline(h=1,col="darkgray",lty=2)

sv1maior <- lambda[1]
sv2maior <- lambda[2]
H <- NA
if(sv2maior>0) {H <- sv1maior/sv2maior}
cat("FirstAV/SecondAV = H = ",round(sv1maior,2),"/",round(sv2maior,2)," ~ ",round(H,2),"\n",sep="")
FirstAV/SecondAV = H = 4.22/1.3 ~ 3.25
cat("\t- if < 2: first order\n")
    - if < 2: first order
cat("\t- if > 3: unifactor\n")
    - if > 3: unifactor
cat("\t- otherwise: bifactor\n")
    - otherwise: bifactor
if (H <= 2) {txt <- "\tpossible first order model, av1/av2 <= 2"}
if (H > 2 & H <= 3) {txt <- "\tpossible bifactor model, 2 < av1/av2 <= 3"}
if (H > 3) {txt <- "\tpossible unifactor model, av1/av2 > 3"}
cat(txt)
    possible unifactor model, av1/av2 > 3
pca.m2 <- psych::principal(r = r,
                           covar = FALSE,
                           nfactors = m,
                           rotate = "none",
                           n.obs = n)
psych::fa.plot(pca.m2)

print(pca.m2,
      sort=FALSE, 
      digits=2, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = r, nfactors = m, rotate = "none", n.obs = n, 
    covar = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
          PC1   PC2   PC3   PC4   h2    u2 com
R100m    0.69  0.06 -0.57  0.22 0.85 0.148 2.2
SaltoDst 0.79  0.08 -0.31  0.03 0.73 0.273 1.3
LncPeso  0.77 -0.40  0.14  0.28 0.85 0.149 1.9
SaltoAlt 0.71  0.15  0.06 -0.36 0.66 0.339 1.6
R400m    0.56  0.63 -0.23  0.29 0.84 0.156 2.7
R110mBar 0.54 -0.23 -0.13 -0.54 0.66 0.343 2.4
LncDisc  0.73 -0.27  0.34  0.10 0.73 0.266 1.8
SaltoVar 0.75  0.00  0.13 -0.35 0.70 0.303 1.5
LncDard  0.50 -0.26  0.38  0.39 0.60 0.395 3.4
R1500m   0.26  0.72  0.57 -0.03 0.91 0.087 2.2

                       PC1  PC2  PC3  PC4
SS loadings           4.22 1.30 1.10 0.93
Proportion Var        0.42 0.13 0.11 0.09
Cumulative Var        0.42 0.55 0.66 0.75
Proportion Explained  0.56 0.17 0.15 0.12
Cumulative Proportion 0.56 0.73 0.88 1.00

Mean item complexity =  2.1
Test of the hypothesis that 4 components are sufficient.

The root mean square of the residuals (RMSR) is  0.08 
 with the empirical chi square  165.17  with prob <  1.2e-29 

Fit based upon off diagonal values = 0.95
print(pca.m2$loadings,
      sort=TRUE, 
      digits=2, 
      cut=0.0)

Loadings:
         PC1   PC2   PC3   PC4  
R100m     0.69  0.06 -0.57  0.22
SaltoDst  0.79  0.08 -0.31  0.03
LncPeso   0.77 -0.40  0.14  0.28
SaltoAlt  0.71  0.15  0.06 -0.36
LncDisc   0.73 -0.27  0.34  0.10
SaltoVar  0.75  0.00  0.13 -0.35
R400m     0.56  0.63 -0.23  0.29
R1500m    0.26  0.72  0.57 -0.03
R110mBar  0.54 -0.23 -0.13 -0.54
LncDard   0.50 -0.26  0.38  0.39

                PC1  PC2  PC3  PC4
SS loadings    4.22 1.30 1.10 0.93
Proportion Var 0.42 0.13 0.11 0.09
Cumulative Var 0.42 0.55 0.66 0.75
# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                               covmat = r,
                               n.obs = n,
                               rotation = "none",
                               factors = m,
                               scores = "none")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

cat("\nCommunalities:\n")

Communalities:
print(round(1-fit$uniquenesses,2))
   R100m SaltoDst  LncPeso SaltoAlt    R400m R110mBar  LncDisc SaltoVar 
    0.70     0.65     1.00     0.54     0.69     0.30     0.71     0.65 
 LncDard   R1500m 
    0.24     1.00 
print(fit, digits=3, cutoff=0.0, sort=TRUE)

Call:
factanal(x = NULL, factors = m, covmat = r, n.obs = n, scores = "none",     rotation = "none")

Uniquenesses:
   R100m SaltoDst  LncPeso SaltoAlt    R400m R110mBar  LncDisc SaltoVar 
   0.301    0.349    0.005    0.464    0.313    0.701    0.292    0.347 
 LncDard   R1500m 
   0.762    0.005 

Loadings:
         Factor1 Factor2 Factor3 Factor4
LncPeso   0.987   0.141  -0.017  -0.005 
LncDisc   0.751   0.359  -0.059   0.109 
R1500m   -0.153   0.986  -0.007  -0.001 
R100m     0.485   0.044   0.648  -0.205 
SaltoDst  0.486   0.182   0.612   0.081 
R400m     0.200   0.453   0.552  -0.371 
SaltoAlt  0.405   0.307   0.395   0.348 
R110mBar  0.287   0.048   0.334   0.321 
SaltoVar  0.442   0.314   0.379   0.464 
LncDard   0.450   0.170   0.021   0.080 

               Factor1 Factor2 Factor3 Factor4
SS loadings      2.719   1.584   1.515   0.644
Proportion Var   0.272   0.158   0.152   0.064
Cumulative Var   0.272   0.430   0.582   0.646

Test of the hypothesis that 4 factors are sufficient.
The chi square statistic is 84.36 on 11 degrees of freedom.
The p-value is 2.1e-13 
load <- fit$loadings[,1:m]
print(load, digits=3)
         Factor1 Factor2  Factor3   Factor4
R100m      0.485  0.0437  0.64827 -0.204552
SaltoDst   0.486  0.1821  0.61208  0.081283
LncPeso    0.987  0.1407 -0.01662 -0.004690
SaltoAlt   0.405  0.3072  0.39518  0.348491
R400m      0.200  0.4527  0.55232 -0.370838
R110mBar   0.287  0.0478  0.33402  0.320710
LncDisc    0.751  0.3585 -0.05867  0.108553
SaltoVar   0.442  0.3143  0.37857  0.464360
LncDard    0.450  0.1695  0.02132  0.079901
R1500m    -0.153  0.9857 -0.00663 -0.000853
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "none",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                                 NONE

  Number of observations                           280

Fit measures:
                    aic      bic    sabic  chisq df pvalue   cfi rmsea
  nfactors = 4 6793.333 6953.264 6813.743 86.269 11      0 0.941 0.156

Eigenvalues correlation matrix:

    ev1     ev2     ev3     ev4     ev5     ev6     ev7     ev8     ev9    ev10 
  4.216   1.297   1.103   0.926   0.726   0.643   0.418   0.341   0.218   0.112 

Standardized loadings: (* = significant at 1% level)

             f1      f2      f3      f4       unique.var   communalities
R100m     0.836*  0.000   0.000   0.000            0.300           0.700
SaltoDst  0.746*  0.306*  0.000   0.000            0.349           0.651
LncPeso   0.568*  0.233   0.789*  0.000            0.000           1.000
SaltoAlt  0.472*  0.556*  0.048   0.025            0.465           0.535
R400m     0.658* -0.013  -0.148   0.480*           0.314           0.686
R110mBar  0.350*  0.386* -0.009  -0.171            0.699           0.301
LncDisc   0.382*  0.387*  0.615*  0.176*           0.295           0.705
SaltoVar  0.453*  0.664*  0.077  -0.023            0.347           0.653
LncDard   0.267*  0.229*  0.334*  0.054            0.762           0.238
R1500m   -0.042   0.433* -0.112   0.893*           0.000           1.000

                              f1    f2    f3    f4 total
Sum of sq (obliq) loadings 2.782 1.437 1.156 1.093 6.469
Proportion of total        0.430 0.222 0.179 0.169 1.000
Proportion var             0.278 0.144 0.116 0.109 0.647
Cumulative var             0.278 0.422 0.538 0.647 0.647

Factor correlations: (* = significant at 1% level)

       f1      f2      f3      f4 
f1      1                         
f2      0       1                 
f3      0       0       1         
f4      0       0       0       1 
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "none",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

# Calculate composite reliability from estimated factor-model parameters
print(semTools::compRelSEM(fit))
   f1    f2    f3    f4 
0.546 0.308 0.100 0.108 

Teste de grande amostra para o número de fatores comuns

A suposição de normalidade populacional conduz diretamente a um teste da adequação do modelo fatorial comum. Suponha que o modelo com \(m\) fatores comuns seja válido. Nesse caso,

\[ \mathbf{\Sigma} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi} \]

e testar a adequação do modelo de \(m\) fatores comuns é equivalente a testar

\[ \begin{cases} H_0: \underset{p \times p}{\mathbf{\Sigma}} = \underset{p \times m}{\mathbf{L}}\; \underset{m \times p}{\mathbf{L}^{\prime}} + \underset{p \times p}{\boldsymbol{\Psi}}\\ H_1: \mathbf{\Sigma} \ne \mathbf{L} \mathbf{L}^{\prime} + \boldsymbol{\Psi} \end{cases}\\ \alpha=5\% \tag{9-33} \] versus a hipótese alternativa de que \(\mathbf{\Sigma}\) é uma matriz definida positiva arbitrária.

Quando \(\mathbf{\Sigma}\) não possui nenhuma estrutura especial, o máximo da função de verossimilhança [ver (4-18) e Resultado 4.11, com \(\hat{\mathbf{\Sigma}} = \dfrac{n-1}{n}\mathbf{S} = \mathbf{S}_n\)] é proporcional a

\[ (|\mathbf{S}_n|\,e^p)^{-n/2} \tag{9-34} \]

Sob \(H_0\), \(\mathbf{\Sigma}\) é restrita a ter a forma dada em (9-33). Nesse caso, o máximo da função de verossimilhança [ver (9-25), com \(\hat{\boldsymbol{\mu}} = \bar{\mathbf{x}}\) e \(\hat{\mathbf{\Sigma}} = \hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}}\), onde \(\hat{\mathbf{L}}\) e \(\hat{\boldsymbol{\Psi}}\) são os estimadores de máxima verossimilhança de \(\mathbf{L}\) e \(\boldsymbol{\Psi}\), respectivamente] é proporcional a

\[ |\hat{\mathbf{\Sigma}}|^{-n/2} \exp\left[ -\dfrac{1}{2} \operatorname{tr} \left\{ \hat{\mathbf{\Sigma}}^{-1} \sum_{j=1}^{n} (\mathbf{x}_j - \bar{\mathbf{x}}) (\mathbf{x}_j - \bar{\mathbf{x}})^{\prime} \right\} \right] \]

i.e.,

\[ |\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}}|^{-n/2} \exp\!\left[ -\dfrac{n}{2} \operatorname{tr} \left\{ (\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}})^{-1} \mathbf{S}_n \right\} \right] \tag{9-35} \]

Usando o Resultado 5.2, (9-34) e (9-35), obtemos que a estatística da razão de verossimilhanças para testar \(H_0\) é

\[ -2\ln (\Lambda) = -2\ln\left( \dfrac{ \text{máx. verossimilhança sob } H_0 }{ \text{máx. verossimilhança irrestrita} } \right) \tag{9-36} \]

ou, equivalentemente,

\[ -2\ln(\Lambda) = -n\ln\left( \dfrac{ |\hat{\mathbf{\Sigma}}| }{ |\mathbf{S}_n| } \right) + n\left[ \operatorname{tr}(\hat{\mathbf{\Sigma}}^{-1}\mathbf{S}_n) - p \right] \] Os graus de liberdade são

\[ \begin{align} v - v_0 &= \frac{1}{2}p(p+1) - \left(p(m+1) - \frac{1}{2}m(m-1)\right)\\ &= \frac{1}{2}\left((p-m)^2 - p - m\right)\\ v - v_0&= \frac{1}{2}(p-m)(p-m-1) - m \end{align} \tag{9-37} \]

O Suplemento 9A indica que \(\mathrm{tr}\left(\hat{\mathbf{\Sigma}}^{-1}\mathbf{S}_n\right) - p = 0\), desde que \(\hat{\mathbf{\Sigma}} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}\) seja a estimativa de máxima verossimilhança de \(\mathbf{\Sigma} = \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}\).

Assim, temos

\[ -2\ln (\Lambda) = n \ln \left(\frac{\left|\hat{\mathbf{\Sigma}}\right|}{\left|\mathbf{S}_n\right|}\right) \tag{9-38} \]

Bartlett [3] mostrou que a aproximação qui-quadrado para a distribuição amostral de \(-2\ln (\Lambda)\) pode ser melhorada substituindo-se \(n\) em (9-38) pelo fator multiplicativo \((n - 1 - (2p + 4m + 5)/6)\).

Usando a correção de Bartlett, rejeitamos \(H_0\) ao nível de significância \(\alpha\) se

\[ \left(n - 1 - \dfrac{2p + 4m + 5}{6}\right) \ln\left(\frac{\left|\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}}\right|}{\left|\mathbf{S}_n\right|}\right) > \chi^2_{\frac{1}{2}(p-m)(p-m-1) - m}(1-\alpha) \tag{9-39} \]

desde que \(n\) e \(n-p\) sejam grandes.

Como o número de graus de liberdade \(\text{df}=\frac{1}{2}(p-m)(p-m-1) - m>1\), segue que

\[ m \le \frac{1}{2}\left(2p + 1 - \sqrt{8p + 9}\right) \tag{9-40} \]

para que se possa aplicar o teste em (9-39).

Se \(m=2\), número mínimo de variáveis manifestas para que \(\text{df}\ge1\) é \(p=5\), sendo que \(\text{df}=1\).

\(p\) \(m\) máximo \(text{df}\)
4 1 2
5 2 1
6 2 4
7 3 3
8 4 2
9 5 1
10 5 5
11 6 4
12 7 3
13 8 2
14 9 1
15 9 6
16 10 5
17 11 4
18 12 3
19 13 2
20 14 1

Comentário. Na implementação do teste em (9-39), estamos testando a adequação do modelo de \(m\) fatores comuns, comparando as variâncias generalizadas

\[ \left|\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}}\right| \quad\text{e}\quad \left|\mathbf{S}_n\right| \]

Se \(n\) é grande e \(m\) é pequeno em relação a \(p\), a hipótese \(H_0\) geralmente será rejeitada, levando à retenção de mais fatores comuns. Entretanto,

\[ \hat{\mathbf{\Sigma}} = \hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}} \]

pode estar suficientemente próxima de \(\mathbf{S}_n\), de modo que adicionar mais fatores não forneça informações adicionais, mesmo que esses fatores sejam “significantes”. Portanto, algum julgamento deve ser exercido na escolha de \(m\).

\[\Diamond\]

Nota. Alguns analistas fatoriais obtêm uma estimativa aproximada de máxima verossimilhança substituindo \(\mathbf{S}_n\) pela estimativa não viesada \(\mathbf{S} = \frac{n}{n-1}\mathbf{S}_n\) e então minimizando \(\ln(\left|\mathbf{\Sigma}\right|) + \mathrm{tr}\!\left(\mathbf{\Sigma}^{-1}\mathbf{S}\right)\).

A substituição dupla de \(\mathbf{S}\) e do estimador aproximado de máxima verossimilhança na estatística de teste em (9-39) não afeta suas propriedades assintóticas em grandes amostras.

\[\Diamond\]

Exemplo 9.7: Teste para dois fatores comuns

A análise de máxima verossimilhança com dois fatores dos dados de retornos semanais de ações foi apresentada no Exemplo 9.5. A matriz residual obtida naquele exemplo sugere que uma solução com dois fatores pode ser adequada. Teste a hipótese

\[ H_0:\ \mathbf{\Sigma}=\mathbf{L}\mathbf{L}^{\prime}+\boldsymbol{\Psi} \]

com \(m=2\), ao nível \(\alpha=0.05\).

O teste de razão de verossimilhanças (LR) da hipótese nula é invariante com relação ao uso da matriz de covariância ou correlação. O teste LR é invariante a transformações lineares de escala. Logo, produz o mesmo valor p usando a matriz de covariância ou a de correlação, desde que a normalidade multivariada seja assumida.

O teste em \((9\text{-}39)\) baseia-se na razão dos determinantes de variâncias generalizadas

\[ \frac{\left|\hat{\mathbf{\Sigma}}\right|}{\left|\mathbf{S}_n\right|} = \frac{\left|\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime}+\hat{\boldsymbol{\Psi}}\right|}{\left|\mathbf{S}_n\right|} \]

Seja \(\hat{\mathbf{V}}^{-1/2}\) a matriz diagonal tal que

\[ \hat{\mathbf{V}}^{-1/2}\mathbf{S}_n\hat{\mathbf{V}}^{-1/2} = \mathbf{R} \]

Pelas propriedades de determinantes (veja o Resultado 2A.11),

\[ \left|\hat{\mathbf{V}}^{-1/2}\right| \left|\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime}+\hat{\boldsymbol{\Psi}}\right| \left|\hat{\mathbf{V}}^{-1/2}\right| = \left| \hat{\mathbf{V}}^{-1/2}\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime}\hat{\mathbf{V}}^{-1/2} + \hat{\mathbf{V}}^{-1/2}\hat{\boldsymbol{\Psi}}\hat{\mathbf{V}}^{-1/2} \right| \]

e

\[ \left|\hat{\mathbf{V}}^{-1/2}\right| \left|\mathbf{S}_n\right| \left|\hat{\mathbf{V}}^{-1/2}\right| = \left| \hat{\mathbf{V}}^{-1/2}\mathbf{S}_n\hat{\mathbf{V}}^{-1/2} \right| \]

Consequentemente,

\[ \begin{align} \frac{\left|\hat{\mathbf{\Sigma}}\right|}{\left|\mathbf{S}_n\right|} &= \frac{\left|\hat{\mathbf{V}}^{-1/2}\right|}{\left|\hat{\mathbf{V}}^{-1/2}\right|} \frac{\left|\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime}+\hat{\boldsymbol{\Psi}}\right|}{\left|\mathbf{S}_n\right|} \frac{\left|\hat{\mathbf{V}}^{-1/2}\right|}{\left|\hat{\mathbf{V}}^{-1/2}\right|} \\ &= \frac{ \left| \hat{\mathbf{V}}^{-1/2}\hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime}\hat{\mathbf{V}}^{-1/2} + \hat{\mathbf{V}}^{-1/2}\hat{\boldsymbol{\Psi}}\hat{\mathbf{V}}^{-1/2} \right| }{ \left| \hat{\mathbf{V}}^{-1/2}\mathbf{S}_n\hat{\mathbf{V}}^{-1/2} \right| } \\ \frac{\left|\hat{\mathbf{\Sigma}}\right|}{\left|\mathbf{S}_n\right|}&= \frac{ \left|\hat{\mathbf{L}}_{\mathbf{z}}\hat{\mathbf{L}}_{\mathbf{z}}^{\prime}+\hat{\boldsymbol{\Psi}}_{\mathbf{z}}\right| }{ \left|\mathbf{R}\right| } \end{align} \tag{9-41} \] Pelo resultado anterior,

\[ \frac{\left|\hat{\mathbf{L}}_2\hat{\mathbf{L}}_2^{\prime}+\hat{\boldsymbol{\Psi}}_2\right|}{\left|\mathbf{r}\right|} = \frac{0.17898}{0.17519} = 1.0216 \]

Com a correção de Bartlett, avaliamos a estatística de teste em (9-39):

\[ \left(n-1-\frac{2p+4m+5}{6}\right) \ln\left(\frac{ \left|\hat{\mathbf{L}}_{\mathbf{z}}\hat{\mathbf{L}}_{\mathbf{z}}^{\prime}+\hat{\boldsymbol{\Psi}}_{\mathbf{z}}\right| }{ \left|\mathbf{r}\right| }\right) \]

Substituindo \(n=103\), \(p=5\), \(m=2\) e o valor numérico \(\ln(1.0216)\), obtemos:

\[ \left(103-1-\frac{10+8+5}{6}\right)\ln(1.0216) = 2.10 \]

Como

\[ \text{df}=\frac{1}{2}(p-m)(p-m-1) - m=\frac{1}{2}\times3\times2-2=1 \]

o valor crítico para \(\chi_1^2(0.95)\) é:

\[ \chi_1^2(0.95)=3.84 \]

e, portanto, como \(2.10<3.84\), falhamos em rejeitar \(H_0\). Concluímos que os dados não contradizem um modelo fatorial de dois fatores comuns.

A significância observada (valor p) para

\[ P\left(\chi_1^2>2.10\right)= 0.15 \]

indica que \(H_0\) não seria rejeitada em nenhum nível usual de significância.

Estes valores obtidos são encontrados apenas com o uso de lavaan::efa e lavaan::summary.

suppressMessages(suppressWarnings(invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
Dados <- read.delim("JW6Data/T8-4.DAT", header = FALSE)
colnames(Dados) <- c("JPM", "Citi", "WF", "RDS", "EM")
s <- cov(Dados, use = "complete.obs", method = "pearson")
r <- cor(Dados, use = "complete.obs", method = "pearson")
print(signif(s, 3))
          JPM     Citi       WF      RDS       EM
JPM  4.33e-04 0.000276 1.59e-04 6.41e-05 8.90e-05
Citi 2.76e-04 0.000439 1.80e-04 1.81e-04 1.23e-04
WF   1.59e-04 0.000180 2.24e-04 7.34e-05 6.05e-05
RDS  6.41e-05 0.000181 7.34e-05 7.22e-04 5.08e-04
EM   8.90e-05 0.000123 6.05e-05 5.08e-04 7.66e-04
print(round(r, 3))
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.632 0.510 0.115 0.154
Citi 0.632 1.000 0.574 0.322 0.213
WF   0.510 0.574 1.000 0.182 0.146
RDS  0.115 0.322 0.182 1.000 0.683
EM   0.154 0.213 0.146 0.683 1.000
n <- nrow(Dados)
p <- ncol(Dados)
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 103 p = 5 m = 2 df = 1
fits <- lavaan::efa(data = NULL,
                   sample.cov = s,
                   sample.nobs = n,
                   rotation = "none",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fits, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                                 NONE

  Number of observations                           103

Fit measures:
                     aic       bic     sabic chisq df pvalue   cfi rmsea
  nfactors = 2 -2636.482 -2599.595 -2643.819 2.039  1  0.153 0.994   0.1

Eigenvalues correlation matrix:

    ev1     ev2     ev3     ev4     ev5 
  2.437   1.407   0.501   0.400   0.255 

Standardized loadings: (* = significant at 1% level)

         f1      f2       unique.var   communalities
JPM   0.764*  0.000            0.416           0.584
Citi  0.828*  0.200            0.275           0.725
WF    0.672*  0.083            0.542           0.458
RDS   0.150   0.989*           0.000           1.000
EM    0.134   0.671*           0.532           0.468

                              f1    f2 total
Sum of sq (obliq) loadings 1.760 1.474 3.235
Proportion of total        0.544 0.456 1.000
Proportion var             0.352 0.295 0.647
Cumulative var             0.352 0.647 0.647

Factor correlations: (* = significant at 1% level)

       f1      f2 
f1      1         
f2      0       1 
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "none",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                                 NONE

  Number of observations                           103

Fit measures:
                    aic      bic    sabic chisq df pvalue   cfi rmsea
  nfactors = 2 1307.115 1344.001 1299.778 2.039  1  0.153 0.994   0.1

Eigenvalues correlation matrix:

    ev1     ev2     ev3     ev4     ev5 
  2.437   1.407   0.501   0.400   0.255 

Standardized loadings: (* = significant at 1% level)

         f1      f2       unique.var   communalities
JPM   0.764*  0.000            0.416           0.584
Citi  0.828*  0.200            0.275           0.725
WF    0.672*  0.083            0.542           0.458
RDS   0.150   0.989*           0.000           1.000
EM    0.134   0.671*           0.532           0.468

                              f1    f2 total
Sum of sq (obliq) loadings 1.760 1.474 3.235
Proportion of total        0.544 0.456 1.000
Proportion var             0.352 0.295 0.647
Cumulative var             0.352 0.647 0.647

Factor correlations: (* = significant at 1% level)

       f1      f2 
f1      1         
f2      0       1 
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "none",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

# Calculate composite reliability from estimated factor-model parameters
print(semTools::compRelSEM(fit))
   f1    f2 
0.538 0.458 

\[\Diamond\]

Variâncias e covariâncias amostrais para grande amostra para as estimativas de máxima verossimilhança \(\hat{\ell}_{ij}\) e \(\hat{\psi}_i\) foram derivadas quando essas estimativas foram obtidas a partir da matriz de covariâncias amostrais \(\mathbf{S}\). (Ver [10].) As expressões são, em geral, bastante complicadas.

Rotação Fatorial

Como indicado na Seção 9.2, todas as cargas fatoriais obtidas das cargas iniciais por uma transformação ortogonal têm a mesma capacidade de reproduzir a matriz de covariância (ou correlação). De álgebra matricial, sabemos que uma transformação ortogonal corresponde a uma rotação rígida (ou reflexão) dos eixos coordenados. Por essa razão, uma transformação ortogonal das cargas fatoriais, bem como a transformação ortogonal implícita dos fatores, é chamada rotação fatorial.

Se \(\hat{\mathbf{L}}\) é a matriz \(p \times m\) de cargas fatoriais estimadas obtidas por qualquer método (componentes principais, máxima verossimilhança, etc.), então

\[ \hat{\mathbf{L}}^{\ast} = \hat{\mathbf{L}} \mathbf{T}, \qquad \text{sendo que } \mathbf{T}^{\prime}\mathbf{T} = \mathbf{T}\mathbf{T}^{\prime} = \mathbf{I} \tag{9-42} \]

é uma matriz \(p \times m\) de cargas “rotacionadas”. Além disso, a matriz de covariância (ou correlação) estimada permanece inalterada, pois

\[ \hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}} = \hat{\mathbf{L}}\mathbf{T}\mathbf{T}^{\prime}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}} = \hat{\mathbf{L}}^{\ast}{\hat{\mathbf{L}}^{\ast}}^{\prime} + \hat{\boldsymbol{\Psi}} \tag{9-43} \]

A Equação (9-43) indica que a matriz residual

\[ \mathbf{S}_n - \hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} - \hat{\boldsymbol{\Psi}} = \mathbf{S}_n - \hat{\mathbf{L}}^{\ast}{\hat{\mathbf{L}}^{\ast}}^{\prime} - \hat{\boldsymbol{\Psi}} \]

permanece inalterada. Do mesmo modo, as variâncias específicas \(\hat{\psi}_i\) e, portanto, as comunalidades \(\hat{h}_i^{2}\), não são modificadas. Assim, de um ponto de vista matemático, é irrelevante se obtemos \(\hat{\mathbf{L}}\) ou \(\hat{\mathbf{L}}^{\ast}\).

Como as cargas iniciais podem não ser facilmente interpretáveis, é prática comum rotacioná-las até que uma “estrutura simples” seja atingida. A ideia é semelhante a ajustar o foco de um microscópio para enxergar os detalhes com mais nitidez.

Idealmente, espera-se um padrão no qual cada variável tenha carga elevada em um único fator, e cargas pequenas ou moderadas nos demais fatores. No entanto, nem sempre é possível obter essa estrutura simples, embora as cargas rotacionadas para os dados do decatlo olímpico discutidos no Exemplo 9.11 forneçam um padrão razoavelmente ideal.

Para o caso \(m = 2\), ou seja, dois fatores comuns considerados simultaneamente, a transformação para uma estrutura simples pode ser frequentemente determinada graficamente. Os fatores não correlacionados são vistos como vetores unitários ao longo de eixos coordenados perpendiculares. Um gráfico das cargas fatoriais \((\hat{\ell}_{i1}, \hat{\ell}_{i2})\) fornece \(p\) pontos, cada qual correspondendo a uma variável. Os eixos podem então ser visualmente rotacionados por um ângulo \(\phi\) — e as cargas fatoriais rotacionadas são obtidas das relações:

\[ \hat{\mathbf{L}}^{\ast} = \hat{\mathbf{L}} \mathbf{T} \tag{9-44} \]

sendo que a matriz ortogonal \(\mathbf{T}\) pode ser:

Rotação no sentido horário:

\[ \mathbf{T} = \begin{bmatrix} \cos\phi & \sin\phi \\ -\sin\phi & \cos\phi \end{bmatrix} \]

Rotação no sentido anti-horário:

\[ \mathbf{T} = \begin{bmatrix} \cos\phi & -\sin\phi \\ \sin\phi & \cos\phi \end{bmatrix} \]

A relação (9-44) raramente é implementada apenas em análise gráfica bidimensional. Nessa situação, agrupamentos de variáveis podem ser percebidos visualmente, permitindo identificar os fatores comuns sem inspecionar numericamente as magnitudes das cargas rotacionadas. Para \(m > 2\), as orientações não são facilmente visualizáveis e deve-se inspecionar os valores das cargas rotacionadas para interpretar os fatores. Uma matriz ortogonal \(\mathbf{T}\) que satisfaça um critério analítico de estrutura simples é geralmente utilizada.

Exemplo 9.8: Um primeiro olhar sobre rotação fatorial

Lawley e Maxwell [10] apresentam a matriz de correlações amostrais das notas em exames em \(p = 6\) áreas de conhecimento para \(n = 220\) estudantes do sexo masculino. A matriz de correlações é

\[ \mathbf{r} = \begin{bmatrix} 1.0 & .439 & .410 & .288 & .329 & .248 \\ .439 & 1.0 & .351 & .354 & .320 & .329 \\ .410 & .351 & 1.0 & .164 & .190 & .181 \\ .288 & .354 & .164 & 1.0 & .595 & .470 \\ .329 & .320 & .190 & .595 & 1.0 & .464 \\ .248 & .329 & .181 & .470 & .464 & 1.0 \end{bmatrix} \]

e uma solução de máxima verossimilhança para \(m = 2\) fatores comuns produz as estimativas apresentadas na Tabela 9.5.

Tabela 9.5: Cargas fatoriais (ML) e comunalidades

Variável \(F_1\) \(F_2\) \(\hat{h}_i^2\)
1. Gaélico .553 .429 .490
2. Inglês .568 .288 .406
3. História .392 .450 .356
4. Aritmética .740 -.273 .623
5. Álgebra .724 -.211 .569
6. Geometria .595 -.132 .372

Todas as variáveis apresentam cargas positivas no primeiro fator. Lawley e Maxwell sugerem que esse fator reflete a resposta global dos estudantes à instrução e pode ser denominado fator de inteligência geral. Metade das cargas é positiva e metade é negativa no segundo fator. Um fator com esse padrão de cargas é chamado fator bipolar. (A atribuição de polos negativo e positivo é arbitrária, pois os sinais das cargas em um fator podem ser trocados sem afetar a análise.) Esse fator não é facilmente identificável, mas, como os indivíduos com escores acima da média nos testes verbais obtêm escores acima da média no fator, enquanto os indivíduos com escores acima da média nos testes matemáticos obtêm escores abaixo da média no fator, talvez esse fator possa ser classificado como um fator “matemática-não matemática”.

Os pares de cargas fatoriais \((\ell_{i1}, \ell_{i2})\) são plotados como pontos na Figura 9.1. Os pontos são identificados com os números das variáveis correspondentes. Também é mostrada uma rotação ortogonal no sentido horário dos eixos das coordenadas por um ângulo de \(\phi \approx 20^\circ\). Esse ângulo foi escolhido de modo que um dos novos eixos passe através de \((\ell_{41}, \ell_{42})\). Quando isso é feito, todos os pontos caem no primeiro quadrante (as cargas fatoriais são todas positivas), e os dois distintos aglomerados de variáveis são mais claramente revelados.

As variáveis dos testes matemáticos apresentam altas cargas no fator \(F_1^{\ast}\) e cargas desprezíveis em \(F_2^{\ast}\). O primeiro fator pode ser chamado de fator de habilidade matemática. Similarmente, as três variáveis dos testes verbais apresentam altas cargas em \(F_2^{\ast}\) e cargas moderadas a pequenas em \(F_1^{\ast}\). O segundo fator pode ser chamado de fator de habilidade verbal. O fator de inteligência geral inicialmente identificado está imerso nos fatores \(F_1^{\ast}\) e \(F_2^{\ast}\).

As cargas fatoriais rotacionadas obtidas de (9-44) com \(\phi \approx 20^\circ\) e as estimativas de comunalidade correspondentes são apresentadas na Tabela 9.6. As magnitudes das cargas fatoriais rotacionadas reforçam a interpretação dos fatores sugerida pela Figura 9.1.

As estimativas de comunalidade são inalteradas pela rotação ortogonal, já que

\[ \boldsymbol{\hat{\Sigma}} = \mathbf{\hat{L}}\mathbf{\hat{L}}^{\prime} = \mathbf{\hat{L}} \, \mathbf{T}\mathbf{T}^{\prime}\mathbf{\hat{L}}^{\prime} = \mathbf{\hat{L}}^{\ast}{\mathbf{\hat{L}}^{\ast}}^{\prime} \]

e as comunalidades são os elementos diagonais dessas matrizes.

Observamos que a Figura 9.1 sugere uma rotação oblíqua dos eixos coordenados. Um novo eixo passaria através do agrupamento {1, 2, 3} e o outro através do agrupamento {4, 5, 6}. As rotações oblíquas recebem esse nome porque correspondem a uma rotação não rígida dos eixos coordenados, resultando em novos eixos que não são perpendiculares.

No entanto, é evidente que a interpretação dos fatores oblíquos para este exemplo seria praticamente a mesma daquela dada anteriormente para uma rotação ortogonal.

Tabela 9.6: Cargas fatoriais (ML) rotacionadas (rotação ortogonal com \(\phi \approx 20^\circ\))

Variável \(F_1^{\ast}\) \(F_2^{\ast}\) Comunalidades \(\hat{h}_i^{\ast 2} = \hat{h}_i^2\)
1. Gaélico 0.369 0.594 0.490
2. Inglês 0.433 0.467 0.406
3. História 0.211 0.558 0.356
4. Aritmética 0.789 0.001 0.623
5. Álgebra 0.752 0.054 0.568
6. Geometria 0.604 0.083 0.372

suppressMessages(suppressWarnings(invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
r <- matrix(c(
   1.0,  .439, .410, .288, .329, .248,
   .439, 1.0,  .351, .354, .320, .329,
   .410, .351, 1.0,  .164, .190, .181,
   .288, .354, .164, 1.0,  .595, .470,
   .329, .320, .190, .595, 1.0,  .464,
   .248, .329, .181, .470, .464, 1.0
), nrow = 6, ncol = 6, byrow = TRUE)

colnames(r) <- rownames(r) <- c(
   "Gaélico", "Inglês", "História",
   "Aritmética", "Álgebra", "Geometria"
)
print(r)
           Gaélico Inglês História Aritmética Álgebra Geometria
Gaélico      1.000  0.439    0.410      0.288   0.329     0.248
Inglês       0.439  1.000    0.351      0.354   0.320     0.329
História     0.410  0.351    1.000      0.164   0.190     0.181
Aritmética   0.288  0.354    0.164      1.000   0.595     0.470
Álgebra      0.329  0.320    0.190      0.595   1.000     0.464
Geometria    0.248  0.329    0.181      0.470   0.464     1.000
n <- 220
p <- dim(r)[1]
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 220 p = 6 m = 2 df = 4
print(
   GGally::ggcorr(data=NULL,
                  name="Disciplinas",
                  cor_matrix=r,
                  geom="tile",
                  min_size=0,
                  max_size=10, 
                  nbreaks=6,
                  digits=2,
                  label=TRUE,
                  label_round=2,
                  label_size=4)
)

pca.m2 <- psych::principal(r = r,
                           covar = FALSE,
                           nfactors = m,
                           rotate = "varimax",
                           n.obs = n)
psych::fa.plot(pca.m2)

print(pca.m2,
      sort=FALSE, 
      digits=2, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = r, nfactors = m, rotate = "varimax", n.obs = n, 
    covar = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
            RC1  RC2   h2   u2 com
Gaélico    0.22 0.76 0.63 0.37 1.2
Inglês     0.35 0.66 0.56 0.44 1.5
História   0.00 0.82 0.67 0.33 1.0
Aritmética 0.83 0.15 0.72 0.28 1.1
Álgebra    0.81 0.18 0.69 0.31 1.1
Geometria  0.75 0.16 0.59 0.41 1.1

                       RC1  RC2
SS loadings           2.09 1.78
Proportion Var        0.35 0.30
Cumulative Var        0.35 0.64
Proportion Explained  0.54 0.46
Cumulative Proportion 0.54 1.00

Mean item complexity =  1.2
Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is  0.11 
 with the empirical chi square  86.13  with prob <  8.7e-18 

Fit based upon off diagonal values = 0.9
print(pca.m2$loadings,
      sort=TRUE, 
      digits=2, 
      cut=0.0)

Loadings:
           RC1  RC2 
Aritmética 0.83 0.15
Álgebra    0.81 0.18
Geometria  0.75 0.16
Gaélico    0.22 0.76
Inglês     0.35 0.66
História   0.00 0.82

                RC1  RC2
SS loadings    2.09 1.78
Proportion Var 0.35 0.30
Cumulative Var 0.35 0.64
# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                               covmat = r,
                               n.obs = n,
                               rotation = "varimax",
                               factors = m,
                               scores = "none")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=10,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=10,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

cat("\nCommunalities:\n")

Communalities:
print(round(1-fit$uniquenesses,2))
   Gaélico     Inglês   História Aritmética    Álgebra  Geometria 
      0.49       0.41       0.36       0.62       0.57       0.37 
print(fit, digits=3, cutoff=0.0, sort=TRUE)

Call:
factanal(x = NULL, factors = m, covmat = r, n.obs = n, scores = "none",     rotation = "varimax")

Uniquenesses:
   Gaélico     Inglês   História Aritmética    Álgebra  Geometria 
     0.510      0.594      0.644      0.377      0.431      0.628 

Loadings:
           Factor1 Factor2
Aritmética 0.771   0.170  
Álgebra    0.724   0.213  
Geometria  0.572   0.210  
Gaélico    0.235   0.659  
Inglês     0.323   0.549  
História   0.088   0.590  

               Factor1 Factor2
SS loadings      1.612   1.203
Proportion Var   0.269   0.201
Cumulative Var   0.269   0.469

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 2.33 on 4 degrees of freedom.
The p-value is 0.674 
load <- fit$loadings[,1:m]
print(load, digits=3)
           Factor1 Factor2
Gaélico     0.2347   0.659
Inglês      0.3229   0.549
História    0.0875   0.590
Aritmética  0.7706   0.170
Álgebra     0.7235   0.213
Geometria   0.5723   0.210
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "varimax",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                   VARIMAX ORTHOGONAL
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                   Kaiser

  Number of observations                           220

Fit measures:
                    aic      bic   sabic chisq df pvalue cfi rmsea
  nfactors = 2 3460.022 3517.713 3463.84 2.391  4  0.664   1     0

Eigenvalues correlation matrix:

    ev1     ev2     ev3     ev4     ev5     ev6 
  2.733   1.130   0.615   0.601   0.525   0.396 

Standardized loadings: (* = significant at 1% level)

               f1      f2       unique.var   communalities
Gaélico     0.660*  0.232*           0.510           0.490
Inglês      0.551*  0.321*           0.594           0.406
História    0.591*  0.085            0.644           0.356
Aritmética  0.173*  0.770*           0.377           0.623
Álgebra     0.215*  0.723*           0.431           0.569
Geometria   0.213*  0.572*           0.628           0.372

                              f2    f1 total
Sum of sq (ortho) loadings 1.606 1.209 2.815
Proportion of total        0.570 0.430 1.000
Proportion var             0.268 0.202 0.469
Cumulative var             0.268 0.469 0.469
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "varimax",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=10,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

# Calculate composite reliability from estimated factor-model parameters
print(semTools::compRelSEM(fit))
   f1    f2 
0.355 0.449 

\[\Diamond\]

Kaiser [19] sugeriu uma medida analítica de estrutura simples conhecida como critério varimax (ou varimax normal). Defina os coeficientes rotacionados escalonados por:

\[ \tilde{\ell}_{ij}^{\ast} = \frac{\hat{\ell}_{ij}^{\ast}}{\sqrt{\hat{h}_i}} \]

isto é, os coeficientes rotacionados divididos pela raiz quadrada das comunalidades.

Então, a rotação ortogonal \(\mathbf{T}\) é escolhida de forma a maximizar:

\[ V = \frac{1}{p} \sum_{j=1}^{m} \left[ \sum_{i=1}^{p} (\tilde{\ell}_{ij}^{\ast})^{4} - \frac{1}{p} \left( \sum_{i=1}^{p} (\tilde{\ell}_{ij}^{\ast})^{2} \right)^{2} \right] \tag{9-45} \]

Escalonar \(\tilde{\ell}_{ij}^{\ast}\) tem o efeito de atribuir maior peso, na determinação de estrutura simples, às variáveis com comunalidades relativamente pequenas. Após a determinação da transformação \(\mathbf{T}\), os coeficientes rotacionados são reescalados multiplicando-se por \(\sqrt{\hat{h}_i}\) para preservar as comunalidades originais.

Embora (9-45) pareça complicada, ela possui uma interpretação simples. Em palavras:

\[ V \propto \sum_{j=1}^{m} \left( \text{variância dos quadrados das cargas (escalonadas) no fator } j \right) \tag{9-46} \]

Maximizar \(V\) corresponde, efetivamente, a “espalhar” os quadrados das cargas fatoriais em cada fator tanto quanto possível. Assim, espera-se encontrar grupos de cargas altas e cargas desprezíveis em qualquer coluna da matriz rotacionada \(\hat{\mathbf{L}}^{\ast}\).

Algoritmos computacionais existem para maximizar \(V\), e os softwares estatísticos mais utilizados em análise fatorial (por exemplo, R, SPSS, MINITAB) implementam rotações varimax.

Como esperado, rotações varimax das cargas fatoriais obtidas com diferentes métodos de estimação (componentes principais, máxima verossimilhança, etc.) não coincidem, em geral. Além disso, o padrão das cargas fatoriais rotacionadas pode mudar substancialmente se fatores adicionais forem incluídos no modelo.

Se existir um fator dominante, ele será geralmente identificado por qualquer rotação ortogonal. Caso contrário, pode-se mantê-lo fixo e rotacionar os fatores remanescentes.

Exemplo 9.9: Cargas fatoriais rotacionadas para os dados de preferência do consumidor

Vamos retornar aos dados de marketing discutidos no Exemplo 9.3.
As cargas fatoriais originais (obtidas pelo método de componentes principais), as comunalidades e as cargas fatoriais rotacionadas (varimax) são apresentadas na Tabela 9.7.

Tabela 9.7: Cargas fatoriais (PC) e rotacionadas (varimax)

Variável \(F_1\) \(F_2\) \(F_1^{\ast}\) \(F_2^{\ast}\)$ Comunalidade
1. Gosto 0.56 0.82 0.02 0.99 0.98
2. Bom custo-benefício 0.78 -0.52 0.94 -0.01 0.88
3. Sabor 0.65 0.75 0.13 0.98 0.98
4. Adequado para lanche 0.94 -0.10 0.84 0.43 0.89
5. Fornece muita energia 0.80 -0.54 0.97 -0.02 0.93
Proporção acumulada explicada 0.571 0.932 0.507 0.932

Fica claro que as variáveis 2, 4 e 5 definem o fator 1 (altas cargas no fator 1 e cargas pequenas ou desprezíveis no fator 2), enquanto as variáveis 1 e 3 definem o fator 2 (altas cargas no fator 2 e cargas pequenas ou desprezíveis no fator 1).

A variável 4 está mais associada ao fator 1, embora apresente aspectos do traço representado pelo fator 2. Podemos chamar o fator 1 de um fator nutricional e o fator 2 de um fator gustativo.

As cargas fatoriais das variáveis são representadas em relação aos eixos fatoriais originais e aos eixos fatoriais rotacionados (varimax) na Figura 9.2.

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
r <- matrix(c(
  1.00, 0.02, 0.96, 0.42, 0.01,
  0.02, 1.00, 0.13, 0.71, 0.85,
  0.96, 0.13, 1.00, 0.50, 0.11,
  0.42, 0.71, 0.50, 1.00, 0.79,
  0.01, 0.85, 0.11, 0.79, 1.00
), nrow = 5, byrow = TRUE)
colnames(r) <- rownames(r) <- c("Gosto", "CustoBenef", "Sabor", "Lanche", "Energia")
print(r)
           Gosto CustoBenef Sabor Lanche Energia
Gosto       1.00       0.02  0.96   0.42    0.01
CustoBenef  0.02       1.00  0.13   0.71    0.85
Sabor       0.96       0.13  1.00   0.50    0.11
Lanche      0.42       0.71  0.50   1.00    0.79
Energia     0.01       0.85  0.11   0.79    1.00
n <- 200
p <- dim(r)[1]
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 200 p = 5 m = 2 df = 1
print(
  GGally::ggcorr(data=NULL,
                 name="Preferência do Consumidor",
                 cor_matrix=r,
                 geom="tile",
                 min_size=0,
                 max_size=10, 
                 nbreaks=6,
                 digits=2,
                 label=TRUE,
                 label_round=2,
                 label_size=4)
)

pca.m2 <- psych::principal(r = r,
                           covar = FALSE,
                           nfactors = m,
                           rotate = "varimax",
                           n.obs = n)
psych::fa.plot(pca.m2)

print(pca.m2,
      sort=FALSE, 
      digits=2, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = r, nfactors = m, rotate = "varimax", n.obs = n, 
    covar = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
            RC1   RC2   h2    u2 com
Gosto      0.02  0.99 0.98 0.021 1.0
CustoBenef 0.94 -0.01 0.88 0.121 1.0
Sabor      0.13  0.98 0.98 0.024 1.0
Lanche     0.84  0.43 0.89 0.107 1.5
Energia    0.97 -0.02 0.93 0.068 1.0

                       RC1  RC2
SS loadings           2.54 2.12
Proportion Var        0.51 0.42
Cumulative Var        0.51 0.93
Proportion Explained  0.54 0.46
Cumulative Proportion 0.54 1.00

Mean item complexity =  1.1
Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is  0.03 
 with the empirical chi square  4.34  with prob <  0.037 

Fit based upon off diagonal values = 1
print(pca.m2$loadings,
      sort=TRUE, 
      digits=2, 
      cut=0.0)

Loadings:
           RC1   RC2  
CustoBenef  0.94 -0.01
Lanche      0.84  0.43
Energia     0.97 -0.02
Gosto       0.02  0.99
Sabor       0.13  0.98

                RC1  RC2
SS loadings    2.54 2.12
Proportion Var 0.51 0.42
Cumulative Var 0.51 0.93
# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                                covmat = r,
                                n.obs = n,
                                rotation = "varimax",
                                factors = m,
                                scores = "none")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="path",
                  whatLabels="no",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  sizeInt=4,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

Exemplo 9.10: Cargas rotacionadas para dados de retornos de ações

Tabela 9.8 mostra as estimativas iniciais e rotacionadas por máxima verossimilhança das cargas fatoriais para os dados dos retornos de ações dos Exemplos 8.5 e 9.5. Assume-se um modelo com \(m = 2\) fatores. As variâncias específicas e as proporções cumulativas da variância total (padronizada) explicada por cada fator também são apresentadas.

Tabela 9.8: Cargas fatoriais (ML) e rotacionadas (varimax)

Variável \(F_1\) \(F_2\) \(F_1^{\ast}\)$ \(F_2^{\ast}\) Variância específica
1. J P Morgan 0.115 0.755 0.763 0.024 0.42
2. Citibank 0.322 0.788 0.821 0.227 0.27
3. Wells Fargo 0.182 0.652 0.669 0.104 0.54
4. Royal Dutch Shell 1.000 -0.000 0.118 0.993 0.00
5. ExxonMobil 0.683 0.032 0.113 0.675 0.53
Proporção acumulada explicada 0.323 0.647 0.346 0.647

Uma interpretação dos fatores sugerida pelas cargas não rotacionadas foi apresentada no Exemplo 9.5. Identificamos fatores de mercado e de indústria.

As cargas rotacionadas indicam que as ações de bancos (JP Morgan, Citibank e Wells Fargo) carregam fortemente no primeiro fator, enquanto as ações de petróleo (Royal Dutch Shell e ExxonMobil) carregam fortemente no segundo fator. Os dois fatores rotacionados, em conjunto, diferenciam os setores. É difícil rotular esses fatores com precisão. O Fator 1 representa forças econômicas específicas que fazem as ações de bancos se moverem juntas. O Fator 2 parece representar condições econômicas que afetam ações de petróleo.

Como já observado, um fator geral (isto é, um fator no qual todas as variáveis carregam fortemente) tende a ser destruído após a rotação. Por essa razão, quando um fator geral é evidente, uma rotação ortogonal pode ser conduzida mantendo-se fixas as cargas fatoriais gerais.

suppressMessages(suppressWarnings(invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
Dados <- read.delim("JW6Data/T8-4.DAT", header = FALSE)
colnames(Dados) <- c("JPM", "Citi", "WF", "RDS", "EM")
r <- cor(Dados, use = "complete.obs", method = "pearson")
print(round(r, 3))
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.632 0.510 0.115 0.154
Citi 0.632 1.000 0.574 0.322 0.213
WF   0.510 0.574 1.000 0.182 0.146
RDS  0.115 0.322 0.182 1.000 0.683
EM   0.154 0.213 0.146 0.683 1.000
n <- nrow(Dados)
p <- ncol(Dados)
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 103 p = 5 m = 2 df = 1
print(psych::describe(Dados), digits=4)
     vars   n   mean     sd median trimmed    mad     min    max  range    skew
JPM     1 103 0.0011 0.0208 0.0034  0.0013 0.0217 -0.0459 0.0485 0.0943 -0.1128
Citi    2 103 0.0007 0.0209 0.0017  0.0002 0.0207 -0.0598 0.0525 0.1123  0.0893
WF      3 103 0.0016 0.0150 0.0003  0.0010 0.0130 -0.0362 0.0407 0.0769  0.3222
RDS     4 103 0.0040 0.0269 0.0063  0.0045 0.0245 -0.0539 0.0620 0.1159 -0.1267
EM      5 103 0.0040 0.0277 0.0052  0.0045 0.0249 -0.0636 0.0784 0.1420 -0.1173
     kurtosis     se
JPM   -0.5367 0.0021
Citi   0.3767 0.0021
WF     0.0108 0.0015
RDS   -0.4341 0.0026
EM     0.3017 0.0027
suppressWarnings(GGally::ggpairs(Dados)+ggplot2::theme_bw())

print(
   GGally::ggcorr(data=NULL,
                  name="Retorno ação EUA (cor)",
                  cor_matrix=r,
                  geom="tile",
                  min_size=0,
                  max_size=10,  
                  nbreaks=6,
                  digits=2,
                  label=TRUE,
                  label_round=2,
                  label_size=4)
)

# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                                covmat = r,
                                n.obs = n,
                                rotation = "varimax",
                                factors = m,
                                scores = "none")
semPlot::semPaths(object=fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(object=fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

cat("\nCommunalities:\n")

Communalities:
print(round(1-fit$uniquenesses,2))
 JPM Citi   WF  RDS   EM 
0.58 0.73 0.46 1.00 0.47 
print(fit, digits=3, cutoff=0.0, sort=TRUE)

Call:
factanal(x = NULL, factors = m, covmat = r, n.obs = n, scores = "none",     rotation = "varimax")

Uniquenesses:
  JPM  Citi    WF   RDS    EM 
0.417 0.275 0.542 0.005 0.530 

Loadings:
     Factor1 Factor2
JPM  0.763   0.029  
Citi 0.819   0.232  
WF   0.668   0.108  
RDS  0.113   0.991  
EM   0.108   0.677  

               Factor1 Factor2
SS loadings      1.725   1.507
Proportion Var   0.345   0.301
Cumulative Var   0.345   0.646

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 1.97 on 1 degree of freedom.
The p-value is 0.16 
load <- fit$loadings[,1:m]
print(load, digits=3)
     Factor1 Factor2
JPM    0.763  0.0292
Citi   0.819  0.2318
WF     0.668  0.1082
RDS    0.113  0.9911
EM     0.108  0.6771
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "varimax",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                   VARIMAX ORTHOGONAL
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                   Kaiser

  Number of observations                           103

Fit measures:
                    aic      bic    sabic chisq df pvalue   cfi rmsea
  nfactors = 2 1307.115 1344.001 1299.778 2.039  1  0.153 0.994   0.1

Eigenvalues correlation matrix:

    ev1     ev2     ev3     ev4     ev5 
  2.437   1.407   0.501   0.400   0.255 

Standardized loadings: (* = significant at 1% level)

         f1      f2       unique.var   communalities
JPM   0.764*  0.024            0.416           0.584
Citi  0.821*  0.227*           0.275           0.725
WF    0.669*  0.104            0.542           0.458
RDS   0.118   0.993*           0.000           1.000
EM    0.113   0.675*           0.532           0.468

                              f1    f2 total
Sum of sq (ortho) loadings 1.731 1.504 3.235
Proportion of total        0.535 0.465 1.000
Proportion var             0.346 0.301 0.647
Cumulative var             0.346 0.647 0.647
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "varimax",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

# Calculate composite reliability from estimated factor-model parameters
print(semTools::compRelSEM(fit))
   f1    f2 
0.512 0.339 

Rotação Oblíqua

Ortogonalizações são apropriadas para um modelo fatorial em que os fatores comuns são assumidos independentes. No entanto, muitos pesquisadores em ciências sociais consideram também rotações oblíquas (não ortogonais). Essas rotações são frequentemente sugeridas após se examinarem as cargas fatoriais estimadas e não decorrem necessariamente do modelo fatorial originalmente postulado. Ainda assim, a rotação oblíqua é, muitas vezes, um recurso útil na análise fatorial.

Se considerarmos os \(m\) fatores comuns como eixos coordenados, o ponto com coordenadas \((\hat{\ell}_{i1}, \hat{\ell}_{i2}, \ldots, \hat{\ell}_{im})\) representa a posição da \(i\)-ésima variável no espaço fatorial. Supondo que as variáveis se agrupem em clusters que não se sobreponham, uma rotação ortogonal para estrutura simples implica uma rotação rígida do sistema de coordenadas, tal que os eixos rotacionados passem o mais próximo possível dos grupos.

Já uma rotação oblíqua corresponde a uma rotação não rígida do sistema de coordenadas, de modo que os eixos rotacionados (não mais perpendiculares) passem aproximadamente pelos agrupamentos. A rotação oblíqua busca expressar cada variável em termos do menor número possível de fatores — idealmente, um único fator.

Rotações oblíquas são discutidas em diversas referências (por exemplo, [12] ou [20]) e não serão desenvolvidas neste capítulo.

Em lavaan::efa, o parâmetro rotation oferece os métodos de rotação oblíqua oblimin, promax e geomin. No exemplo de Preferência do Consumidor, usando rotação oblimin, a correlação estimada entre os fatores nutricional e gustativo é \(0.173\). Cada método de rotação produz um valor diferente de correlação entre os dois fatores.

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
r <- matrix(c(
  1.00, 0.02, 0.96, 0.42, 0.01,
  0.02, 1.00, 0.13, 0.71, 0.85,
  0.96, 0.13, 1.00, 0.50, 0.11,
  0.42, 0.71, 0.50, 1.00, 0.79,
  0.01, 0.85, 0.11, 0.79, 1.00
), nrow = 5, byrow = TRUE)
colnames(r) <- rownames(r) <- c("Gosto", "CustoBenef", 
                                "Sabor", "Lanche", "Energia")
print(r)
           Gosto CustoBenef Sabor Lanche Energia
Gosto       1.00       0.02  0.96   0.42    0.01
CustoBenef  0.02       1.00  0.13   0.71    0.85
Sabor       0.96       0.13  1.00   0.50    0.11
Lanche      0.42       0.71  0.50   1.00    0.79
Energia     0.01       0.85  0.11   0.79    1.00
n <- 2
p <- dim(r)[1]
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 2 p = 5 m = 2 df = 1
print(
  GGally::ggcorr(data=NULL,
                 name="Preferência do Consumidor",
                 cor_matrix=r,
                 geom="tile",
                 min_size=0,
                 max_size=10, 
                 nbreaks=6,
                 digits=2,
                 label=TRUE,
                 label_round=2,
                 label_size=4)
)

# factanal: sem rotação oblíqua
pca.m2 <- psych::principal(r = r,
                           covar = FALSE,
                           nfactors = m,
                           rotate = "oblimin",
                           n.obs = n)
Carregando namespace exigido: GPArotation
psych::fa.plot(pca.m2)

print(pca.m2,
      sort=FALSE, 
      digits=2, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = r, nfactors = m, rotate = "oblimin", n.obs = n, 
    covar = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
             TC1   TC2   h2    u2 com
Gosto      -0.06  1.00 0.98 0.021 1.0
CustoBenef  0.95 -0.09 0.88 0.121 1.0
Sabor       0.05  0.98 0.98 0.024 1.0
Lanche      0.82  0.36 0.89 0.107 1.4
Energia     0.98 -0.10 0.93 0.068 1.0

                       TC1  TC2
SS loadings           2.54 2.12
Proportion Var        0.51 0.42
Cumulative Var        0.51 0.93
Proportion Explained  0.55 0.45
Cumulative Proportion 0.55 1.00

 With component correlations of 
     TC1  TC2
TC1 1.00 0.17
TC2 0.17 1.00

Mean item complexity =  1.1
Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is  0.03 
 with the empirical chi square  0.04  with prob <  0.83 

Fit based upon off diagonal values = 1
print(pca.m2$loadings,
      sort=TRUE, 
      digits=2, 
      cut=0.0)

Loadings:
           TC1   TC2  
CustoBenef  0.95 -0.09
Lanche      0.82  0.36
Energia     0.98 -0.10
Gosto      -0.06  1.00
Sabor       0.05  0.98

                TC1  TC2
SS loadings    2.53 2.10
Proportion Var 0.51 0.42
Cumulative Var 0.51 0.93
pca.m2 <- psych::principal(r = r,
                           covar = FALSE,
                           nfactors = m,
                           rotate = "promax",
                           n.obs = n)
print(pca.m2,
      sort=FALSE, 
      digits=2, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = r, nfactors = m, rotate = "promax", n.obs = n, 
    covar = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
             RC1   RC2   h2    u2 com
Gosto      -0.09  1.01 0.98 0.021 1.0
CustoBenef  0.96 -0.12 0.88 0.121 1.0
Sabor       0.02  0.98 0.98 0.024 1.0
Lanche      0.81  0.34 0.89 0.107 1.3
Energia     0.99 -0.13 0.93 0.068 1.0

                       RC1  RC2
SS loadings           2.55 2.11
Proportion Var        0.51 0.42
Cumulative Var        0.51 0.93
Proportion Explained  0.55 0.45
Cumulative Proportion 0.55 1.00

 With component correlations of 
     RC1  RC2
RC1 1.00 0.23
RC2 0.23 1.00

Mean item complexity =  1.1
Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is  0.03 
 with the empirical chi square  0.04  with prob <  0.83 

Fit based upon off diagonal values = 1
# factanal: MLE
fit <- factanal(x=NULL,
                covmat = r,
                n.obs = n,
                rotation = GPArotation::oblimin,
                factors = m,
                scores = "none")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

cat("\nCommunalities:\n")

Communalities:
print(round(1-fit$uniquenesses,2))
     Gosto CustoBenef      Sabor     Lanche    Energia 
      0.97       0.76       0.96       0.83       0.95 
print(fit, digits=3, cutoff=0.0, sort=TRUE)

Call:
factanal(x = NULL, factors = m, covmat = r, n.obs = n, scores = "none",     rotation = GPArotation::oblimin)

Uniquenesses:
     Gosto CustoBenef      Sabor     Lanche    Energia 
     0.028      0.237      0.040      0.168      0.052 

Loadings:
           Factor1 Factor2
CustoBenef  0.883  -0.074 
Lanche      0.792   0.336 
Energia     0.986  -0.104 
Gosto      -0.059   0.994 
Sabor       0.049   0.970 

            Factor1 Factor2
SS loadings   2.385   2.058

Factor Correlations:
        Factor1 Factor2
Factor1   1.000   0.173
Factor2   0.173   1.000

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is -0.07 on 1 degree of freedom.
The p-value is 1 
load <- fit$loadings[,1:m]
print(load, digits=3)
           Factor1 Factor2
Gosto      -0.0589  0.9943
CustoBenef  0.8831 -0.0739
Sabor       0.0495  0.9698
Lanche      0.7919  0.3357
Energia     0.9861 -0.1043
fit <- lavaan::efa(data = NULL,
                   auto.efa=TRUE,
                   sample.cov = r,
                   sample.nobs = n,
                   #orthogonal = TRUE,
                   std.lv = TRUE,
                   rotation = "oblimin",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                      OBLIMIN OBLIQUE
  Oblimin gamma                                      0
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                     None

  Number of observations                             2

Fit measures:
                  aic    bic   sabic chisq df pvalue cfi rmsea
  nfactors = 2 38.259 19.963 -14.825 0.047  1  0.829   1     0

Eigenvalues correlation matrix:

     ev1      ev2      ev3      ev4      ev5 
  2.8531   1.8063   0.2045   0.1024   0.0337 

Standardized loadings: (* = significant at 1% level)

               f1      f2       unique.var   communalities
Gosto       0.994* -0.059            0.028           0.972
CustoBenef -0.074   0.883*           0.237           0.763
Sabor       0.970*  0.050            0.040           0.960
Lanche      0.336   0.792*           0.168           0.832
Energia    -0.104   0.986*           0.052           0.948

                              f2    f1 total
Sum of sq (obliq) loadings 2.400 2.073 4.474
Proportion of total        0.537 0.463 1.000
Proportion var             0.480 0.415 0.895
Cumulative var             0.480 0.895 0.895

Factor correlations: (* = significant at 1% level)

       f1      f2 
f1  1.000         
f2  0.173   1.000 
fit <- lavaan::efa(data = NULL,
                   auto.efa=TRUE,
                   sample.cov = r,
                   sample.nobs = n,
                   #orthogonal = TRUE,
                   std.lv = TRUE,
                   rotation = "oblimin",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

fit <- lavaan::efa(data = NULL,
                   auto.efa=TRUE,
                   sample.cov = r,
                   sample.nobs = n,
                   #orthogonal = TRUE,
                   std.lv = TRUE,
                   rotation = "promax",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                       PROMAX OBLIQUE
  Promax kappa                                       4
  Rotation algorithm (rstarts)              PROMAX (0)
  Standardized metric                             TRUE
  Row weights                                   Kaiser

  Number of observations                             2

Fit measures:
                  aic    bic   sabic chisq df pvalue cfi rmsea
  nfactors = 2 38.259 19.963 -14.825 0.047  1  0.829   1     0

Eigenvalues correlation matrix:

     ev1      ev2      ev3      ev4      ev5 
  2.8531   1.8063   0.2045   0.1024   0.0337 

Standardized loadings:

               f1     f2      unique.var   communalities
Gosto       1.003 -0.092           0.028           0.972
CustoBenef -0.103  0.892           0.237           0.763
Sabor       0.975  0.018           0.040           0.960
Lanche      0.312  0.786           0.168           0.832
Energia    -0.137  0.997           0.052           0.948

                              f2    f1 total
Sum of sq (obliq) loadings 2.402 2.071 4.474
Proportion of total        0.537 0.463 1.000
Proportion var             0.480 0.414 0.895
Cumulative var             0.480 0.895 0.895

Factor correlations:

       f1     f2
f1  1.000       
f2  0.235  1.000
fit <- lavaan::efa(data = NULL,
                   auto.efa=TRUE,
                   sample.cov = r,
                   sample.nobs = n,
                   #orthogonal = TRUE,
                   std.lv = TRUE,
                   rotation = "promax",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

fit <- lavaan::efa(data = NULL,
                   auto.efa=TRUE,
                   sample.cov = r,
                   sample.nobs = n,
                   #orthogonal = TRUE,
                   std.lv = TRUE,
                   rotation = "geomin",
                   nfactors= m,
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                       GEOMIN OBLIQUE
  Geomin epsilon                                 0.001
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                     None

  Number of observations                             2

Fit measures:
                  aic    bic   sabic chisq df pvalue cfi rmsea
  nfactors = 2 38.259 19.963 -14.825 0.047  1  0.829   1     0

Eigenvalues correlation matrix:

     ev1      ev2      ev3      ev4      ev5 
  2.8531   1.8063   0.2045   0.1024   0.0337 

Standardized loadings: (* = significant at 1% level)

               f1      f2       unique.var   communalities
Gosto       0.990* -0.065            0.028           0.972
CustoBenef  0.000   0.873*           0.237           0.763
Sabor       0.975*  0.043            0.040           0.960
Lanche      0.402   0.781            0.168           0.832
Energia    -0.022   0.975*           0.052           0.948

                              f2    f1 total
Sum of sq (obliq) loadings 2.356 2.118 4.474
Proportion of total        0.527 0.473 1.000
Proportion var             0.471 0.424 0.895
Cumulative var             0.471 0.895 0.895

Factor correlations: (* = significant at 1% level)

       f1      f2 
f1  1.000         
f2  0.097   1.000 
fit <- lavaan::efa(data = NULL,
                   auto.efa=TRUE,
                   sample.cov = r,
                   sample.nobs = n,
                   #orthogonal = TRUE,
                   std.lv = TRUE,
                   rotation = "geomin",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

Escore Fatorial

Na análise fatorial, o interesse geralmente se concentra nos parâmetros do modelo fatorial. No entanto, os valores estimados dos fatores comuns, chamados escores fatoriais, também podem ser necessários.

Essas quantidades são frequentemente usadas para fins diagnósticos, bem como como entradas para uma análise subsequente.

Os escores fatoriais não são estimativas de parâmetros desconhecidos no sentido usual. Em vez disso, são estimativas dos valores dos vetores fatoriais aleatórios não observados \(\mathbf{F}_j\), \(j = 1, 2, \dots, n\). Ou seja, os escores fatoriais são

\[ \hat{\mathbf{f}}_j = \text{estimativa dos valores } \mathbf{f}_j \text{ assumidos por } \mathbf{F}_j \text{ (caso } j\text{)} \]

A situação de estimação é complicada pelo fato de que as quantidades não observadas \(\mathbf{f}_j\) e \(\boldsymbol{\varepsilon}_j\) excedem em número os valores observados \(\mathbf{x}_j\). Para superar essa dificuldade, algumas abordagens heurísticas, mas fundamentadas, para o problema de estimar escores fatoriais têm sido propostas. Descrevemos duas dessas abordagens.

Ambas as abordagens de escores fatoriais têm dois elementos em comum:

  1. Elas tratam as cargas fatoriais estimadas \(\hat{\ell}_{ij}\) e as variâncias específicas estimadas \(\hat{\psi}_i\) como se fossem os valores verdadeiros.

  2. Elas envolvem transformações lineares dos dados originais, possivelmente centrados ou padronizados. Tipicamente, as cargas fatoriais rotacionadas estimadas, em vez das cargas originais não rotacionadas, são usadas para calcular os escores fatoriais. As fórmulas computacionais, conforme apresentadas nesta seção, não se alteram quando cargas rotacionadas são usadas no lugar das cargas não rotacionadas, portanto, não faremos distinção entre elas.

Método dos Mínimos Quadrados Ponderados (WLS)

Suponha inicialmente que o vetor de médias \(\boldsymbol{\mu}\), as cargas fatoriais \(\mathbf{L}\) e as variâncias específicas \(\boldsymbol{\Psi}\) são conhecidas no modelo fatorial

\[ \mathbf{X} - \boldsymbol{\mu} = \mathbf{L} \mathbf{F} + \boldsymbol{\varepsilon} \]

Além disso, considere os fatores específicos \(\boldsymbol{\varepsilon}^{\prime} = [\varepsilon_1, \varepsilon_2,\ldots,\varepsilon_p]\) como erros. Sabendo que \(\mathbb{V}(\varepsilon_i)=\psi_i\), e que \(\psi_i\) não precisam ser iguais entre si, Bartlett [3] sugeriu que mínimos quadrados ponderados (WLS) fossem usados para estimar os valores dos fatores comuns.

A soma dos quadrados dos erros, ponderada pelo inverso de suas variâncias, é

\[ \sum_{i=1}^p \frac{\varepsilon_i^2}{\psi_i} = \boldsymbol{\varepsilon}^{\prime}\boldsymbol{\Psi}^{-1}\boldsymbol{\varepsilon} = (\mathbf{x} - \boldsymbol{\mu} - \mathbf{L}\mathbf{f})^{\prime} \boldsymbol{\Psi}^{-1} (\mathbf{x} - \boldsymbol{\mu} - \mathbf{L}\mathbf{f}) \tag{9-47} \]

Bartlett propôs escolher o estimador \(\hat{\mathbf{f}}\) que minimiza (9-47). A solução (ver Exercício 7.3) é:

\[ \hat{\mathbf{f}} = (\mathbf{L}^{\prime}\boldsymbol{\Psi}^{-1}\mathbf{L})^{-1} \mathbf{L}^{\prime}\boldsymbol{\Psi}^{-1} (\mathbf{x} - \boldsymbol{\mu}) \tag{9-48} \]

Motivados por (9-48), usamos as estimativas \(\hat{\mathbf{L}}\), \(\hat{\boldsymbol{\Psi}}\) e \(\hat{\boldsymbol{\mu}} = \bar{\mathbf{x}}\) como valores verdadeiros e obtemos os escores fatoriais para a \(j\)-ésima observação como:

\[ \hat{\mathbf{f}}_j = (\hat{\mathbf{L}}^{\prime}\hat{\boldsymbol{\Psi}}^{-1}\hat{\mathbf{L}})^{-1} \hat{\mathbf{L}}^{\prime}\hat{\boldsymbol{\Psi}}^{-1} (\mathbf{x}_j - \bar{\mathbf{x}}) \tag{9-49} \]

Quando \(\hat{\mathbf{L}}\) e \(\hat{\boldsymbol{\Psi}}\) são obtidas por máxima verossimilhança, devem satisfazer a condição de unicidade:

\[ \hat{\mathbf{L}}^{\prime}\hat{\boldsymbol{\Psi}}^{-1}\hat{\mathbf{L}} = \hat{\boldsymbol{\Delta}} \]

uma matriz diagonal. Assim, temos escores fatoriais obtidos por WLS usando estimativas de máxima verossimilhança

\[ \hat{\mathbf{f}}_j = \boldsymbol{\Delta}^{-1} \hat{\mathbf{L}}^{\prime} \hat{\boldsymbol{\Psi}}^{-1} (\mathbf{x}_j - \bar{\mathbf{x}})\\ j = 1,\ldots,n \tag{9-50} \]

ou, se a matriz de correlação é fatorada:

\[ \hat{\mathbf{f}}_j = \boldsymbol{\Delta}^{-1} \hat{\mathbf{L}}_z^{\prime} \hat{\boldsymbol{\Psi}}_z^{-1} \mathbf{z}_j\\ j = 1,\ldots,n \]

sendo que \(\mathbf{z}_j = \mathbf{D}^{-1/2}(\mathbf{x}_j - \bar{\mathbf{x}})\), conforme (8-25), e

\[ \hat{\boldsymbol{\rho}} = \hat{\mathbf{L}}_z \hat{\mathbf{L}}_z^{\prime} + \hat{\boldsymbol{\Psi}}_z \]

Os escores fatoriais obtidos por (9-50) possuem vetor de médias amostrais \(\mathbf{0}\) e matriz de covariância amostral igual à identidade. (Ver Exercício 9.16)

Se cargas fatoriais rotacionadas \(\hat{\mathbf{L}}^{\ast} = \hat{\mathbf{L}}\mathbf{T}\) forem usadas no lugar das cargas originais em (9-50), então os escores fatoriais rotacionados são:

\[ \hat{\mathbf{f}}_j^{\ast} = \mathbf{T}^{\prime} \hat{\mathbf{f}}_j\\ j = 1,\ldots,n \] Comentário. Se as cargas fatoriais são estimadas pelo método dos componentes principais, é comum gerar escores fatoriais usando mínimos quadrados não ponderados (ordinary least squares). Isso equivale a assumir \(\psi_i\) aproximadamente iguais. Os escores fatoriais são então dados por

\[ \hat{\mathbf{f}}_{j} = (\mathbf{\hat{L}}^{\prime}\mathbf{\hat{L}})^{-1} \mathbf{\hat{L}}^{\prime} (\mathbf{x}_{j} - \bar{\mathbf{x}}) \tag{9-51} \]

ou, alternativamente, para dados padronizados:

\[ \hat{\mathbf{f}}_{j} = (\mathbf{\hat{L}}_{z}^{\prime}\mathbf{\hat{L}}_{z})^{-1} \mathbf{\hat{L}}_{z}^{\prime} \mathbf{z}_{j}, \qquad \mathbf{z}_{j} = \mathbf{D}^{-1/2}(\mathbf{x}_{j} - \bar{\mathbf{x}}) \]

sendo que as cargas fatoriais de componentes principais são

\[ \mathbf{\hat{L}} = \left[ \sqrt{\hat{\lambda}_{1}}\mathbf{e}_{1} \;\;\; \sqrt{\hat{\lambda}_{2}}\mathbf{e}_{2} \;\;\; \cdots \;\;\; \sqrt{\hat{\lambda}_{m}}\mathbf{e}_{m} \right] \]

Assim, cada escore fatorial pode ser escrito como

\[ \hat{\mathbf{f}}_{j} = \begin{bmatrix} \frac{1}{\sqrt{\hat{\lambda}_{1}}}\, \mathbf{e}_{1}^{\prime} (\mathbf{x}_{j} - \bar{\mathbf{x}}) \\ \frac{1}{\sqrt{\hat{\lambda}_{2}}}\, \mathbf{e}_{2}^{\prime} (\mathbf{x}_{j} - \bar{\mathbf{x}}) \\ \vdots \\ \frac{1}{\sqrt{\hat{\lambda}_{m}}}\, \mathbf{e}_{m}^{\prime} (\mathbf{x}_{j} - \bar{\mathbf{x}}) \end{bmatrix} \tag{9-51} \]

Para esses escores fatoriais, valem as propriedades de amostra:

\[ \frac{1}{n}\sum_{j=1}^{n} \hat{\mathbf{f}}_{j} = \mathbf{0} \qquad\text{(média amostral)} \]

\[ \frac{1}{n-1}\sum_{j=1}^{n} \hat{\mathbf{f}}_{j}\hat{\mathbf{f}}_{j}^{\prime} = \mathbf{I} \qquad\text{(covariância amostral)} \]

Comparando (9-51) com a definição dos componentes principais, concluímos:

Coparando (9-51) com (8-21), vemos que \(\hat{\mathbf{f}}_{j}\) são simplesmente os primeiros componentes principais (escalonados) avaliados em \(\mathbf{x}_{j}\).

\[\Diamond\]

Método de Regressão

Partindo novamente do modelo fatorial original

\[ \mathbf{X} - \boldsymbol{\mu} = \mathbf{L}\mathbf{F} + \boldsymbol{\varepsilon} \]

tratamos inicialmente as cargas fatoriais \(\mathbf{L}\) e as variâncias específicas \(\boldsymbol{\Psi}\) como conhecidas. Quando os fatores comuns \(\mathbf{F}\) e os erros \(\boldsymbol{\varepsilon}\) são normalmente distribuídos (ver eq. 9-3), a combinação

\[ \mathbf{X} - \boldsymbol{\mu} = \mathbf{L}\mathbf{F} + \boldsymbol{\varepsilon} \]

tem distribuição

\[ \mathbf{X} - \boldsymbol{\mu} \sim \mathcal{N}_{p}\left(\mathbf{0},\, \mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}\right) \]

Além disso, a distribuição conjunta de \((\mathbf{X} - \boldsymbol{\mu})\) e \(\mathbf{F}\) é normal:

\[ \begin{bmatrix} \mathbf{X} - \boldsymbol{\mu} \\ \mathbf{F} \end{bmatrix} \sim \mathcal{N}_{p+m}\left( \mathbf{0},\; \mathbf{\Sigma}^{\ast} \right) \]

sendo que

\[ \mathbb{C}(\mathbf{X} - \boldsymbol{\mu}, \mathbf{F})=\underset{(m+p)\times (m+p)}{\mathbf{\Sigma}^{\ast}} = \begin{bmatrix} \underset{p\times p}{\mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi}} & \underset{p\times m}{\mathbf{L}} \\[6pt] \underset{m\times p}{\mathbf{L}^{\prime}} & \underset{m\times m}{\mathbf{I}} \end{bmatrix} \tag{9-52} \]

Usando o resultado 4.6, encontramos a distribuição condicional

\[ \mathbb{E}(\mathbf{F} \mid \mathbf{x}) = \mathbf{L}^{\prime} \mathbf{\Sigma}^{-1} (\mathbf{x} - \boldsymbol{\mu}) = \mathbf{L}^{\prime} (\mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi})^{-1} (\mathbf{x} - \boldsymbol{\mu}) \tag{9-53} \]

e

\[ \mathbb{C}(\mathbf{F} \mid \mathbf{x}) = \mathbf{I} - \mathbf{L}^{\prime} (\mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi})^{-1} \mathbf{L} \tag{9-54} \]

As quantidades \(\mathbf{L}^{\prime}(\mathbf{L}\mathbf{L}^{\prime} + \boldsymbol{\Psi})^{-1}\) em (9-53) são coeficientes de uma regressão multivariada dos fatores nas variáveis observadas. Assim, dadas as observações \(\mathbf{x}_{j}\), os escores fatoriais estimados são:

\[ \hat{\mathbf{f}}_{j} = \mathbf{\hat{L}}^{\prime} \mathbf{\hat{\Sigma}}^{-1} (\mathbf{x}_{j} - \bar{\mathbf{x}}) = \mathbf{\hat{L}}^{\prime} \left(\mathbf{\hat{L}}\mathbf{\hat{L}}^{\prime} + \mathbf{\hat{\Psi}}\right)^{-1} (\mathbf{x}_{j} - \bar{\mathbf{x}})\\ j = 1,2,\ldots,n \tag{9-55} \]

A expressão (9-55) pode ser simplificada usando a identidade matricial (Exercício 9.6):

\[ \mathbf{\hat{L}}^{\prime} \left(\mathbf{\hat{L}}\mathbf{\hat{L}}^{\prime} + \mathbf{\hat{\Psi}}\right)^{-1} = \left(\mathbf{I} + \mathbf{\hat{L}}^{\prime} \mathbf{\hat{\Psi}}^{-1} \mathbf{\hat{L}} \right)^{-1} \mathbf{\hat{L}}^{\prime} \mathbf{\hat{\Psi}}^{-1} \tag{9-56} \] A identidade algébrica em (9-56) permite comparar os escores fatoriais obtidos pelo método de regressão com aqueles obtidos por WLS, conforme (9-50). Denotemos temporariamente:

  • \(\hat{\mathbf{f}}_j^{\text{R}}\) = escore fatorial estimado por regressão,
  • \(\hat{\mathbf{f}}_j^{\text{WLS}}\) = escore fatorial estimado por mínimos quadrados (least squares).

Então, utilizando (9-56), temos:

\[ \hat{\mathbf{f}}_j^{\text{WLS}} = (\mathbf{L}^{\prime}\hat{\boldsymbol{\Psi}}^{-1}\mathbf{L})^{-1} (\mathbf{I} + \mathbf{L}^{\prime}\hat{\boldsymbol{\Psi}}^{-1}\mathbf{L}) \hat{\mathbf{f}}_j^{\text{R}} \tag{9-57} \]

Para estimadores de máxima verossimilhança, vale que

\[ (\mathbf{L}^{\prime}\hat{\boldsymbol{\Psi}}^{-1}\mathbf{L})^{-1} = \hat{\boldsymbol{\Delta}}^{-1} \]

e, se os elementos dessa matriz diagonal são próximos de zero, os métodos de regressão e de WLS tendem a produzir escores fatoriais quase idênticos.

Escores fatoriais obtidos por regressão:

Em aplicações práticas, para reduzir possíveis erros na determinação do número de fatores, costuma-se calcular os escores fatoriais substituindo

\[ \hat{\boldsymbol{\Sigma}} = \hat{\mathbf{L}}\hat{\mathbf{L}}^{\prime} + \hat{\boldsymbol{\Psi}} \]

pela matriz de covariâncias amostral original \(\mathbf{s}\):

\[ \hat{\mathbf{f}}_j = \hat{\mathbf{L}}^{\prime} \mathbf{s}^{-1} (\mathbf{x}_j - \bar{\mathbf{x}})\\ j = 1,2,\ldots,n \tag{9-58} \]

Se o modelo utilizar a matriz de correlações \(\mathbf{r}\):

\[ \hat{\mathbf{f}}_j = \hat{\mathbf{L}}_{z}^{\prime} \mathbf{r}^{-1} \mathbf{z}_j\\ j = 1,2,\ldots,n \]

sendo que

\[ \mathbf{z}_j = \mathbf{D}^{-1/2}(\mathbf{x}_j - \bar{\mathbf{x}}) \]

e

\[ \hat{\boldsymbol{\rho}} = \hat{\mathbf{L}}_{\mathbf{z}}\hat{\mathbf{L}}_{\mathbf{z}}^{\prime} + \hat{\boldsymbol{\Psi}}_{\mathbf{z}} \]

Se for utilizada uma rotação ortogonal, com

\[ \hat{\mathbf{L}}^{\ast} = \hat{\mathbf{L}}\mathbf{T} \]

então os escores fatoriais rotacionados são dados por

\[ \hat{\mathbf{f}}^{\ast}_j = \mathbf{T}^{\prime}\hat{\mathbf{f}}_j\\j = 1,2,\ldots,n \]

O coeficiente de correlação amostral entre os escores resultantes de dois métodos diferentes fornece uma medida do grau de concordância entre os métodos [sic: recomenda-se Regressão de Deming, conforme Silveira & Siqueira (2024)]. Nenhum dos métodos é considerado uniformemente superior em todas as situações.

Exemplo 9.12: Cálculo de escore fatorial

Vamos ilustrar o cálculo de escores fatoriais pelos métodos de mínimos quadrados ponderados (WLS) de Bartlett e de regressão multivariada, usando os dados de retornos de ações discutidos no Exemplo 9.10.

Escore fatorial de observação futura

Uma solução de máxima verossimilhança para um modelo com dois fatores comuns, obtida a partir de \(\mathbf{r}\), forneceu as cargas fatoriais rotacionadas padronizadas e as variâncias específicas

\[ \hat{\mathbf{L}}_{\mathbf{z}}^{\ast} = \begin{bmatrix} 0.763 & 0.024\\ 0.821 & 0.227\\ 0.669 & 0.104\\ 0.118 & 0.993\\ 0.113 & 0.675 \end{bmatrix} \qquad\text{e}\qquad \hat{\boldsymbol{\Psi}}_{\mathbf{z}} = \begin{bmatrix} 0.42 & 0 & 0 & 0 & 0 \\ 0 & 0.27 & 0 & 0 & 0 \\ 0 & 0 & 0.54 & 0 & 0 \\ 0 & 0 & 0 & 0.00 & 0 \\ 0 & 0 & 0 & 0 & 0.53 \end{bmatrix} \]

O vetor de observações padronizadas é

\[ \mathbf{z}^{\prime} = [0.50,-1.40,-0.20,-0.70,1.40] \]

Pelo método de mínimos quadrados ponderados (WLS) (expressão análoga a (9-50)), o escore fatorial estimado é

\[ \hat{\mathbf{f}} = \left(\hat{\mathbf{L}}_{\mathbf{z}}^{\ast \prime} \hat{\boldsymbol{\Psi}}_{\mathbf{z}}^{-1} \hat{\mathbf{L}}_{\mathbf{z}}^{\ast}\right)^{-1} \hat{\mathbf{L}}_{\mathbf{z}}^{\ast \prime} \hat{\boldsymbol{\Psi}}_{\mathbf{z}}^{-1} \mathbf{z} \]

Para os dados deste exemplo, obtemos aproximadamente

\[ \hat{\mathbf{f}} = \begin{bmatrix} -0.61\\ -0.61 \end{bmatrix} \]

Escores por regressão

Pelo método de regressão (expressão análoga a (9-58)), usando a matriz de correlações \(\mathbf{r}\) entre as cinco ações, os escores fatoriais são dados por

\[ \hat{\mathbf{f}} = \hat{\mathbf{L}}_{\mathbf{z}}^{\ast \prime} \mathbf{r}^{-1} \mathbf{z} \]

Escrevendo explicitamente a matriz de coeficientes,

\[ \hat{\mathbf{f}} = \begin{bmatrix} 0.331 & 0.526 & 0.221 & -0.137 & 0.011\\ -0.040 & -0.063 & -0.026 & 1.023 & -0.001 \end{bmatrix} \begin{bmatrix} 0.50\\ -1.40\\ -0.20\\ -0.70\\ 1.40 \end{bmatrix} = \begin{bmatrix} -0.50\\ -0.64 \end{bmatrix} \]

Os dois métodos de escoragem (pontuação) produzem resultados numéricos bastante diferentes para os escores fatoriais neste conjunto de dados, pois há offending estimate (variância negativa estimada por ML: Heywood case). Note que a variância nula é uma substituição da variância negativa estimada.

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))
))

# Vetor de escores padronizados z'
z <- c(0.50, -1.40, -0.20, -0.70, 1.40)

Dados <- read.delim("JW6Data/T8-4.DAT", header = FALSE)
colnames(Dados) <- c("JPM", "Citi", "WF", "RDS", "EM")
r <- cor(Dados, use = "complete.obs", method = "pearson")
print(round(r, 3))
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.632 0.510 0.115 0.154
Citi 0.632 1.000 0.574 0.322 0.213
WF   0.510 0.574 1.000 0.182 0.146
RDS  0.115 0.322 0.182 1.000 0.683
EM   0.154 0.213 0.146 0.683 1.000
n <- nrow(Dados)
p <- ncol(Dados)
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 103 p = 5 m = 2 df = 1
# factanal: MLE
fit <- fit.factanal <- factanal(x=Dados,
                                rotation = "varimax",
                                factors = m,
                                scores = "none") 
print(fit, digits=3, cutoff=0.0, sort=TRUE)

Call:
factanal(x = Dados, factors = m, scores = "none", rotation = "varimax")

Uniquenesses:
  JPM  Citi    WF   RDS    EM 
0.417 0.275 0.542 0.005 0.530 

Loadings:
     Factor1 Factor2
JPM  0.763   0.029  
Citi 0.819   0.232  
WF   0.668   0.108  
RDS  0.113   0.991  
EM   0.108   0.677  

               Factor1 Factor2
SS loadings      1.725   1.507
Proportion Var   0.345   0.301
Cumulative Var   0.345   0.646

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 1.97 on 1 degree of freedom.
The p-value is 0.16 
Lz  <- as.matrix(loadings(fit))          # cargas padronizadas
Psi <- diag(fit$uniquenesses)           # variâncias específicas

## Regressão
f_reg <- t(Lz) %*% solve(r) %*% z

## Bartlett / WLS (se Psi não for singular)
f_wls <- solve(t(Lz) %*% matlib::Ginv(Psi) %*% Lz) %*%
          t(Lz) %*% matlib::Ginv(Psi) %*% z

print(f_wls, 2)
         [,1]
Factor1 -0.60
Factor2 -0.63
print(f_reg, 2)
         [,1]
Factor1 -0.50
Factor2 -0.64
fit <- lavaan::efa(
  data       = Dados,
  auto.efa   = TRUE,
  orthogonal = TRUE,
  std.lv     = TRUE,
  rotation   = "varimax",
  nfactors   = m,
  estimator  = "ML",
  output     = "efa"
)
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                   VARIMAX ORTHOGONAL
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                   Kaiser

  Number of observations                           103

Fit measures:
                     aic       bic     sabic chisq df pvalue   cfi rmsea
  nfactors = 2 -2636.482 -2599.595 -2643.819 2.039  1  0.153 0.994   0.1

Eigenvalues correlation matrix:

    ev1     ev2     ev3     ev4     ev5 
  2.437   1.407   0.501   0.400   0.255 

Standardized loadings: (* = significant at 1% level)

         f1      f2       unique.var   communalities
JPM   0.764*  0.024            0.416           0.584
Citi  0.821*  0.227*           0.275           0.725
WF    0.669*  0.104            0.542           0.458
RDS   0.118   0.993*           0.000           1.000
EM    0.113   0.675*           0.532           0.468

                              f1    f2 total
Sum of sq (ortho) loadings 1.731 1.504 3.235
Proportion of total        0.535 0.465 1.000
Proportion var             0.346 0.301 0.647
Cumulative var             0.346 0.647 0.647
fit <- lavaan::efa(
  data       = Dados,
  rotation   = "varimax",
  nfactors   = m,
  estimator  = "ML",
  output     = "lavaan"
)

Lz <- as.matrix(lavaan::inspect(fit, "std")$lambda)
Psi <- diag(1 - rowSums(Lz^2))
r <- lavaan::lavInspect(fit, "cor.ov")
f_reg <- t(Lz) %*% solve(r) %*% z
Psi_adj <- Psi
diag(Psi_adj)[diag(Psi_adj) == 0] <- 1e-6
f_wls <- solve(t(Lz) %*% matlib::Ginv(Psi_adj) %*% Lz) %*%
  t(Lz) %*% matlib::Ginv(Psi_adj) %*% z
print(f_wls, 2)
   [,1]
f1 -1.0
f2  1.5
print(f_reg, 2)
    [,1]
f1 -0.50
f2 -0.65

Escore fatorial de observação presente

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))
))
Dados <- read.delim("JW6Data/T8-4.DAT", header = FALSE)
colnames(Dados) <- c("JPM", "Citi", "WF", "RDS", "EM")
r <- cor(Dados, use = "complete.obs", method = "pearson")
print(round(r, 3))
       JPM  Citi    WF   RDS    EM
JPM  1.000 0.632 0.510 0.115 0.154
Citi 0.632 1.000 0.574 0.322 0.213
WF   0.510 0.574 1.000 0.182 0.146
RDS  0.115 0.322 0.182 1.000 0.683
EM   0.154 0.213 0.146 0.683 1.000
n <- nrow(Dados)
p <- ncol(Dados)
m <- 2 
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 103 p = 5 m = 2 df = 1
# factanal: MLE
fit.B <- fit.factanal <- factanal(x=Dados,
                                  rotation = "varimax",
                                  factors = m,
                                  scores = "Bartlett") # Bartlett's weighted least-squares scores
print(fit.B, digits=3, cutoff=0.0, sort=TRUE)

Call:
factanal(x = Dados, factors = m, scores = "Bartlett", rotation = "varimax")

Uniquenesses:
  JPM  Citi    WF   RDS    EM 
0.417 0.275 0.542 0.005 0.530 

Loadings:
     Factor1 Factor2
JPM  0.763   0.029  
Citi 0.819   0.232  
WF   0.668   0.108  
RDS  0.113   0.991  
EM   0.108   0.677  

               Factor1 Factor2
SS loadings      1.725   1.507
Proportion Var   0.345   0.301
Cumulative Var   0.345   0.646

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 1.97 on 1 degree of freedom.
The p-value is 0.16 
summary(fit.B$scores, digits=2)
    Factor1          Factor2      
 Min.   :-2.445   Min.   :-2.241  
 1st Qu.:-0.788   1st Qu.:-0.720  
 Median : 0.063   Median : 0.084  
 Mean   : 0.000   Mean   : 0.000  
 3rd Qu.: 0.647   3rd Qu.: 0.566  
 Max.   : 3.044   Max.   : 2.284  
print(head(fit.B$scores), digits=2)
     Factor1 Factor2
[1,]   0.251  -1.854
[2,]   0.443   0.248
[3,]  -0.481  -0.098
[4,]   0.799  -1.315
[5,]  -0.099   0.959
[6,]  -0.471   0.413
print(tail(fit.B$scores), digits=2)
       Factor1 Factor2
 [98,]   1.571 -0.0085
 [99,]  -0.873 -0.1203
[100,]   0.063 -0.2072
[101,]   1.031 -0.8764
[102,]   0.171 -0.2692
[103,]  -1.044 -0.2229
sunflowerplot(fit.B$scores)
abline(h=0,v=0, lty=2)

fit <- lavaan::efa(
  data       = Dados,
  rotation   = "varimax",
  nfactors   = m,
  estimator  = "ML",
  output     = "efa"
)
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                   VARIMAX ORTHOGONAL
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                   Kaiser

  Number of observations                           103

Fit measures:
                     aic       bic     sabic chisq df pvalue   cfi rmsea
  nfactors = 2 -2636.482 -2599.595 -2643.819 2.039  1  0.153 0.994   0.1

Eigenvalues correlation matrix:

    ev1     ev2     ev3     ev4     ev5 
  2.437   1.407   0.501   0.400   0.255 

Standardized loadings: (* = significant at 1% level)

         f1      f2       unique.var   communalities
JPM   0.764*  0.024            0.416           0.584
Citi  0.821*  0.227*           0.275           0.725
WF    0.669*  0.104            0.542           0.458
RDS   0.118   0.993*           0.000           1.000
EM    0.113   0.675*           0.532           0.468

                              f1    f2 total
Sum of sq (ortho) loadings 1.731 1.504 3.235
Proportion of total        0.535 0.465 1.000
Proportion var             0.346 0.301 0.647
Cumulative var             0.346 0.647 0.647
# escores fatoriais (padrão: método de regressão)
scores.B <- lavaan::lavPredict(
  fit,
  method = "Bartlett",    # ou "regression"
  type   = "lv"           # escores das variáveis latentes
)

summary(scores.B, digits=2)
       f1              f2       
 Min.   :-2.46   Min.   :-2.24  
 1st Qu.:-0.79   1st Qu.:-0.71  
 Median : 0.06   Median : 0.09  
 Mean   : 0.00   Mean   : 0.00  
 3rd Qu.: 0.65   3rd Qu.: 0.56  
 Max.   : 3.05   Max.   : 2.29  
print(head(scores.B), digits=2)
         f1     f2
[1,]  0.241 -1.867
[2,]  0.447  0.244
[3,] -0.484 -0.095
[4,]  0.795 -1.324
[5,] -0.091  0.957
[6,] -0.471  0.420
print(tail(scores.B), digits=2)
           f1     f2
 [98,]  1.580 -0.023
 [99,] -0.879 -0.111
[100,]  0.061 -0.206
[101,]  1.030 -0.884
[102,]  0.169 -0.266
[103,] -1.052 -0.214
sunflowerplot(scores.B)
abline(h=0,v=0, lty=2)

# escores fatoriais (padrão: método de regressão)
scores.R <- lavaan::lavPredict(
  fit,
  method = "regression",    # ou "regression"
  type   = "lv"           # escores das variáveis latentes
)

sunflowerplot(scores.R[,1], scores.B[,1], 
              main="Regression scores: factanal x lavaan::efa")
lines(lowess(scores.R[,1], scores.B[,1]))
curve(x*1, add=TRUE, lty=2)

sunflowerplot(scores.R[,2], scores.B[,2], 
              main="Regression scores: factanal x lavaan::efa")
lines(lowess(scores.R[,2], scores.B[,2]))
curve(x*1, add=TRUE, lty=2)

sunflowerplot(fit.B$scores[,1], scores.B[,1], 
              main="Bartlett's weighted least-squares scores")
lines(lowess(fit.B$scores[,1], scores.B[,1]))
curve(x*1, add=TRUE, lty=2)

sunflowerplot(fit.B$scores[,2], scores.B[,2], 
              main="Bartlett's weighted least-squares scores")
lines(lowess(fit.B$scores[,2], scores.B[,2]))
curve(x*1, add=TRUE, lty=2)

Perspectivas e uma Estratégia para Análise Fatorial Exploratória (EFA)

Muitas decisões precisam ser tomadas em qualquer estudo de análise fatorial. Provavelmente, a decisão mais importante é a escolha de \(m\), o número de fatores comuns. Embora exista um teste de grande amostra para avaliar a adequação de um modelo dado \(m\), ele só é apropriado para dados aproximadamente normais. Além disso, o teste quase certamente rejeitará o modelo para m pequeno se o número de variáveis e observações for grande. Ainda assim, a análise fatorial frequentemente fornece uma aproximação útil. Na prática, a escolha final de \(m\) é baseada em alguma combinação de:

  1. Proporção da variância amostral explicada
  2. Conhecimento substantivo da área
  3. Razoabilidade dos resultados

A escolha do método de solução e do tipo de rotação é menos crucial. De fato, as análises fatoriais mais satisfatórias são aquelas nas quais as rotações são avaliadas por mais de um método, e todos os resultados confirmam substancialmente a mesma estrutura fatorial.

No momento, a análise fatorial ainda mantém certo caráter artístico, e nenhuma estratégia única deve ser tratada como definitiva. Uma estratégia razoável consiste em:

  1. Realizar uma análise fatorial por componentes principais.
    Esse método é adequado como primeira análise dos dados (não é necessário que as matrizes de covariância or correlação amostrais sejam não singulares).

    1. Procurar observações suspeitas plotando os escores fatoriais. Também calcular escores padronizados e distâncias ao quadrado conforme descrito na Seção 4.6.
    2. Aplicar uma rotação varimax.
  2. Realizar uma análise fatorial por máxima verossimilhança, incluindo rotação varimax.

  3. Comparar as soluções dos dois métodos.

    1. As cargas fatoriais se agrupam da mesma maneira?
    2. Plotar os escores de componentes principais contra os escores da análise de máxima verossimilhança.
  4. Repetir os três primeiros passos para outros valores de \(m\).
    Fatores adicionais realmente contribuem para a interpretação dos dados?

  5. Para grandes conjuntos de dados, dividir a amostra em duas partes e realizar a análise separadamente.
    Comparar os resultados entre as duas metades e com o obtido na amostra completa, avaliando a estabilidade da solução.
    A divisão pode ser aleatória ou baseada em particionar a primeira metade dos casos em um grupo e a segunda metade em outro.

Conforme Gerbing & Hamilton (1996), no artigo intitulado “Viabilidade da Análise Fatorial Exploratória como Precedente para a Análise Fatorial Confirmatória”:

Resumo: Como parte do desenvolvimento de uma estratégia abrangente para construção e avaliação de modelos de equações estruturais, um estudo de Monte Carlo avaliou a eficácia de diferentes métodos de extração e rotação na análise fatorial exploratória para identificar corretamente o modelo populacional conhecido de medida com múltiplos indicadores. Os métodos exploratórios tiveram bom desempenho na recuperação do modelo, exceto em tamanhos de amostra pequenos com fatores altamente correlacionados, e mesmo nessas situações a maioria dos indicadores foi corretamente atribuída aos fatores. Surpreendentemente, a rotação ortogonal varimax apresentou desempenho tão bom quanto as rotações oblíquas mais sofisticadas na recuperação do modelo, e geralmente produziu estimativas mais precisas. Esses resultados demonstram que a análise fatorial exploratória pode contribuir como uma estratégia heurística útil para a especificação de modelos antes da validação cruzada com análise fatorial confirmatória.”

“A maioria dos usos de análises fatoriais”confirmatórias” são, na realidade, em parte exploratórias e em parte confirmatórias, em que o modelo resultante é derivado em parte da teoria e em parte de uma nova especificação com base na análise de ajuste do modelo. Uma prática comum é usar as informações fornecidas a partir de um CFA, como índices de modificação e erros padrão para reespecificar incrementalmente um modelo, a fim de obter melhor ajuste (alterando assim os erros-padrão relatados e o ajuste estatístico do modelo a partir de regras estatísticas formais para apenas guias heurísticos de ajuste). Este artigo fornece orientação para o pesquisador com relação à eficácia de uma estratégia heurística alternativa para a especificação do modelo baseado em dados. Especificamente, quão eficaz é a EFA em revelar a estrutura de um modelo de mensuração (psicométrico)?”

“A conclusão mais geral deste artigo é que EFA é uma ferramenta útil para auxiliar o pesquisador na recuperação de um modelo de mensuração subjacente que pode então ser avaliado com CFA. CFA de um modelo desenvolvido em parte com EFA é uma estratégia viável para o desenvolvimento e análise de teoria. O papel deste estudo foi mostrar que a EFA, particularmente com a rotação varimax dos fatores dos eixos principais, parece fornecer uma ferramenta heurística útil para a construção de modelos de mensuração de múltiplos indicadores como um precursor dos procedimentos CFA.”

Exemplo 9.14: Análise fatorial dos dados de ossos de galinha

Apresentamos os resultados de várias análises fatoriais sobre medidas de ossos e crânios de galinhas da linhagem white leghorn. Trata-se de um estudo de alometria osteométrica (ou morfometria alométrica) em aves, especificamente alectorométrica. Os dados originais foram obtidos de Dunn (5). A análise fatorial dos dados de Dunn foi originalmente discutida por Wright (15), que iniciou sua análise a partir de uma matriz de correlação diferente da que usamos aqui.

O conjunto completo de dados consiste em \(n = 276\) medidas de dimensões ósseas, organizadas da seguinte forma:

Cabeça: \[ \begin{cases} X_1 = \text{comprimento do crânio}\\ X_2 = \text{largura do crânio} \end{cases} \]

Perna: \[ \begin{cases} X_3 = \text{comprimento do fêmur}\\ X_4 = \text{comprimento da tíbia} \end{cases} \]

Asa: \[ \begin{cases} X_5 = \text{comprimento do úmero}\\ X_6 = \text{comprimento da ulna} \end{cases} \]

A matriz de correlação amostral é

\[ \mathbf{r} = \begin{bmatrix} 1.000 & .505 & .569 & .602 & .621 & .603\\ .505 & 1.000 & .422 & .467 & .482 & .450\\ .569 & .422 & 1.000 & .926 & .877 & .878\\ .602 & .467 & .926 & 1.000 & .874 & .894\\ .621 & .482 & .877 & .874 & 1.000 & .937\\ .603 & .450 & .878 & .894 & .937 & 1.000 \end{bmatrix} \]

Essa matriz foi analisada pelos métodos de componentes principais e de máxima verossimilhança, assumindo \(m = 2\) fatores.

Após a rotação, os dois métodos produzem resultados diferentes. Concentrando-nos no método de componentes principais e na proporção cumulativa da variância total explicada, observamos que uma solução de dois fatores parece justificada.

O primeiro fator parece representar um fator de tamanho corporal, dominado pelas dimensões da asa e da perna. O segundo representa dimensões cranianas.

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
r <- matrix(c(
  1.000, 0.505, 0.569, 0.602, 0.621, 0.603,
  0.505, 1.000, 0.422, 0.467, 0.482, 0.450,
  0.569, 0.422, 1.000, 0.926, 0.877, 0.878,
  0.602, 0.467, 0.926, 1.000, 0.874, 0.894,
  0.621, 0.482, 0.877, 0.874, 1.000, 0.937,
  0.603, 0.450, 0.878, 0.894, 0.937, 1.000
), nrow = 6, byrow = TRUE)

dimnames(r) <- list(
  c("cranio_c", "cranio_l",
    "femur_c", "tibia_c",
    "umero_c", "ulna_c"),
  c("cranio_c", "cranio_l",
    "femur_c", "tibia_c",
    "umero_c", "ulna_c")
)

print(r)
         cranio_c cranio_l femur_c tibia_c umero_c ulna_c
cranio_c    1.000    0.505   0.569   0.602   0.621  0.603
cranio_l    0.505    1.000   0.422   0.467   0.482  0.450
femur_c     0.569    0.422   1.000   0.926   0.877  0.878
tibia_c     0.602    0.467   0.926   1.000   0.874  0.894
umero_c     0.621    0.482   0.877   0.874   1.000  0.937
ulna_c      0.603    0.450   0.878   0.894   0.937  1.000
n <- 276
p <- dim(r)[1]
m <- 2
df <- 0.5*(p-m)*(p-m-1)-m
cat("\nn = ", n, " p = ", p, " m = ", m, " df = ", df, "\n", sep="")

n = 276 p = 6 m = 2 df = 4
print(
  GGally::ggcorr(data=NULL,
                 name="Ossos de galinha",
                 cor_matrix=r,
                 geom="tile",
                 min_size=0,
                 max_size=10, 
                 nbreaks=6,
                 digits=2,
                 label=TRUE,
                 label_round=2,
                 label_size=4)
)

## 1) calcular um layout fixo sem plotar
set.seed(123)  # só para o layout ser reprodutível
q_tmp <- qgraph::qgraph(
  r,
  graph      = "cor",
  sampleSize = n,
  minimum    = "sig",
  bonf       = TRUE,
  layout     = "spring",
  DoNotPlot  = TRUE  # <- calcula, mas não desenha
)

layout_fix <- q_tmp$layout  # <- matriz de coordenadas dos nós

## 2) rede de correlações, agora usando layout_fix
qgraph::qgraph(
  r, 
  graph      = "cor", 
  sampleSize = n,
  minimum    = "sig",
  bonf       = TRUE,
  layout     = layout_fix,  # <- aqui entra o layout fixo
  shape      = "rectangle",
  vsize      = 8,
  label.cex  = 1.6,
  labels     = colnames(r),
  label.prop = 0,
  theme      = "gray",
  title      = "Ossos de galinha (cor)",
  details    = FALSE
)

## 3) rede glasso, com o MESMO layout
suppressWarnings(qgraph::qgraph(
  r, 
  graph      = "glasso", 
  sampleSize = n,
  layout     = layout_fix,  # <- mesmo layout, só mudam as arestas
  shape      = "rectangle",
  vsize      = 8,
  label.cex  = 1.6,
  labels     = colnames(r),
  label.prop = 0,
  theme      = "gray",
  title      = "Ossos de galinha (glasso)",
  details    = FALSE
))

eig <- eigen(r, symmetric = TRUE)
lambda <- eig$values
E <- eig$vectors  # colunas = autovetores unitários

dt <- data.frame(1:length(lambda),format(as.numeric(lambda), 
                                     digits=2, 
                                     nsmall=2))
names(dt) <- c("component","value")
print(dt)
  component value
1         1 4.456
2         2 0.782
3         3 0.458
4         4 0.169
5         5 0.079
6         6 0.055
plot(lambda, 
     main="Ossos de galinha (cor)",
     xlab="Componente", ylab="Autovalor", 
     type="o", pch=16, axes=FALSE)
axis(1, at=1:length(lambda))
axis(2)
abline(h=1,col="darkgray",lty=2)

sv1maior <- lambda[1]
sv2maior <- lambda[2]
H <- NA
if(sv2maior>0) {H <- sv1maior/sv2maior}
cat("FirstAV/SecondAV = H = ",round(sv1maior,2),"/",round(sv2maior,2)," ~ ",round(H,2),"\n",sep="")
FirstAV/SecondAV = H = 4.46/0.78 ~ 5.7
cat("\t- if < 2: first order\n")
    - if < 2: first order
cat("\t- if > 3: unifactor\n")
    - if > 3: unifactor
cat("\t- otherwise: bifactor\n")
    - otherwise: bifactor
if (H <= 2) {txt <- "\tpossible first order model, av1/av2 <= 2"}
if (H > 2 & H <= 3) {txt <- "\tpossible bifactor model, 2 < av1/av2 <= 3"}
if (H > 3) {txt <- "\tpossible unifactor model, av1/av2 > 3"}
cat(txt)
    possible unifactor model, av1/av2 > 3
pca.m2 <- psych::principal(r = r,
                           covar = FALSE,
                           nfactors = m,
                           rotate = "oblimin",
                           n.obs = n)
psych::fa.plot(pca.m2)

print(pca.m2,
      sort=FALSE, 
      digits=2, 
      cut=0.0)
Principal Components Analysis
Call: psych::principal(r = r, nfactors = m, rotate = "oblimin", n.obs = n, 
    covar = FALSE)
Standardized loadings (pattern matrix) based upon correlation matrix
           TC1   TC2   h2    u2 com
cranio_c  0.36  0.57 0.67 0.329 1.7
cranio_l -0.05  0.96 0.88 0.116 1.0
femur_c   0.99 -0.06 0.92 0.083 1.0
tibia_c   0.95  0.01 0.92 0.080 1.0
umero_c   0.93  0.05 0.92 0.082 1.0
ulna_c    0.96  0.00 0.93 0.072 1.0

                       TC1  TC2
SS loadings           3.89 1.34
Proportion Var        0.65 0.22
Cumulative Var        0.65 0.87
Proportion Explained  0.74 0.26
Cumulative Proportion 0.74 1.00

 With component correlations of 
     TC1  TC2
TC1 1.00 0.52
TC2 0.52 1.00

Mean item complexity =  1.1
Test of the hypothesis that 2 components are sufficient.

The root mean square of the residuals (RMSR) is  0.06 
 with the empirical chi square  27.91  with prob <  1.3e-05 

Fit based upon off diagonal values = 0.99
print(pca.m2$loadings,
      sort=TRUE, 
      digits=2, 
      cut=0.0)

Loadings:
         TC1   TC2  
femur_c   0.99 -0.06
tibia_c   0.95  0.01
umero_c   0.93  0.05
ulna_c    0.96  0.00
cranio_c  0.36  0.57
cranio_l -0.05  0.96

                TC1  TC2
SS loadings    3.81 1.26
Proportion Var 0.63 0.21
Cumulative Var 0.63 0.84
# factanal: MLE
fit <- fit.factanal <- factanal(x=NULL,
                                covmat = r,
                                n.obs = n,
                                rotation = GPArotation::oblimin,
                                factors = m,
                                scores = "none")
semPlot::semPaths(object=fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(object=fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

cat("\nCommunalities:\n")

Communalities:
print(round(1-fit$uniquenesses,2))
cranio_c cranio_l  femur_c  tibia_c  umero_c   ulna_c 
    0.40     0.24     0.88     1.00     0.99     0.91 
print(fit, digits=3, cutoff=0.0, sort=TRUE)

Call:
factanal(x = NULL, factors = m, covmat = r, n.obs = n, scores = "none",     rotation = GPArotation::oblimin)

Uniquenesses:
cranio_c cranio_l  femur_c  tibia_c  umero_c   ulna_c 
   0.598    0.759    0.120    0.005    0.006    0.095 

Loadings:
         Factor1 Factor2
cranio_c  0.634   0.037 
femur_c   0.930  -0.104 
tibia_c   0.961  -0.251 
umero_c   0.972   0.240 
ulna_c    0.949   0.083 
cranio_l  0.491   0.029 

            Factor1 Factor2
SS loadings   4.277    0.14

Factor Correlations:
        Factor1 Factor2
Factor1   1.000  -0.017
Factor2  -0.017   1.000

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 28.2 on 4 degrees of freedom.
The p-value is 1.13e-05 
load <- fit$loadings[,1:m]
print(load, digits=3)
         Factor1 Factor2
cranio_c   0.634  0.0370
cranio_l   0.491  0.0292
femur_c    0.930 -0.1039
tibia_c    0.961 -0.2508
umero_c    0.972  0.2399
ulna_c     0.949  0.0834
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "oblimin",
                   nfactors= 1:(m+1),
                   estimator = "ML",
                   output = "efa")
print(lavaan::summary(fit, 
                      nd = 3L,
                      cutoff = 0.0,
                      dot.cutoff = 0.05))
This is lavaan 0.6-20 -- running exploratory factor analysis

  Estimator                                         ML
  Rotation method                      OBLIMIN OBLIQUE
  Oblimin gamma                                      0
  Rotation algorithm (rstarts)                GPA (30)
  Standardized metric                             TRUE
  Row weights                                     None

  Number of observations                           276

Overview models:
                    aic      bic    sabic   chisq df pvalue   cfi rmsea
  nfactors = 1 2977.019 3020.463 2982.413 122.826  9      0 0.938 0.214
  nfactors = 2 2892.890 2954.437 2900.533  28.697  4      0 0.987 0.150
  nfactors = 3 2872.390 2948.418 2881.830   0.197  0     NA 1.000 0.000

Eigenvalues correlation matrix:

     ev1      ev2      ev3      ev4      ev5      ev6 
  4.4564   0.7824   0.4584   0.1688   0.0791   0.0548 

Number of factors:  1 

Standardized loadings: (* = significant at 1% level)

             f1       unique.var   communalities
cranio_c  0.637*           0.594           0.406
cranio_l  0.488*           0.762           0.238
femur_c   0.932*           0.131           0.869
tibia_c   0.940*           0.116           0.884
umero_c   0.954*           0.090           0.910
ulna_c    0.960*           0.078           0.922

                           f1
Sum of squared loadings 4.230
Proportion of total     1.000
Proportion var          0.705
Cumulative var          0.705

Number of factors:  2 

Standardized loadings: (* = significant at 1% level)

             f1      f2       unique.var   communalities
cranio_c  0.218   0.432*           0.598           0.402
cranio_l  0.173   0.331*           0.758           0.242
femur_c   0.664*  0.295*           0.122           0.878
tibia_c   1.022* -0.025            0.000           1.000
umero_c  -0.049   1.039*           0.010           0.990
ulna_c    0.265*  0.708*           0.094           0.906

                              f2    f1 total
Sum of sq (obliq) loadings 2.373 2.045 4.418
Proportion of total        0.537 0.463 1.000
Proportion var             0.396 0.341 0.736
Cumulative var             0.396 0.736 0.736

Factor correlations: (* = significant at 1% level)

       f1      f2 
f1  1.000         
f2  0.894*  1.000 

Number of factors:  3 

Standardized loadings: (* = significant at 1% level)

             f1      f2      f3       unique.var   communalities
cranio_c  0.380   0.128   0.290            0.512           0.488
cranio_l  0.828*  0.002  -0.006            0.318           0.682
femur_c  -0.019   0.649*  0.324*           0.118           0.882
tibia_c   0.047   1.001* -0.030            0.000           1.000
umero_c   0.043  -0.042   1.001*           0.022           0.978
ulna_c    0.007   0.234*  0.737*           0.087           0.913

                              f3    f2    f1 total
Sum of sq (obliq) loadings 2.129 1.852 0.962 4.943
Proportion of total        0.431 0.375 0.195 1.000
Proportion var             0.355 0.309 0.160 0.824
Cumulative var             0.355 0.663 0.824 0.824

Factor correlations: (* = significant at 1% level)

       f1      f2      f3 
f1  1.000                 
f2  0.537*  1.000         
f3  0.566*  0.893*  1.000 
fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "oblimin",
                   nfactors= 1,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=10,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

fit <- lavaan::efa(data = NULL,
                   sample.cov = r,
                   sample.nobs = n,
                   rotation = "oblimin",
                   nfactors= m,
                   estimator = "ML",
                   output = "lavaan")
semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=10,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit,
                  layout="tree",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=3,
                  edge.label.cex=1,
                  nCharNodes=10,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=TRUE)

# Calculate composite reliability from estimated factor-model parameters
print(semTools::compRelSEM(fit))
   f1    f2 
0.201 0.295 
# latent variables can be thought of representing two distinct constructs?
print(semTools::discriminantValidity(fit))
Some of the latent variable variances are fixed to values other than 1. The model is re-estimated by scaling the latent variables based on the first factor loading.
Warning: lavaan->lav_model_vcov():  
   The variance-covariance matrix of the estimated parameters (vcov) does not 
   appear to be positive definite! The smallest eigenvalue (= -7.125087e-18) 
   is smaller than zero. This may be a symptom that the model is not 
   identified.
  lhs op rhs       est  ci.lower  ci.upper Df     AIC      BIC    Chisq
1  f1 ~~  f2 0.8937724 0.8592398 0.9283049  3 2894.89 2960.057 28.69723
    Chisq diff RMSEA Df diff Pr(>Chisq)
1 1.176659e-11     0       1  0.9999973

Modelo de Equações Estruturais (SEM)

Modelo de equações estruturais (SEM) consiste num conjunto de equações lineares usados para especificar fenômenos em termos de suas variáveis presumidas de causa e efeito. Na sua forma mais geral, os modelos permitem variáveis que não podem ser medidas diretamente. Esses modelos são particularmente úteis nas ciências sociais e comportamentais e têm sido usados para estudar a relação entre status social e desempenho, os determinantes da lucratividade de empresas, discriminação no emprego, a eficiência de programas de ação social e outros mecanismos relevantes.

Softwares para especificar, ajustar e avaliar modelos de equações estruturais:

Comercial:

  • LISREL (Linear Structural Relationships): Jöreskog, KG & Sörbom, D (Primeiro)
  • MPLUS: Muthen, B & Muthen, L
  • AMOS (Analysis of MOments Structures): Arbuckle, JL

R:

Modelo LISREL

Usando a notação de Jöreskog e Sörbom, o modelo LISREL é dado pelas equações

\[ \underset{m\times 1}{\boldsymbol{\eta}} = \underset{m\times m}{\mathbf{B}}\;\underset{m\times 1}{\boldsymbol{\eta}} + \underset{m\times n}{\boldsymbol{\Gamma}}\;\underset{n\times 1}{\boldsymbol{\xi}} + \underset{m\times 1}{\boldsymbol{\zeta}} \tag{9-59} \]

\[ \begin{align} \underset{p\times 1}{\mathbf{Y}} &= \underset{p\times m}{\boldsymbol{\Lambda}_{\mathbf{y}}}\;\underset{m\times 1}{\boldsymbol{\eta}} + \underset{p\times 1}{\boldsymbol{\varepsilon}}\\\\ \underset{q\times 1}{\mathbf{X}} &= \underset{q\times n}{\boldsymbol{\Lambda}_{\mathbf{x}}}\;\underset{n\times 1}{\boldsymbol{\xi}} + \underset{q\times 1}{\boldsymbol{\delta}} \end{align} \tag{9-60} \]

com

\[ \begin{align} \mathbb{E}(\boldsymbol{\zeta}) &= \mathbf{0} \qquad \mathbb{C}(\boldsymbol{\zeta}) = \boldsymbol{\Psi}\\ \mathbb{E}(\boldsymbol{\varepsilon}) &= \mathbf{0} \qquad \mathbb{C}(\boldsymbol{\varepsilon}) = \boldsymbol{\Theta}_{\varepsilon}\\ \mathbb{E}(\boldsymbol{\delta}) &= \mathbf{0} \qquad \mathbb{C}(\boldsymbol{\delta}) = \boldsymbol{\Theta}_{\delta} \end{align} \tag{9-61} \]

As quantidades \(\boldsymbol{\zeta}\), \(\boldsymbol{\varepsilon}\) e \(\boldsymbol{\delta}\) são mutuamente não correlacionadas.

\(\mathbb{C}(\boldsymbol{\xi}) = \boldsymbol{\Phi}\).

\(\boldsymbol{\zeta}\) é não correlacionado com \(\boldsymbol{\xi}\).

\(\boldsymbol{\varepsilon}\) é não correlacionado com \(\boldsymbol{\eta}\).

\(\boldsymbol{\delta}\) é não correlacionado com \(\boldsymbol{\xi}\).

A matriz \(\mathbf{B}\) tem zeros na diagonal.

\(\mathbf{I} - \mathbf{B}\) é não singular.

Além disso, assumimos \(\mathbb{E}(\boldsymbol{\xi}) = \mathbf{0}\) e \(\mathbb{E}(\boldsymbol{\eta}) = \mathbf{0}\).

As quantidades \(\boldsymbol{\xi}\) e \(\boldsymbol{\eta}\) em (9-59) são as variáveis de causa e efeito, respectivamente, e, em geral, não são observadas diretamente. Elas são chamadas de variáveis latentes. As quantidades \(\mathbf{Y}\) e \(\mathbf{X}\) em (9-60) são variáveis manifestas linearmente relacionadas a \(\boldsymbol{\eta}\) e \(\boldsymbol{\xi}\) pelas matrizes de coeficientes \(\boldsymbol{\Lambda}_\mathbf{y}\) e \(\boldsymbol{\Lambda}_\mathbf{x}\), e essas variáveis podem ser medidas. Seus valores observados constituem os dados. As equações (9-60) são chamadas de equações de medida.

Construção de um diagrama de caminhos

Faz-se uma distinção entre variáveis que não são influenciadas por outras variáveis no sistema (variáveis exógenas) e variáveis que são afetadas por outras (variáveis endógenas). Cada variável dependente (endógena) possui um termo residual associado.

Determinadas convenções regem o desenho de um diagrama de caminhos (path diagram), que é construído da seguinte forma (setas direcionadas representam um caminho):

  1. Uma seta reta é desenhada para cada variável dependente (endógena) a partir de cada uma de suas fontes.

  2. Uma seta reta também é desenhada para cada variável dependente a partir de seu termo residual.

  3. Uma seta curva com duas pontas é desenhada entre cada par de variáveis independentes (exógenas) que se presume terem correlação diferente de zero.

A seta curva que representa correlação indica a natureza simétrica de um coeficiente de correlação. As outras conexões são direcionais, conforme indicado pela seta de ponta única.

Exemplo 9.15: Um diagrama de caminhos e a equação estrutural

Considere o seguinte diagrama de caminhos para as variáveis de causa e efeito:

(O diagrama mostra três variáveis exógenas \(\xi_1\), \(\xi_2\), \(\xi_3\) com correlações entre elas, e duas variáveis endógenas \(\eta_1\) e \(\eta_2\), com setas direcionais representando os coeficientes \(\gamma_1, \gamma_2, \gamma_3, \gamma_4\) e \(\beta\), além dos termos residuais \(\zeta_1\) e \(\zeta_2\).)

Este diagrama, com \(m = 2\) e \(n = 3\), corresponde à equação estrutural (ver 9-59):

\[ \begin{bmatrix} \eta_1 \\ \eta_2 \end{bmatrix} = \begin{bmatrix} 0 & \beta \\ 0 & 0 \end{bmatrix} \begin{bmatrix} \eta_1 \\ \eta_2 \end{bmatrix} + \begin{bmatrix} \gamma_1 & \gamma_2 & 0 \\ 0 & \gamma_3 & \gamma_4 \end{bmatrix} \begin{bmatrix} \xi_1 \\ \xi_2 \\ \xi_3 \end{bmatrix} + \begin{bmatrix} \zeta_1 \\ \zeta_2 \end{bmatrix} \]

com

\[ \mathbb{C}(\xi_1, \xi_2) = \phi_1 \qquad \mathbb{C}(\xi_2, \xi_3) = \phi_2 \qquad \mathbb{C}(\xi_1, \xi_3) = \phi_3 \]

e

\[ \mathbb{C}(\zeta_1, \zeta_2) = 0 \]

Vemos, por exemplo, que \(\eta_1\) depende de \(\xi_1\), \(\xi_2\) e \(\eta_2\).

Diagramas de caminhos são ferramentas úteis para formular modelos estruturais. Como indicam a direção e a natureza da causalidade, eles obrigam o pesquisador a pensar cuidadosamente sobre o problema.

\[\Diamond\] O modelo em (9-59) e (9-60) possui uma estrutura muito rica e inclui diversos submodelos importantes como casos particulares. Por exemplo, com uma escolha criteriosa de dimensões e variáveis, é possível definir tanto o modelo de regressão linear multivariada quanto o modelo de análise fatorial.

Estrutura de Covariância

Como \(\boldsymbol{\eta}\) e \(\boldsymbol{\xi}\) não são observadas, o modelo LISREL não pode ser verificado diretamente. Entretanto, assim como na análise fatorial, o modelo e suas suposições implicam uma estrutura de covariância que pode ser examinada.

Defina o vetor de dados \([\,\mathbf{Y}^{\prime},\mathbf{X}^{\prime}\,]^{\prime}\). Então,

\[ \mathbb{C} \begin{pmatrix} \begin{bmatrix} Y \\ X \end{bmatrix} \end{pmatrix} = \underset{(p+q)\times(p+q)}{\boldsymbol{\Sigma}} = \begin{bmatrix} \underset{p\times p}{\boldsymbol{\Sigma}_{11}} & \underset{p\times q}{\boldsymbol{\Sigma}_{12}} \\[6pt] \underset{q\times p}{\boldsymbol{\Sigma}_{21}} & \underset{q\times q}{\boldsymbol{\Sigma}_{22}} \end{bmatrix} = \begin{bmatrix} \mathbb{C}(\mathbf{Y}) & \mathbb{C}(\mathbf{Y},\mathbf{X})\\[4pt] \mathbb{C}(\mathbf{X},\mathbf{Y}) & \mathbb{C}(\mathbf{X}) \end{bmatrix} \tag{9-62} \]

Para simplificar a apresentação, tome \(\mathbf{B} = \mathbf{0}\). Assim,

\[ \begin{align} \mathbb{C}(\mathbf{Y}) &= \mathbb{E}(\mathbf{Y}\mathbf{Y}^{\prime})\\ &= \boldsymbol{\Lambda}_{\mathbf{y}}\, \mathbb{C}(\boldsymbol{\eta})\, \boldsymbol{\Lambda}_{\mathbf{y}}^{\prime} + \boldsymbol{\Theta}_{\boldsymbol{\varepsilon}}\\ \mathbb{C}(\mathbf{Y})&= \boldsymbol{\Lambda}_{\mathbf{y}}\, (\boldsymbol{\Gamma}\boldsymbol{\Phi}\boldsymbol{\Gamma}^{\prime} + \boldsymbol{\Psi})\, \boldsymbol{\Lambda}_{\mathbf{y}}^{\prime} + \boldsymbol{\Theta}_{\boldsymbol{\varepsilon}} \end{align} \]

\[ \begin{align} \mathbb{C}(\mathbf{X}) &= \boldsymbol{\Lambda}_{\mathbf{x}}\, \mathbb{C}(\boldsymbol{\xi})\, \boldsymbol{\Lambda}_{\mathbf{x}}^{\prime} + \boldsymbol{\Theta}_{\delta}\\ \mathbb{C}(\mathbf{X})&= \boldsymbol{\Lambda}_{\mathbf{x}}\, \boldsymbol{\Phi}\, \boldsymbol{\Lambda}_{\mathbf{x}}^{\prime} + \boldsymbol{\Theta}_{\boldsymbol{\delta}} \end{align} \]

\[ \begin{align} \mathbb{C}(\mathbf{Y},\mathbf{X}) &= \mathbb{E}(\mathbf{Y}\mathbf{X}^{\prime})\\ &= \boldsymbol{\Lambda}_{\mathbf{y}}\, \mathbb{E}\left[(\boldsymbol{\Gamma}\boldsymbol{\xi}+\boldsymbol{\zeta}+\boldsymbol{\varepsilon}) (\boldsymbol{\Lambda}_{\mathbf{x}}\boldsymbol{\xi}+\boldsymbol{\delta})^{\prime} \right]\\ \mathbb{C}(\mathbf{Y},\mathbf{X})&= \boldsymbol{\Lambda}_{\mathbf{y}}\, \boldsymbol{\Gamma}\, \boldsymbol{\Phi}\, \boldsymbol{\Lambda}_{\mathbf{x}}^{\prime}\\\\ \mathbb{C}(\mathbf{Y},\mathbf{X})&= \left[\mathbb{C}(\mathbf{X},\mathbf{Y})\right]^{\prime} \end{align} \tag{9-63} \]

Portanto:

\[ \begin{align} \mathbb{C} \begin{bmatrix} Y \\[2pt] X \end{bmatrix} &= \begin{bmatrix} \mathbb{C}(\mathbf{Y}) & \mathbb{C}(\mathbf{Y},\mathbf{X})\\[4pt] \mathbb{C}(\mathbf{X},\mathbf{Y}) & \mathbb{C}(\mathbf{X}) \end{bmatrix}\\ &= \begin{bmatrix} \boldsymbol{\Lambda}_{\mathbf{y}}\, (\boldsymbol{\Gamma}\boldsymbol{\Phi}\boldsymbol{\Gamma}^{\prime} + \boldsymbol{\Psi})\, \boldsymbol{\Lambda}_{\mathbf{y}}^{\prime} + \boldsymbol{\Theta}_{\boldsymbol{\varepsilon}} & \boldsymbol{\Lambda}_{\mathbf{y}}\, \boldsymbol{\Gamma}\, \boldsymbol{\Phi}\, \boldsymbol{\Lambda}_{\mathbf{x}}^{\prime}\\[4pt] \left(\boldsymbol{\Lambda}_{\mathbf{y}}\, \boldsymbol{\Gamma}\, \boldsymbol{\Phi}\, \boldsymbol{\Lambda}_{\mathbf{x}}^{\prime}\right)^{\prime} & \boldsymbol{\Lambda}_{\mathbf{x}}\, \boldsymbol{\Phi}\, \boldsymbol{\Lambda}_{\mathbf{x}}^{\prime} + \boldsymbol{\Theta}_{\boldsymbol{\delta}} \end{bmatrix} \end{align} \]

As covariâncias acima são funções não lineares dos parâmetros do modelo:
\(\boldsymbol{\Lambda}_{\mathbf{x}}\), \(\boldsymbol{\Lambda}_{\mathbf{y}}\), \(\boldsymbol{\Gamma}\), \(\boldsymbol{\Phi}\), \(\boldsymbol{\Psi}\), \(\boldsymbol{\Theta}_{\boldsymbol{\varepsilon}}\) e \(\boldsymbol{\Theta}_{\boldsymbol{\delta}}\).
(Recordando: supomos \(\mathbf{B} = \mathbf{0}\).)

Dadas \(n\) observações multivariadas \([\,\mathbf{y}_{j}^{\prime}, \mathbf{x}_{j}^{\prime}\,]^{\prime}\), \(j=1,\dots,n\), a matriz de covariância amostral é [veja (3-11)]

\[ \underset{(p+q)\times(p+q)}{\mathbf{S}} = \begin{bmatrix} \underset{p\times p}{\mathbf{S}_{11}} & \underset{p\times q}{\mathbf{S}_{12}}\\[6pt] \underset{q\times p}{\mathbf{S}_{21}} & \underset{q\times q}{\mathbf{S}_{22}} \end{bmatrix} \tag{9-64} \]

A matriz \(\mathbf{S}\) pode ser particionada de maneira compatível com \(\boldsymbol{\Sigma}\). As informações contidas em \(\mathbf{S}\) são usadas para estimar os parâmetros do modelo impondo

\[ \hat{\boldsymbol{\Sigma}} = \mathbf{S} \tag{9-64} \]

e resolvendo as equações resultantes.

Estimação

Infelizmente, as equações em (9-64) muitas vezes não podem ser resolvidas de forma explícita. É necessário usar um procedimento iterativo de busca que comece com estimativas iniciais dos parâmetros do modelo e produza uma matriz \(\hat{\boldsymbol{\Sigma}}\) que aproxime bem \(\mathbf{S}\). Esses procedimentos usam uma função critério que mede a discrepância entre \(\hat{\boldsymbol{\Sigma}}\) e \(\mathbf{S}\). O programa LISREL utiliza atualmente um critério de mínimos quadrados e um critério de máxima verossimilhança para estimar os parâmetros do modelo.

O próximo exemplo, com dados hipotéticos, ilustra um caso em que as estimativas dos parâmetros podem ser obtidas a partir de (9-64).

Exemplo 9.16: Estimativa para um modelo de equações estruturais (SEM) (dados artificiais)

Considere \(m = 1\), \(n = 1\), \(p = 2\), \(q = 2\) e \(\mathbf{B} = \mathbf{0}\) em (9-59) e (9-60).

A equação estrutural (regressão entre variáveis latentes) é:

\[ \eta = \gamma\cdot \xi + 1\cdot\zeta \]

As duas equações de mensuração (modelos unifatoriais) são:

\[ \begin{align} \begin{bmatrix} Y_1\\ Y_2 \end{bmatrix} &= \begin{bmatrix} 1\\ \lambda_1 \end{bmatrix}\eta + \begin{bmatrix} \varepsilon_1\\ \varepsilon_2 \end{bmatrix}1\\ \begin{bmatrix} X_1\\ X_2 \end{bmatrix} &= \begin{bmatrix} \lambda_2\\ 1 \end{bmatrix}\xi + \begin{bmatrix} \delta_1\\ \delta_2 \end{bmatrix}1 \end{align} \] Note que um \(\lambda\) de cada equação de mensuração tem valor unitário. Essa etapa de SEM é fundamental para atribuir unidade de medida à variável latente comum e desta maneira reificá-la. O nome desta etapa é identificação do SEM. Note também que todos os coeficientes de regressão das variáveis latentes específicas (resíduos) são unitários pelo mesmo motivo.

Além disso, tome \(\mathbb{V}(\xi) = \phi\) e \(\mathbb{V}(\zeta) = \psi\),

\[ \mathbb{C}(\boldsymbol{\varepsilon}) = \begin{bmatrix} \theta_1 & 0\\ 0 & \theta_2 \end{bmatrix} \qquad \mathbb{C}(\boldsymbol{\delta}) = \begin{bmatrix} \theta_3 & 0\\ 0 & \theta_4 \end{bmatrix} \]

Usando (9-63), obtemos

\[ \begin{align} \mathbb{C}(\mathbf{Y}) &= \boldsymbol{\Sigma}_{11} = \begin{bmatrix} \gamma^{2}\phi + \psi + \theta_1 & \lambda_1(\gamma^{2}\phi + \psi)\\[4pt] \lambda_1(\gamma^{2}\phi + \psi) & \lambda_1^{2}(\gamma^{2}\phi + \psi) + \theta_2 \end{bmatrix}\\ \mathbb{C}(\mathbf{Y},\mathbf{X}) &= \boldsymbol{\Sigma}_{12} = \begin{bmatrix} \lambda_2(\gamma\phi) & \gamma\phi\\[4pt] \lambda_1\lambda_2(\gamma\phi) & \lambda_1(\gamma\phi) \end{bmatrix} = \boldsymbol{\Sigma}_{21}^{\prime}\\ \mathbb{C}(\mathbf{X}) &= \boldsymbol{\Sigma}_{22} = \begin{bmatrix} \phi\lambda_2^{2} + \theta_3 & \phi\lambda_2\\[4pt] \phi\lambda_2 & \phi + \theta_4 \end{bmatrix} \end{align} \]

Os dados coletados para \(Y\) e \(X\) produzem a seguinte matriz de covariância amostral:

\[ \mathbf{s}=\begin{bmatrix} \mathbf{s}_{11} & \mathbf{s}_{12}\\ \mathbf{s}_{21} & \mathbf{s}_{22} \end{bmatrix} = \begin{bmatrix} 14.3 & -27.6 & 6.4 & 3.2\\ -27.6 & 55.4 & -12.8 & -6.4\\ 6.4 & -12.8 & 3.7 & 1.6\\ 3.2 & -6.4 & 1.6 & 1.1 \end{bmatrix} \]

Igualando \(\hat{\Sigma} = \mathbf{s}\), obtemos as equações:

  1. \((\gamma^2 \hat{\phi} + \hat{\psi}) + \hat{\theta}_1 = 14.3\)

  2. \(\lambda_1(\gamma^2 \hat{\phi} + \hat{\psi}) = -27.6\)

  3. \(\lambda_1^2(\gamma^2 \hat{\phi} + \hat{\psi}) + \hat{\theta}_2 = 55.4\)

  4. \(\lambda_2 \gamma \hat{\phi} = 6.4\)

  5. \(\gamma \hat{\phi} = 3.2\)

  6. \(\lambda_1 \lambda_2 (\gamma \hat{\phi}) = -12.8\)

  7. \(\lambda_1(\gamma \hat{\phi}) = -6.4\)

  8. \(\hat{\phi} \lambda_2^2 + \hat{\theta}_3 = 3.7\)

  9. \(\hat{\phi} \lambda_2 = 1.6\)

  10. \(\hat{\phi} + \hat{\theta}_4 = 1.1\)

Das equações (iv) e (v), \(\lambda_2 = 2.0\). Da equação (ix), \(\hat{\phi} = 0.8\). Seguindo as demais equações, obtemos:

\[ \hat{\gamma} = 4, \qquad \hat{\boldsymbol{\Lambda}}_\mathbf{y} = \begin{bmatrix} 1\\ -2 \end{bmatrix}, \qquad \hat{\boldsymbol{\Lambda}}_\mathbf{x} = \begin{bmatrix} 2\\ 1 \end{bmatrix} \]

\[ \hat{\phi} = 0.8, \qquad \hat{\psi} = 1, \qquad \hat{\boldsymbol{\Theta}}_{\boldsymbol{\varepsilon}} = \begin{bmatrix} 0.5 & 0\\ 0 & 2 \end{bmatrix}, \qquad \hat{\boldsymbol{\Theta}}_{\boldsymbol{\delta}} = \begin{bmatrix} 0.5 & 0\\ 0 & 0.3 \end{bmatrix} \]

As colunas das matrizes \(\boldsymbol{\Lambda}_\mathbf{y}\) e \(\boldsymbol{\Lambda}_\mathbf{x}\) contêm valores iguais a 1 para fixar a escala das variáveis latentes \(\eta\) e \(\xi\). Neste exemplo, as unidades de \(\eta\) foram escolhidas iguais às de \(Y_1\), e as unidades de \(\xi\) iguais às de \(X_2\).

As variáveis estruturais \(\eta\) e \(\xi\) podem representar, por exemplo, desempenho da empresa e talento gerencial, respectivamente. As medidas observáveis \(Y_1\) (lucro) e \(Y_2\) (preço da ação) são indicadores de desempenho. Indicadores do talento gerencial, como \(X_1\) (anos como CEO) e \(X_2\) (número de conselhos nos quais participa), podem ser medidos. Assim, assumindo que o desempenho da firma é causado em grande parte pelo talento gerencial, obtém-se o modelo apresentado.

## Exemplo 9.16 – solução algébrica em R

## Matriz de covariância amostral S (ordem: Y1, Y2, X1, X2)
S <- matrix(c(
  14.3, -27.6,  6.4,  3.2,
  -27.6,  55.4, -12.8, -6.4,
  6.4, -12.8,  3.7,  1.6,
  3.2, -6.4,   1.6,  1.1
), nrow = 4, byrow = TRUE)
colnames(S) <- rownames(S) <- c("Y1","Y2","X1","X2")
S
      Y1    Y2    X1   X2
Y1  14.3 -27.6   6.4  3.2
Y2 -27.6  55.4 -12.8 -6.4
X1   6.4 -12.8   3.7  1.6
X2   3.2  -6.4   1.6  1.1
## Passos algébricos exatamente como no texto

# 1) parâmetros ligados a X1, X2
lambda2_hat    <- S["Y1","X1"] / S["Y1","X2"]        # λ2 = S13 / S14
phi_hat        <- S["X1","X2"] / lambda2_hat        # φ   = S34 / λ2
gamma_phi_hat  <- S["Y1","X2"]                      # γ φ = S14
gamma_hat      <- gamma_phi_hat / phi_hat           # γ   = (γ φ)/φ
theta4_hat     <- S["X2","X2"] - phi_hat            # θ4  = Var(X2) - φ
theta3_hat     <- S["X1","X1"] - phi_hat*lambda2_hat^2  # θ3 = Var(X1) - φ λ2^2

# 2) parâmetros ligados a Y1, Y2
lambda1_hat    <- S["Y2","X2"] / gamma_phi_hat      # λ1 = S24 / (γ φ)
G2phi_hat      <- gamma_hat^2 * phi_hat             # γ^2 φ
B_hat          <- S["Y1","Y2"] / lambda1_hat        # B = γ^2 φ + ψ
psi_hat        <- B_hat - G2phi_hat                 # ψ = B - γ^2 φ
theta1_hat     <- S["Y1","Y1"] - B_hat              # θ1 = Var(Y1) - B
theta2_hat     <- S["Y2","Y2"] - lambda1_hat^2*B_hat# θ2 = Var(Y2) - λ1^2 B

## Resumos dos parâmetros
pars <- c(
  gamma  = gamma_hat,
  lambda1 = lambda1_hat,
  lambda2 = lambda2_hat,
  phi    = phi_hat,
  psi    = psi_hat,
  theta1 = theta1_hat,
  theta2 = theta2_hat,
  theta3 = theta3_hat,
  theta4 = theta4_hat
)
round(pars, 3)
  gamma lambda1 lambda2     phi     psi  theta1  theta2  theta3  theta4 
    4.0    -2.0     2.0     0.8     1.0     0.5     0.2     0.5     0.3 
## Reconstruindo Σ̂ a partir dos parâmetros para conferir

Lambda_y_hat <- matrix(c(1, lambda1_hat), ncol = 1)
Lambda_x_hat <- matrix(c(lambda2_hat, 1),  ncol = 1)
Theta_e_hat  <- diag(c(theta1_hat, theta2_hat))
Theta_d_hat  <- diag(c(theta3_hat, theta4_hat))

Sigma11_hat <- tcrossprod(Lambda_y_hat) * (gamma_hat^2*phi_hat + psi_hat) + Theta_e_hat
Sigma22_hat <- tcrossprod(Lambda_x_hat) *  phi_hat                     + Theta_d_hat
Sigma12_hat <- tcrossprod(Lambda_y_hat, Lambda_x_hat) * (gamma_hat*phi_hat)

Sigma_hat <- rbind(
  cbind(Sigma11_hat,      Sigma12_hat),
  cbind(t(Sigma12_hat),   Sigma22_hat)
)

print(round(Sigma_hat, 2))
      [,1]  [,2]  [,3] [,4]
[1,]  14.3 -27.6   6.4  3.2
[2,] -27.6  55.4 -12.8 -6.4
[3,]   6.4 -12.8   3.7  1.6
[4,]   3.2  -6.4   1.6  1.1
print(signif(Sigma_hat - S, 3))   # diferenças por arredondamento
   Y1 Y2 X1 X2
Y1  0  0  0  0
Y2  0  0  0  0
X1  0  0  0  0
X2  0  0  0  0
suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
S <- matrix(c(14.3, -27.6,  6.4,  3.2,
              -27.6, 55.4, -12.8, -6.4,
              6.4, -12.8, 3.7,  1.6,
              3.2, -6.4,  1.6,  1.1),
            nrow = 4, byrow = TRUE)
colnames(S) <- rownames(S) <- c("Y1","Y2","X1","X2")
r <- cov2cor(S)
print(signif(r,2))
      Y1    Y2    X1    X2
Y1  1.00 -0.98  0.88  0.81
Y2 -0.98  1.00 -0.89 -0.82
X1  0.88 -0.89  1.00  0.79
X2  0.81 -0.82  0.79  1.00
print(
  GGally::ggcorr(
    data       = NULL,
    name       = "",
    cor_matrix = r,
    geom       = "tile",
    min_size   = 0,
    max_size   = 10,
    nbreaks    = 6,
    digits     = 2,
    label      = TRUE,
    label_round= 2,
    label_size = 4
  )
)

## modelo LISREL simples: 1 fator endógeno (eta) e 1 exógeno (xi)
## Y1,Y2 medem eta; X1,X2 medem xi; eta ~ xi
mod_916 <- "
  eta =~ Y1 + Y2
  xi  =~ X2 + X1
  eta ~ xi
"

fit_916 <- lavaan::sem(model = mod_916,
                       std.lv = FALSE,
                       bounds = TRUE, 
                       estimator = "ML",
                       sample.cov  = S,
                       sample.nobs = 200)   
print(lavaan::summary(fit_916))
lavaan 0.6-20 ended normally after 75 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         9
  Row rank of the constraints matrix                 8

  Number of observations                           200

Model Test User Model:
                                                      
  Test statistic                                 0.000
  Degrees of freedom                                 1
  P-value (Chi-square)                           1.000

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  eta =~                                              
    Y1                1.000                           
    Y2               -2.000    0.031  -64.747    0.000
  xi =~                                               
    X2                1.000                           
    X1                2.000    0.107   18.656    0.000

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)
  eta ~                                               
    xi                4.000    0.213   18.774    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .Y1                0.497    0.100    4.975    0.000
   .Y2                0.199    0.348    0.573    0.567
   .X2                0.298    0.035    8.567    0.000
   .X1                0.497    0.087    5.690    0.000
   .eta               0.995    0.313    3.182    0.001
    xi                0.796    0.107    7.452    0.000
semPlot::semPaths(fit_916,
                  layout="spring",
                  style="lisrel",
                  what="std",
                  whatLabels="path",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="lisrel",
                  what="std",
                  whatLabels="est",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="ram",
                  what="std",
                  whatLabels="path",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="ram",
                  what="std",
                  whatLabels="est",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

\[\Diamond\] Exercício 9.17 (J&W, 5a ed.). Considere o modelo LISREL no Exemplo 9.16. Troque 1 e \(\lambda_1\) no vetor de parâmetros \(\boldsymbol{\Lambda}_\mathbf{y}\), e troque \(\lambda_2\) e 1 no vetor de parâmetros \(\boldsymbol{\Lambda}_\mathbf{x}\). Usando a matriz \(\boldsymbol{s}\) fornecida no exemplo, resolva para os parâmetros do modelo. Explique por que as escalas das variáveis estruturais \(\eta_1\) e \(\zeta\) devem ser fixadas.

Solução:

A equação estrutural é:

\[ \eta = \gamma \xi + \zeta \]

As equações de medida são:

\[ \begin{align} \begin{bmatrix} Y_1 \\ Y_2 \end{bmatrix} &= \begin{bmatrix} \lambda_1 \\ 1 \end{bmatrix} \eta + \begin{bmatrix} \varepsilon_1 \\ \varepsilon_2 \end{bmatrix}\\ \begin{bmatrix} X_1 \\ X_2 \end{bmatrix} &= \begin{bmatrix} 1 \\ \lambda_2 \end{bmatrix} \xi + \begin{bmatrix} \delta_1 \\ \delta_2 \end{bmatrix} \end{align} \]

Adicionalmente, seja:

\[ \mathbb{V}(\xi) = \phi\qquad \mathbb{V}(\zeta) = \psi \]

As covariâncias dos erros são:

\[ \mathbb{C}(\boldsymbol{\varepsilon)} = \begin{bmatrix} \theta_1 & 0 \\ 0 & \theta_2 \end{bmatrix} \qquad \mathbb{C}(\boldsymbol{\delta)} = \begin{bmatrix} \theta_3 & 0 \\ 0 & \theta_4 \end{bmatrix} \]

A matriz de covariâncias observada é:

\[ \hat{\mathbb{C}} \begin{pmatrix} \begin{bmatrix} Y \\ X \end{bmatrix} \end{pmatrix} = \mathbf{s} = \begin{bmatrix} 14.3 & -27.6 & 6.4 & 3.2 \\ -27.6 & 55.4 & -12.8 & -6.4 \\ 6.4 & -12.8 & 3.7 & 1.6 \\ 3.2 & -6.4 & 1.6 & 1.1 \end{bmatrix} \]

A partir disso, obtemos:

  1. \[ \hat{\mathbb{V}}(Y_1) = \hat{\lambda}_1^2(\hat{\gamma}^2 \hat{\phi} + \hat{\psi}) + \hat{\theta_1} = 14.3 \]

  2. \[ \hat{\mathbb{V}}(Y_2) = (\hat{\gamma}^2\hat{\phi} + \hat{\psi}) + \hat{\theta}_2 = 55.4 \]

  3. \[ \hat{\mathbb{C}}(Y_1,Y_2) = \hat{\lambda}_1(\hat{\gamma}^2 \hat{\phi} + \hat{\psi}) = -27.6 \]

  4. \[ \hat{\mathbb{C}}(Y_1,X_1) = \hat{\lambda}_1 \hat{\gamma} \hat{\phi} = 6.4 \]

  5. \[ \hat{\mathbb{C}}(Y_1,X_2) = \hat{\lambda}_1 \hat{\lambda}_2 \hat{\gamma} \hat{\phi} = 3.2 \]

  6. \[ \hat{\mathbb{C}}(Y_2,X_1) = \hat{\gamma} \hat{\phi} = -12.8 \]

  7. \[ \hat{\mathbb{C}}(Y_2,X_2) = \hat{\lambda}_2 \hat{\gamma} \hat{\phi} = -6.4 \]

  8. \[ \hat{\mathbb{V}}(X_1) = \hat{\phi} + \hat{\theta}_3 = 3.7 \]

  9. \[ \hat{\mathbb{V}}(X_2) = \hat{\lambda}_2^2 \hat{\phi} + \hat{\theta}_4 = 1.1 \]

  10. \[ \hat{\mathbb{C}}(X_1,X_2) = \hat{\lambda}_2 \hat{\phi} = 1.6 \]

Resolvendo (i)–(x):

\[ \hat{\phi} = 3.2,\qquad \hat{\gamma} = -4,\qquad \hat{\psi} = 4 \]

As cargas padronizadas estimadas:

\[ \hat{\boldsymbol{\Lambda}}_\mathbf{y} = \begin{bmatrix} -0.5 \\ 1.0 \end{bmatrix} \qquad \hat{\boldsymbol{\Lambda}}_\mathbf{x} = \begin{bmatrix} 0.5 \\ 1 \end{bmatrix} \]

Covariâncias residuais:

\[ \mathbb{C}(\boldsymbol{\varepsilon}) = \begin{bmatrix} 0.5 & 0 \\ 0 & 0.2 \end{bmatrix} \qquad \mathbb{C}(\boldsymbol{\delta}) = \begin{bmatrix} 0.5 & 0 \\ 0 & 0.3 \end{bmatrix} \]

Comparando os modelos ajustados:

Exemplo 9.16:

\[ \begin{align} \eta &= 4\xi + \zeta \\ Y_1 &= \eta + \varepsilon_1 \\ Y_2 &= -2\eta + \varepsilon_2 \\ X_1 &= 2\eta + \delta_1 \\ X_2 &= \eta + \delta_2 \end{align} \]

Exercício 9.17:

\[ \begin{align} \eta &= -4\xi + \zeta \\ Y_1 &= -0.5\eta + \varepsilon_1 \\ Y_2 &= \eta + \varepsilon_2 \\ X_1 &= \eta + \delta_1 \\ X_2 &= 0.5\eta + \delta_2 \end{align} \]

Se \(\eta\) e \(\xi\) não forem escaladas, os \(\lambda\) não podem ser determinadas unicamente sem restrições adicionais. A mudança de escala altera a interpretação dos resultados. Os dados eram artificiais, e o Exemplo 9.16 foi construído para “ajustar” o modelo.

A razão para a construção de dois casos é a indeterminação de escala das variáveis latentes no modelo LISREL. Como nem \(\xi\) nem \(\eta\) têm sua unidade de medida fixada, o sinal do parâmetro estrutural \(\gamma\) não é identificável a partir das covariâncias observadas.

Quando a escala de uma variável latente é definida por um indicador específico (e.g., \(X_2\) para \(\xi\) e \(Y_1\) para \(\eta\)), o sinal de \(\gamma\) fica determinado pela covariância entre esses indicadores. No Caso 1, \(\mathbb{C}(X_2, Y_1) = 3.2 > 0\), implicando \(\gamma > 0\).

Se a escala for definida por outro par de indicadores (e.g., \(X_1\) para \(\xi\) e \(Y_2\) para \(\eta\)), o sinal de \(\gamma\) se ajusta para satisfazer a nova associação observada. No Caso 2, \(\mathbb{C}(X_1, Y_2) = -12.8 < 0\), implicando \(\gamma < 0\).

Assim, os dois casos mostram que, sem fixação explícita de escala, o modelo admite soluções igualmente válidas com sinais opostos para \(\gamma\). A escolha da unidade de medida das latentes determina o sinal, mas não afeta as covariâncias reproduzidas pelo modelo.

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
S <- matrix(c(14.3, -27.6,  6.4,  3.2,
              -27.6, 55.4, -12.8, -6.4,
              6.4, -12.8, 3.7,  1.6,
              3.2, -6.4,  1.6,  1.1),
            nrow = 4, byrow = TRUE)
colnames(S) <- rownames(S) <- c("Y1","Y2","X1","X2")
r <- cov2cor(S)
print(signif(r,2))
      Y1    Y2    X1    X2
Y1  1.00 -0.98  0.88  0.81
Y2 -0.98  1.00 -0.89 -0.82
X1  0.88 -0.89  1.00  0.79
X2  0.81 -0.82  0.79  1.00
print(
  GGally::ggcorr(
    data       = NULL,
    name       = "",
    cor_matrix = r,
    geom       = "tile",
    min_size   = 0,
    max_size   = 10,
    nbreaks    = 6,
    digits     = 2,
    label      = TRUE,
    label_round= 2,
    label_size = 4
  )
)

## modelo LISREL simples: 1 fator endógeno (eta) e 1 exógeno (xi)
## Y1,Y2 medem eta; X1,X2 medem xi; eta ~ xi
mod_916 <- "
  eta =~ Y2 + Y1
  xi  =~ X1 + X2
  eta ~ xi
"

fit_916 <- lavaan::sem(model = mod_916,
                       std.lv = FALSE,
                       bounds = TRUE, 
                       estimator = "ML",
                       sample.cov  = S,
                       sample.nobs = 200) 
print(lavaan::summary(fit_916))
lavaan 0.6-20 ended normally after 71 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         9
  Row rank of the constraints matrix                 8

  Number of observations                           200

Model Test User Model:
                                                      
  Test statistic                                 0.000
  Degrees of freedom                                 1
  P-value (Chi-square)                           1.000

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  eta =~                                              
    Y2                1.000                           
    Y1               -0.500    0.008  -64.747    0.000
  xi =~                                               
    X1                1.000                           
    X2                0.500    0.027   18.656    0.000

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)
  eta ~                                               
    xi               -4.000    0.162  -24.710    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .Y2                0.199    0.348    0.573    0.567
   .Y1                0.497    0.100    4.975    0.000
   .X1                0.497    0.087    5.690    0.000
   .X2                0.299    0.035    8.567    0.000
   .eta               3.980    1.257    3.166    0.002
    xi                3.184    0.372    8.564    0.000
semPlot::semPaths(fit_916,
                  layout="spring",
                  style="lisrel",
                  what="std",
                  whatLabels="path",
                  rotation=1,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="lisrel",
                  what="std",
                  whatLabels="est",
                  rotation=1,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="ram",
                  what="std",
                  whatLabels="path",
                  rotation=1,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="ram",
                  what="std",
                  whatLabels="est",
                  rotation=1,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

Podemos também determinar a correlação entre as duas variáveis latentes \(\eta\) e \(\xi\).

suppressMessages(suppressWarnings(
  invisible(Sys.setlocale("LC_ALL", "pt_BR.UTF-8"))))
S <- matrix(c(14.3, -27.6,  6.4,  3.2,
              -27.6, 55.4, -12.8, -6.4,
              6.4, -12.8, 3.7,  1.6,
              3.2, -6.4,  1.6,  1.1),
            nrow = 4, byrow = TRUE)
colnames(S) <- rownames(S) <- c("Y1","Y2","X1","X2")
r <- cov2cor(S)
print(signif(r,2))
      Y1    Y2    X1    X2
Y1  1.00 -0.98  0.88  0.81
Y2 -0.98  1.00 -0.89 -0.82
X1  0.88 -0.89  1.00  0.79
X2  0.81 -0.82  0.79  1.00
print(
  GGally::ggcorr(
    data       = NULL,
    name       = "",
    cor_matrix = r,
    geom       = "tile",
    min_size   = 0,
    max_size   = 10,
    nbreaks    = 6,
    digits     = 2,
    label      = TRUE,
    label_round= 2,
    label_size = 4
  )
)

mod_916 <- "
  eta =~ Y1 + Y2
  xi  =~ X2 + X1
  eta ~~ xi
"

fit_916 <- lavaan::sem(model = mod_916,
                       std.lv = FALSE,
                       bounds = TRUE, 
                       estimator = "ML",
                       sample.cov  = S,
                       sample.nobs = 200)   
print(lavaan::summary(fit_916))
lavaan 0.6-20 ended normally after 51 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         9
  Row rank of the constraints matrix                 9

  Number of observations                           200

Model Test User Model:
                                                      
  Test statistic                                 0.000
  Degrees of freedom                                 1
  P-value (Chi-square)                           1.000

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  eta =~                                              
    Y1                1.000                           
    Y2               -2.000    0.031  -64.747    0.000
  xi =~                                               
    X2                1.000                           
    X1                2.000    0.107   18.656    0.000

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)
  eta ~~                                              
    xi                3.184    0.358    8.897    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .Y1                0.498    0.100    4.975    0.000
   .Y2                0.199    0.348    0.573    0.567
   .X2                0.298    0.035    8.567    0.000
   .X1                0.497    0.087    5.690    0.000
    eta              13.731    1.425    9.638    0.000
    xi                0.796    0.107    7.452    0.000
semPlot::semPaths(fit_916,
                  layout="spring",
                  style="lisrel",
                  what="std",
                  whatLabels="path",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="ram",
                  what="std",
                  whatLabels="path",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="ram",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

mod_916 <- "
  eta =~ Y2 + Y1
  xi  =~ X1 + X2
  eta ~~ xi
"

fit_916 <- lavaan::sem(model = mod_916,
                       std.lv = FALSE,
                       bounds = TRUE, 
                       estimator = "ML",
                       sample.cov  = S,
                       sample.nobs = 200)   
print(lavaan::summary(fit_916))
lavaan 0.6-20 ended normally after 49 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                         9
  Row rank of the constraints matrix                 9

  Number of observations                           200

Model Test User Model:
                                                      
  Test statistic                                 0.000
  Degrees of freedom                                 1
  P-value (Chi-square)                           1.000

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  eta =~                                              
    Y2                1.000                           
    Y1               -0.500    0.008  -64.747    0.000
  xi =~                                               
    X1                1.000                           
    X2                0.500    0.027   18.656    0.000

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)
  eta ~~                                              
    xi              -12.736    1.351   -9.426    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .Y2                0.199    0.348    0.573    0.567
   .Y1                0.497    0.100    4.975    0.000
   .X1                0.498    0.087    5.690    0.000
   .X2                0.299    0.035    8.567    0.000
    eta              54.924    5.523    9.944    0.000
    xi                3.184    0.372    8.564    0.000
semPlot::semPaths(fit_916,
                  layout="spring",
                  style="lisrel",
                  what="std",
                  whatLabels="path",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="lisrel",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="ram",
                  what="std",
                  whatLabels="path",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

semPlot::semPaths(fit_916,
                  layout="spring",
                  style="ram",
                  what="std",
                  whatLabels="std",
                  rotation=2,
                  residuals=TRUE,
                  edge.color="black",
                  nDigits=2,
                  edge.label.cex=1,
                  nCharNodes=8,
                  sizeLat=10,
                  sizeMan=10,
                  curvePivot=TRUE,
                  intAtSide=TRUE,
                  fade=FALSE)

Condição de identificação do modelo

De modo geral, para estimar os parâmetros de um modelo estrutural, precisamos de mais equações do que incógnitas.

Se \(t\) é o número total de parâmetros desconhecidos, então \(p\) e \(q\) devem satisfazer

\[ t \le (p+q)\,\frac{p+q+1}{2} \tag{9-65} \]

Essa condição, porém, não garante que todos os parâmetros possam ser estimados de forma única.

Avaliação do ajuste final do modelo

O ajuste final do modelo deve ser analisado com cuidado.

Pontos essenciais:

  1. Inspecionar cada parâmetro estimado, verificando se sinais e magnitudes fazem sentido substantivo.

  2. Examinar a matriz residual

\[ \mathbf{S} - \hat{\boldsymbol{\Sigma}} \]
Os resíduos devem ser pequenos e sem padrão sistemático.

  1. Verificar variâncias: procedimentos iterativos de estimação podem gerar estimativas negativas (casos de Heywood). Todas as variâncias devem ser positivas.

  2. Avaliar se a solução obtida dependeu do ponto inicial da iteração.

Em resumo: identificação não garante estimabilidade prática, e estimabilidade não garante ajuste adequado.

Questões sobre SEM em Lei & Wu (2007)

  1. Liste pelo menos duas vantagens dos modelos de equações estruturais (SEM) em relação aos modelos tradicionais de ANOVA e regressão.

  2. Em um diagrama convencional de SEM, \(Y_1 \to Y_2\) significa:

  • A. \(Y_2\) é uma variável exógena.
  • B. A variação em \(Y_2\) é afetada pela variação em \(Y_1\).
  • C. A variação em \(Y_1\) é explicada dentro do modelo.
  • D. \(Y_1\) e \(Y_2\) são correlacionadas.
  1. O que não está incluído em um modelo de caminhos (path model)?
  • A. Variável exógena
  • B. Variável endógena
  • C. Variável latente
  • D. Distúrbio (erro de equação)
  1. O que é um mediador em um modelo de caminhos?

  2. Qual das afirmações sobre modelos de caminhos não está correta?

  • A. É uma extensão das regressões múltiplas.
  • B. Pode ser usado para examinar efeitos de mediação.
  • C. Os erros de medida são bem considerados nos modelos de caminhos.
  • D. Pode ser usado para examinar hipóteses causais entre variáveis independentes e dependentes.
  1. Um pesquisador deseja estudar o efeito do nível socioeconômico (SES) sobre o comportamento dos alunos em sala de aula e gostaria de verificar se o SES afeta o comportamento diretamente ou indiretamente por meio de seu efeito direto sobre o desempenho acadêmico. Qual dos modelos a seguir é o mais apropriado para esse estudo?
  • A. Modelo de análise fatorial confirmatória
  • B. Modelo de caminhos
  • C. Modelo de crescimento
  • D. Modelo de múltiplas amostras
  1. Quais são algumas formas possíveis de considerar os erros de medida das variáveis observadas no SEM?

  2. O que significa dizer que um modelo é identificado?

  • A. O modelo é baseado em teoria.
  • B. Os índices de ajuste do modelo são todos satisfatórios.
  • C. Um programa de SEM produz com sucesso uma solução para o modelo.
  • D. Existe uma solução única para cada parâmetro livre do modelo.
  1. Para que um modelo seja identificado, devemos fixar as variâncias das variáveis latentes em 1. V/F

  2. A estatística de teste do modelo, \((N - 1)F_{min}\), tem distribuição qui-quadrado, onde (N) é o tamanho da amostra e \(F_{min}\) é o mínimo da função de ajuste. V/F

  3. Mesmo que um modelo se ajuste muito bem aos dados, ainda é muito provável obter um valor de qui-quadrado significativo. V/F

  4. Qual dos seguintes índices de ajuste do modelo é o mais sensível ao tamanho da amostra?

  • A. Qui-quadrado
  • B. RMSEA
  • C. SRMR
  • D. CFI
  1. Qual dos seguintes fatores mais provavelmente indica mau ajuste do modelo?
  • A. Valores elevados nos índices de ajuste incrementais
  • B. Valor elevado no GFI
  • C. Valor elevado no qui-quadrado do modelo
  • D. Valor elevado no RMSEA
  1. Qual dos seguintes indica uma solução imprópria do modelo?
  • A. Variância residual não significativa
  • B. Variância de distúrbio negativa
  • C. Covariância negativa
  • D. Correlação pequena
  1. Qual das seguintes afirmações sobre o índice de modificação é verdadeira?
  • A. Indica o quanto os estimadores dos parâmetros mudariam se um parâmetro fixo fosse liberado.
  • B. Decisões de modificação do modelo devem ser baseadas nos valores do índice de modificação.
  • C. Todos os parâmetros com índice de modificação maior que 3,84 devem ser liberados.
  • D. Indica o quanto o qui-quadrado mudaria se um parâmetro fixo fosse liberado.
  1. Uma das vantagens do uso de SEM é que relações causais entre variáveis podem ser estabelecidas usando dados transversais. V/F

Respostas e soluções:

  1. O SEM pode incluir tanto variáveis observadas quanto latentes, e as relações entre construtos latentes podem ser examinadas; várias variáveis dependentes podem ser estudadas em uma única análise de SEM; os resíduos das equações podem ser correlacionados no SEM.

  2. B

  3. C

  4. Um mediador é uma variável que serve tanto como uma variável de origem quanto como uma variável de resultado. Em outras palavras, ela afeta e também é afetada por algumas outras variáveis dentro do modelo.

  5. C

  6. B

  7. Existem duas maneiras possíveis: (1) incorporar coeficientes de confiabilidade, quando aplicável, fixando as variâncias de erro como os quadrados dos erros-padrão de medida; (2) incorporar modelos de medida quando múltiplos indicadores dos construtos estão disponíveis.

  8. D

  9. F (A escala de uma variável latente pode ser definida de duas maneiras: padronizando-a ou fixando a carga fatorial de um indicador em 1.)

  10. F (Ela tem distribuição qui-quadrado somente quando o modelo está corretamente especificado e as demais suposições do modelo são satisfeitas.)

  11. V (Mantendo constante a discrepância entre modelo e dados, o valor do qui-quadrado do modelo aumenta à medida que o tamanho da amostra aumenta.)

  12. A

  13. D (Tanto valores altos do qui-quadrado do modelo quanto do RMSEA indicam mau ajuste do modelo, mas o qui-quadrado também é afetado pelo tamanho da amostra, portanto a melhor opção é o RMSEA.)

  14. B

  15. D

  16. F (Existem certas condições necessárias para relações causais que provavelmente não são satisfeitas em estudos transversais.)

Atualização da literatura científica

Artigos que atualizam análise fatorial exploratória (EFA):

  • Beaujean, AA (2013) Factor analysis using R. Practical Assessment, Research & Evaluation 18(4): 1-16.

  • Achim (2017)

  • Nájera et al. (2025)

  • Rönkkö & Cho (2020)

  • Trendafilov & Unkel (2011)

  • Zygmont & Smith (2014)

Artigos que atualizam modelo de equações estruturais (SEM):

  • Lei & Wu (2007)

  • Rosseel, Y & Vidal, M (2025) A tutorial for understanding SEM using R: Where do all the numbers come from? British Journal of Mathematical and Statistical Psychology 00: 1-38. https://doi.org/10.1111/bmsp.70003

  • Epskamp, S (2015) semPlot: Unified visualizations of structural equation models. Structural Equation Modeling: A Multidisciplinary Journal 22(3): 474–83. https://doi.org/10.1080/10705511.2014.937847

  • Evermann, J (2010) Multiple-Group Analysis Using the sem Package in the R System, Structural Equation Modeling: A Multidisciplinary Journal 17(4): 677-702. DOI: 10.1080/10705511.2010.510070. https://joerg.evermann.ca/docs/sem_tutorial.zip

Referências

  • Livro-texto:
    • JOHNSON, RA & WICHERN, DW (2007) Applied multivariate statistical analysis. 6th ed. NJ: Prentice Hall.
    • JOHNSON, RA & WICHERN, DW (2007) Applied multivariate statistical analysis: Solutions Manual. 6th ed. NJ: Prentice Hall.
  • Achim, A (2017) Testing the number of required dimensions in exploratory factor analysis. The Quantitative Methods for Psychology 13(1): 32–46. https://doi.org/10.20982/tqmp.13.1.p032
  • Bollen, KA (1989) Structural equations with latent variables. NJ: Wiley.
  • Beaujean, AA (2013) Factor analysis using R. Practical Assessment, Research & Evaluation 18(4): 1-16.
  • BROWN, TA (2015) Confirmatory factor analysis for applied research. 2nd ed. NY: Guilford. http://sites.bu.edu/tabrown/cfabook/ ; http://www.amarkos.gr/cfa-lavaan/
  • Epskamp, S (2015) semPlot: Unified visualizations of structural equation models. Structural Equation Modeling: A Multidisciplinary Journal 22(3): 474–83. https://doi.org/10.1080/10705511.2014.937847
  • Evermann, J (2010) Multiple-Group Analysis Using the sem Package in the R System, Structural Equation Modeling: A Multidisciplinary Journal 17(4): 677-702. DOI: 10.1080/10705511.2010.510070. https://joerg.evermann.ca/docs/sem_tutorial.zip
  • Gerbing, DW & Hamilton, JG (1996) Viability of exploratory factor analysis as a precursor to confirmatory factor analysis. Structural Equation Modeling 3(1): 62–72.
  • Lei, P-W & Wu, Q (2007) Introduction to structural equation modeling: Issues and practical considerations. Educational Measurement: Issues and Practice 26(3): 33–43.
  • Nájera, P; Abad, FJ & Sorrel, MA (2025) Is exploratory factor analysis always to be preferred? A systematic comparison of factor analytic techniques throughout the confirmatory–exploratory continuum. Psychological Methods 30(1): 16-39. https://doi.org/10.1037/met0000623
  • Rönkkö, M & Cho, E (2020) An Updated Guideline for Assessing Discriminant Validity. Organizational Research Methods 25(1): 6-14. https://doi.org/10.1177/1094428120968614 (Original work published 2022)
  • Rosseel, Y & Vidal, M (2025) A tutorial for understanding SEM using R: Where do all the numbers come from? British Journal of Mathematical and Statistical Psychology 00: 1-38. https://doi.org/10.1111/bmsp.70003
  • Silveira PSP, Vieira JE & Siqueira JO (2024) Is the Bland-Altman plot method useful without inferences for accuracy, precision, and agreement? Rev Saude Publica 58:01. DOI 10.11606/s1518-8787.2024058005430: PDF
  • Trendafilov, NT & Unkel, S (2011) Exploratory Factor Analysis of Data Matrices With More Variables Than Observations. Journal of Computational and Graphical Statistics 20(4): 874-91, DOI: 10.1198/jcgs.2011.09211
  • Zygmont, C & Smith, MR (2014) Robust factor analysis in the presence of normality violations, missing data, and outliers: Empirical questions and possible solutions. The Quantitative Methods for Psychology 10(1): 40–55. https://doi.org/10.20982/tqmp.10.1.p040