R e Análise Fatorial

O R é uma ferramenta extremamente potente para fazer cálculos estatísticos. Para além das estatísticas de base, é possível adicionar outras estatísticas disponíveis em pacotes opcionais. Para a análise fatorial, por exemplo, é necessário instalar um pacote extra. Eu estou a usar o psych e instalei-o assim, dentro do ambiente do R:

install.packages("psych")

Para efetuar uma análise fatorial de componentes principais, estou a utilizar a função principal que tem os seguintes parâmetros:

principal(r, nfactors = 1, residuals = FALSE,rotate="varimax",n.obs=NA, covar=FALSE, scores=TRUE,missing=FALSE,impute="median",oblique.scores=TRUE,method="regression",...)

O primeiro parâmetro é o único obrigatório e pode ser uma matriz de dados com as variáveis a analisar, ou então a matriz de correlações das variáveis. No caso de ser a matriz de dados, a função calcula a matriz de correlações removendo os valores em falta (missing values) aos pares (pairwise), ou seja, para cada correlação entre duas variáveis, são removidos apenas os casos que contenham valores em falta nessas variáveis.

Ora, se formos efetuar o mesmo cálculo no SPSS, por omissão é utilizada a remoção listwise dos casos, ou seja, todos os casos que contenham valores em falta, em qualquer das variáveis usadas, são removidos previamente ao cálculo.

Portanto, havendo valores em falta nas variáveis, por omissão, o R e o SPSS produzem resultados diferentes para a mesma análise fatorial.

Para se obterem resultados iguais nos dois programas, é necessário que a técnica de remoção dos valores em falta seja a mesma. No caso do R, posso calcular a matriz de correlações previamente, usando a remoção listwise para os valores em falta, e depois forneço essa matriz à função principal.

Fica aqui a sequência de instruções desde o carregamento dos dados até à obtenção da análise fatorial.

1) Abrir o ficheiro de dados e criar a matriz (data.frame) com as variáveis a processar

X<-read.table('/tmp/FACT.txt',header=T)
attach(X)
dados<-data.frame(M1=M1, M2=M2, M3=M3, M4=M4, M5=M5, M6=M6, M7=M7, M8=M8, M9=M9, M10=M10, M11=M11, M12=M12, M13=M13, M14=M14, M15=M15, M16=M16, M17=M17, M18=M18, M19=M19, M20=M20, M21=M21, M22=M22)
library(psych)

O ficheiro de dados tem 22 variáveis com os nomes indicados acima, e com um aspeto semelhante ao seguinte:

M1      M2      M3      M4      M5     ...     M21     M22
4       5       5       4       4      ...     4       2
4       5       5       2       4      ...     5       3
5       5       4       5       4      ...     4       1
4       5       4       2       5      ...     4       4
4       5       4       4       5      ...     5       5
3       5       4       4       5      ...     4       4
5       5       4       3       4      ...     4       4
4       4       5       5       4      ...     4       3
4       2       4       3       5      ...     5       2
..     ...     ...     ...     ...     ...    ...     ...
4       4       2       4       4      ...     4       4

2) Todas as variáveis têm o 9 para representar o valor em falta. Por isso, criei uma função para substituir o 9 pelo NA (valor em falta no R) para todas as variáveis do data.frame.

poeNA <- function(v) {
	is.na(v) = v==9
	return(v)
}
dados<-apply(dados, 2, poeNA)

3) Calcular a matriz de correlação, removendo os valores em falta em listwise, e efetuar a análise fatorial, com extração de 5 fatores e rotação varimax.

cdados<-cor(dados, use="complete.obs")
temp.fit<-principal(cdados, nfactors=5, rotate="varimax")
print(temp.fit, digits=3, cutoff=.3)

Entretanto, tentei fazer outras rotações para além da Varimax e deparei com um problema: os resultados do R não coincidem com os do SPSS.

A rotação varimax está no pacote base e faz a normalização de Kaiser por omissão. As outras rotações estão noutros pacotes e tem que se pedir explicitamente para fazer a normalização de Kaiser. Para isso deve passar-se o parâmetro normalize=TRUE, quando se chama a função “principal”. Mas ainda assim só consegui acertar a rotação oblimin. A promax e a quartimax não coincidem com o SPSS. [1] [2]

Pesquisei mais e descobri que há uma função kaiser que pode ser invocada com dois parâmetros: a solução não rodada, e o tipo de rotação a fazer. Produz uma solução rodada com a normalização de Kaiser.
Consegui resolver todas as rotações exceto a promax, que vem no pacote psych e funciona de forma diferente.

temp.fit<-principal(cdados, nfactors=5, rotate="none")
temp.fit<-kaiser(temp.fit, rotate="quartimax")
print(temp.fit, digits=3, cutoff=.3)
temp.fit$loadings

temp.fit<-principal(cdados, nfactors=5, rotate="none")
temp.fit<-kaiser(temp.fit, rotate="oblimin")
print(temp.fit, digits=3, cutoff=.3)
temp.fit$loadings

Aplicações de R, com interpretação dos resultados em STAT.COOL


Publicado

em

por

Etiquetas:

Comentários

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *