#### PSY232/PSY532 | R101: Praktický úvod pro používání statistického programu R ####
#### Setkání 08: Explorační faktorová analýza                                    ####



# Načtení dat a balíčků ---------------------------------------------------

library(psych)
library(nFactors)

nfcc <- read.csv2("Pretest2015.csv")
source("EFA_Comparison_Data.R")


# Deskriptivy a předpoklady -----------------------------------------------

describe(nfcc)
KMO(nfcc[,2:16]) ## Kaiser-Meyer-Olkin (KMO) Test for Sampling Adequacy (pokud by někdo chtěl :)
bartlett.test(nfcc[,2:16]) ## Bartlettův test sféricity (pokud...)
cor.plot(nfcc[,2:16], numbers=T) ## korelační matice
EFA.Comp.Data(na.omit(nfcc[,2:16]), F.Max = 7, N.Pop = 10000, Graph = T, Spearman = T) ## Comparison data procedura na matici Spearmanových korelací (doporučeno)

# Odhad počtu faktorů -----------------------------------------------------

# Doporučuji: 
# A. Courtney, M. G. R. (2013). Determining the number of factors to retain in EFA : Using the SPSS R-Menu v2 . 0 to make more judicious estimations. Practical Assessment, Research & Evaluation, 18(8), 1–14.
# Ruscio, J., & Roche, B. (2012). Determining the number of factors to retain in an exploratory factor analysis using comparison data of known factorial structure. Psychological Assessment, 24(2), 282–292. http://doi.org/10.1037/a0025697

scree(nfcc[,2:16], factors = F) ## běžný scree-plot na matici Pearsonových korelací
fa.parallel(nfcc[,2:16], cor="poly") ## paralelní analýza (PA) na matici polychorických korelací

(oc <- nScree(na.omit(nfcc[,2:16]))) ## PA a optimal coordinate analysis (OC)
# ta závorka tam je proto, aby to vypsalo do konzole výsledky
# na.omit provede listwise delete; zbytek matic je na pair-wise korelační matici
plot(oc)

nfactors(nfcc[,2:16]) ## více různých metod odhadu počtu faktorů na Pearsonových korelacích
nfactors(nfcc[,2:16], cor="poly") ## totéž na polychorických


# Extrakce ----------------------------------------------------------------

efa1 <- fa(nfcc[,2:16], fm="minres", cor="poly", nfactors = 4, rotate = "varimax") ## odhad 4 faktorů s extrakcí minimum residual matice polychorických korelací a rotací varimax
print(efa1, sort = T) ## sort = T mi seřadí output

varimax(fa(nfcc[,2:16], fm="minres", cor="poly", nfactors = 4, rotate = "none")$loadings) ## můžu odhadnout nerotované řešení a rotovat dodatečně rotovat příslušnou funkcí loadingy
# To je výhodné v případě, že extrakce je časově náročná, a zkoušíte různé extrakce


efa2 <- fa(nfcc[,2:16], fm="minres", cor="poly", nfactors = 4, rotate = "geominQ") ## totéž, ale šikmá rotace geomin
print(efa2, sort = T)

efa3 <- fa(nfcc[nfcc$student_psy == 0, 2:16], fm="minres", cor="poly", nfactors = 4, rotate = "geominQ") ## totéž, jen pro nestudenty psychologie
efa4 <- fa(nfcc[nfcc$student_psy == 1, 2:16], fm="minres", cor="poly", nfactors = 4, rotate = "geominQ") ## totéž, ale pro studenty psychologie
fa.congruence(efa3, efa4) ## koeficient kongruence pro obě řešení

## faktory nejsou moc podobné, protože jsou "jinak zarotované". "Přerotujeme":
x <- target.rot(efa4, efa3$loadings) ## target rotace efa4 tak, aby byl výsledek co nejpodobnější 

fa.congruence(efa3, x) ## koeficienty kongruence na stejně zarotovaných řešení je výrazně lepší


# Diagramy ----------------------------------------------------------------

fa.diagram(efa3) ## faktorové náboje
fa.rgraph(efa3)
fa.plot(efa3) ## matice nábojů položek; stejně funguje i jen plot(efa3)

# Reliabilita -------------------------------------------------------------

alpha(nfcc[,2:16]) ## Cronbachovo alfa
omega(nfcc[,2:16], nfactors = 4) ## McDonaldovo omega pro čtyřfaktorový model


