27 Эксплораторный факторный анализ

Он же exploratory factor analysis.

27.1 Математическая модель эскплораторного факторного анализа

У нас есть все та же матрица наблюдений \(\boldsymbol{X}^\mathrm{T}= (\boldsymbol{X}_1 \, \boldsymbol{X}_2 \, \dots \boldsymbol{X}_k)\), только мы ее транспонировали для будущего удобства. Мы предполагаем, что под нашими наблюдениями спрятаны некие факторы в количестве \(p\) штук, \(p < k\). Их мы также можем оформить в матрицу \(\boldsymbol{F}^\mathrm{T}=(\boldsymbol{F}_1 \, \boldsymbol{F}_2 \, \dots \boldsymbol{F}_p)\). Эти факторы объясняют имеющиеся переменные. Делают это они следующим образом:

\[ \boldsymbol{X}_i = a_{i1} \boldsymbol{F}_1 + a_{i2} \boldsymbol{F}_ 2 + \dots + a_{ip} \boldsymbol{F}_p + \boldsymbol{U}_i, \; 1≤i≤k \]

\[ \boldsymbol{X}= \boldsymbol{A}\boldsymbol{F}+ \boldsymbol{U}, \\ \boldsymbol{A}= (a_{ij}),\; 1≤i≤k, \; 1≤j≤p, \\ \boldsymbol{U}^\mathrm{T}= (\boldsymbol{U}_1 \, \boldsymbol{U}_2 \dots \boldsymbol{U}_k) \]

Здесь \(U\) — то, что не удалось объяснить факторами (остатки, уникальность, uniqueness).

Также выдвигаем ряд дополнительных предположения для формализации требования и упрощения вычислений:

  1. \(\mathbb{E} \boldsymbol{X}= 0\). Так сделать можно, так как мы все равно будем стандартизировать переменные, и математическое ожидание обратиться в ноль.
  2. \(\mathrm{corr}(\boldsymbol{F}_j, \boldsymbol{F}_t) = 0, \; ∀j\,∀t, \;j≠t, \; 1≤j≤p, \; 1≤t≤p\). То есть хотим, чтобы факторы были независимы (некоррелированы).
  3. \(\mathrm{var}(\boldsymbol{F})=\boldsymbol{I}\). Если «истинная» дисперсия факторов будет отличаться от единицы, то разница уйдет в матрицу A.
  4. \(\mathrm{corr}(\boldsymbol{U}_i, \boldsymbol{U}_r) = 0; \;\; \mathrm{corr}(\boldsymbol{U}_i, \boldsymbol{F}_j) = 0,\; ∀i\,∀r\,∀j, i \neq r, \; 1≤i≤k, \; 1≤r≤k, \; 1≤j≤p\). Ну, они же все-таки уникальности.

Элементы матрицы \(\boldsymbol{A}\) называются факторными нагрузками (factor loadings). Элементы вектора \(\boldsymbol{U}\) называются уникальными факторами (specific variates).

Теперь об информативности. Аналогично PCA, возьмем в качестве меры информативности дисперсию. Мы хотим узнать, насколько хорошо факторы объясняют исходные переменные. Дисперсия переменных будет складываться из следующего:

\[ \mathrm{var}(\boldsymbol{X}_i) = \sum_{j=1}^p a^2_{ij} + \mathrm{var}(\boldsymbol{U}_i) \]

То есть, чем больше уникальность (uniqueness) — часть дисперсии переменной, объясненной уникальными факторами — тем хуже наши факторы объясняют переменную. Что делать? Либо подобрать другую модель (изменить количество факторов), либо не брать такую переменную в факторный анализ…

Однако в факторном анализе есть еще одна интересная деталь. Мы работаем с выборочными корреляциями. По этой причине мы не можем подобрать единственно верное решение задачи факторного анализа. Матрица факторных нагрузок определена до ортогонального преобразования (по-русски, вращения). То есть у нас есть множество решений, которые отличаются друг от друга поворотом, и мы можем выбирать самое «симпатишное».

За такую неопределенность факторный анализа часто критикуют. Да и вообще, как вы могли заметить, в факторном анализе субъективность чуть ли не на каждом шагу.

27.1.1 Вращение факторов (factor rotation)

