29  Faktoranalüüs

Tunnuste vahel esineb peaaegu alati korrelatsioon, mis ühtlasi viitab tunnuste jagatud hajuvusele. Selle ühise hajuvuse arvutamiseks ja mõtestamiseks on palju võimalusi. Üks lähenemine on koondada võimalikult suur osa hajuvusest esimestesse peakomponentidesse, mis on sel juhul laetud tunnuste poolt. Faktoranalüüsi lähenemine on aga teatud mõttes vastupidine. Selle käigus leitavaid faktorid käsitletakse varjatud tunnustena, mis seletavad hoopis analüüsi kaasatud tunnuseid.

Important

Faktoranalüüsi (factor analysis) käigus leitakse tunnuste ühise hajuvuse alusel faktorid.

Faktorid on selles tähenduses varjatud muutujad (latent variables), mis seletavad olemasolevaid tunnuseid.

Faktorid niisiis andmetes eraldi tunnustena ei esine. Oletame, et need on tegelikult olemas, esinevad teatud määral olemasolevates tunnustes ja nende alusel tuletatavad. Iga faktor on niisiis seotud ainult teatud tunnustega.

Enamasti kasutatakse faktoranalüüsi andmete esialgseks uurimiseks, sest sellel puudub paljude arvutusviiside tõttu üksainus ja nö õige lahendus. Siiski on olemas erinevaid protseduure nende lahenduste testimiseks ja kinnitamiseks, mille võib kokku võtta mõistega struktuurvõrrandite mudelid.

Uurime järgnevalt surmapõhjuste osakaale maailma riikides. Võime oletada, et erinevate põhjuste taga võivad olla samad varjatud tunnused, mille kohta meil või üleüldse andmeid ei ole.

surm <- read.csv('andmed/deathcause.csv')
rownames(surm) <- surm$Country.Name
surm$Country.Name <- NULL
str(surm)
'data.frame':   191 obs. of  31 variables:
 $ Covid.19.Deaths             : num  0.01002 0.05055 0.01416 0.12519 0.00019 ...
 $ Cardiovascular.diseases     : num  0.282 0.552 0.502 0.252 0.148 ...
 $ Respiratory.diseases        : num  0.0322 0.0349 0.0386 0.0581 0.0227 ...
 $ Kidney.diseases             : num  0.0257 0.0141 0.042 0.0238 0.0142 ...
 $ Neonatal.disorders          : num  0.10787 0.00689 0.04489 0 0.10493 ...
 $ Meningitis                  : num  0.007114 0.000556 0.001497 0 0.014538 ...
 $ Malaria                     : num  0.00241 0 0 0 0.06221 ...
 $ Interpersonal.violence      : num  0.02283 0.00244 0.00235 0 0.00562 ...
 $ HIV.AIDS                    : num  1.45e-03 8.56e-05 1.35e-03 4.47e-03 9.69e-02 ...
 $ Tuberculosis                : num  0.016508 0.000471 0.002281 0 0.067796 ...
 $ Maternal.disorders          : num  0.018378 0.000128 0.003271 0 0.011936 ...
 $ Lower.respiratory.infections: num  0.0851 0.0196 0.0297 0.0298 0.0737 ...
 $ Alcohol.use.disorders       : num  0.000669 0.00077 0.000569 0.00149 0.001217 ...
 $ Diarrheal.diseases          : num  0.01966 0.0003 0.0027 0.00149 0.07463 ...
 $ Poisoning                   : num  0.002389 0.000471 0.0018 0 0.002498 ...
 $ Nutritional.deficiencies    : num  0.005662 0.000214 0.000584 0 0.017393 ...
 $ Alzheimer.s.disease         : num  0.00808 0.03925 0.02671 0.05365 0.00659 ...
 $ Parkinson.s.disease         : num  0.00255 0.01061 0.00658 0.01043 0.00154 ...
 $ Acute.hepatitis             : num  8.83e-03 4.28e-05 1.33e-03 1.49e-03 1.42e-03 ...
 $ Digestive.diseases          : num  0.0315 0.0226 0.0328 0.0402 0.0518 ...
 $ Liver.diseases              : num  0.0173 0.0143 0.0207 0.0179 0.0327 ...
 $ Protein.energy.malnutrition : num  0.005507 0.000128 0.000472 0 0.016764 ...
 $ Neoplasms                   : num  0.0967 0.2014 0.1221 0.3428 0.0738 ...
 $ Fire..heat                  : num  0.00221 0.00077 0.00401 0 0.00296 ...
 $ Drowning                    : num  0.00768 0.00154 0.0027 0 0.00457 ...
 $ Drug.use.disorders          : num  0.001848 0.001241 0.002697 0 0.000462 ...
 $ Road.injuries               : num  0.0376 0.0104 0.0567 0.0119 0.0534 ...
 $ Heat.and.cold               : num  0.000269 0.000171 0.000205 0 0.000658 ...
 $ Self.harm                   : num  0.00734 0.00651 0.00777 0.01192 0.01112 ...
 $ Conflict.and.terrorism      : num  1.11e-01 0.00 6.67e-05 0.00 9.23e-05 ...
 $ Diabetes                    : num  0.02192 0.00749 0.02732 0.01341 0.02327 ...

