Analisis factorial

#cargando librerias
library(pacman)
p_load(dplyr,corrplot,DataExplorer,psych,gtools,mvnormtest)
datos=read.delim('Dataset.txt',header = TRUE,sep =",") 
str(datos)
'data.frame':   244 obs. of  14 variables:
 $ day        : int  1 2 3 4 5 6 7 8 9 10 ...
 $ month      : int  6 6 6 6 6 6 6 6 6 6 ...
 $ year       : int  2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
 $ Temperature: int  29 29 26 25 27 31 33 30 25 28 ...
 $ RH         : int  57 61 82 89 77 67 54 73 88 79 ...
 $ Ws         : int  18 13 22 13 16 14 13 15 13 12 ...
 $ Rain       : num  0 1.3 13.1 2.5 0 0 0 0 0.2 0 ...
 $ FFMC       : num  65.7 64.4 47.1 28.6 64.8 82.6 88.2 86.6 52.9 73.2 ...
 $ DMC        : num  3.4 4.1 2.5 1.3 3 5.8 9.9 12.1 7.9 9.5 ...
 $ DC         : chr  "7.6" "7.6" "7.1" "6.9" ...
 $ ISI        : num  1.3 1 0.3 0 1.2 3.1 6.4 5.6 0.4 1.3 ...
 $ BUI        : num  3.4 3.9 2.7 1.7 3.9 7 10.9 13.5 10.5 12.6 ...
 $ FWI        : chr  "0.5" "0.4" "0.1" "0" ...
 $ Classes    : chr  "not fire   " "not fire   " "not fire   " "not fire   " ...
#realizando la transformacion a numeric
datos$FWI=as.numeric(datos$FWI)
datos$DC=as.numeric(datos$DC)

Analisis exploratorio

#revisando nulos
plot_missing(datos)

colSums(is.na(datos))
        day       month        year Temperature          RH          Ws 
          0           0           0           0           0           0 
       Rain        FFMC         DMC          DC         ISI         BUI 
          0           0           0           1           0           0 
        FWI     Classes 
          1           0 
#Eliminado nulos
datos=na.omit(datos)
#Seleccionando sólo las variables numericas
datos_num=datos %>% select(c('Temperature':'FWI'))
#Graficos de histograma
plot_histogram(datos_num)

# 1 Supuestos

supuestos de correlacion

Analis de correlacion

#Graficos de correlacion
plot_correlation(datos_num)

#Analisis de matriz de correlacion inversa
correl=round(cor(datos_num),2)
round(solve(correl),3)
            Temperature     RH     Ws   Rain   FFMC     DMC      DC     ISI
Temperature       2.324  0.715  0.353 -0.022 -0.862  -0.542  -0.381   0.153
RH                0.715  2.769 -0.368  0.386  0.666   1.547   0.039   1.591
Ws                0.353 -0.368  1.291 -0.217  0.145   0.329  -0.503  -0.822
Rain             -0.022  0.386 -0.217  1.529  0.944   0.165   0.540   0.480
FFMC             -0.862  0.666  0.145  0.944  4.109   1.790   0.672  -3.994
DMC              -0.542  1.547  0.329  0.165  1.790  43.228  13.267  -1.540
DC               -0.381  0.039 -0.503  0.540  0.672  13.267  14.877  -1.458
ISI               0.153  1.591 -0.822  0.480 -3.994  -1.540  -1.458  23.461
BUI               0.838 -1.895  0.040 -0.554 -4.977 -54.327 -29.562  15.758
FWI              -0.436 -0.351  0.183 -0.430  4.222   0.293   4.044 -28.932
                BUI     FWI
Temperature   0.838  -0.436
RH           -1.895  -0.351
Ws            0.040   0.183
Rain         -0.554  -0.430
FFMC         -4.977   4.222
DMC         -54.327   0.293
DC          -29.562   4.044
ISI          15.758 -28.932
BUI          95.084 -24.908
FWI         -24.908  42.776

Prueba estadistica de correlacion (p-value)

  • H0: las variables no estan correlacionadas
  • H1: las variables estan correlacionadas
#corr.test(datos_num)
round(corr.test(datos_num,alpha=0.05)$p,3)#(p-value)
            Temperature RH    Ws  Rain  FFMC DMC    DC ISI BUI FWI