Вращать вообще-то не обязательно. Если хочется, чтобы все было похоже на PCA, то можно ввести дополнительное условие, чтобы матрица \(\boldsymbol{A}^\mathrm{T}\text{diag}(\mathrm{var}(\boldsymbol{U}))\boldsymbol{A}\) быда диагональной и элементы на её главной диагонали стояли в убывающем порядке.

Но, господи, вращать это же весело!

Поэтому придумали много всяких разных вариантов вращения. Самый популярный — varimax. Его идея состоит в том, чтобы найти наиболее «контрастное» решение — чтобы значения факторов были или большими, или маленькими. Эта логика хорошо согласуется с тем, что мы хотели, чтобы каждый фактор описывал что-то своё. Попутно мы минимизируем количество переменных, которые имеют высокую нагрузку на каждый фактор. Работает varimax по следуюшей математической модели:

\[ \cases{ a_2 + b_ 2 \rightarrow \max \\ a + b = 1 } \]

Коротенечко о других вращениях:

  • quartimax — минимизирует количество факторов, необходимых для объяснения каждой переменной
  • equamax — количество переменных, сильно нагружающих фактор, и количество факторов, необходимых для объяснения переменных, минимальны
  • promax — наклонное вращение, позволяющее коррелировать факторы

27.2 Реализация EFA в R

Работаем с тем же датасетом:

  • brand — Pizza brand (class label)
  • id — Sample analysed
  • mois — Amount of water per 100 grams in the sample
  • prot — Amount of protein per 100 grams in the sample
  • fat — Amount of fat per 100 grams in the sample
  • ash — Amount of ash per 100 grams in the sample
  • sodium — Amount of sodium per 100 grams in the sample
  • carb — Amount of carbohydrates per 100 grams in the sample
  • cal — Amount of calories per 100 grams in the sample

Строки из предыдущей главы:

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2     ✓ purrr   0.3.4
## ✓ tibble  3.0.4     ✓ dplyr   1.0.2
## ✓ tidyr   1.1.2     ✓ stringr 1.4.0
## ✓ readr   1.4.0     ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
theme_set(theme_bw())
pizza <- read_csv('https://raw.githubusercontent.com/angelgardt/hseuxlab-andan/master/Pizza.csv')
## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   brand = col_character(),
##   id = col_double(),
##   mois = col_double(),
##   prot = col_double(),
##   fat = col_double(),
##   ash = col_double(),
##   sodium = col_double(),
##   carb = col_double(),
##   cal = col_double()
## )
pizza %>% mutate(brand = as_factor(brand),
             id = as_factor(id)) %>% 
  select(-brand, -id) -> pizza2 # убираем номинативные переменные

Для факторного анализа есть функция factanal(). Она ждет от нас данные и количество факторов.

factanal(pizza2, factors = 5)
## Error in factanal(pizza2, factors = 5): 5 factors are too many for 7 variables

Опа, попросили слишком много факторов. Действительно, если математические ограничения на количество факторов, оно завязано на число имеющихся переменных. Но нам не надо об этом париться, R за нас сам все проверит и посчитает.

Попробуем 4:

factanal(pizza2, factors = 4)
## Error in factanal(pizza2, factors = 4): 4 factors are too many for 7 variables

Тоже много. Давайте 3:

fan <- factanal(pizza2, factors = 3, scores = 'regression') #укажем scores, чтобы сохранились сами значения факторов
fan
## 
## Call:
## factanal(x = pizza2, factors = 3, scores = "regression")
## 
## Uniquenesses:
##   mois   prot    fat    ash sodium   carb    cal 
##  0.005  0.005  0.005  0.091  0.114  0.005  0.005 
## 
## Loadings:
##        Factor1 Factor2 Factor3
## mois            0.266  -0.961 
## prot    0.199   0.971  -0.116 
## fat     0.904   0.356   0.232 
## ash     0.629   0.706  -0.118 
## sodium  0.889   0.278   0.135 
## carb   -0.539  -0.714   0.443 
## cal     0.632           0.772 
## 
##                Factor1 Factor2 Factor3
## SS loadings      2.736   2.228   1.815
## Proportion Var   0.391   0.318   0.259
## Cumulative Var   0.391   0.709   0.968
## 
## Test of the hypothesis that 3 factors are sufficient.
## The chi square statistic is 2281.07 on 3 degrees of freedom.
## The p-value is 0

О, норм, работает.