29.1 Faktormudel

Faktoranalüüsi käsitluses laadivad tunnuseid faktorid ehk mingid varjatud tunnused. Seega saame faktormudeli abil selgitada iga tunnuse väärtusi faktorite kordajate lineaarsete kombinatsioonidena:

\[x_j = q_{jl} F_l + U_j +\mu_j,\] kus

  • \(x_j\) on tunnus \(j\),
  • \(q_{jl}\) on \(j\)nda tunnuse \(l\)nda faktori kordaja,
  • \(F_l\) on \(l\)ndas faktor,
  • \(U_j\) on ainult \(j\)ndale tunnusele omane (unikaalne) hajuvus ja
  • \(\mu_j\) on tunnuse \(x_j\) keskmine väärtus.

Enne faktoranalüüsi kajastavad tunnuste väärtused ainult tunnustele omast hajuvust \(U_j\) koos tunnuse keskmisega \(\mu_j\). Faktoranalüüsi tulemusel eraldatakse sellest faktor \(q_{jl} F_l\), mida saame seejärel kirjeldada. Faktorite arvutamiseks kasutatakse tunnustevahelisi korrelatsioone, millest faktorite tuletamiseks on mitu viisi.

Kuigi R keeles on funktsioon factanal(), siis palju rohkem võimalusi pakub funktsioon fa() laiendusest psych.

library('psych')
faktorid <- fa(surm, nfactors = 7, rotate = 'none')
Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect.  Try a
different factor score estimation method.
Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, : An
ultra-Heywood case was detected.  Examine the results carefully

29.2 Faktorite arv

Sobiva arvu faktorite määramisel võib jällegi kasutada samasid põhimõtteid, mida peakomponentide analüüsi korral. Kuna faktoranalüüs on mõneti loomingulisem, siis võib vabamalt läheneda ka faktorite valikule. Näiteks võib lähtuda faktorite kordajatest või unikaalsusest. Kui mõnel tunnusel on väga kõrge unikaalsus, siis faktorite lisamine võib aidata sellist tunnust lisanduva faktori abil seletada.

Samuti saab välja selgitada sobiva faktorite arv funktsiooni fa.parallel() abil. Lisaks joonisele nimetatakse sellisel juhul sobivaim faktorite arv ka käsureal.

fa.parallel(surm)
Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect.  Try a
different factor score estimation method.

Parallel analysis suggests that the number of factors =  7  and the number of components =  6 

Joonisele järgnevast sõnumist saame järeldada, et sobivaim faktorite arv ette antud andmete analüüsimiseks on 7.

29.3 Pööramine