Temperature           0  0 0.000 0.000 0.000   0 0.000   0   0   0
RH                    0  0 0.001 0.004 0.000   0 0.003   0   0   0
Ws                    0  0 0.000 0.052 0.056   1 1.000   1   1   1
Rain                  0  0 0.007 0.000 0.000   0 0.000   0   0   0
FFMC                  0  0 0.009 0.000 0.000   0 0.000   0   0   0
DMC                   0  0 0.991 0.000 0.000   0 0.000   0   0   0
DC                    0  0 0.219 0.000 0.000   0 0.000   0   0   0
ISI                   0  0 0.895 0.000 0.000   0 0.000   0   0   0
BUI                   0  0 0.626 0.000 0.000   0 0.000   0   0   0
FWI                   0  0 0.616 0.000 0.000   0 0.000   0   0   0
#Cantidad de combinaciones realidas de pares para pruebas de hipoteris
#N <- 10  # Número de variables
#n <- 2 # grupos de 2 en 2
#combinaciones <- combinations(N,n, c(1:N))
#length(combinaciones)/n
#Cantidad de correlaciones no significativas = 5
res1=cor.mtest(datos_num,conf.level=0.05)
#res1=round(res1$p,3)
i=cor(datos_num,method="pearson")
corrplot(i, p.mat = res1$p, sig.level = 0.05)

Comentario:

  • De las 45 pruebas de correlación realizadas para las 10 variables, solo 5 de ellas resultaron no significativas. A partir de esto, podemos concluir que existe evidencia de correlación entre las variables

Prueba de Esfericidad de Bartlett para la correlacion

  • H0: |Rp|=1 (El determinate de matriz de correlaciones es: 1. La matriz de correlaciones deberia ser una mattriz identidad,)
  • H1: |Rp|<>1
options(scipen=0)
esfer=cortest.bartlett(cor(datos_num),n=dim(datos_num))
str(esfer)
List of 3
 $ chisq  : num [1:2] 3330.9 67.7
 $ p.value: num [1:2] 0 0.0159
 $ df     : num 45
esfer$p.value[1]
[1] 0

Comentario:

  • Con un valor de p-value igual a cero, se rechaza la hipótesis nula, lo que nos lleva a concluir que existe correlación entre las variables del estudio

supuesto de normalidad

Supuesto de normalidad multivariada: Prueba de Shapiro Wilk

  • H0: La variable aleatoria multivariada proviene de una población que sigue una distribución normal.
  • H1: La variable aleatoria multivariada No proviene de una población que sigue una distribución normal.
mshapiro.test(t(datos_num))

    Shapiro-Wilk normality test

data:  Z
W = 0.35216, p-value < 2.2e-16

Comentario:

  • Con un valor de p-value menor que 2.2e-16, se rechaza la hipótesis nula, lo que lleva a la conclusión de que no se cumple la normalidad multivariada

  • Dado que no vamos a llevar a cabo un proceso de inferencia estadística, podemos continuar con el análisis factorial, incluso si no se cumple la suposición de normalidad multivariada.

Indicador Kaiser-Meyer-Olkin KMO y MSA

kmo = psych::KMO(datos_num)
kmo$MSA #KMO general
[1] 0.7699412
kmo$MSAi #KMO por cada variable
Temperature          RH          Ws        Rain        FFMC         DMC 
  0.9235440   0.8926449   0.5950542   0.7984362   0.8436735   0.7273515 
         DC         ISI         BUI         FWI 
  0.6909547   0.7637957   0.6782652   0.8036776 

Comentario:

  • Dado que el índice KMO general (0.7699412) y los valores individuales para cada variable son todos mayores que 0.5, podemos concluir que los datos son adecuados para realizar un análisis factorial

  • Si encontramos variables con un índice KMO por debajo de 0.5, se recomienda considerar la eliminación de dichas variables, comenzando por la variable que tenga el índice más bajo.

Analisis factorial sin rotación (mediante componentes principales)

#Utilizando la funcion: principal
# nfactors= 3 debido a que se pueden ver 3 grupos en la correlacion
datos_num_sr <- principal(r=datos_num,nfactors=3,rotate="none") #internamente hace el proceso de tipificacion
datos_num_sr$values
 [1] 5.726855877 1.583287174 0.917148658 0.796524081 0.391380735 0.250211226
 [7] 0.222264816 0.092326109 0.016155238 0.003846086
#Metodo grafico
plot(datos_num_sr$values,type="b",pch=20,col="steelblue",lwd=2)
abline(h=1,lty=3,col="tomato",lwd=2)

Comentario - Se retendrán los dos primeros factores o componentes ya que dos de los tres primeros autovalores (5.726855877 1.583287174 0.917148658) son mayores que 1. - La suma de todos los autovalores es igual al número de variables

datos_num_sr <- principal(r=datos_num,nfactors=2,rotate="none") #internamente hace el proceso de tipificacion
datos_num_sr
Principal Components Analysis
Call: principal(r = datos_num, nfactors = 2, rotate = "none")
Standardized loadings (pattern matrix) based upon correlation matrix
              PC1   PC2   h2    u2 com