Итак, что видно в аутпуте: уникальности, матрица факторных нагрузок, доля объясненной дисперсии и даже какой-то статистический тест с p-value.

Анализируем уникальности: больших значений нет, значит все наши переменные хорошо объясняются факторами.

Смотрим на таблицу факторных нагрузок. Так получается, что она еще и автоматически корреляционная матрица переменных с факторами. Вот почему:

\[ \mathrm{corr}(\boldsymbol{X}_i,\boldsymbol{F}_j) = \mathrm{corr}(a_{i1} \boldsymbol{F}_1 + a_{i2} \boldsymbol{F}_2 + \dots + a_{ip} \boldsymbol{F}_p + \boldsymbol{U}_i, \boldsymbol{F}_j) = \\ = \mathrm{corr}(a_{i1} \boldsymbol{F}_1, Fj) + \mathrm{corr}(a_{i2} \boldsymbol{F}_2, \boldsymbol{F}_j) + \dots + \mathrm{corr}(a_{ij} \boldsymbol{F}_j, \boldsymbol{F}_j) + \dots + \mathrm{corr}(a_{ip} \boldsymbol{F}_p, \boldsymbol{F}_j)+ \mathrm{corr}(\boldsymbol{U}_i, \boldsymbol{F}_j) = \\ = a_{ij} \mathrm{corr}(\boldsymbol{F}_j, \boldsymbol{F}_j) = a_{ij} \mathrm{var}(\boldsymbol{F}_j) = a_{ij} \]

Таким образом, мы интерпретируем факторы так же, как мы интерпретировали главные компоненты — на основании корреляций с исходными переменными. Как бы вы проинтерпретировали получившиеся три фактора?

Можно подобрать модель с двумя факторами:

factanal(pizza2, factors = 2)
## 
## Call:
## factanal(x = pizza2, factors = 2)
## 
## Uniquenesses:
##   mois   prot    fat    ash sodium   carb    cal 
##  0.005  0.520  0.005  0.191  0.126  0.071  0.005 
## 
## Loadings:
##        Factor1 Factor2
## mois    0.406  -0.911 
## prot    0.684  -0.111 
## fat     0.827   0.558 
## ash     0.895         
## sodium  0.807   0.472 
## carb   -0.934   0.238 
## cal     0.274   0.960 
## 
##                Factor1 Factor2
## SS loadings      3.717   2.364
## Proportion Var   0.531   0.338
## Cumulative Var   0.531   0.869
## 
## Test of the hypothesis that 2 factors are sufficient.
## The chi square statistic is 3485.54 on 8 degrees of freedom.
## The p-value is 0

Как теперь их можно интерпретировать? Отличается ли результат от PCA?

Из результатов факторного анализа можно отдельно доставать всякие штуки:

