#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)
#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
#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
#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:
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:
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.
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.
#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")