Temperature  0.71 -0.44 0.70 0.298 1.7
RH          -0.66  0.50 0.69 0.309 1.9
Ws          -0.10  0.68 0.47 0.530 1.0
Rain        -0.47  0.27 0.29 0.706 1.6
FFMC         0.83 -0.29 0.78 0.219 1.2
DMC          0.90  0.34 0.91 0.085 1.3
DC           0.79  0.47 0.85 0.155 1.6
ISI          0.87 -0.09 0.77 0.233 1.0
BUI          0.89  0.39 0.94 0.060 1.4
FWI          0.94  0.15 0.91 0.093 1.1

                       PC1  PC2
SS loadings           5.73 1.58
Proportion Var        0.57 0.16
Cumulative Var        0.57 0.73
Proportion Explained  0.78 0.22
Cumulative Proportion 0.78 1.00

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

The root mean square of the residuals (RMSR) is  0.08 
 with the empirical chi square  155.21  with prob <  2.3e-20 

Fit based upon off diagonal values = 0.98
#Ordenando comunalidades
comunalidad = data.frame(comunalidad = datos_num_sr$communality)
comunalidad$variables = rownames(comunalidad)
comunalidad = dplyr::arrange(comunalidad, desc(comunalidad))
print(comunalidad)
            comunalidad   variables
BUI           0.9396114         BUI
DMC           0.9146807         DMC
FWI           0.9074275         FWI
DC            0.8451325          DC
FFMC          0.7807645        FFMC
ISI           0.7665061         ISI
Temperature   0.7016996 Temperature
RH            0.6912324          RH
Ws            0.4695760          Ws
Rain          0.2935123        Rain

Comentario

#Las cargas o las correlaciones y los autovectores
datos_num_sr$loadings# Se omiten los valores menores de 0.10

Loadings:
            PC1    PC2   
Temperature  0.714 -0.438
RH          -0.663  0.502
Ws                  0.678
Rain        -0.469  0.271
FFMC         0.834 -0.292
DMC          0.896  0.335
DC           0.789  0.471
ISI          0.871       
BUI          0.885  0.394
FWI          0.941  0.150

                 PC1   PC2
SS loadings    5.727 1.583
Proportion Var 0.573 0.158
Cumulative Var 0.573 0.731
#La correlacion entre los factores (scores)
plot_correlation(datos_num_sr$scores)

Comentario

