Założenia Minimum 10 zmiennych Minimum 100 obserwacji, 10:15 na każdą zmienną Każda zmienna skorelowana z czynnikiem Ponieważ FA jest częścią GLM, to zależności liniowe danych ilościowych Odchylenia standardowa > 0 Wielozmiennowa normalność rozkładów Analizy czynnikowe Dr Paweł Kleka 2019-04-10 <div class="notes> Minimum 10 zmiennych Minimum 100 obserwacji, 10:15 na każdą zmienną Każda zmienna skorelowana z czynnikiem Ponieważ FA jest częścią GLM, to zależności liniowe danych ilościowych Odchylenia standardowa > 0 Wielozmiennowa normalność rozkładów 3/49 Po co nam analiza czynnikowa? walidacja itemów (pozycji) narzędzi badawczych panaceum na współliniowość zmiennych redukcja zmiennych - ze względu na overfitting - ukryte czynniki 2/49 4/49
EFA: factors cause answer on questions, PCA: questions cause components FA factor analysis odmiany eksploracyjne i konfirmacyjne budowanie i testowanie modeli powiązań przyczynowo-skutkowych wynik wyrażony w ładunkach czynnikowych analiza wariancji wspólnej z czynnikiem ukrytym (latentnym) syntetyczne (latentne) czynniki mogą być zależne PCA EFA 7/49 PCA principal component analysis Dekompozycja wariancji metoda eksploracyjna działania na danych obserwowanych wynik wyrażony w wagach składowych oparta o dekompozyję wariancji dzielonej przez obserwowane zmienne algorytm iteracyjny preferuje pierwsze składowe analiza całej wariancji wszystkich zmiennych składowe są niezależne (ortogonalne) PCA składowa = linowa kombinacja obserwowanych zmiennych + błąd FA obserwowana zmienna = liniowa kombinacja czynników + błąd Variance = common+ u niqu e + error 6/49 8/49
Solving the number of factors problem is easy, I do it everyday before breakfast. But knowing the right solution is harder Kaiser, 1956 Wartości własne Eigenvalues suma wariancji ze wszystkich zmiennych, w których obecny jest dany czynnik Liczba czynników / składowych 11/49 1. kryterium Kaissera wartość własne (eigenvalues) dla PCA > 1 (nowe kryterium > 0.7) średnia z przekątnej macierzy 2. kryterium wyjaśnionej wariancji 3. kryterium osypiska 4. kryterium minimalnego zasobu zmienności wspólnej 5. kryterium bardzo prostej struktury (VSS) 6. kryterium MAP - (minimum average partial) 7. analiza równoległa Wyjaśniona wariancja Składowa Wartość własna % wariancji % skumulowany 1 3.070 30.702 30.702 2 2.499 24.987 55.689 3 1.210 12.987 67.787 4.803 8.027 75.814 5.740 7.405 83.219 6.480 4.802 88.021 7.434 4.343 92.363 8.293 2.932 95.294 10/49 12/49 9.266 2.659 97.953
50% zasobu zmienności wspólnej Najpierw dane pozycja składowa 1 składowa 2 składowa 3 składowa 4 ZM2 ZM3 ZM4 ATS1 0.688 0.051 0.495 0.054 0.476 0.721 0.724 ATS2 0.686 0.016 0.406 0.229 0.471 0.636 0.688 ATS3-0.502 0.071 0.349 0.697 0.257 0.379 0.865 ATS4 0.677 0.044 0.435 0.235 0.460 0.649 0.705 ATS5-0.72 0.005 0.347 0.270 0.518 0.639 0.712 ATS6-0.639-0.010 0.581 0.328 0.408 0.746 0.854 df <- read.spss("zadowolenie.sav", to.data.frame=t, use.value.labels = F) df <- df[,3:7] colnames(df) <- c("cena", "oferta", "organizacja", "obsługa", "jakość") # zadowolenie z restauracji tail(df) cena oferta organizacja obsługa jakość 577 4 3 3 2 3 578 2 3 3 2 3 579 2 2 4 3 2 580 2 2 3 3 3 581 3 2 2 3 2 582 2 1 4 1 1 ATS7 0.699 0.011-0.168 0.131 0.489 0.517 0.534 ATS8-0.033 0.907-0.012 0.022 0.824 0.824 0.824 14/49 ATS9-0.017 0.926-0.035 0.077 0.858 0.859 0.865 16/49 Macierz kowariancji cov(df) Analiza głównych składowych (PCA) cena oferta organizacja obsługa jakość cena 1.5909884 1.1144963 0.5407018 0.9896197 0.8826292 oferta 1.1144963 1.6225018 0.3244968 1.0312295 0.9348025 organizacja 0.5407018 0.3244968 1.9594608 0.5235552 0.4070361 obsługa 0.9896197 1.0312295 0.5235552 1.7978157 0.7883404 jakość 0.8826292 0.9348025 0.4070361 0.7883404 1.9221540 17/49
Macierz korelacji Założenia 1 - braki danych cor(df) summary(df) cena oferta organizacja obsługa jakość cena 1.0000000 0.6936694 0.3062359 0.5851433 0.5047202 oferta 0.6936694 1.0000000 0.1819908 0.6037959 0.5293382 organizacja 0.3062359 0.1819908 1.0000000 0.2789469 0.2097348 obsługa 0.5851433 0.6037959 0.2789469 1.0000000 0.4240793 jakość 0.5047202 0.5293382 0.2097348 0.4240793 1.0000000 cena oferta organizacja obsługa Min. :1.000 Min. :1.000 Min. :1.000 Min. :1.000 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.000 1st Qu.:2.000 Median :3.000 Median :3.000 Median :3.000 Median :3.000 Mean :3.079 Mean :3.076 Mean :3.192 Mean :3.088 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:4.000 Max. :5.000 Max. :5.000 Max. :5.000 Max. :5.000 jakość Min. :1.000 1st Qu.:2.000 Median :3.000 Mean :3.156 3rd Qu.:4.000 Max. :5.000 18/49 20/49 Houston, mamy problem! Założenia 2 - outliers braki danych wartości nietypowe (outliers) brak normalności rozkładów (przejdzie przy n > 300) wielo-współliniowość zależności >.95 (multicollinearity) heterogeniczność zmiennych (różne wariancje) homoskedastyczność (cutoff = qchisq(p = 1-.001, df = ncol(df))) [1] 20.51501 mahal = mahalanobis(x = df, center = colmeans(df), cov = cov(df)) summary(mahal > cutoff) Mode FALSE logical 582 19/49 21/49
Założenia 2 - wartości wpływające Założenia 3 - normalność random = rchisq(n = nrow(df), 5) fake = lm(random~., data = df) bad_boys <- influence.measures(fake) hist(fake$residuals) Warning in abbreviate(vn): 'abbreviate' użyte ze znakami nie będącymi ASCII summary(bad_boys) Potentially influential observations of lm(formula = random ~., data = df) : dfb.1_ dfb.cena dfb.ofrt dfb.orgn dfb.obsł dfb.jkść dffit cov.r 14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.03_* 60 0.00-0.05 0.04 0.00-0.03 0.04-0.07 1.04_* 76 0.17 0.17-0.02 0.02-0.19-0.18 0.33_* 0.93_* 89 0.03-0.18 0.09 0.12 0.02 0.01 0.25 0.90_* 129-0.11-0.02 0.01 0.11 0.00 0.10 0.20 0.95_* 151 0.14 0.29-0.08-0.01-0.20-0.18 0.39_* 0.95_* 154 0.16-0.16 0.14 0.19-0.14-0.14 0.37_* 0.92_* 22/49 nortest::sf.test(fake$residuals) 24/49 plot(fake, which = 5) Założenia 4 - liniowość qqnorm(rstudent(fake)) abline(0,1) 23/49 25/49
Założenia 5 - homogenniczność loadings(fit) wagi składowe poszczególnych pytań plot(scale(fake$fitted.values),fake$residuals) abline(v = 0) abline(a = 0, b = 0) Loadings: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 cena 0.482 0.125 0.534 0.679 oferta 0.483 0.254 0.150 0.404-0.719 organizacja 0.294-0.945-0.121 obsługa 0.479 0.549-0.676 jakość 0.468 0.172-0.811-0.304 Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 SS loadings 1.0 1.0 1.0 1.0 1.0 Proportion Var 0.2 0.2 0.2 0.2 0.2 Cumulative Var 0.2 0.4 0.6 0.8 1.0 26/49 28/49 Analiza plot(fit,type="lines") # wykres osypiska wg wariancji # usunięcie "złych" wyników bad_boys_indeksy <- which(apply(influence.measures(fake)$is.inf, 1, any)) df <- df[-bad_boys_indeksy,] # analiza fit <- princomp(df) summary(fit) podsumowanie składowych Importance of components: Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Standard deviation 2.2241286 1.3031442 1.0386739 0.84605549 0.6609634 Proportion of Variance 0.5572885 0.1913133 0.1215398 0.08064138 0.0492170 Cumulative Proportion 0.5572885 0.7486018 0.8701416 0.95078300 1.0000000 27/49 29/49
biplot(fit,cex = c(.5,1), choices = c(4,5)) biplot(fit2, main="") 30/49 32/49 PCA z rotacją Rotacje dla principal() fit2 <- psych::principal(df, nfactors=3, rotate="varimax") fit2 none varimax Principal Components Analysis Call: psych::principal(r = df, nfactors = 3, rotate = "varimax") Standardized loadings (pattern matrix) based upon correlation matrix RC1 RC3 RC2 h2 u2 com cena 0.76 0.39 0.18 0.76 0.2377 1.6 oferta 0.80 0.40 0.00 0.81 0.1947 1.5 organizacja 0.14 0.10 0.98 0.99 0.0071 1.1 obsługa 0.87 0.07 0.17 0.80 0.2016 1.1 jakość 0.29 0.93 0.11 0.95 0.0456 1.2 RC1 RC3 RC2 SS loadings 2.10 1.18 1.04 Proportion Var 0.42 0.24 0.21 Cumulative Var 0.42 0.66 0.86 Proportion Explained 0.49 0.27 0.24 Cumulative Proportion 0.49 0.76 1.00 Mean item complexity = 1.3 Test of the hypothesis that 3 components are sufficient. The root mean square of the residuals (RMSR) is 0.07 with the empirical chi square 61.24 with prob < NA Fit based upon off diagonal values = 0.98 31/49 quatimax promax oblimin simplimax cluster 33/49
df2 <- read.csv("inteligencja.csv", sep=";") head(df2) 34/49 VisualPerception Cubes PaperFormBoard Flags VisualPerception 1.000 0.318 0.403 0.468 Cubes 0.318 1.000 0.317 0.230 PaperFormBoard 0.403 0.317 1.000 0.305 Flags 0.468 0.230 0.305 1.000 GeneralInformation 0.321 0.285 0.247 0.227 PargraphComprehension 0.335 0.234 0.268 0.327 GeneralInformation PargraphComprehension VisualPerception 0.321 0.335 Cubes 0.285 0.234 PaperFormBoard 0.247 0.268 Flags 0.227 0.327 GeneralInformation 1.000 0.622 PargraphComprehension 0.622 1.000 SentenceCompletion WordClassification WordMeaning VisualPerception 0.304 0.332 0.326 Cubes 0.157 0.157 0.195 PaperFormBoard 0.223 0.382 0.184 Flags 0.335 0.391 0.325 36/49 Very Simple Structure i kryterium MAP MAP - minimum average partial kryterium VSS(df2, n = 8, n.obs = 145, plot=f) Analiza czynnikowa (EFA) Very Simple Structure Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, n.obs = n.obs, plot = plot, title = title, use = use, cor = cor) VSS complexity 1 achieves a maximimum of 0.8 with 1 factors VSS complexity 2 achieves a maximimum of 0.85 with 2 factors The Velicer MAP achieves a minimum of 0.02 with 4 factors BIC achieves a minimum of -731.36 with 3 factors Sample Size adjusted BIC achieves a minimum of -112 with 5 factors Statistics by number of factors vss1 vss2 map dof chisq prob sqresid fit RMSEA BIC SABIC complex 1 0.80 0.00 0.025 252 626 8.0e-34 16.8 0.80 0.107-628 170 1.0 2 0.55 0.85 0.022 229 428 3.1e-14 12.7 0.85 0.084-711 13 1.5 3 0.46 0.79 0.017 207 299 3.0e-05 10.0 0.88 0.062-731 -76 1.8 4 0.42 0.74 0.017 186 228 1.9e-02 8.0 0.90 0.048-698 -109 1.9 5 0.40 0.71 0.021 166 189 1.1e-01 7.2 0.91 0.041-637 -112 2.0 6 0.40 0.71 0.024 147 162 1.8e-01 6.3 0.92 0.038-569 -104 2.0 7 0.40 0.70 0.028 129 138 2.7e-01 5.6 0.93 0.036-504 -95 2.2 8 0.41 0.70 0.030 112 111 5.0e-01 5.0 0.94 0.027-446 -92 2.3 echisq SRMR ecrms ebic 1 748 0.097 0.101-506 37/49
fa.parallel(df2, n.obs = 145) Very Simple Structure Call: vss(x = df2, n = 8, n.obs = 145) VSS complexity 1 achieves a maximimum of 0.8 with 1 factors VSS complexity 2 achieves a maximimum of 0.85 with 2 factors The Velicer MAP achieves a minimum of 0.02 with 4 factors BIC achieves a minimum of -731.36 with 3 factors Sample Size adjusted BIC achieves a minimum of -112 with 5 factors Statistics by number of factors 38/49 Parallel analysis suggests that the number of factors = 4 and the number of components = 3 40/49 Analiza równoległa Kryterium jakościowe Najbardziej odporną (obiektywną) procedurą określającą liczbę czynników jest PA - parallel analysis, która wyznacza liczbę czynników w danej macierzy w porównaniu do macierzy na danych losowych. Wyznacza ona kolejne czynniki dotąd, aż wartości własne czynników wynikające z danych są mniejsze, niż wartości własne losowego zbioru danych o tej samej wielkości. Czynników jest tyle ile można zinterpretować ;-) ładunki / wagi >.3 co najmniej 1 czynnik dominujący każdy czynnik ma 3 pozycje minimum RMSEA/RMR <.06 doskonale, <.08 dobrze GFI, AGFI, CFI, TLI, NNFI >.95 doskonale, >.90 dobrze α i ω >.7 39/49 41/49
Testy założeń: sferyczność cortest.bartlett(df2, 145) Eksploracyjna analiza czynnikowa $chisq [1] 1545.862 $p.value [1] 2.399561e-175 $df [1] 276 cortest.normal(df2, n1 = 145) Tests of correlation matrices Call:cortest.normal(R1 = df2, n1 = 145) Chi Square value 4797.49 with df = 276 with probability < 0 44/49 Testy założeń: adekwatność fit2 <- fa(df2, nfactors = 4, n.obs=145) print(fit2, digits=2, sort=t) # odpowiednik fa.sort(), ręcznie przez fa.order() Pożądane są wartości zbliżone do 1, minimalny próg wynosi 0.5 KMO(r = df2) Kaiser-Meyer-Olkin factor adequacy Call: KMO(r = df2) Overall MSA = 0.88 MSA for each item = VisualPerception Cubes PaperFormBoard 0.90 0.84 0.78 Flags GeneralInformation PargraphComprehension 0.85 0.88 0.89 SentenceCompletion WordClassification WordMeaning 0.89 0.92 0.88 Addition Code CountingDots 0.81 0.85 0.84 StraightCurvedCapitals WordRecognition NumberRecognition 0.89 0.85 0.88 FigureRecognition ObjectNumber NumberFigure 0.89 0.85 0.88 FigureWord Deduction NumericalPuzzles 0.83 0.93 0.91 ProblemReasoning SeriesCompletion ArithmeticProblems 0.93 0.91 0.92 43/49 Factor Analysis using method = minres Call: fa(r = df2, nfactors = 4, n.obs = 145) Standardized loadings (pattern matrix) based upon correlation matrix item MR1 MR3 MR2 MR4 h2 u2 com SentenceCompletion 7 0.87 0.01 0.05-0.10 0.73 0.27 1.0 WordMeaning 9 0.86-0.02-0.08 0.07 0.74 0.26 1.0 PargraphComprehension 6 0.80 0.00-0.06 0.09 0.68 0.32 1.0 GeneralInformation 5 0.76 0.01 0.11-0.02 0.64 0.36 1.0 WordClassification 8 0.56 0.22 0.11-0.01 0.51 0.49 1.4 Deduction 20 0.33 0.31-0.04 0.21 0.42 0.58 2.7 ProblemReasoning 22 0.31 0.30-0.01 0.20 0.40 0.60 2.7 VisualPerception 1 0.04 0.69 0.04 0.06 0.55 0.45 1.0 PaperFormBoard 3 0.09 0.54-0.15 0.06 0.34 0.66 1.2 Flags 4 0.18 0.52-0.04-0.02 0.35 0.65 1.2 Cubes 2 0.05 0.46-0.02 0.01 0.23 0.77 1.0 SeriesCompletion 23 0.30 0.44 0.08 0.10 0.51 0.49 2.0 NumericalPuzzles 21 0.07 0.37 0.33 0.10 0.42 0.58 2.2 Addition 10 0.08-0.16 0.86 0.04 0.74 0.26 1.1 CountingDots 12-0.10 0.22 0.70-0.02 0.55 0.45 1.2 Code 11 0.06 0.01 0.49 0.30 0.47 0.53 1.7 StraightCurvedCapitals 13 0.07 0.42 0.46-0.06 0.51 0.49 2.1 ArithmeticProblems 24 0.29 0.07 0.41 0.17 0.49 0.51 2.2 ObjectNumber 17 0.04-0.08 0.15 0.59 0.41 0.59 1.2 WordRecognition 14 0.14-0.11 0.00 0.58 0.36 0.64 1.2 NumberRecognition 15 0.04-0.01-0.01 0.55 0.31 0.69 1.0 FigureRecognition 16-0.05 0.33-0.09 0.52 0.45 0.55 1.8 NumberFigure 18-0.12 0.25 0.25 0.43 0.41 0.59 2.5 45/49
Wykres czynnik 1 x czynnik 2 Wskaźnik dopasowania CFI ld <- fit2$loadings[,c(1,3)] plot(ld, pch = 20, cex=.5, col="red", xlim = c(0,1), ylim = c(0,1)) text(ld+.03,labels=rownames(ld),cex=.7) # nazwy, lekko w górę 1 - ((fit2$statistic - fit2$dof)/(fit2$null.chisq - fit2$null.dof)) [1] 0.9668969 46/49 48/49 Wykres czynnik 1 x czynnik 3 Na deser ld <- fit2$loadings[,c(3,2)] plot(ld, pch = 20, cex=.5, col="red", xlim = c(0,1), ylim = c(0,1)) text(ld+.03,labels=rownames(ld),cex=.7) # nazwy, lekko w górę fa.diagram(fit2) # A stąd już tylko krok do równań strukturalnych :-D ld <- fit2$loadings[,c(2,4)] plot(ld, pch = 20, cex=.5, col="red", xlim = c(0,1), ylim = c(0,1)) text(ld+.03,labels=rownames(ld),cex=.7) # nazwy, lekko w górę 47/49 49/49