Faktoranalüüsi eesmärgiks on enamasti saada sellised faktorid, millest igaüks seletaks võimalikult täpselt konkreetse tunnuse väärtusi nii, et iga tunnus saaks kokkuvõtteks seletatud. Selleks pööratakse algset faktorikordajate maatriksit nii, et faktorid oleksid teineteisest erinevad. Kuna pööramiseks on palju erinevaid viise, millest igaüks annab enamasti erineva tulemuse, siis toob see analüüsi erapoolikust. Teisalt lihtsustab pööramine tavaliselt faktorite tõlgendamist.

Enamasti rakendatakse ühte kolmest alljärgnevast pööramisest. Sealjuures tasub tähele panna, et faktorite täisnurksust säilitatavate pööramistega kaasnevad eripärasemad faktorid, aga faktorid ise ei ole nii palju seotud konkreetsete tunnustega.

  • Varimax pööramise korral maksimeeritakse kordajate ruutude hajuvust faktorite siseselt. Faktorite vahel puudub korrelatsioon. Selle tulemusel on igal faktor seotud võimalikult väheste tunnustega.
  • Oblimin pööramisel maksimeeritakse samuti kordajate ruutude hajuvust faktorite siseselt, aga selliselt, et faktorite vahel võib olla ka korrelatsioon. Võrreldes varimax pööramisega on tulemuseks küll mitte nii selgelt eristuvad faktorid, aga faktorite siseselt eristuvad selgemalt tunnused.
  • Quartimax pööramise eesmärk on maksimeerida faktori kordajate ruutude hajuvust erinevalt eelnevatest hoopis tunnuste siseselt. Selle tulemusel on iga tunnus seotud võimalikult väheste faktoritega.

Soovitud pööramise saame faktorite arvutamisel täpsustada argumendiga rotate. Näiteks tavapäraselt kasutatavat Varimax pööramist 7 faktori leidmiseks saame rakendada alljärgnevalt.

faktorid <- fa(surm, nfactors = 7, rotate = 'varimax')
Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect.  Try a
different factor score estimation method.
Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, : An
ultra-Heywood case was detected.  Examine the results carefully

29.4 Eeldused

Üldiselt kehtivad faktoranalüüsil samad eeldused, mis peakomponentide analüüsi puhul. Veelgi olulisem on aga veenduda selles, et tunnuste vaheline jagatud hajuvus on piisav selleks, et

  • andmepilv ei ole sfääriline (sphericity) ja
  • andmetabel sobib faktoranalüüsiks (sampling adequacy).

Nende kahe eelduse testimiseks saab kasutada vastavalt funktsioone cortest.bartlett() ja KMO() laiendusest psych.

Veendumaks, et andmepilv ei ole sfääriline, saame testida, kas andmetes esinevad korrelatsioonid on üldistatavad. Selleks saame kasutada Bartletti testi korrelatsioonimaatriksi hindamiseks.

korrel <- cor(surm, use = 'pairwise.complete.obs')
cortest.bartlett(korrel, n = nrow(surm))
$chisq
[1] 6618.6

$p.value
[1] 0

$df
[1] 465

Kuna saadud p-väärtus on madalam kui \(\alpha = 0.05\), siis võime järeldada, et andmetes esinevad korrelatsioonid on piisavalt suured.

Andmetabeli sobivus faktoranalüüsiks seisneb sellest, et kasutatavad tunnused on üldse seletatavad faktorite poolt ja ei ole seotud ainult enda faktoriga ega unikaalsed. Seda saame hinnata KMO mõõdiku abil (Kaiser-Meyer-Olkin measure). Mõõdiku väärtus on vahemikus \(0...1\), kus kõrgem väärtus näitab, et suurem osa hajuvusest on tingitud faktoritest.