#Rotacion de los factores
datos_num_cr <- principal(r=datos_num,nfactors=2,rotate="varimax")
datos_num_cr
Principal Components Analysis
Call: principal(r = datos_num, nfactors = 2, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix
              RC1   RC2   h2    u2 com
Temperature  0.33  0.77 0.70 0.298 1.4
RH          -0.25 -0.79 0.69 0.309 1.2
Ws           0.31 -0.61 0.47 0.530 1.5
Rain        -0.23 -0.49 0.29 0.706 1.4
FFMC         0.51  0.72 0.78 0.219 1.8
DMC          0.93  0.24 0.91 0.085 1.1
DC           0.92  0.07 0.85 0.155 1.0
ISI          0.66  0.58 0.77 0.233 2.0
BUI          0.95  0.19 0.94 0.060 1.1
FWI          0.86  0.42 0.91 0.093 1.5

                       RC1  RC2
SS loadings           4.36 2.95
Proportion Var        0.44 0.29
Cumulative Var        0.44 0.73
Proportion Explained  0.60 0.40
Cumulative Proportion 0.60 1.00

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

The root mean square of the residuals (RMSR) is  0.08 
 with the empirical chi square  155.21  with prob <  2.3e-20 

Fit based upon off diagonal values = 0.98
#comunalidad sin rotar
datos_num_sr$communality
Temperature          RH          Ws        Rain        FFMC         DMC 
  0.7016996   0.6912324   0.4695760   0.2935123   0.7807645   0.9146807 
         DC         ISI         BUI         FWI 
  0.8451325   0.7665061   0.9396114   0.9074275 
#comunalidad con rotacion
datos_num_cr$communality
Temperature          RH          Ws        Rain        FFMC         DMC 
  0.7016996   0.6912324   0.4695760   0.2935123   0.7807645   0.9146807 
         DC         ISI         BUI         FWI 
  0.8451325   0.7665061   0.9396114   0.9074275 
#Cargas no rotadas
datos_num_sr$loadings

Loadings:
            PC1    PC2   
Temperature  0.714 -0.438
RH          -0.663  0.502
Ws                  0.678
Rain        -0.469  0.271
FFMC         0.834 -0.292
DMC          0.896  0.335
DC           0.789  0.471
ISI          0.871       
BUI          0.885  0.394
FWI          0.941  0.150

                 PC1   PC2
SS loadings    5.727 1.583
Proportion Var 0.573 0.158
Cumulative Var 0.573 0.731
#Cargas rotadas
datos_num_cr$loadings

Loadings:
            RC1    RC2   
Temperature  0.333  0.769
RH          -0.255 -0.791
Ws           0.311 -0.611
Rain        -0.229 -0.491
FFMC         0.515  0.718
DMC          0.926  0.240
DC           0.917       
ISI          0.660  0.576
BUI          0.951  0.186
FWI          0.856  0.418

                 RC1   RC2
SS loadings    4.360 2.950
Proportion Var 0.436 0.295
Cumulative Var 0.436 0.731
#Grafica de compracion de factores sin rotacion y con rotacion
loadings=datos_num_sr$loadings
par(mfcol=c(1,2))
plot(loadings,xlim=c(-1,1),ylim=c(-1,1),xlab='Factor1',ylab='Factor2')
text(loadings,row.names(loadings),pos=c(1,2,2,2,1))
abline(v=0,h=0,lty=2)
#Con rotacion
rot.loadings=datos_num_cr$loadings
plot(rot.loadings,xlim=c(-1,1),ylim=c(-1,1),xlab='Factor1 Rot',ylab='Factor2 Rot')
text(rot.loadings,row.names(loadings),pos=c(1,2,2,2,1))
abline(v=0,h=0,lty=2)

par(mfcol=c(1,1))
#scores sin rotar
head(datos_num_sr$scores,5)
         PC1        PC2
1 -0.8540619 -0.1154899
2 -0.9205603 -0.6406662
3 -1.9666849  2.5933900
4 -1.7956553  0.7439474
5 -1.0602354  0.2157741
#scores con rotacion
head(datos_num_cr$scores,5)
         RC1          RC2
1 -0.7654968 -0.395947406
2 -1.1215466 -0.004206764
3 -0.1206121 -3.252533525
4 -1.0427447 -1.640280206
5 -0.7440323 -0.785540334
#La correlacion entre los factores (scores)
plot_correlation(datos_num_cr$scores)

Comentario - La rotacion de factores no cambia la comunalidad - La rotacion de factores cambia los scores - La rotacion de factores cambia el valor de los autovalores - No se recomienda realizar la rotación de factores, ya que desde el principio existe una clara correlación entre las variables y los factores (cargas bien diferenciadas) - La rotación genera un inconveniente, ya que la variable “ISI” no está claramente definida en cuanto a cuál factor debe estar relacionada - La rotación de factores mantiene en cero la correlación entre los factores

# Dividiendo la ventana de graficos
#x <- c(1, 2, 3, 4) # cuatro gráficos diferentes
x=c(1,2,3,3)
m <- matrix(x, ncol = 2)
#m
layout(m)
nf <- layout(m)
#layout.show(nf)

load <- datos_num_sr$loadings[,1:2]
plot(load, pch=16, xlim=c(-1,1), ylim=c(-1,1),col="chartreuse3",
     xlab="Factor 1",ylab="Factor 2") 
abline(h=0,lty=3,col="brown1",lwd=2)
abline(v=0,lty=3,col="burlywood1",lwd=2)
text(load,pos=1,labels=names(datos),cex=1.1)#agrega los nombres a las variables


# Grafica de circulo de correlaciones
library(ade4)
s.corcircle(load,grid=FALSE)
fa.diagram(datos_num_sr)

#Guardando resultados
salida.facto <- cbind(datos,datos_num_sr$scores)
head(salida.facto)
  day month year Temperature RH Ws Rain FFMC DMC   DC ISI BUI FWI     Classes
1   1     6 2012          29 57 18  0.0 65.7 3.4  7.6 1.3 3.4 0.5 not fire   
2   2     6 2012          29 61 13  1.3 64.4 4.1  7.6 1.0 3.9 0.4 not fire   
3   3     6 2012          26 82 22 13.1 47.1 2.5  7.1 0.3 2.7 0.1 not fire   
4   4     6 2012          25 89 13  2.5 28.6 1.3  6.9 0.0 1.7 0.0 not fire   
5   5     6 2012          27 77 16  0.0 64.8 3.0 14.2 1.2 3.9 0.5 not fire   
6   6     6 2012          31 67 14  0.0 82.6 5.8 22.2 3.1 7.0 2.5     fire   
         PC1        PC2
1 -0.8540619 -0.1154899
2 -0.9205603 -0.6406662
3 -1.9666849  2.5933900
4 -1.7956553  0.7439474
5 -1.0602354  0.2157741
6 -0.4462392 -0.6859873
write.csv(salida.facto,"Alpacas-factorial-con-acp.csv")