fan$loadings # факторные нагрузки aka матрица корреляций переменных с факторами
## 
## Loadings:
##        Factor1 Factor2 Factor3
## mois            0.266  -0.961 
## prot    0.199   0.971  -0.116 
## fat     0.904   0.356   0.232 
## ash     0.629   0.706  -0.118 
## sodium  0.889   0.278   0.135 
## carb   -0.539  -0.714   0.443 
## cal     0.632           0.772 
## 
##                Factor1 Factor2 Factor3
## SS loadings      2.736   2.228   1.815
## Proportion Var   0.391   0.318   0.259
## Cumulative Var   0.391   0.709   0.968
fan$correlation # корреляционная матрица исходных переменных
##              mois       prot        fat        ash     sodium        carb
## mois    1.0000000  0.3602477 -0.1713182  0.2655555 -0.1022789 -0.59180165
## prot    0.3602477  1.0000000  0.4980017  0.8238437  0.4291295 -0.85354226
## fat    -0.1713182  0.4980017  1.0000000  0.7916340  0.9333252 -0.64023817
## ash     0.2655555  0.8238437  0.7916340  1.0000000  0.8081221 -0.89898837
## sodium -0.1022789  0.4291295  0.9333252  0.8081221  1.0000000 -0.62017634
## carb   -0.5918017 -0.8535423 -0.6402382 -0.8989884 -0.6201763  1.00000000
## cal    -0.7644405  0.0702581  0.7645671  0.3264685  0.6719575 -0.02348458
##                cal
## mois   -0.76444054
## prot    0.07025810
## fat     0.76456710
## ash     0.32646845
## sodium  0.67195750
## carb   -0.02348458
## cal     1.00000000
fan$uniquenesses # уникальности
##       mois       prot        fat        ash     sodium       carb        cal 
## 0.00500000 0.00500000 0.00500000 0.09123351 0.11363405 0.00500000 0.00500000
fan$factors # количество факторов
## [1] 3
fan$dof # число степеней сводобы
## [1] 3
fan$rotmat # rotation matrix (кстати, мы по умолчанию применили varimax)
##            [,1]      [,2]       [,3]
## [1,]  0.7536936 0.1565949  0.6382978
## [2,]  0.1916326 0.8766368 -0.4413444
## [3,] -0.6286676 0.4549571  0.6307068
fan$n.obs # число наблюдений
## [1] 300
fan$scores # значения факторов
##              Factor1     Factor2      Factor3
##   [1,]  2.2403606726  1.01365654  1.586355336
##   [2,]  2.1517548542  1.00091815  1.496408251
##   [3,]  2.4850667309  0.72364156  1.437571756
##   [4,]  2.1961101438  0.77695944  1.231803288
##   [5,]  1.9063377764  1.02361718  1.317077547
##   [6,]  2.1080650467  0.80291517  1.169719507
##   [7,]  1.9106978395  0.96219229  1.226313169
##   [8,]  1.8419336983  1.08904918  1.501611777
##   [9,]  2.3597231318  0.82839938  1.490011356
##  [10,]  2.2997558996  0.96763399  1.580551579
##  [11,]  2.3171874472  0.96533982  1.625380205
##  [12,]  2.2394984222  0.99187466  1.670151354
##  [13,]  2.4010735791  0.73763937  1.413621437
##  [14,]  2.1691001728  0.69065729  1.192213382
##  [15,]  2.0138510469  0.91483867  1.234337039
##  [16,]  2.5802939761  0.32831412  1.032800530
##  [17,]  1.8510266753  0.81639109  0.990412118
##  [18,]  2.2745608639  0.28807009  0.632433234
##  [19,]  1.8753957387  0.87708898  1.099961226
##  [20,]  2.2117838012  0.59714566  1.099454189
##  [21,]  2.6617777924  0.62981107  1.556565161
##  [22,]  2.4447180621  0.73872153  1.508952001
##  [23,]  2.0620657018  0.87473489  1.221283371
##  [24,]  2.3612603970  0.57294296  1.001523050
##  [25,]  2.3244039216  0.38111229  0.802152569
##  [26,]  2.3662367303  0.68194554  1.214699229
##  [27,]  2.4256829077  0.72226741  1.389241102
##  [28,]  2.4316853463  0.49596114  1.155773681
##  [29,]  2.1243633904  0.96229702  1.377906129
##  [30,]  1.5245191852 -0.38591847 -1.115422504
##  [31,]  1.1144121194 -0.23128326 -1.381128600
##  [32,]  1.6946707363 -0.49788000 -1.033852276
##  [33,]  1.4371994153 -0.36068816 -1.171080576
##  [34,]  1.4071001078 -0.45100948 -1.255734239
##  [35,]  1.5788200815 -0.46090330 -1.181013939
##  [36,]  1.7296881919 -0.56912880 -1.298799704
##  [37,]  1.7466188162 -0.64082886 -1.294966697
##  [38,]  1.1836832066 -0.44264630 -1.587410267
##  [39,]  1.0101788214 -0.20634894 -1.317818517
##  [40,]  1.5337258621 -0.35655449 -1.179478042
##  [41,]  1.5888661077 -0.41395683 -1.124934026
##  [42,]  1.3317229696 -0.31112092 -1.262173758
##  [43,]  1.5426171736 -0.46663798 -1.163324108
##  [44,]  0.8407773262 -0.22250609 -1.622066201
##  [45,]  0.6487965309 -0.08028165 -1.593806926
##  [46,]  1.0805401304 -0.29427053 -1.547582136
##  [47,]  1.5529898252 -0.37247076 -1.083277985
##  [48,]  1.5709499707 -0.49863089 -1.277396981
##  [49,]  0.9984879853 -0.23423108 -1.376616855
##  [50,]  1.5152058510 -0.43750266 -1.169501388
##  [51,]  1.6089133152 -0.48940577 -1.144758288
##  [52,]  1.6130042718 -0.50646770 -1.124521755
##  [53,]  1.3698388494 -0.34341836 -1.247357567
##  [54,]  1.3595486121 -0.33410616 -1.261472695
##  [55,]  1.0559521732 -0.28792381 -1.545025210
##  [56,]  1.3435712796 -0.38944131 -1.400085217
##  [57,]  1.3979053333 -0.34587471 -1.338457029
##  [58,]  1.4837380311 -0.39847340 -1.329807264
##  [59,]  1.5837908950 -0.52816023 -1.371221916
##  [60,]  1.5254965452 -0.50539511 -1.356971003
##  [61,] -0.6564304681  2.11766623 -0.166976218
##  [62,] -1.3955566660  2.67209895 -0.024385555
##  [63,] -0.6439029608  1.97154837 -0.256448225
##  [64,] -0.8744255312  2.08895038 -0.239432061
##  [65,] -0.2090670311  1.66833341 -0.343001080
##  [66,] -0.7699740622  2.03786028 -0.293637694
##  [67,] -1.5347278184  2.65119362 -0.190832803
##  [68,] -1.1917307459  2.55270925 -0.003793950
##  [69,] -1.3468090115  2.45350710 -0.181656518
##  [70,] -1.2062193773  2.22601950 -0.487925867
##  [71,] -1.4109000180  2.27302994 -0.535696204
##  [72,] -0.7438030121  1.98352299 -0.290824607
##  [73,] -0.6436995362  2.12107486 -0.131094138
##  [74,] -0.7390440384  2.10206079 -0.109591606
##  [75,] -0.6843265470  2.04250364 -0.117166835
##  [76,] -0.5667719396  1.83401273 -0.301262709
##  [77,] -0.6512577379  1.77796905 -0.441735958
##  [78,] -1.1236981168  2.17386524 -0.593206084
##  [79,] -0.7317686173  2.16958936 -0.006643861
##  [80,] -0.9075375101  2.29165938 -0.132728822
##  [81,] -1.1963530935  2.23114877 -0.561171329
##  [82,] -1.1605763707  2.32554134 -0.167078126
##  [83,] -1.0233565303  1.97503662 -0.546891922
##  [84,] -1.2919992535  2.46241444 -0.128349471
##  [85,] -0.1391120436  1.67880770 -0.190705740
##  [86,] -1.2489448170  2.25579590 -0.386383866
##  [87,] -0.6611091064  2.00245912 -0.307434785
##  [88,]  0.1885979781  1.21958461 -0.326288126
##  [89,]  0.2601249140  1.24838692 -0.234436763
##  [90,] -0.3538261531  1.42592007 -0.337197495
##  [91,] -0.6017589423  1.54298063 -0.299575284
##  [92,] -0.3459991818  1.38668573 -0.275651040
##  [93,] -0.0146485657  1.31432242 -0.322070333
##  [94,] -0.3773789287  1.38084025 -0.336722579
##  [95,] -0.3654960133  1.40428407 -0.388891708
##  [96,] -1.3255604922  2.56714064 -0.094706030
##  [97,] -0.3613116928  1.46871134 -0.275505996
##  [98,] -0.2476722068  1.31202060 -0.338505886
##  [99,] -0.2204720598  1.24212636 -0.383045628
## [100,] -0.5767082151  1.50063565 -0.338952718
## [101,] -0.2882175965  1.51884367 -0.417630932
## [102,] -0.3010984843  1.48050831 -0.394382685
## [103,] -0.3476628457  1.53855072 -0.449358034
## [104,] -0.3809592875  1.44427420 -0.313896243
## [105,] -0.4242264947  1.40291836 -0.353980844
## [106,] -0.4148148445  1.42966395 -0.385380757
## [107,] -0.2849448624  1.28068192 -0.426206521
## [108,] -0.4076482165  1.48865177 -0.299168407
## [109,] -0.4703742257  1.49515330 -0.331947871
## [110,] -0.5837414082  1.54017359 -0.378226432
## [111,]  0.2228909974  1.18798010 -0.289467744
## [112,] -0.6630063572  1.53609572 -0.431809952
## [113,] -0.2491017302  1.55139606 -0.495807157
## [114,] -0.4699016029  1.47621685 -0.351585932
## [115,]  0.2094440488  1.24571710 -0.274406306
## [116,]  0.3007729562  1.21284206 -0.295522536
## [117,]  0.3331837834  1.09597392 -0.404659545
## [118,]  0.2616061627  1.09241178 -0.381803577
## [119,] -1.1236981168  2.17386524 -0.593206084
## [120,] -0.3000530023 -0.83158171  0.488023463
## [121,] -0.1318964137 -0.84396801  0.237619511
## [122,] -0.3913683952 -0.71954937  0.459104420
## [123,] -1.7824889326 -0.37073958  0.120606209
## [124,] -0.5062646322 -0.73396282  0.521536476
## [125,] -1.7508036890 -0.43167666  0.069029838
## [126,] -0.6599641614 -0.69749429  0.487625793
## [127,] -0.1471450550 -0.82058298 -0.033604901
## [128,] -0.3672733856 -0.78693893  0.332512908
## [129,] -0.3268926424 -0.80095526  0.275289584
## [130,] -0.6628668564 -0.65174582  0.184293672
## [131,] -0.6314139563 -0.68847351  0.446553197
## [132,]  0.0620842391 -0.87847252  0.476208521
## [133,]  0.0866662887 -0.88267477  0.614038597
## [134,]  0.2646732156 -1.00485599  0.115112698
## [135,] -0.5758860162 -0.73169183  0.188392424
## [136,] -0.7291339553 -0.74901749  0.294293682
## [137,]  0.2646732156 -1.00485599  0.115112698
## [138,] -0.5689581078 -0.68164815  0.556653854
## [139,] -0.4412783353 -0.76979556  0.268819563
## [140,] -0.1092327637 -0.81326762  0.511861391
## [141,] -0.0714279440 -0.88920515  0.353315373
## [142,]  0.2705697644 -1.04010003  0.347424840
## [143,]  0.1322437936 -0.96480380  0.533364254
## [144,]  0.0690241268 -0.93870178  0.418985182
## [145,] -1.2472538982 -0.66558367  0.228233689
## [146,] -0.6628668564 -0.65174582  0.184293672
## [147,] -0.6131405536 -0.74431085  0.518370420
## [148,] -0.2633341239 -0.71595766  1.217767729
## [149,] -0.6452732493 -0.60657008  1.035891625
## [150,] -0.7863210938 -0.54181156  1.082516215
## [151,]  0.0399793183 -0.75014649  0.989664128
## [152,] -0.1958271874 -0.72955635  1.172809228
## [153,] -0.6889072014 -0.58321943  1.017012897
## [154,] -0.5534773902 -0.65909045  1.172386875
## [155,] -0.8796835042 -0.51342908  0.968200779
## [156,] -0.7625457389 -0.54292645  1.082984946
## [157,] -0.5136323523 -0.67488901  0.992410797
## [158,] -0.1260441128 -0.69718469  1.016658593
## [159,] -0.6630200341 -0.62791921  1.091423664
## [160,] -0.1433731874 -0.67466674  1.133934202
## [161,] -0.6633503098 -0.60652431  1.055744228
## [162,] -0.4456240518 -0.65538122  1.302235507
## [163,] -0.3299463103 -0.67951831  1.202957460
## [164,] -0.0462946668 -0.71034224  1.106137789
## [165,] -0.7922443006 -0.54985709  1.111121538
## [166,] -0.2765030338 -0.66555894  1.392900093
## [167,] -0.7643990265 -0.58073080  0.994930751
## [168,] -0.9308335754 -0.53026450  0.992796345
## [169,] -1.0378602881 -0.50927628  1.060276180
## [170,] -0.5252360474 -0.61711983  1.118287551
## [171,] -0.5604205081 -0.67371934  1.046086695
## [172,] -0.3016177534 -0.74021680  1.105263592
## [173,] -0.4620008841 -0.67775527  1.132068625
## [174,] -0.4152371410 -0.65820714  1.153426690
## [175,] -0.2392387783 -0.73462895  1.178923743
## [176,] -0.1347829908 -0.75465222  1.170848548
## [177,] -0.7065606368 -0.66007230  0.907077888
## [178,] -0.7052084389 -0.52907926  1.270454126
## [179,] -0.7669398263 -0.52418763  1.254392851
## [180,] -0.8287004468 -0.56989612  0.965871034
## [181,] -0.7682631495 -0.50400407  1.275308271
## [182,] -0.0681737908 -0.67197746  1.153811750
## [183,] -0.5204759038 -0.60207280  1.235604840
## [184,] -0.6092084547 -0.54575639  1.207813338
## [185,] -0.6972704977 -0.51567524  1.314716201
## [186,] -0.5939143569 -0.54508464  1.278438987
## [187,] -0.6157929001 -0.53015748  1.272934448
## [188,] -0.9075546254 -0.45209687  1.298956859
## [189,] -0.9034021373 -0.42248813  1.284882425
## [190,] -0.7331520605 -0.49758105  1.228558551
## [191,] -0.9381055131 -0.60315974  0.720210141
## [192,] -0.1542219603 -0.65658458  1.424124840
## [193,] -0.7970942874 -0.44354121  1.388287278
## [194,] -0.8344037197 -0.48926991  1.343928463
## [195,] -0.7272484866 -0.54664030  1.312450364
## [196,] -0.3634201019 -0.63934454  0.970983776
## [197,] -0.8669825809 -0.46824072  1.186391474
## [198,] -0.4458325684 -0.58687218  1.202331935
## [199,] -0.8403950759 -0.47135000  1.380179771
## [200,] -0.9311263837 -0.49171184  1.261024081
## [201,] -0.4837883396 -0.58944642  1.460393423
## [202,] -0.4120952211 -0.62578548  1.429259752
## [203,] -0.7603225496 -0.50858031  1.320757323
## [204,] -0.6511242527 -0.45611815  1.633198829
## [205,] -1.1083210972 -0.41517655  1.198410938
## [206,] -0.5915123496 -0.59547625  1.196299077
## [207,] -0.8966051013 -0.57599698  0.396145385
## [208,]  0.0466019595 -0.81639803  0.433541167
## [209,] -0.3893761776 -0.78932624  0.400991460
## [210,] -1.7164518588 -0.27511957  0.544040743
## [211,] -0.3265123805 -0.73624683  0.403224130
## [212,] -0.2932551471 -0.75588575  0.392583499
## [213,] -1.6418119782 -0.47483164 -0.065190853
## [214,] -0.2319282837 -0.86766588  0.350593553
## [215,] -0.4093341372 -0.80398693  0.656136555
## [216,] -0.5611281783 -0.66226519  0.627610390
## [217,] -1.8047530753 -0.38026537  0.170378061
## [218,] -0.0455772260 -0.86881185  0.591489371
## [219,] -0.4972289904 -0.61334498  0.354144355
## [220,] -0.5771739885 -0.71612835  0.389513271
## [221,] -0.7870893792 -0.60044211  0.337399891
## [222,] -0.6904069626 -0.65067737  0.444019329
## [223,] -0.4688860134 -0.76426230  0.259689750
## [224,] -0.3526204332 -0.81986949  0.382351195
## [225,] -0.4063563585 -0.74899600  0.583501109
## [226,] -0.5733465959 -0.72541362  0.380232698
## [227,] -0.5483667556 -0.72460286  0.391720562
## [228,]  0.1224767974 -0.93423499  0.323200478
## [229,] -0.2640182510 -0.73059744  0.358039524
## [230,] -0.6152917257 -0.70061070  0.426118720
## [231,] -0.2207262896 -0.86301422  0.308637907
## [232,] -0.3533345249 -0.79725501  0.336647802
## [233,]  0.0316932063 -0.93931308  0.224401367
## [234,] -0.4561786417 -0.80227378  0.338105783
## [235,] -0.7760109052 -0.65134221  0.354519098
## [236,] -0.0584421152 -0.92914021  0.452832672
## [237,] -1.1641433622 -0.60578215  0.316331489
## [238,] -0.6548454950 -0.68458555  0.380456991
## [239,] -0.5483667556 -0.72460286  0.391720562
## [240,] -0.2261682399 -0.62774049 -1.657090791
## [241,] -0.1053217215 -0.73691400 -1.666798111
## [242,] -0.2273248664 -0.64091000 -1.564983928
## [243,] -0.1193538843 -0.60003667 -1.602905105
## [244,] -0.0891131708 -0.66492303 -1.472197597
## [245,] -0.4969962743 -0.45410882 -1.632509013
## [246,] -0.2483464369 -0.85944509 -1.887226594
## [247,] -0.0970237888 -0.74360357 -1.858042502
## [248,] -0.2641877399 -0.73832715 -1.663799441
## [249,] -0.0049763509 -0.55948273 -1.538010395
## [250,] -0.1125711670 -0.65963883 -1.671613523
## [251,] -0.2310873737 -0.47450775 -1.444859445
## [252,] -0.3081643611 -0.52574339 -1.679093153
## [253,] -0.1593471933 -0.57962511 -1.662364206
## [254,] -0.2789489329 -0.61110059 -1.736717879
## [255,] -0.0087151472 -0.79989235 -1.804803439
## [256,] -0.2258723792 -0.69881743 -1.658660575
## [257,] -0.2512359869 -0.65453256 -1.666814956
## [258,] -0.3690831334 -0.54182691 -1.570913580
## [259,] -0.3274008558 -0.51338581 -1.413770692
## [260,] -0.3064494648 -0.43113070 -1.564645325
## [261,] -0.1701732230 -0.57316168 -1.616412981
## [262,] -0.1945782780 -0.62726961 -1.637032756
## [263,] -0.2005364068 -0.57558560 -1.569821295
## [264,] -0.3343848744 -0.75388906 -1.963691419
## [265,] -0.1700467032 -0.60998592 -1.659556801
## [266,] -0.1865690767 -0.66843038 -1.612812090
## [267,] -0.3176273572 -0.53318695 -1.507685396
## [268,] -0.1586424822 -0.73766474 -1.755852980
## [269,] -0.0912035483 -0.54523205 -0.733212692
## [270,] -0.1896130982 -0.38994722 -0.429646993
## [271,] -0.1864072779 -0.52926831 -0.873944328
## [272,] -0.1264472341 -0.61768326 -0.817252368
## [273,] -0.0914707391 -0.62231127 -0.732443888
## [274,] -0.2400717376 -0.56506499 -0.909002089
## [275,]  0.0023752220 -0.53682294 -0.687442611
## [276,] -0.0450163720 -0.49768748 -0.749746599
## [277,]  0.0139827070 -0.50856352 -0.712657273
## [278,]  0.0248556056 -0.69824580 -1.029945432
## [279,] -0.4482304001 -0.03404786 -0.412792955
## [280,] -0.4227670694 -0.39271346 -0.674079591
## [281,] -0.0145035502 -0.56212568 -0.869975519
## [282,] -0.1981420653 -0.37251769 -0.682075736
## [283,] -0.1319332508 -0.46869511 -0.603371462
## [284,] -0.2032093971 -0.51540468 -0.812895514
## [285,]  0.2166337669 -0.49911115 -0.426480989
## [286,]  0.0027125211 -0.60372788 -0.920509837
## [287,] -0.0009888876 -0.53971526 -0.616514538
## [288,] -0.1600400524 -0.48270054 -0.559359510
## [289,] -0.0815784835 -0.50492781 -0.902831050
## [290,] -0.0587008082 -0.56497971 -0.675739390
## [291,] -0.0643984553 -0.55783784 -0.725236942
## [292,] -0.1443051554 -0.55601196 -0.859305404
## [293,] -0.0477442039 -0.69937331 -0.659514402
## [294,]  0.1458822477 -0.65520493 -0.778702613
## [295,]  0.0751389883 -0.45088887 -0.484026429
## [296,] -0.1249121426 -0.41300520 -0.564966576
## [297,] -0.0184274013 -0.28697552 -0.324125970
## [298,] -0.2266289174 -0.38575999 -0.506405446
## [299,] -0.1864072779 -0.52926831 -0.873944328
## [300,] -0.1264472341 -0.61768326 -0.817252368

Ну, и напоследок, визуализируем связь номинативного предиктора с получившимися факторами.

library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
plot_ly(x = fan$scores[,1], y = fan$scores[,2], z = fan$scores[,3], color = pizza$brand,
                type = 'scatter3d', mode = 'markers') %>% 
  layout(scene = list(
    xaxis = list(title = 'Factor 1'),
    yaxis = list(title = 'Factor 2'),
    zaxis = list(title = 'Factor 3')
  ))
## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors

## Warning in RColorBrewer::brewer.pal(N, "Set2"): n too large, allowed maximum for palette Set2 is 8
## Returning the palette you asked for with that many colors