KMO(surm)
Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = surm)
Overall MSA =  0.24
MSA for each item = 
             Covid.19.Deaths      Cardiovascular.diseases 
                        0.08                         0.19 
        Respiratory.diseases              Kidney.diseases 
                        0.05                         0.08 
          Neonatal.disorders                   Meningitis 
                        0.32                         0.62 
                     Malaria       Interpersonal.violence 
                        0.24                         0.05 
                    HIV.AIDS                 Tuberculosis 
                        0.13                         0.29 
          Maternal.disorders Lower.respiratory.infections 
                        0.55                         0.21 
       Alcohol.use.disorders           Diarrheal.diseases 
                        0.20                         0.30 
                   Poisoning     Nutritional.deficiencies 
                        0.74                         0.70 
         Alzheimer.s.disease          Parkinson.s.disease 
                        0.26                         0.71 
             Acute.hepatitis           Digestive.diseases 
                        0.83                         0.09 
              Liver.diseases  Protein.energy.malnutrition 
                        0.12                         0.81 
                   Neoplasms                   Fire..heat 
                        0.27                         0.68 
                    Drowning           Drug.use.disorders 
                        0.22                         0.12 
               Road.injuries                Heat.and.cold 
                        0.05                         0.71 
                   Self.harm       Conflict.and.terrorism 
                        0.05                         0.02 
                    Diabetes 
                        0.05 

Näeme, et esineb palju surmapõhjuseid, mille korral KMO mõõdiku väärtus on \(<0.6\). Seega need tunnused ei ole faktoritega seletatavad ega sobi seega faktoranalüüsi jaoks.

29.5 Tõlgendamine

Lähtudes faktormudelist näitavad faktorite kordajad iga faktori mõju tunnusele. Nii on need kordajad tähenduselt mingil määral sarnased regressioonmudeli kordajatele, kus kordaja märk näitab seose suunda ja absoluutväärtus seose tugevust. Sageli võetakse arvesse ainult neid kordajaid mille väärtus on kõrgem kui nt 0,3 või 0,5 selleks, et iga faktor oleks selgemini seotud konkreetsete tunnustega või vastupidi.

Kordajad saame kätte faktori objekti osisest loadings. Sealjuures tuleks faktorite järjestamisel lähtuda seletatud hajuvusest, mitte veeru päises olevast numbrist.

