Documentos de Académico
Documentos de Profesional
Documentos de Cultura
# Instalamos librerías
install.packages("readxl")
install.packages("psych")
install.packages("corrplot")
install.packages("corrr")
library(readxl)
library(psych)
library(corrplot)
library(corrr)
datosEV = read_excel("C:\\ejemplos\\EncuestaSVJ.xlsx",sheet="EV")
datosEV
View(datosEV)
SALIDA:
# Estudio de condiciones previas
matriz_correlacion = cor(datosEV)
# Vemos y analizamos la matriz de correlación para ver si hay interrelación entre nuestras
variables
View(matriz_correlacion)
SALIDA:
cov(datosEV)
> cov(datosEV)
E1 E2 E3 E4 E5 E6 E7 E8
>
SALIDA:
# La mayoría de las correlaciones entre las variables se encuentran sobre el valor de 0.4, lo cual
es un buen indicador
bartlett.test(datosEV)
SALIDA:
> bartlett.test(datosEV)
data: datosEV
Bartlett's K-squared = 40.508, df = 15, p-value =
0.0003799
Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
2: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
3: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
4: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
5: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
6: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
7: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
8: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
9: In doTryCatch(return(expr), name, parentenv, handler) :
"tel.cex" is not a graphical parameter
>
# Vemos que el valor de ρ es menor que el valor de significancia de 0.05, por lo que
rechazamos la hipótesis nula y podemos decir que nuestras variables si están correlacionadas
det(matriz_correlacion)
SALIDA:
> det(matriz_correlacion)
[1] 6.023443e-05
>
# Las variables están correlacionadas, tiene sentido hacer el Análisis Factorial Exploratorio
# Usamos el indicador KMO, el cual nos dice como una variable puede ser explicada a través de
las demás
KMO(datosEV)
SALIDA:
> KMO(datosEV)
Kaiser-Meyer-Olkin factor adequacy
0.96 0.93 0.95 0.94 0.91 0.96 0.93 0.96 0.92 0.95 0.94 0.94 0.93
>
# Los valores están por encima de 0.5, pero es mejor si son mayores a 0.7, con lo que estamos
listos para realizar el Análisis Factorial Exploratorio
analFact
SALIDA:
> analFact
Call:
Uniquenesses:
E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11
0.484 0.521 0.526 0.593 0.165 0.353 0.363 0.466 0.492 0.482 0.322
Loadings:
E1 0.681 0.210
E2 0.583 0.127 0.350
E3 0.651 0.208
E5 0.804 -0.433
E8 0.729
E9 0.632 0.317
E10 0.716
E16 0.588
>
analFactRot
SALIDA:
Call:
Uniquenesses:
E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11
0.484 0.521 0.526 0.593 0.165 0.353 0.363 0.466 0.492 0.482 0.322
Loadings:
>
# Valores propios
ev
SALIDA:
> ev
eigen() decomposition
$values
$vectors
>
# Observamos que tres variables tienen valores sobre el valor de 1 o muy cercano, con lo que
comprobamos que tres es el número adecuado de factores que debemos utilizar
# Gráfico de sedimentación
install.packages("nFactors")
ns = nScree(x=ev$values, aparallel=ap$eigen$qevpea)
SALIDA:
>
eigen(matriz_correlacion)
SALIDA:
> eigen(matriz_correlacion)
eigen() decomposition
$values
[1] 8.3518500 1.0538790 0.9581659 0.7459430 0.6937302 0.5753718
[7] 0.5526124 0.5039080 0.4358902 0.4300266 0.3711596
0.3265545
[13] 0.2953303 0.2540524 0.2465903 0.2049358
$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] -0.2476281 -0.26593987 0.212115955 -0.05786524 -0.293421417
[2,] -0.2176679 -0.46586457 0.236678094 -0.23271912 0.097184620
[3,] -0.2336865 -0.06779315 0.439916227 -0.19451968 -0.008706711
[4,] -0.2142866 -0.40556673 -0.027848915 0.35479675 -0.335062795
[5,] -0.2646218 0.26537733 0.377987230 0.09380610 -0.057189008
[6,] -0.2651253 -0.26046703 0.013930694 0.16237094 0.208359286
[7,] -0.2531897 0.35345333 0.150005621 0.05895741 -0.189953074
[8,] -0.2606710 0.11735303 -0.005215104 0.27705911 -0.018600417
[9,] -0.2349684 -0.21053120 -0.366416254 0.20146111 0.478945669
[10,] -0.2543602 0.24005116 -0.016458501 0.16915620 0.387620499
[11,] -0.2776952 0.17754291 0.206648264 0.21320508 0.273166033
[12,] -0.2538482 0.01057909 -0.411116912 -0.11216882 -0.096313332
[13,] -0.2594653 0.30580467 -0.180569108 -0.17195100 -0.209037875
[14,] -0.2665313 0.13480567 -0.328364643 -0.04065287 -0.305371305
[15,] -0.2685319 -0.14031727 -0.224933655 -0.13330245 -0.179696787
[16,] - 0.2155670 0.03517612 -0.042603924 -0.69795785 0.276097575
[,6] [,7] [,8] [,9] [,10]
[1,] 0.164125700 0.07146694 0.41933501 -0.3812013 0.27074934
[2,] -0.331376957 0.25316543 0.28756121 0.2685009 0.20020796
[3,] 0.434046889 0.25152188 -0.24330189 0.3426530 -0.29537778
[4,] -0.288907062 -0.51637177 -0.20062347 0.2420752 -0.01512547
[5,] -0.255371831 -0.08349309 -0.17717199 -0.1860636 0.01924259
[6,] 0.229300534 -0.06789386 -0.18761976 -0.3096143 -0.13533291
[7,] -0.384201300 0.30875323 -0.21640518 -0.1212809 0.08055468
[8,] 0.459253377 -0.07389551 -0.19900146 0.2934115 0.46462073
[9,] -0.001080736 0.27487096 -0.07671759 -0.1559394 0.17132638
[10,] -0.098160398 -0.23359862 0.44390570 0.2689296 -0.11767481
[11,] -0.071254908 -0.01980581 0.11348014 -0.1669012 -0.22309947
[12,] -0.222116767 0.34929033 -0.18219971 0.3280327 -0.10277798
[13,] 0.162926879 -0.14388496 0.39345085 0.2096365 0.01687809
[14,] 0.106040183 0.09256223 0.01110299 -0.2427821 0.15797987
[15,] 0.087049504 -0.06903743 0.05008329 -0.1678548 -0.61664654
[16,] -0.075187815 -0.44941264 -0.28731467 -0.1101533 0.22148537
[,11] [,12] [,13] [,14] [,15]
[1,] -0.41005590 -0.33714207 -0.09823652 0.003615597 -0.123775302
[2,] 0.42213213 0.18502260 -0.02594945 0.127287789 0.131143363
[3,] -0.30721399 0.17770935 0.17732376 -0.153604695 0.072604038
[4,] -0.17360859 0.12386105 0.06167327 -0.154824801 -0.055536282
[5,] -0.06325779 0.18336124 0.04403395 0.180479769 -0.076101659
[6,] 0.44871840 -0.35253734 0.49541819 -0.058087171 -0.095425253
[7,] 0.13568554 -0.24935510 -0.09053836 -0.448953119 0.236824696
[8,] 0.22582731 -0.13060648 -0.40507591 0.193829011 0.110147532
[9,] -0.26766105 0.30197218 -0.14410014 -0.384272745 -0.035498328
[10,] -0.23136607 -0.25953848 0.20117363 0.046661360 0.432459302
[11,] 0.03930188 0.22934586 -0.21407102 0.312499654 -0.430773067
[12,] -0.18246496 -0.36741125 0.08740106 0.344122971 -0.347656169
[13,] 0.25026704 0.16941501 0.11177555 -0.436195835 -0.421146161
[14,] -0.01790827 0.43493940 0.38619656 0.323800848 0.349699254
[15,] 0.15042502 -0.01810421 -0.50281826 0.010381767 0.285719681
[16,] -0.09373993 -0.06083004 -0.07482156 -0.001707348 -0.002965111
[,16]
[1,] -0.01476090
[2,] 0.02640975
[3,] -0.08700180
[4,] -0.15857918
[5,] 0.69865134
[6,] 0.04216608
[7,] -0.30250096
[8,] 0.03688855
[9,] 0.16911313
[10,] 0.02357513
[11,] -0.49941529
[12,] 0.08160911
[13,] 0.12469343
[14,] -0.19607957
[15,] 0.16352546
[16,] -0.13282232
>
puntuaciones_fact = analFactRot$scores
puntuaciones_fact
SALIDA:
puntuaciones_fact = analFactRot$scores
> puntuaciones_fact
>
ANÁLISIS FACTORIAL CONFIRMATORIO DE LA VARIABLE ENSEÑANZA VIRTUAL EN RSTUDIO
library(readxl)
install.packages("semPlot")
library(semPlot)
library(lavaan)
datosEV=read_excel("C:\\ejemplos\\EncuestaSVJ.xlsx",sheet="EV")
View(datosEV)
SALIDA:
# con sus indicadores siguiendo el =~ (lea este símbolo "se mide por")
Modelo_confir = ' Factor1 =~ E3 + E5 + E7 + E8 + E10 + E11
Factor3 =~ E1 + E2 + E4 + E6'
Modelo_confir
SALIDA:
+ Factor3 =~ E1 + E2 + E4 + E6'
> Modelo_confir
[1] " Factor1 =~ E3 + E5 + E7 + E8 + E10 + E11\n Factor2 =~ E9 + E12 + E13 + E14 + E15 + E16\n
Factor3 =~ E1 + E2 + E4 + E6"
# Corremos el modelo
SALIDA:
Estimator ML
P-value 0.000
RMSEA 0.079
SRMR 0.048
Parameter Estimates:
Information Expected
Latent Variables:
Factor1 =~
E3 1.000
Factor2 =~
E9 1.000
Factor3 =~
E1 1.000
Covariances:
Factor2 ~~
Variances:
SALIDA:
semPaths(modelo, what = "est", layout = "circle", title = TRUE, style = "LISREL")
SALIDA:
Una guía amigable para el uso de
Lavaan: Potencia de R para el
Análisis Factorial Confirmatorio
(SEM)
Brian N. Peña Calero (1,2,*)
2018-11-22
Carátula
1. Sociedad Peruana de Psicometría (SPP)
2. Avances en Medición Psicológica (AMP)
Presentación
Esta breve guía presenta dos ejes principales: a) Los fundamentos y usos del
Análisis Factorial Confirmatorio (CFA) de acuerdo a los estándares actuales y
b) El uso del paquete R lavaan (Rosseel, 2018) para su ejecución en el
análisis psicométrico (construcción de pruebas, adaptación, validación y/o
estudio de propiedades). A pesar de que existen actualmente una cantidad
considerable de software (mayormente privativos) que permiten el desarrollo
de un AFC, pocos de ellos tienen implementados los procedimientos
necesarios a desarrollar (consideración de variables ordinales por ej.).
1 Introducción
Este manual es una guía para el entendimiento de los fundamentos del
Análisis Factorial Confirmatorio (AFC) y su desarrollo mediante el software R
y el paquete lavaan mayormente. Para fines de presentación de resultados y
análisis adicionales se hará uso de otros paquetes de R
como psych (Revelle, 2018) para análisis descriptivo de los
ítems; MVN (Korkmaz, Goksuluk, & Zararsiz, 2018) para el análisis de
normalidad multivariada; semTools (Jorgensen, Pornprasertmanit,
Schoemann, & Rosseel, 2018) para el cálculo de fiabilidad a partir del modelo
evaluado; y semPlot (Epskamp & Simon Stuber, 2017) para la generación de
gráficos a partir del modelo evaluado.
Esta guía tiene en pendiente abordar los principales usos de AFC desde los
procesos más básicos hasta los más completos para fines de investigación
instrumental. Aún está en proceso de desarrollo por lo que se anuncia la
planificación existente: - Fundamentos básicos del AFC: Diferencias con
AFE. - Revisión de los estimadores clásicos y robustos - AFC de primer
orden - AFC de segundo orden - Modelos Bifactor - Modelos
multidimensionales - Invarianza - Invarianza longitudinal - Procedimientos de
AFC en muestras complejas
1.4 Preparándonos
Para realizar análisis específicos como lo es el AFC o SEM, R requiere de
paquetes especializados para su propósito (que traen consigo, funciones
especializadas). Existen diversos paquetes para realizar un AFC, entre los
más comunes está OpenMX, CFA, sem y lavaan.
En nuestro caso usaremos el último en mención por ser uno de los más
consolidados en la actualidad, ofrecer mayor facilidad de manejo y tener en
su desarrollo los últimos avances en AFC provenientes en gran parte de
Mplus y aportes propios.
Factores Indicadores
Sintaxis Descripción
~ Regresión
Table 2.2: Sintaxis para la Especificación en Lavaan.
Sintaxis Descripción
~1 Interceptos
2.3 Identificación, Estimación y
Evaluación
¡Ahora vamos a identificar y estimar! ¡Si! Los dos pasos al mismo tiempo
utilizando la función cfa del paquete lavaan.
# Cargamos el paquete
library(lavaan)
## This is lavaan 0.6-3
## lavaan is BETA software! Please report any bugs.
# Almacenamos en el objeto "fit" la información de la estimación
fit <- cfa(model = model,
data = datos)
¡Ya está! Veamos el entorno ambiente. Hemos creado un objeto adicional de
clase lavaan llamado fit. La función cfa es un wrapper de la función
general lavaan, es decir que automatiza una gran cantidad de
especificaciones como las varianzas individuales de las variables,
correlaciones de errores establecidas a 0, y el hecho de tratar a los factores
especificados como oblicuos, es decir que se encuentra correlacionados
entre ellos. Dicho esta aclaración sobre lo que acabamos de hacer,
procederemos a verificar la evaluación de nuestro modelo factorial
almacenado en fit. Para esto usaremos a la conocida función summary que
nos devolverá de forma organizada parte de lo estimado. ¡Hagámoslo!
summary(datos) ## ¡Ups! Nos confundimos, parece ser que hace eso mismo:
¡Resumir!
## id sex ageyr agemo
## Min. : 1.0 Min. :1.000 Min. :11 Min. : 0.000
## 1st Qu.: 82.0 1st Qu.:1.000 1st Qu.:12 1st Qu.: 2.000
## Median :163.0 Median :2.000 Median :13 Median : 5.000
## Mean :176.6 Mean :1.515 Mean :13 Mean : 5.375
## 3rd Qu.:272.0 3rd Qu.:2.000 3rd Qu.:14 3rd Qu.: 8.000
## Max. :351.0 Max. :2.000 Max. :16 Max. :11.000
##
## school grade x1 x2
## Grant-White:145 Min. :7.000 Min. :0.6667 Min. :2.250
## Pasteur :156 1st Qu.:7.000 1st Qu.:4.1667 1st Qu.:5.250
## Median :7.000 Median :5.0000 Median :6.000
## Mean :7.477 Mean :4.9358 Mean :6.088
## 3rd Qu.:8.000 3rd Qu.:5.6667 3rd Qu.:6.750
## Max. :8.000 Max. :8.5000 Max. :9.250
## NA's :1
## x3 x4 x5 x6
## Min. :0.250 Min. :0.000 Min. :1.000 Min. :0.1429
## 1st Qu.:1.375 1st Qu.:2.333 1st Qu.:3.500 1st Qu.:1.4286
## Median :2.125 Median :3.000 Median :4.500 Median :2.0000
## Mean :2.250 Mean :3.061 Mean :4.341 Mean :2.1856
## 3rd Qu.:3.125 3rd Qu.:3.667 3rd Qu.:5.250 3rd Qu.:2.7143
## Max. :4.500 Max. :6.333 Max. :7.000 Max. :6.1429
##
## x7 x8 x9
## Min. :1.304 Min. : 3.050 Min. :2.778
## 1st Qu.:3.478 1st Qu.: 4.850 1st Qu.:4.750
## Median :4.087 Median : 5.500 Median :5.417
## Mean :4.186 Mean : 5.527 Mean :5.374
## 3rd Qu.:4.913 3rd Qu.: 6.100 3rd Qu.:6.083
## Max. :7.435 Max. :10.000 Max. :9.250
##
## Muestrame acerca de lo estimado entonces
summary(fit)
## lavaan 0.6-3 ended normally after 35 iterations
##
## Optimization method NLMINB
## Number of free parameters 21
##
## Number of observations 301
##
## Estimator ML
## Model Fit Test Statistic 85.306
## Degrees of freedom 24
## P-value (Chi-square) 0.000
##
## Parameter Estimates:
##
## Information Expected
## Information saturated (h1) model Structured
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|)
## visual =~
## x1 1.000
## x2 0.554 0.100 5.554 0.000
## x3 0.729 0.109 6.685 0.000
## textual =~
## x4 1.000
## x5 1.113 0.065 17.014 0.000
## x6 0.926 0.055 16.703 0.000
## speed =~
## x7 1.000
## x8 1.180 0.165 7.152 0.000
## x9 1.082 0.151 7.155 0.000
##
## Covariances:
## Estimate Std.Err z-value P(>|z|)
## visual ~~
## textual 0.408 0.074 5.552 0.000
## speed 0.262 0.056 4.660 0.000
## textual ~~
## speed 0.173 0.049 3.518 0.000
##
## Variances:
## Estimate Std.Err z-value P(>|z|)
## .x1 0.549 0.114 4.833 0.000
## .x2 1.134 0.102 11.146 0.000
## .x3 0.844 0.091 9.317 0.000
## .x4 0.371 0.048 7.779 0.000
## .x5 0.446 0.058 7.642 0.000
## .x6 0.356 0.043 8.277 0.000
## .x7 0.799 0.081 9.823 0.000
## .x8 0.488 0.074 6.573 0.000
## .x9 0.566 0.071 8.003 0.000
## visual 0.809 0.145 5.564 0.000
## textual 0.979 0.112 8.737 0.000
## speed 0.384 0.086 4.451 0.000
¡Que elegancia! No nos asustemos. Vamos a entenderlo paso a paso, de las
manitos. No nos soltemos. Respiremos y empecemos por la primera parte.
Vemos que el “output” (resultados en consola) nos indica la versión de
“lavaan”, el número de parámetros libres que tenemos en el modelo, número
de casos analizados, método de estimación utilizado (máxima verosimilitud),
valor de chi cuadrado (Model Fit Test Statistic), grados de libertad (sobre
identificado), valor p de la prueba de bondad de ajuste (chi cuadrado) e
información adicional que por ahora no será de nuestra preocupación.
2.4 Re-Especificación
Vemaos como mejorar nuestro modelo ya que presenta valores en sus
ajustes que no llegan a ser del todo satisfactorios. En este punto, la reflexión
teórica debería darnos algunas pistas sobre el mal funcionamiento de
algunos ítems, pertenencia a otro factor o presencia de correlación de errores
por un mismo comienzo en el enunciado.
Antes de cantar victoria, volvamos a verificar los IM para ver si hay más
cambios importantes sugeridos al modelo.
# Solicitar los 10 primeros IM con valores más altos
modindices(fit_02, sort = TRUE, maximum.number = 10)
## lhs op rhs mi epc sepc.lv sepc.all sepc.nox
## 34 textual =~ x3 9.057 -0.257 -0.254 -0.225 -0.225
## 32 textual =~ x1 8.734 0.313 0.309 0.265 0.265
## 60 x3 ~~ x5 8.712 -0.136 -0.136 -0.223 -0.223
## 67 x4 ~~ x7 8.117 0.112 0.112 0.181 0.181
## 56 x2 ~~ x7 7.266 -0.160 -0.160 -0.148 -0.148
## 52 x2 ~~ x3 6.536 0.181 0.181 0.187 0.187
## 27 visual =~ x5 6.076 -0.191 -0.169 -0.131 -0.131
## 29 visual =~ x7 5.438 -0.231 -0.204 -0.188 -0.188
## 66 x4 ~~ x6 5.367 -0.222 -0.222 -0.609 -0.609
## 30 visual =~ x8 5.049 0.276 0.244 0.242 0.242
Genial, parece ser que los IM mostrados no son tan altos ni
el sepc.all representa un cambio importante al modelo estimado. Tenemos
entonces un modelo estructural comprobado… ¡Espera! ¿Hemos revisado la
distribución de los datos? Ups… Verifiquemos si se tiene una distribución
normal multivariada. Para ello usaremos la función “mvn” del paquete “MVN”.
Referencias
Beaujean, A. A. (2014). Latent variable modeling using R: A step by step
guide. New York: Routledge/Taylor & Francis Group.
Epskamp, S., & Simon Stuber. (2017). SemPlot: Path diagrams and visual
analysis of various sem packages’ output. https://CRAN.R-
project.org/package=semPlot
Holzinger, K., & Swineford, F. (1939). A study in factor analysis: The stability
of a bifactor solution. Supplementary Educational Monograph, 48.
Jorgensen, T. D., Pornprasertmanit, S., Schoemann, A., & Rosseel, Y.
(2018). SemTools: Useful tools for structural equation
modeling. https://CRAN.R-project.org/package=semTools
Kline, R. B. (2005). Principles and practice of structural equation modeling. New York, NY: The Guilford
Press.
In this model, I am determining whether AIDS-related stigma, religiosity, and adherence to the traditional
male role norm of antifemininity lead to perceptions of two types of threat in response to gay men. I am
also testing whether these perceived threats, in turn, lead to intoxicated and non-intoxicated aggression
toward sexual minorities.
CAVEAT: This is a cross-sectional study. Of course, we cannot determine causation with this design.
Nonetheless, terms like “path” and “effect” are often used with SEM even in cross-sectional studies. The
understanding is that these are not really causal.
I am activitating the sem package that I have already installed. But I will not import data. As you will
subsequently see, I won't need to for sem package.
library("sem")
## Loading required package: MASS
## Loading required package: matrixcalc
Create a correlation matrix of the assocations between all of the observed variables, which are just your
study variables that you directly measured. Structural equation modeling analyzes the correlations
between the variables. If you want to be fancier, you can create latent variables that represent underlying
factors, and you might choose to analyze the covariance matrix plus the variable means and standard
deviations in a software program or R package that will let you do so.
You will want to run correlation analyses to find the correlations among your observed variables. You can
use R or another program, like Stata.
corr.diss
## IntAgg NonIntAgg RealThr SymbThr ARStigma MRNaf Relig
## IntAgg 1.000 0.000 0.000 0.000 0.000 0.000 0
## NonIntAgg 0.876 1.000 0.000 0.000 0.000 0.000 0
## RealThr 0.318 0.320 1.000 0.000 0.000 0.000 0
## SymbThr 0.358 0.333 0.840 1.000 0.000 0.000 0
## ARStigma 0.245 0.264 0.566 0.521 1.000 0.000 0
## MRNaf 0.267 0.254 0.549 0.506 0.365 1.000 0
## Relig 0.058 0.074 0.074 0.301 0.520 0.149 1
In the path column, I am estimating assocations between variables that will be estimated using regression
coefficents. (Think coefficients, or slops, from regression.) Single-headed arrows represent “causal” paths,
where as double headed arrows represent “covariances” between variables. These covariances are like
correlations that are in their original units of measurement. These covariances in the model are actually
associations between the variables' error terms. The parameter column names the parameters that you
want to estimate (e.g., regression coefficients), and you don't really need to worry about what the starting
values are. If you put a number in this column instead of NA, you will fix the parameter to be that value.
I chose parameter names that are intuitive to me. You can name them what you want, and you can even
name them after standard statitical notation, like “beta”. The numbering is up to you.
The fixed.x argument tells R what predictor variables are in the model. These predictor variables, which
are called exogenous variables, are variables that have no single-headed arrows pointing to them.
Variables that do have single-headed arrows pointing toward them are called, endogenous variables.
sem.diss
##
## Model Chisquare = 7.293 Df = 6
##
## b11 b12 b21 b22 a11 a12 a13
a21
## 0.05870 0.30870 0.13682 0.21807 0.57256 -0.28062 0.38183
0.35482
## a22 a23 c11 c21 d11 d21 d31
d41
## 0.06177 0.36729 0.43296 0.75442 0.48708 0.61070 0.87082
0.88360
##
## Iterations = 0
Here are the results of the analyses. As you can see, the (unstandardized) regression coefficients are
shown. Unfortunately, standard errors are not included. But, fear not.
summary(sem.diss)
##
## Model Chisquare = 7.293 Df = 6 Pr(>Chisq) = 0.2946
## AIC = 39.29
## BIC = -24.85
##
## Normalized Residuals
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -0.568 0.000 0.000 0.134 0.000 1.120
##
## R-square for Endogenous Variables
## RealThr IntAgg SymbThr NonIntAgg
## 0.5129 0.1292 0.3893 0.1164
##
## Parameter Estimates
## Estimate Std Error z value Pr(>|z|)
## b11 0.05870 0.11840 0.4957 6.201e-01 IntAgg <--- RealThr
## b12 0.30870 0.11840 2.6072 9.128e-03 IntAgg <--- SymbThr
## b21 0.13682 0.11927 1.1472 2.513e-01 NonIntAgg <--- RealThr
## b22 0.21807 0.11927 1.8284 6.748e-02 NonIntAgg <--- SymbThr
## a11 0.57256 0.05982 9.5710 1.058e-21 RealThr <--- ARStigma
## a12 -0.28062 0.05632 -4.9823 6.282e-07 RealThr <--- Relig
## a13 0.38183 0.05167 7.3891 1.478e-13 RealThr <--- MRNaf
## a21 0.35482 0.06698 5.2971 1.177e-07 SymbThr <--- ARStigma
## a22 0.06177 0.06307 0.9794 3.274e-01 SymbThr <--- Relig
## a23 0.36729 0.05786 6.3477 2.186e-10 SymbThr <--- MRNaf
## c11 0.43296 0.04794 9.0315 1.694e-19 SymbThr <--> RealThr
## c21 0.75442 0.07965 9.4717 2.753e-21 NonIntAgg <--> IntAgg
## d11 0.48708 0.04742 10.2713 9.490e-25 RealThr <--> RealThr
## d21 0.61070 0.05946 10.2713 9.490e-25 SymbThr <--> SymbThr
## d31 0.87082 0.08478 10.2713 9.490e-25 IntAgg <--> IntAgg
## d41 0.88360 0.08603 10.2713 9.490e-25 NonIntAgg <--> NonIntAgg
##
## Iterations = 0
Here are your path coefficients and standard errors, along with p-values if you are interested in hypothesis
testing.
It is worth noting that the results also include R-squared values for all variables that have arrows pointing
toward them. You also get fit stiatistics, chi-square test of model fit, the Aikike Information Criterion (AIC),
and the Bayesian Information Criterion (BIC). Many people use chi-square default, and you should almost
always report some version of the chi-square model fit test with your results. A good, commonly used test
of model fit is the root mean-squared error (RMSEA), which you can calculate. See Fox's (2002) work,
reference above.
Unfortunately, these results do not include indirect effects, which are the effects of the predictor (e.g.,
ARStigma) on the outcome (e.g., IntAgg) through the mediator (e.g., RealThr). However, you can get
these by multiplying a by multiplying the regression coefficent of ARStigma -> RealThr by the regression
coefficient. You can do what's called a Sobel test to find out if this particuarly indirect path is statistically
significantly differnet from zero, or you can use bootstrapping. These deserve their own demonstrations
and are beyond the scope of this project.
In this example of SEM, we used continuous variables. If you have endogenous variables that are not
continuous, you would approach this all a bit differently.
Estadística y Machine Learning con
R
Francisco Parra
15 de Junio de 2017
Agrupación de la información
Análisis de componentes principales
El Análisis de Componentes Principales (ACP) es una técnica estadística de síntesis de la
información, o reducción de la dimensión (número de variables.
Var(y1)=Var(a′1x)=a′1σa1Var(y1)=Var(a1′x)=a1′σa1
El problema consiste en maximizar la función a′1σa1a1′σa1 donde σσ es la matriz de
covarianzas de las pp variables,sujeta a la restricción a′1a1=1a1′a1=1, utilizandose para
ello los multiplicadores de Lagrange:
L(a1)=a′1σa1−λ(a′1a1−1)L(a1)=a1′σa1−λ(a1′a1−1)
siendo ahora a1a1 la incognita, se busca el maximo:
L(∂a1)∂a1=0⟶(σ−λI)a1=0L(∂a1)∂a1=0⟶(σ−λI)a1=0
La solución del sistema de ecuaciones requiere que el determinante ∣σ−λI∣∣σ−λI∣ sea no
nulo, de manera que λλ es un autovalor de σσ, que al ser definida positiva,
tendrá pp autovalores distintos.
Entonces, para maximizar la varianza de y1y1 se tiene que tomar el mayor
autovalor, λ1λ1 y el correspondiente autovector de a1a1.
El segundo componente principal,y2=a′2xy2=a2′x ha de estar incorrelacionado con y1y1,
es decir:
cov(y1,y2)=cov(a′1x,a′2x)=a′1σa2=0cov(y1,y2)=cov(a1′x,a2′x)=a1′σa2=0.
Equivale a:
a′1λa2=0a1′λa2=0
Y a maximizar las Var(y2)=a′2σa2Var(y2)=a2′σa2 imponinedo ahora dos restricciones:
a′2a2=1a2′a2=1
a′2a1=0a2′a1=0
Se forma el lagrangiano L(a2)=a′12σa2−λ(a′2a2−1)−δ(a
′2a1)L(a2)=a1′2σa2−λ(a2′a2−1)−δ(a′2a1), se deriva respecto a a2a2 y se iguala a cero:
L(∂a2)∂a2=0⟶(σ−λI)a2=0L(∂a2)∂a2=0⟶(σ−λI)a2=0.
Elegimos λ2λ2 como segundo autovalor de la matriz σσ asociado al autovector
asociado a2a2.
Entonces todos los p componentes de yy se pueden expresar como el producto de una
matriz formada por los autovectores, multiplicada por el vector xx que contiene las
variables originales:
y=Axy=Ax
donde la Var(yj)=λjVar(yj)=λj, y la Cov(yj,ys)=0Cov(yj,ys)=0.
Si sumamos todos los autovalores,tendremos entonces la varianza total de los
componentes, que por las propiedades del operador traza, acaba siendo igual que la
varianza de los variables originales:
∑Var(yj)=∑(λj)=∑Var(xj)∑Var(yj)=∑(λj)=∑Var(xj)
El porcentaje de varianza total que recoge cada componentes principales, es el critierio
utilizado para reducir las pp variables de nuestro conjunto de datos,
por mm combinaciones lineales de dichas variables.
El ACP se emplea sobre todo en análisis exploratorio de datos (Analisis factorial) y para
construir modelos predictivos cuando las variables explicativas tienen problemas de
colinealidad.
El ACP comporta el cálculo de la descomposición en autovalores de la matriz de
covarianza, normalmente tras centrar los datos en la media de cada atributo.
El análisis de componentes principales (PCA) puede realizarse con una función de la
librería básica de «R»: prcomp o princomp.
require(graphics)
str(USArrests)
## 'data.frame': 50 obs. of 4 variables:
## $ Murder : num 13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
## $ Assault : int 236 263 294 190 276 204 110 238 335 211 ...
## $ UrbanPop: int 58 48 80 50 91 78 77 72 80 60 ...
## $ Rape : num 21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9
25.8 ...
prcomp(USArrests, scale = TRUE)
## Standard deviations (1, .., p=4):
## [1] 1.5748783 0.9948694 0.5971291 0.4164494
##
## Rotation (n x k) = (4 x 4):
## PC1 PC2 PC3 PC4
## Murder -0.5358995 0.4181809 -0.3412327 0.64922780
## Assault -0.5831836 0.1879856 -0.2681484 -0.74340748
## UrbanPop -0.2781909 -0.8728062 -0.3780158 0.13387773
## Rape -0.5434321 -0.1673186 0.8177779 0.08902432
prcomp(~ Murder + Assault + Rape, data = USArrests, scale = TRUE)
## Standard deviations (1, .., p=3):
## [1] 1.5357670 0.6767949 0.4282154
##
## Rotation (n x k) = (3 x 3):
## PC1 PC2 PC3
## Murder -0.5826006 0.5339532 -0.6127565
## Assault -0.6079818 0.2140236 0.7645600
## Rape -0.5393836 -0.8179779 -0.1999436
plot(prcomp(USArrests))
Análisis factorial
El análisis factorial (AF) es tambien una técnica estadística de reducción de datos usada
para explicar las correlaciones entre las variables observadas en términos de un número
menor de variables no observadas llamadas factores.
El análisis factorial exploratorio, se utiliza para tratar de descubrir la estructura interna de
un número relativamente grande de variables. La hipótesis a priori del investigador es que
pueden existir una serie de factores asociados a grupos de variables. Las cargas de los
distintos factores se utilizan para intuir la relación de éstos con las distintas variables. Es el
tipo de análisis factorial más común.
El análisis factorial confirmatorio, AFC, trata de determinar si el número de factores
obtenidos y sus cargas se corresponden con los que cabría esperar a la luz de una teoría
previa acerca de los datos. La hipótesis a priori es que existen unos determinados factores
preestablecidos y que cada uno de ellos está asociado con un determinado subconjunto de
las variables. El análisis factorial confirmatorio entonces arroja un nivel de confianza para
poder aceptar o rechazar dicha hipótesis.
El análisis de componentes principales es el método apropiado de extracción de factores,
cuando el interés primordial se centra en la predicción o el número mínimo de factores
necesarios para justificar la porción máxima de varianza representada en la serie de
variables original, y cuando el conocimiento previo sugiere que la varianza específica y de
error representan una porción relativamente pequeña de la varianza total. Por el contrario
cuando se pretende identificar las dimensiones latentes o las construcciones
representadas en las variables originales y se tiene poco conocimiento de la varianza
específica y el error, lo más apropiado es utilizar el método factorial común. Si bien las
complicaciones del análisis factorial común han contribuido al análisis generalizado de la
técnica de componentes principales.
Para interpretar bien los factores se utiliza una rotación de ejes, ya que las soluciones
factoriales no rotadas extraen factores según su orden de importancia. El primer factor
tiende a ser un factor general por el que casi toda variable se ve afectada
significativamente dando cuenta del mayor porcentaje de varianza. Los métodos de
rotación ortogonales mas utilizados son VARIMAX, QUARTIMAX y EQUIMAX.
En la practica no se utiliza un criterio único de los factores a extraer, si bien se utiliza como
primera aproximación el gráfico de autovalor para el criterio de contraste de caida,
despues de interpretar los factores extraidos hay que valorar su caracter práctico.
Se leen la base de datos Seatbelts, que contiene datos mensuales de conductores de
Gran Bretaña, muestos o heridos entre Enero de 1969 y Diciembre de 1983:
library(rela)
Belts <- Seatbelts[,1:7]
summary(Belts)
## DriversKilled drivers front rear
## Min. : 60.0 Min. :1057 Min. : 426.0 Min. :224.0
## 1st Qu.:104.8 1st Qu.:1462 1st Qu.: 715.5 1st Qu.:344.8
## Median :118.5 Median :1631 Median : 828.5 Median :401.5
## Mean :122.8 Mean :1670 Mean : 837.2 Mean :401.2
## 3rd Qu.:138.0 3rd Qu.:1851 3rd Qu.: 950.8 3rd Qu.:456.2
## Max. :198.0 Max. :2654 Max. :1299.0 Max. :646.0
## kms PetrolPrice VanKilled
## Min. : 7685 Min. :0.08118 Min. : 2.000
## 1st Qu.:12685 1st Qu.:0.09258 1st Qu.: 6.000
## Median :14987 Median :0.10448 Median : 8.000
## Mean :14994 Mean :0.10362 Mean : 9.057
## 3rd Qu.:17203 3rd Qu.:0.11406 3rd Qu.:12.000
## Max. :21626 Max. :0.13303 Max. :17.000
library(psych)
cortest.bartlett(Belts)
## R was not square, finding R from data
## $chisq
## [1] 968.7579
##
## $p.value
## [1] 1.260101e-191
##
## $df
## [1] 21
## Importance of components:
## Comp.1 Comp.2 Comp.3 Comp.4
Comp.5
## Standard deviation 1.9203515 1.2141729 0.8489513 0.78140438
0.5754445
## Proportion of Variance 0.5268214 0.2106022 0.1029598 0.08722754
0.0473052
## Cumulative Proportion 0.5268214 0.7374236 0.8403834 0.92761093
0.9749161
## Comp.6 Comp.7
## Standard deviation 0.3298839 0.258386585
## Proportion of Variance 0.0155462 0.009537661
## Cumulative Proportion 0.9904623 1.000000000
##
## Loadings:
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
## DriversKilled -0.444 0.136 0.521 -0.360 -0.519 0.323
## drivers -0.480 0.100 0.377 0.505 -0.596
## front -0.475 -0.198 -0.103 0.417 0.414 0.612
## rear -0.226 -0.686 -0.322 0.277 -0.406 -0.361
## kms 0.276 -0.627 -0.606 0.365 0.168
## PetrolPrice 0.327 -0.141 0.829 0.277 0.311
## VanKilled -0.334 0.259 0.526 -0.627 -0.387
library(psych)
fa.parallel(Belts)
## The estimated weights for the factor scores are probably incorrect.
Try a different factor extraction method.
## Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate =
## rotate, : A loading greater than abs(1) was detected. Examine the
loadings
## carefully.
## The estimated weights for the factor scores are probably incorrect.
Try a different factor extraction method.
## Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate =
## rotate, : An ultra-Heywood case was detected. Examine the results
carefully
Belts.fa<-factanal(Belts,factors=3, rotation="varimax",scores =
"Bartlett")
Belts.fa
##
## Call:
## factanal(x = Belts, factors = 3, scores = "Bartlett", rotation =
"varimax")
##
## Uniquenesses:
## DriversKilled drivers front rear
kms
## 0.197 0.005 0.005 0.227
0.051
## PetrolPrice VanKilled
## 0.660 0.645
##
## Loadings:
## Factor1 Factor2 Factor3
## DriversKilled 0.820 0.264 0.244
## drivers 0.883 0.391 0.249
## front 0.485 0.531 0.691
## rear 0.204 -0.121 0.846
## kms -0.191 -0.903 0.311
## PetrolPrice -0.241 -0.469 -0.249
## VanKilled 0.301 0.507
##
## Factor1 Factor2 Factor3
## SS loadings 1.915 1.813 1.482
## Proportion Var 0.274 0.259 0.212
## Cumulative Var 0.274 0.533 0.744
##
## Test of the hypothesis that 3 factors are sufficient.
## The chi square statistic is 11.54 on 3 degrees of freedom.
## The p-value is 0.00914
library(rela)
res <- paf(as.matrix(Belts))
summary(res) # Automatically calculate KMO with MSA, determine the
number of factors,
## $KMO
## [1] 0.66899
##
## $MSA
## MSA
## DriversKilled 0.75338
## drivers 0.72295
## front 0.65795
## rear 0.40214
## kms 0.53517
## PetrolPrice 0.83413
## VanKilled 0.88197
##
## $Bartlett
## [1] 968.76
##
## $Communalities
## Initial Communalities Final Extraction
## DriversKilled 0.79824 0.66181
## drivers 0.87486 0.85141
## front 0.87225 0.91049
## rear 0.76216 0.69016
## kms 0.67184 0.89761
## PetrolPrice 0.36120 0.29405
## VanKilled 0.36294 0.34590
##
## $Factor.Loadings
## [,1] [,2]
## DriversKilled 0.80934 -0.082307
## drivers 0.92263 -0.012744
## front 0.92638 -0.228709
## rear 0.41852 -0.717642
## kms -0.53335 -0.783039
## PetrolPrice -0.53096 -0.110142
## VanKilled 0.55008 0.208105
##
## $RMS
## [1] 0.050492
# calculate chi-square of Bartlett's sphericity test, communalities
and
# factor loadings. Communalities are 1 minus uniquenesses.
barplot(res$Eigenvalues[,1]) # First column of eigenvalues.
El índice KMO compara los valores de las correlaciones entre las variables y sus
correlaciones parciales. Si el índice KMO está próximo a 1, el ACP se puede hacer. Si el
índice es bajo (próximo a 0), el ACP no será relevante.
Análisis cluster
Introducción
El análisis cluster (AC) es un conjunto de técnicas multivariantes cuyo principal propósito
es agrupar objetos basándose en las características que poseen. El AC clasifica los
objetos en clases ó conglomerados de tal forma que cada objeto sea parecido a los que
hay en el conjunto de su conglomerado. Los conglomerados resultantes tendrán que tener
un alto grado de homogeneidad interna (dentro del conglomerado) y de heterogeneidad
externa (entre conglomerados).
Para realizar un AC se necesita una medida de similitud, de correspondencia, o parecido
entre objetos que van a ser analizados. Esta puede ser medida de varias formas, pero en
el AC, tres son los métodos de simulitud que se utilizan: medidas de correlación (la matriz
de correlación entre variables), medidas de distancia (la más utilizada es la distancia
euclidea) y las medidas de asociación, cuando se tienen datos no métricos.
Una vez se tiene una matriz de simulitud calculada, hay que realizar el proceso de
partición de los datos, para ello hay que decidir el algoritmo de aglomeración utilizado en la
formación de conglomerados, para despues tomar una decisión acerca del número de
conglomerados que se van a formar. Los algoritmos de obtención de conglomerados se
subdividen en métodos jerárquicos (encadenamiento simple, encadenamiento completo,
encadenamiento médio, método de Ward, método del centroide), de los no jerarquicos
(umbral secuencial, umbral paralelo, optimización), o una combinación de los dos.
El dendrograma ó gráfico en forma de arbol, es una herramienta visual que ayudar a
decidir el número de conglomerados que podrían representar mejor la estructura de los
datos.
Para determinar el número final de conglomerados a formar o regla de parada, no hay un
procedimiento determinado, ha de decidirlo el investigador en la fase de interpretación de
los datos.
Cluster Jerarquico
R incluye la función hclust para la realización de clasificaciones jerárquicas.
Una clasificación precisa que el investigador le pase dos opciones básicas a R:
●Medida de similitud/disimilitud para calcular la matriz de distancias
●Estrategia de fusión
Posteriormente, en la interpretación de los datos el investigador deberá decidir el punto de
corte y, con ello, el número de grupos.
Se puede usar la función nativa de R dist para calcular la matriz de distancias; por defecto
el programa usa la distancia euclídea (euclidean), siendo posible elegir varias más con la
opción method=“”: maximum, manhattan, canberra, binary, minkowski.
Las estrategias de fusión disponibles en hclust son las siguientes:
●“ward”: la distancia entre dos conglomerados es la suma de los cuadrados entre dos
conglomerados sumados para todas las variables. En cada paso del procedimiento de
aglomeración se minimiza la suma de cuadrados dentro del conglomerado para todas las
particiones. Tiende a combinar los conglomerados con un número reducido de
dimensiones.
●“single”: distancia mínima o vecino más próximo, encuentra dos objetos separados por la
distancia más corta y los coloca en un primer conglomerado. A continuación se encuetra la
distancia más corta, y se une a el un tercer objeto o se forma un nuevo conglomerado de
dos miembros. El proceso continua hasta que todos los objetos están en un conglomerado.
●“complete”: Parecido al “single”(simple) pero utilizando como criterio de agregación la
distancia máxima (aproximación al vecino más lejano).
●“average”: comienza igual que los métodos “single” y “complete”, pero el método de
aproximación es la distancia media entre todos los individuos de un conglomerado y los de
otro.
●“mcquitty”
●“median”
●“centroid”: la distancia entre dos conglomerados es la distancia (euclidia) entre
centroides.
Realizamos un Cluster Jerarquico con las tasas de crimen en USA (USArrests), utilizando
una medida de similaridad de distancias euclideas y el método de agrupación de
encadenamiento medio:
require(graphics)
str(USArrests)
## 'data.frame': 50 obs. of 4 variables:
## $ Murder : num 13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
## $ Assault : int 236 263 294 190 276 204 110 238 335 211 ...
## $ UrbanPop: int 58 48 80 50 91 78 77 72 80 60 ...
## $ Rape : num 21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9
25.8 ...
hc <- hclust(dist(USArrests), "ave")
plot(hc)
d=dist(USArrests)^2
1. 1-100 Normal,
2. 101-200 Cíclico,
3. 201-300 Tendencia creciente,
4. 301-400 Tendencia decreciente,
5. 401-500 Cambio hacia arriba y
6. 501-600 Descenso cambio.
sc <-
read.table("http://kdd.ics.uci.edu/databases/synthetic_control/synthet
ic_control.data", header=F, sep="")
# randomly sampled n cases from each class, to make it easy for
plotting
n <- 10
s <- sample(1:100, n)
idx <- c(s, 100+s, 200+s, 300+s, 400+s, 500+s)
sample2 <- sc[idx,]
observedLabels <- c(rep(1,n), rep(2,n), rep(3,n), rep(4,n), rep(5,n),
rep(6,n))
# compute DTW distances
library(dtw)
## Loading required package: proxy
##
## Attaching package: 'proxy'
## The following objects are masked from 'package:stats':
##
## as.dist, dist
## The following object is masked from 'package:base':
##
## as.matrix
## Loaded dtw v1.18-1. See ?dtw for help, citation("dtw") for use in
publication.
distMatrix <- dist(sample2, method="DTW")
# hierarchical clustering
hc <- hclust(distMatrix, method="average")
plot(hc, labels=observedLabels, main="")
Curva ROC
Basandonos en el trabajo pionero de Mantegna (1999) sobre tasas de retornos en los
mercados financieros, realizamos un ejercicio clasificatorio con la función span-tree, de la
librería vegan, que ordena y establece dependencias entre diversos activos financieros
utilizando datos de rendimientos mensuales de activos procedentes de Berndt’s The
Practice of Econometrics: http://web.stanford.edu/~clint/berndt/
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
berndt.z = zooreg(berndt.df[,-1], start=c(1978, 1),
end=c(1987,12),frequency=12)
index(berndt.z) = as.yearmon(index(berndt.z))
start(berndt.z)
## [1] "ene. 1978"
end(berndt.z)
## [1] "dic. 1987"
nrow(berndt.z)
## [1] 120
# note: coredata() function extracts data from zoo object
returns.mat = as.matrix(coredata(berndt.z))
library(vegan)
## Loading required package: permute
## Loading required package: lattice
## This is vegan 2.4-3
tr <- spantree(d)
## Add tree to a metric scaling
plot(tr, cmdscale(d), type = "t")
## Depths of nodes
depths <- spandepth(tr)
plot(tr, type = "t", label = depths)
## Initial stress : 0.10907
## stress after 2 iters: 0.06448
## Plot as a dendrogram
cl <- as.hclust(tr)
plot(cl)
Potencia de R para el Análisis Factorial Confirmatorio (SEM)
Carátula
Presentación
1 Introducción
2 Primeros pasos en el Análisis
o 2.1 Importar datos y reconocer variables
o 2.2 Sintaxis de Lavaan (Especificación)
o 2.3 Identificación, Estimación y Evaluación
o 2.4 Re-Especificación
Referencias
Publicado en Github
Factores Indicadores
Sintaxis Descripción
~ Regresión
~1 Interceptos
Calma, toda esta información se encuentra almacenada en el objeto “fit”, solo que al
momento de solicitar el “output” con la función “summary”, no hemos sido más precisos
en lo que queremos que nos muestre. Para las dos menciones que deseamos poder ver
y revisar usaremos dos argumentos adicionales. Si deseamos que se adicione la
información sobre índices de ajuste, la función quedará así:
summary(..., fit.measures = TRUE)
Si deseamos que se adicione información estandarizada, la función quedará así:
summary(..., standardized = TRUE)
Así, en caso de querer ambas cosas, solo hará falta poner esos dos argumentos en la
misma solicitud:
summary(..., fit.measures = TRUE, standardized = TRUE)
¡Probemos!
# Solicitar el resumen del análisis adicionando las medidas estandarizadas
# y los índices de ajuste
summary(fit, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-3 ended normally after 35 iterations
##
## Optimization method NLMINB
## Number of free parameters 21
##
## Number of observations 301
##
## Estimator ML
## Model Fit Test Statistic 85.306
## Degrees of freedom 24
## P-value (Chi-square) 0.000
##
## Model test baseline model:
##
## Minimum Function Test Statistic 918.852
## Degrees of freedom 36
## P-value 0.000
##
## User model versus baseline model:
##
## Comparative Fit Index (CFI) 0.931
## Tucker-Lewis Index (TLI) 0.896
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -3737.745
## Loglikelihood unrestricted model (H1) -3695.092
##
## Number of free parameters 21
## Akaike (AIC) 7517.490
## Bayesian (BIC) 7595.339
## Sample-size adjusted Bayesian (BIC) 7528.739
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.092
## 90 Percent Confidence Interval 0.071 0.114
## P-value RMSEA <= 0.05 0.001
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.065
##
## Parameter Estimates:
##
## Information Expected
## Information saturated (h1) model Structured
## Standard Errors Standard
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## visual =~
## x1 1.000 0.900 0.772
## x2 0.554 0.100 5.554 0.000 0.498 0.424
## x3 0.729 0.109 6.685 0.000 0.656 0.581
## textual =~
## x4 1.000 0.990 0.852
## x5 1.113 0.065 17.014 0.000 1.102 0.855
## x6 0.926 0.055 16.703 0.000 0.917 0.838
## speed =~
## x7 1.000 0.619 0.570
## x8 1.180 0.165 7.152 0.000 0.731 0.723
## x9 1.082 0.151 7.155 0.000 0.670 0.665
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## visual ~~
## textual 0.408 0.074 5.552 0.000 0.459 0.459
## speed 0.262 0.056 4.660 0.000 0.471 0.471
## textual ~~
## speed 0.173 0.049 3.518 0.000 0.283 0.283
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .x1 0.549 0.114 4.833 0.000 0.549 0.404
## .x2 1.134 0.102 11.146 0.000 1.134 0.821
## .x3 0.844 0.091 9.317 0.000 0.844 0.662
## .x4 0.371 0.048 7.779 0.000 0.371 0.275
## .x5 0.446 0.058 7.642 0.000 0.446 0.269
## .x6 0.356 0.043 8.277 0.000 0.356 0.298
## .x7 0.799 0.081 9.823 0.000 0.799 0.676
## .x8 0.488 0.074 6.573 0.000 0.488 0.477
## .x9 0.566 0.071 8.003 0.000 0.566 0.558
## visual 0.809 0.145 5.564 0.000 1.000 1.000
## textual 0.979 0.112 8.737 0.000 1.000 1.000
## speed 0.384 0.086 4.451 0.000 1.000 1.000
Está bien, no hay problema. Solo se agregaron unas líneas más al “output”. ¡Podemos
manejarlo! En la primera parte del “output” se adicionó cuatro de los índices de ajuste
más comunes: CFI (>= .95), TLI (>= .95), RMSEA (<= .05) y SRMR (<= .06).
Estos índices de ajuste nos permitirán decidir si, el modelo tal y como se encuentra
especificado guarda coherencia estadística. En la parte de abajo (Latent Variables,
Covariances y Variances) se ha agregado dos columnas Std.lv y Std.all. Nosotros nos
concentraremos en “Std.all” debido a que representa la estimación estandarizada a todo
el modelo (varía entre -1 y 1). Mientras más alto mejor.
Antes de pasar a ver como podemos mejorar nuestro modelo ya que presenta valores
en sus ajustes que no llegan a ser del todo satisfactorios, veremos otra forma de
visualizar los resultados que puede ser un tanto más amigable.
2.4 Re-Especificación
Vemaos como mejorar nuestro modelo ya que presenta valores en sus ajustes que no
llegan a ser del todo satisfactorios. En este punto, la reflexión teórica debería darnos
algunas pistas sobre el mal funcionamiento de algunos ítems, pertenencia a otro factor
o presencia de correlación de errores por un mismo comienzo en el enunciado.
Con respecto a las sugerencias de que un ítem pertenezca a otro factor, tener en
cuenta los siguientes puntos:
Dicho lo anterior verificamos que los IM sugieren que habría un cambio de 36 puntos
menos en el chi-cuadrado (valor actual de 85.3) si se modificase su pertenencia al
factor visual. Mientras que si se correlaciona los errores del indicador 7 y 8, habría un
cambio de 34.15, además de que la correlación sería de 0.86 (sepc.all).
Recordemos que cada vez que se realiza una re-especificación en el modelo los IM
cambian debido a que el ajuste del modelo también cambia. Así que no se recomienda
hacer múltiples re-especificaciones a partir de un solo procedimiento de análisis para re-
especificar. De uno en uno o de dos en dos si las incongruencias son más claras.
Antes de cantar victoria, volvamos a verificar los IM para ver si hay más cambios
importantes sugeridos al modelo.
# Solicitar los 10 primeros IM con valores más altos
modindices(fit_02, sort = TRUE, maximum.number = 10)
## lhs op rhs mi epc sepc.lv sepc.all sepc.nox
## 34 textual =~ x3 9.057 -0.257 -0.254 -0.225 -0.225
## 32 textual =~ x1 8.734 0.313 0.309 0.265 0.265
## 60 x3 ~~ x5 8.712 -0.136 -0.136 -0.223 -0.223
## 67 x4 ~~ x7 8.117 0.112 0.112 0.181 0.181
## 56 x2 ~~ x7 7.266 -0.160 -0.160 -0.148 -0.148
## 52 x2 ~~ x3 6.536 0.181 0.181 0.187 0.187
## 27 visual =~ x5 6.076 -0.191 -0.169 -0.131 -0.131
## 29 visual =~ x7 5.438 -0.231 -0.204 -0.188 -0.188
## 66 x4 ~~ x6 5.367 -0.222 -0.222 -0.609 -0.609
## 30 visual =~ x8 5.049 0.276 0.244 0.242 0.242
Genial, parece ser que los IM mostrados no son tan altos ni el sepc.all representa un
cambio importante al modelo estimado. Tenemos entonces un modelo estructural
comprobado… ¡Espera! ¿Hemos revisado la distribución de los datos? Ups…
Verifiquemos si se tiene una distribución normal multivariada. Para ello usaremos la
función “mvn” del paquete “MVN”.