Skip to Content

Como desenvolver uma análise fatorial com variáveis ordinais (ou ordinais e contínuas)?

Análise fatorial
Variáveis ordinais
Variáveis binárias
Correlação policórica

Introdução

Você não precisa usar o R… pode usar o Python também.


O manifesto sobre dados de Likert/Ordinal/Dados Não-normais

As escalas de likert são populares na pesquisa acadêmica. Dentre as opções de respostas dessa escala (de 5 pontos), teríamos: 1) discordo totalmente, 2) discordo, 3) indiferente (ou neutro), 4) concordo e 5) concordo totalmente.

Muitas vezes a análise fatorial é utilizada para escalas de likert. Implícito neste tipo de estudo é uma suposição de que essas escalas de likert têm uma distribuição normal multivariada.

Todavia, Kero (et. al., 2016) afirmam que essa é uma suposição incorreta, pois os dados do tipo Likert são realmente escalas ordinais. As respostas do tipo Likert são qualitativas, com significado limitado especificamente às opções disponíveis para o respondente; nem mais nem menos.

Considerando a escala de likert como variável ordinal com cinco categorias (há uma grande discussão sobre isso), temos um problema para o uso de análise fatorial. Não podemos utilizar a correlação de Pearson como medida de associação. Essa correlação é especifica para variáveis contínuas. Em outras palavras, na Análise fatorial, uma medida de correlação é necessária para extrair os fatores latentes não correlacionados e não podemos usar a correlação de pearson.

Cumpre registrar que uma análise de dados mal desenvolvida leva a uma ciência ruim. Softwares de estatística que facilitam qualquer análise de dados permitem muitas análises irresponsáveis. Muitas vezes, essas análise levam a conclusões igualmente enganosas. Lamentavelmente, as escalas Likert simplesmente são utilizadas de forma equivocada.

Matriz de Correlação Policórica

Os métodos tradicionais para realização da análise fatorial (ou seja, aqueles baseados em uma matriz das correlações de Pearson) assumem que as variáveis são contínuas e seguem uma distribuição normal multivariada. Se o modelo incluir variáveis binárias/dicotômicas ou ordinais, uma análise fatorial pode ser realizada usando uma matriz de correlação policórica.

Observe que as variáveis usadas com policóricas podem ser binárias (0/1), ordinais ou contínuas, mas não podem ser nominais (categorias não ordenadas). Observe também que as correlações na matriz produzidas pelo código policórico não são todas correlações policóricas. Quando duas variáveis têm 10 ou menos valores observados diferentes, é calculada uma correlação policórica, quando apenas uma das variáveis assume 10 ou menos valores (ou seja, uma variável é contínua e a outra categórica), uma correlação polisserial é calculada e se ambas as variáveis assumir mais de 10 valores diferentes é calculada a correlação de Pearson.

Depois de termos uma matriz de correlação policórica, podemos realizar uma análise fatorial exploratória usando a matriz como entrada, em vez de variáveis brutas. Vamos realizar essas duas etapas a seguir.

Vantagem dessa metodologia

Também é notável que a metodologia da variável ordinal sempre possa ser generalizada para lidar com outras variáveis binárias porque elas podem ser consideradas como um caso específico da variável ordinal. Além disso, a variável categórica pode ser transformada em variáveis binárias (uma possível alternativa à análise de correspondência).

O banco de dados