faktorid <- fa(surm, nfactors = 7, rotate = 'oblimin')
Loading required namespace: GPArotation
Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, : I
am sorry, to do these rotations requires the GPArotation package to be
installed
Warning in fa.stats(r = r, f = f, phi = phi, n.obs = n.obs, np.obs = np.obs, :
The estimated weights for the factor scores are probably incorrect.  Try a
different factor score estimation method.
Warning in fac(r = r, nfactors = nfactors, n.obs = n.obs, rotate = rotate, : An
ultra-Heywood case was detected.  Examine the results carefully
faktorid$loadings

Loadings:
                             MR1    MR2    MR3    MR4    MR5    MR6    MR7   
Covid.19.Deaths              -0.386                             -0.283  0.325
Cardiovascular.diseases      -0.632  0.283  0.282 -0.434 -0.233 -0.275 -0.272
Respiratory.diseases         -0.241        -0.106        -0.211  0.458 -0.162
Kidney.diseases              -0.229  0.277 -0.645  0.228  0.177              
Neonatal.disorders            0.922 -0.110                                   
Meningitis                    0.889 -0.258                                   
Malaria                       0.732 -0.255                                   
Interpersonal.violence        0.144  0.302 -0.305  0.235  0.337 -0.166       
HIV.AIDS                      0.499                       0.192              
Tuberculosis                  0.839                                          
Maternal.disorders            0.891 -0.138                                   
Lower.respiratory.infections  0.681 -0.227 -0.101  0.194         0.180       
Alcohol.use.disorders        -0.251  0.376  0.381  0.194  0.460              
Diarrheal.diseases            0.855 -0.212                                   
Poisoning                     0.762  0.165  0.319 -0.177                     
Nutritional.deficiencies      0.748 -0.165         0.194  0.197              
Alzheimer.s.disease          -0.719 -0.445  0.147  0.231                0.100
Parkinson.s.disease          -0.799 -0.426         0.195         0.201       
Acute.hepatitis               0.621               -0.128 -0.324  0.156       
Digestive.diseases                   0.525  0.187  0.765 -0.296              
Liver.diseases                0.200  0.676  0.147  0.460 -0.353              
Protein.energy.malnutrition   0.742 -0.173         0.191  0.208              
Neoplasms                    -0.808 -0.361  0.164  0.162  0.109  0.213       
Fire..heat                    0.496  0.314        -0.396  0.176  0.106  0.118
Drowning                      0.230  0.506 -0.263 -0.145         0.291 -0.248
Drug.use.disorders           -0.257         0.150 -0.187         0.285  0.317
Road.injuries                 0.200  0.346 -0.263 -0.352         0.170  0.532
Heat.and.cold                        0.383  0.782         0.278              
Self.harm                    -0.170  0.248  0.211         0.286  0.429       
Conflict.and.terrorism        0.121               -0.233 -0.165              
Diabetes                     -0.125  0.256 -0.639         0.180        -0.250

                  MR1   MR2   MR3   MR4   MR5   MR6   MR7
SS loadings    10.257 2.740 2.225 1.841 1.191 0.972 0.797
Proportion Var  0.331 0.088 0.072 0.059 0.038 0.031 0.026
Cumulative Var  0.331 0.419 0.491 0.550 0.589 0.620 0.646

Kordajate alusel saame muuhulgas anda faktoritele tähenduse.

  1. Esimene faktor võiks iseloomustada arsiabi kättesaamatust, kuna suurendab eelkõige nakkushaiguste ja lihtsamini ravitavate surmapõhjuste esinemist, vähendades samal ajal vanadusega seotud haigustesse suremist.
  2. Teine faktor suurendab muuhulgas õnnetustega seotud surmapõhjusi ja vähendab vanadusega seotud surmapõhjuste esinemist, nii et see võiks iseloomustada elukeskkonna ohtlikkust. Samas ei ole see iseloomustus päris täpne, sest kõige suurem on selle faktori mõju hoopis suremusel maksahaiguste tõttu.
  3. Kolmas faktor suurendab kuumast ja külmast keskkonnast tingitud surmasid ja (alkoholi) mürgitust, aga vähendab suremist maksahaiguste ja diabeedi tõttu.

Üks viis faktorite kordajaid joonistada on kasutada seosekaarti.

library('gplots')
heatmap.2(faktorid$loadings, col = 'bluered', margins = c(4,12))

Teine võimalus on kuvada tunnused ja faktorid ning nende vahelised seosed joontena, millel on kordajad.

fa.diagram(faktorid)

Sarnaselt peakomponentide analüüsile saame ka faktoranalüüsis leida igale vaatlusele nende paiknemise faktori skaalal ehk faktorskoorid (factor scores).

head(faktorid$scores)
                           MR1        MR2        MR3        MR4        MR5
Afghanistan          1.2837410 -0.1114036 -0.8188728 -1.7174264 -1.3218726
Albania             -0.9621016 -1.0332814  0.5246546 -1.5734375 -0.8608276
Algeria             -0.3205165  0.3941513  0.2469887 -1.8875429 -1.4263518
Andorra             -0.3191040 -1.6884350 -1.9617702  1.0227512  1.6965491
Angola               1.7674327 -0.1049126  0.1219444  0.3027988 -0.1638401
Antigua and Barbuda -0.2872706  0.1574415 -1.9210794  0.5530720  2.1891926
                           MR6        MR7
Afghanistan          0.7131453  0.7246590
Albania             -1.1414748 -0.9942366
Algeria             -0.6594341 -0.1066433
Andorra              0.8659360  3.5498961
Angola               0.1329637  0.7311467
Antigua and Barbuda  0.1021627  0.5483677

Võttes aluseks eelneva faktorite iseloomustuse, võime öelda nt, et Afganistaanis ja Angolas on keskmisest kõrgem arstiabi kättesaamatus ehk halvem arstiabi kättesaadavus.

Iga tunnuse kohta saame arvutada unikaalsuse (uniqueness), mis näitab faktorite poolt seletamata jäänud osa tunnuse hajuvusest. Kommunaliteet (communality) on selle pöördväärtus ja näitab seega, kui suur osa tunnuse hajuvusest on seletatav faktoritega.

sort(faktorid$uniqueness)
          Digestive.diseases      Cardiovascular.diseases 
                -0.001210907                  0.048529385 
         Parkinson.s.disease                    Neoplasms 
                 0.099186554                  0.105436732 
                  Meningitis           Neonatal.disorders 
                 0.127442251                  0.132623516 
              Liver.diseases                Heat.and.cold 
                 0.140368041                  0.152130049 
          Maternal.disorders          Alzheimer.s.disease 
                 0.180847557                  0.190689824 
          Diarrheal.diseases                    Poisoning 
                 0.205641250                  0.248135643 
                Tuberculosis                Road.injuries 
                 0.260812244                  0.328503356 
    Nutritional.deficiencies  Protein.energy.malnutrition 
                 0.330606990                  0.331549171 
             Kidney.diseases                      Malaria 
                 0.368355321                  0.386910786 
       Alcohol.use.disorders Lower.respiratory.infections 
                 0.399582764                  0.400298334 
                    Diabetes                   Fire..heat 
                 0.412819988                  0.440951462 
                    Drowning              Acute.hepatitis 
                 0.446291963                  0.468876556 
      Interpersonal.violence                    Self.harm 
                 0.591559198                  0.596473265 
        Respiratory.diseases              Covid.19.Deaths 
                 0.641325972                  0.644943281 
          Drug.use.disorders                     HIV.AIDS 
                 0.691896473                  0.708052925 
      Conflict.and.terrorism 
                 0.897567476 

Näeme, et kõige vähem seletavad faktorid surmasid terrorismi ja sarnaste konfliktide tõttu (Conflict.and.terrorism). Kõige paremini seletavad faktorid aga seedimisega seotud surmapõhjuste esinemist (Digestive.diseases).

Tunnuse keerukuse (complexity) saab leida samuti iga tunnuse kohta ja see näitab faktorite arvu, mis antud tunnust mõjutavad.

sort(faktorid$complexity)
          Neonatal.disorders           Maternal.disorders 
                    1.039504                     1.066057 
                Tuberculosis           Diarrheal.diseases 
                    1.100237                     1.173406 
                  Meningitis                      Malaria 
                    1.210875                     1.289432 
                    HIV.AIDS     Nutritional.deficiencies 
                    1.346614                     1.416843 
 Protein.energy.malnutrition                    Poisoning 
                    1.455460                     1.620001 
Lower.respiratory.infections              Acute.hepatitis 
                    1.634290                     1.760045 
               Heat.and.cold                    Neoplasms 
                    1.790406                     1.791195 
         Parkinson.s.disease                     Diabetes 
                    1.832446                     1.952125 
         Alzheimer.s.disease              Kidney.diseases 
                    2.116485                     2.149664 
          Digestive.diseases         Respiratory.diseases 
                    2.340790                     2.569134 
      Conflict.and.terrorism               Liver.diseases 
                    2.679955                     2.721305 
             Covid.19.Deaths                   Fire..heat 
                    3.159435                     3.245938 
                   Self.harm                     Drowning 
                    3.447885                     3.617551 
               Road.injuries        Alcohol.use.disorders 
                    3.860604                     3.943862 
     Cardiovascular.diseases           Drug.use.disorders 
                    4.073304                     4.165440 
      Interpersonal.violence 
                    4.903432 

Näeme, et kui vastsündinu surmade (Neonatal.disorders) seletamiseks piisab ühest faktorist, siis isikutevaheline vägivald (Interpersonal.violence) on seotud peaaegu viie faktoriga.

Kahte faktorit ja vaatluste paiknemist nende suhtes saame korraga kujutada hajuvusjoonisel.

biplot(faktorid$scores[, 1:2],  loadings(faktorid), cex = .5)