O banco de dados para este exemplo inclui dados de 1.428 estudantes universitários e seus instrutores. A análise de exemplo inclui variáveis dicotômicas, incluindo sexo na faculdade (facsex) e nacionalidade da faculdade (cidadão dos EUA ou cidadão estrangeiro (facnat); variáveis categóricas ordinais, incluindo classificação na faculdade (facrank), classificação do aluno (studrank) e nota (A, B, C, etc., nota); variáveis contínuas salário do corpo docente (salário), anos de ensino na Universidade (yrsut); e variáveis discretas número de alunos da turma (nstud) nessa análise. Essas variáveis foram selecionadas para representar uma variedade de tipos de variáveis (ou seja, dicotômicas, ordenadas categóricas, discretas e contínuas) e não formam necessariamente fatores substantivamente significativos. Essa base de dados é do stats.idre.ucla.edu e está disponível no repositório de bancos de dados.

Abaixo, abrimos o conjunto de dados e geramos a matriz de correlação policórica para as variáveis em nossa análise.

library(readr)
banco <- read_delim("C:/Users/Hp/Documents/GitHub/blog/AF_variaveis_ordinais/m255.csv", 
    ";", escape_double = FALSE, trim_ws = TRUE)
## Warning: Missing column names filled in: 'X1' [1]
## Parsed with column specification:
## cols(
##   .default = col_double(),
##   sexism = col_number(),
##   racism = col_number(),
##   rpolicy = col_number(),
##   casteman = col_number(),
##   competen = col_number(),
##   sensitiv = col_number(),
##   cstatus = col_number()
## )
## See spec(...) for full column specifications.

selecao<-c("facnat", "facrank", "studrank", "grade", "salary", "yrsut", "nstud")
banco<-banco[,selecao]
banco<-na.omit(banco)

Análise fatorial para dados categóricos ordenados

# polychoric correlation between two ordinal variables
# polyserial correlation between a quantitative variable andan ordinal variables,

# hetcor = heterogenous correlation matrix, consisting of Pearson product-moment correlations between numeric variables, polyserial correlations between numeric and ordinal variables, and polychoric correlations between ordinal variables.

# Etapa 1 - Use a matriz de correlação policórica para fazer uma Análise fatorial.
library(polycor)               # for hetcor()
pc <- hetcor(banco, ML=TRUE)   # polychoric corr matrix

# Etapa 2 - Fazer a Análise fatorial  usando a uma matriz de correlação policórica como entrada.
library(psych)
faPC <- fa(r=pc$correlations, nfactors=2, rotate="varimax")
faPC$loadings

Loadings:
         MR1    MR2   
facnat   -0.356  0.162
facrank   0.937       
studrank        -0.417
grade           -0.205
salary    0.731       
yrsut     0.703 -0.154
nstud    -0.210  0.814

                 MR1   MR2
SS loadings    2.077 0.932
Proportion Var 0.297 0.133
Cumulative Var 0.297 0.430

A saída da análise fatorial acima pode ser interpretada de maneira semelhante a um modelo de análise fatorial padrão.

É possível pular a etapa de cálculo da matriz de correlação policórica e usar diretamente fa.poly() do pacote psych, que no final faz procedimento semelhante. Esta função aceita os dados dicotômicos brutos como uma matriz numérica.

# polychoric FA
faPCdirect <- fa.poly(banco, nfactors=2, rotate="varimax")

mixed.cor is deprecated, please use mixedCor.

faPCdirect$fa$loadings         # loadings are the same as above ...

Loadings:
         MR1    MR2   
facnat   -0.513  0.245
facrank   0.997       
studrank        -0.390
grade           -0.220
salary    0.736       
yrsut     0.698 -0.153
nstud    -0.191  0.881

                 MR1   MR2
SS loadings    2.323 1.064
Proportion Var 0.332 0.152
Cumulative Var 0.332 0.484
# polychoric FA
faPCdirect <- fa.poly(banco, nfactors=2, rotate="varimax")
## 
## mixed.cor is deprecated, please use mixedCor.
## Warning in matpLower(x, nvar, gminx, gmaxx, gminy, gmaxy): 3 cells were adjusted
## for 0 values using the correction for continuity. Examine your data carefully.
## Warning in polydi(data[, p, drop = FALSE], data[, d, drop = FALSE], global =
## global, : The items do not have an equal number of response alternatives, I am
## setting global to FALSE
## Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
## The estimated weights for the factor scores are probably incorrect. Try a
## different factor score estimation method.
#faPCdirect <- fa(ordNum, nfactor=2, cor="poly", fm="mle", rotate = "none")

## ------------------------------------------------------------------------
faPCdirect$fa$loadings         # loadings are the same as above ...
## 
## Loadings:
##          MR1    MR2   
## facnat   -0.513  0.245
## facrank   0.997       
## studrank        -0.390
## grade           -0.220
## salary    0.736       
## yrsut     0.698 -0.153
## nstud    -0.191  0.881
## 
##                  MR1   MR2
## SS loadings    2.323 1.064
## Proportion Var 0.332 0.152
## Cumulative Var 0.332 0.484

## ----rerMultFApoly01-----------------------------------------------------
factor.plot(faPCdirect$fa, cut=0.5)

fa.diagram(faPCdirect)


# Scree plots 
#fap <- fa.parallel.poly(banco)   # parallel analysis for dichotomous data
fap <- fa.parallel(banco)   

## Parallel analysis suggests that the number of factors =  4  and the number of components =  2
vss(pc$correlations, rotate="varimax")  # very simple structure
## n.obs was not specified and was arbitrarily set to 1000.  This only affects the chi square values.

## 
## Very Simple Structure
## Call: vss(x = pc$correlations, rotate = "varimax")
## VSS complexity 1 achieves a maximimum of 0.73  with  3  factors
## VSS complexity 2 achieves a maximimum of 0.79  with  3  factors
## 
## The Velicer MAP achieves a minimum of NA  with  1  factors 
## BIC achieves a minimum of  NA  with  3  factors
## Sample Size adjusted BIC achieves a minimum of  NA  with  3  factors
## 
## Statistics by number of factors 
##   vss1 vss2   map dof   chisq    prob sqresid  fit RMSEA   BIC SABIC complex
## 1 0.57 0.00 0.055  14 3.1e+02 1.2e-58     4.5 0.57 0.146 217.6   262     1.0
## 2 0.68 0.72 0.079   8 7.5e+01 4.1e-13     2.9 0.72 0.092  20.1    46     1.1
## 3 0.73 0.79 0.179   3 2.6e+01 9.5e-06     2.1 0.80 0.088   5.3    15     1.2
## 4 0.67 0.78 0.332  -1 2.7e-06      NA     2.0 0.81    NA    NA    NA     1.5
## 5 0.64 0.76 0.423  -4 1.9e-08      NA     1.9 0.82    NA    NA    NA     1.6
## 6 0.64 0.76 1.000  -6 0.0e+00      NA     1.9 0.82    NA    NA    NA     1.6
## 7 0.64 0.76    NA  -7 0.0e+00      NA     1.9 0.82    NA    NA    NA     1.6
##    eChisq    SRMR eCRMS  eBIC
## 1 4.1e+02 9.9e-02 0.121 314.6
## 2 5.3e+01 3.5e-02 0.058  -2.3
## 3 1.3e+01 1.7e-02 0.046  -8.1
## 4 1.4e-06 5.9e-06    NA    NA
## 5 6.2e-09 3.8e-07    NA    NA
## 6 5.5e-19 3.6e-12    NA    NA
## 7 5.5e-19 3.6e-12    NA    NA
# outra forma
library(nFactors)
## Warning: package 'nFactors' was built under R version 4.0.2
## Carregando pacotes exigidos: lattice
## 
## Attaching package: 'nFactors'
## The following object is masked from 'package:lattice':
## 
##     parallel
rMatrix<-pc$correlations
parallelAnalysis<-nScree(rMatrix)
parallelAnalysis
##   noc naf nparallel nkaiser
## 1   2   1         2       2
plotnScree(parallelAnalysis)

O pacote FactoMineR oferece um grande número de funções adicionais para a análise fatorial para dados continuos e categoricos. Isso inclui o uso de variáveis quantitativas e qualitativas, bem como a inclusão de variáveis suplementares e observações. Aqui está um exemplo dos tipos de gráficos que você pode criar com este pacote.

# Factor Analysis for Mixed Data - FAMD
res <- FAMD(geomorphology)
summary(res)

Se você usar o código ou as informações deste guia em um trabalho publicado, solicito que cite-o como uma fonte nas referências bibliográficas.

DUTT-ROSS,Steven Como desenvolver uma análise fatorial com variáveis ordinais (ou ordinais e contínuas). Rio de Janeiro. 2020. mimeo. Disponível em: https://blog.metodosquantitativos.com/AF_variaveis_ordinais/


Outras referências desse texto.
1. Paul Velleman and Leland Wilkinson 1993 Nominal, Ordinal, Interval, and Ratio Typologies are Misleading 2. Kero P, Lee D. Likert is Pronounced “LICK-urt” not “LIE-kurt” and the Data are Ordinal not Interval. J Appl Meas. 2016;17(4):502-509. 3. https://stats.idre.ucla.edu/stata/faq/how-can-i-perform-a-factor-analysis-with-categorical-or-categorical-and-continuous-variables/.

Para saber sobre outras funções no R e no Python, você pode acessar o meu blog https://blog.metodosquantitativos.com/ ou o meu site pessoal https://steven.metodosquantitativos.com/