library(tidyverse)
library(readxl)
library(GPArotation)
library(psych)
library(FactoMineR)
library(cluster)
library(fpc)
library(NbClust)
library(knitr) 
fa.vitamins <- read_xlsx(path = "vitamins example data.xlsx")
fa.vitamins
## # A tibble: 300 x 23
##       p1    p2    p3    p4    p5    p6    p7    p8    p9   p10   p11   p12   p13
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1     9     7     4    10     7     6     9     7     6     8     6     9     8
##  2     9     8     8     7     9     7     7     8    10     9     8     9     8
##  3     7     6     6     8     5     6     4     5     5     6     7     7     6
##  4    10     7     5    10     8     7    10    10     5    10    10     8     9
##  5     6     7     7     7     7     4     6     7     8     7     6     7     6
##  6     7     7     8     8     6     5     7     7     9     7     9     7     7
##  7     5     7     5     6     7     5     6     4     4     6     4     8     8
##  8     8     8     8     5     8     5     7     8     7    10     6    10     8
##  9     8     8     8     9     9     9    10     9     7     8    10     9     8
## 10     4     6     4     7     8     8     8     7     6     7     8     8     7
## # ... with 290 more rows, and 10 more variables: p14 <dbl>, p15 <dbl>,
## #   p16 <dbl>, p17 <dbl>, p18 <dbl>, p19 <dbl>, p20 <dbl>, p21 <dbl>,
## #   p22 <dbl>, p23 <dbl>

Is the data Adequate?

We perform Bartlett’s Test for Sphericity at 5% level of significance. And the result is as follows:

cortest.bartlett(R = cor(fa.vitamins), n = 300)
## $chisq
## [1] 4058.815
## 
## $p.value
## [1] 0
## 
## $df
## [1] 253

Results gives a p-value of less than 0.0001. Thus, at alpha 0.05 , we reject the null hypothesis that there is no common factor. Correlation among variables is present.

We also compute the Kaiser-Meyer-Olkin Measure of Sampling Adequacy. Results show that the KMO coefficient for all variables are close to 0.90. Thus, factor analysis are appropriate for all the data.

KMO(r = fa.vitamins)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = fa.vitamins)
## Overall MSA =  0.94
## MSA for each item = 
##   p1   p2   p3   p4   p5   p6   p7   p8   p9  p10  p11  p12  p13  p14  p15  p16 
## 0.93 0.96 0.91 0.92 0.93 0.97 0.94 0.96 0.94 0.92 0.95 0.90 0.87 0.96 0.89 0.91 
##  p17  p18  p19  p20  p21  p22  p23 
## 0.93 0.95 0.96 0.94 0.95 0.94 0.93

Performing EFA using PC Method

We perform PCA to determine the initial number of factors to extract for the exploratory factor analysis. Based on the results, the initial 5 factors has the eigenvalues greater than 1. Also, retaining 5 factors will give a cumulative percentage of variance of at least 69%. Retaining 6 factors will only bring a cumulative variance of at least 73%. We decide to initially consider 5 factors, considering the cumulative variance that is already close to 70% and results on eigenvalues.

pca.vitamins <- PCA(X=fa.vitamins, scale.unit=T, ncp=23)

## Warning: ggrepel: 4 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

pca.vitamins$eig
##         eigenvalue percentage of variance cumulative percentage of variance
## comp 1   9.8446838             42.8029732                          42.80297
## comp 2   2.0276359              8.8158081                          51.61878
## comp 3   1.5505848              6.7416731                          58.36045
## comp 4   1.3221803              5.7486099                          64.10906
## comp 5   1.1439212              4.9735703                          69.08263
## comp 6   0.9282812              4.0360053                          73.11864
## comp 7   0.5449912              2.3695270                          75.48817
## comp 8   0.5193455              2.2580239                          77.74619
## comp 9   0.4653573              2.0232925                          79.76948
## comp 10  0.4498444              1.9558452                          81.72533
## comp 11  0.4256838              1.8507990                          83.57613
## comp 12  0.4062776              1.7664246                          85.34255
## comp 13  0.3878014              1.6860930                          87.02865
## comp 14  0.3674851              1.5977614                          88.62641
## comp 15  0.3473967              1.5104206                          90.13683
## comp 16  0.3358201              1.4600875                          91.59691
## comp 17  0.3282682              1.4272531                          93.02417
## comp 18  0.3047669              1.3250735                          94.34924
## comp 19  0.2885773              1.2546841                          95.60393
## comp 20  0.2833016              1.2317462                          96.83567
## comp 21  0.2614723              1.1368359                          97.97251
## comp 22  0.2517682              1.0946444                          99.06715
## comp 23  0.2145551              0.9328481                         100.00000

Final Model

The final solution has 4 factors and has varimax rotation. The detailed solution for obtaining the final factors for the exploratory factor analysis is in the Appendix.

The factor loadings for the final is as follows with the corresponding heat map. the heat map is produced using excel (attached).

Different parameters for the solution were adjusted to attain the final solution for the exploratory factor analysis. “Varimax” rotation were chosen since it provides a more interpretable results compared to “quartimax” and “oblimin”.

In general, it was quite difficult to get interpretations for the data involving other variables. To help give a clearer interpretation for the data, we removed some of the variables (p5, p6, p10, p12, p14, p16), the heat map and results are shown in the appendix. After removing the variables, it resulted to a much clearer table and is easier to interpret. The groupings of the values were much more visible and concise than the other one.

Interpretation

Factor 1: Energy Booster Factor

Let us look at our first factor. This “Energy Booster” factor of the vitamin is recommended for people who does a lot of ground work, and is often at night duty. If a person were to drink this vitamin, the vitamin can provide extra strength or energy to do things, can make one feel energized all day, relieves the fatigue and stress of the person who took the vitamin. Adding to the list of the benefits, the person drinking this vitamin will also be able to be more productive on extended hours and also fights lack of sleep. It also promotes better blood circulation throughout the body, and in line with that, also revitalizes the person’s body. In general, looking at the reasons above, we can see that this vitamin gives energy and immunity to the person who drinks it.

Factor 2: Appearance Enhancing Factor

Moving on, our second factor contains the “Appearance Enhancing” factor of the vitamin. It is recommended for people who wants to improve and maintain their youthful and glowing appearance. If a person were to drink this vitamin, the person can expect their bones and teeth to be more solid and stronger, at the same time, it also promotes growth and increase in height. Some other benefits include having healthier, bouncier, and shiny hair, while also having immaculately clear skin.

Factor 3: Immunity Booster Factor

For our third factor, we can call this the “Immunity Booster” factor of the vitamin. It is recommended for people who want to gain weight healthily while also increasing their body’s resistance to sickness and diseases. If a person were to drink this vitamin, the person would feel an increase in their appetite. In line with this, due to their new drive to appease their appetite comes with the option of gaining weight. An additional perk of this vitamin is that it also aids in increasing body resistance to illnesses.

Factor 4: Rejuvenating Factor

Lastly, our fourth factor is the “Rejuvenating” factor of the vitamin. This is recommended for aging people who are adventurous and are outgoing. If a person were to drink this vitamin, it can assist in making the body strong, healthy, and ready to take on an adventure. To aid on the adventures, this vitamin also helps improve the eyesight of the person, which can add into the satisfaction of venturing outside. All in all, the vitamin helps the person feel younger, revitalize and restore their youth, and ready to conquer the world.

Appendix

The following are the process done in order to determine the best number of factors. Upon checking between “varimax” and “quartimax” rotation, we decided to use “varimax” since it produces more interpretable results. In comparison with “oblimin”, “varimax” was still able to produce a more intepretable results.

p = c("increases body resistance",
      "makes body strong and healthy",
      "provides extra energy/strength",
      "enhances/increases appetite",
      "sharpens memory/enhances mental alertness",
      "has no side effects",
      "promotes weight gain",
      "revitalizes/conditions body",
      "relieves tiredness/fatigue/stress",
      "has complete vitamins and minerals",
      "fights lack of sleep",
      "has nice packaging",
      "promotes healthy hair",
      "has affordable price",
      "promotes growth/height",
      "readily available",
      "makes bones/teeth strong",
      "promotes better blood circulation",
      "promotes good skin",
      "promotes good eyesight",
      "makes one feel younger/revitalized",
      "extends peak hours",
      "keeps one full of energy")

variables <- data.frame(code = colnames(fa.vitamins),
                        variables = p)

The process starts at 8 factors for easier flow of comparison. The group started on checking from an initial 5 factors and tried adjusting the number of factors and removing variables until an interpretable and clear groupings is produced.

8 FACTORS

The following are the exploratory factor analysis for 8 factors and the corresponding heat map. Notice that only the “varimax” and “oblimin” rotation might produces better groupings for the variable.

fa8.varimax <- fa(r = fa.vitamins, 
                        nfactors = 8, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "varimax", 
                        fm = "pa")
fa8.varimax.comm.kmo <- data.frame(communality = fa8.varimax$communality, 
                                   "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>%
                        rownames_to_column("code") %>% 
                          cbind(variables = variables$variables)
fa8.varimax.final <- as.data.frame(unclass(fa.sort(fa8.varimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa8.varimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa8.varimax.final
variables code PA1 PA3 PA6 PA2 PA4 PA5 PA7 PA8 communality KMO.MSAi
readily available p16 0.7464 0.1726 0.2182 0.1349 -0.0195 0.0447 0.0397 0.0481 0.6590 0.9115
extends peak hours p22 0.6660 0.1494 0.1866 0.0253 0.3736 0.2049 0.0465 -0.0045 0.6851 0.9392
keeps one full of energy p23 0.6337 0.0766 0.3617 0.0285 0.4022 0.0851 -0.1231 0.0114 0.7234 0.9301
fights lack of sleep p11 0.5972 0.2863 0.3144 0.1686 -0.0710 0.2504 0.0537 -0.1279 0.6529 0.9521
promotes good skin p19 0.4513 0.3024 0.1766 0.4311 0.2190 0.1718 0.1184 0.2011 0.6441 0.9609
enhances/increases appetite p4 0.2152 0.7410 0.0664 0.1110 0.1785 0.0712 -0.0241 0.0672 0.6541 0.9228
promotes weight gain p7 0.2510 0.6751 0.0769 0.2784 0.0470 0.1778 0.0798 -0.0985 0.6521 0.9403
increases body resistance p1 0.1268 0.6089 0.2925 -0.0624 0.2349 0.3638 -0.0301 -0.0059 0.6647 0.9284
makes body strong and healthy p2 0.1165 0.4515 0.3201 0.1172 0.4352 0.1766 0.0360 0.2093 0.5993 0.9584
provides extra energy/strength p3 0.2153 0.0574 0.7639 0.0236 0.2257 0.2053 -0.0328 0.0298 0.7288 0.9139
relieves tiredness/fatigue/stress p9 0.2887 0.1889 0.7239 0.0527 0.1252 0.1582 0.0416 -0.0079 0.6884 0.9430
sharpens memory/enhances mental alertness p5 0.2953 0.0380 0.5472 0.4027 0.2154 0.0344 0.4012 0.0376 0.7602 0.9307
has affordable price p14 0.3748 0.3204 0.4802 0.2195 0.2498 -0.0520 -0.0234 0.0464 0.5897 0.9639
revitalizes/conditions body p8 0.3313 0.4768 0.4795 0.2264 0.0159 0.2606 -0.0594 -0.0721 0.6952 0.9612
has no side effects p6 0.4156 0.4057 0.4224 0.2289 0.2001 -0.0314 0.0277 -0.0229 0.6105 0.9699
promotes growth/height p15 0.1418 0.1730 0.0864 0.7816 0.1370 0.0309 0.0127 -0.1130 0.7011 0.8948
promotes healthy hair p13 0.0844 0.0435 0.0722 0.7787 0.0982 0.1303 0.0109 0.1069 0.6588 0.8737
has nice packaging p12 -0.0432 0.5233 0.0697 0.5462 0.1164 0.0815 -0.0200 0.0154 0.5997 0.8950
promotes good eyesight p20 0.2797 0.2047 0.1827 0.2122 0.6277 0.3364 0.0584 -0.0031 0.7091 0.9421
makes one feel younger/revitalized p21 0.0415 0.2446 0.2559 0.3112 0.5715 0.1152 0.0214 -0.0376 0.5657 0.9504
has complete vitamins and minerals p10 0.0628 0.2875 0.2042 0.0899 0.2642 0.6980 0.0292 0.0529 0.6971 0.9206
makes bones/teeth strong p17 0.3191 0.1461 0.0646 0.4391 0.0620 0.5345 0.0279 -0.1221 0.6253 0.9346
promotes better blood circulation p18 0.3435 0.1134 0.2805 0.1810 0.3583 0.4223 -0.2216 0.1521 0.6212 0.9466

fa8.quartimax <- fa(r = fa.vitamins, 
                        nfactors = 8, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "quartimax", 
                        fm = "pa")
fa8.quartimax.comm.kmo <- data.frame(communality = fa8.quartimax$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables)
fa8.quartimax.final <- as.data.frame(unclass(fa.sort(fa8.quartimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa8.quartimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa8.quartimax.final
variables code PA1 PA2 PA3 PA5 PA4 PA6 PA7 PA8 communality KMO.MSAi
keeps one full of energy p23 0.7776 -0.1017 -0.1892 -0.1193 0.0129 0.1751 -0.1641 -0.0248 0.7234 0.9301
extends peak hours p22 0.7397 -0.0874 -0.0789 0.0224 -0.0619 0.3412 -0.0455 -0.0335 0.6851 0.9392
relieves tiredness/fatigue/stress p9 0.7355 -0.0914 -0.0819 -0.0157 -0.0194 -0.3418 0.1197 -0.0239 0.6884 0.9430
revitalizes/conditions body p8 0.7270 0.1057 0.2452 0.0804 -0.1640 -0.2370 -0.0290 -0.0709 0.6952 0.9612
has no side effects p6 0.7240 0.1019 0.1739 -0.1988 -0.0218 -0.0507 0.0441 -0.0341 0.6105 0.9699
has affordable price p14 0.7178 0.0899 0.0779 -0.2168 0.0529 -0.0982 0.0088 0.0284 0.5897 0.9639
provides extra energy/strength p3 0.7145 -0.1155 -0.2202 0.0423 0.1023 -0.3759 0.0544 0.0015 0.7288 0.9139
fights lack of sleep p11 0.6839 0.0521 0.0795 0.0449 -0.3984 0.0227 0.0259 -0.1190 0.6529 0.9521
promotes good eyesight p20 0.6820 0.1290 -0.0007 0.2354 0.3332 0.2412 -0.0115 -0.0501 0.7091 0.9421
promotes good skin p19 0.6675 0.3298 0.1114 0.0231 -0.0653 0.1760 0.0677 0.1924 0.6441 0.9609
promotes better blood circulation p18 0.6622 0.0902 -0.1076 0.2669 0.0897 0.0387 -0.2606 0.1193 0.6212 0.9466
sharpens memory/enhances mental alertness p5 0.6577 0.2727 -0.1826 -0.0944 0.0371 -0.0905 0.4481 0.0242 0.7602 0.9307
readily available p16 0.6510 0.0161 -0.0279 -0.1684 -0.4038 0.1994 -0.0137 0.0525 0.6590 0.9115
makes body strong and healthy p2 0.6269 0.0266 0.2526 0.0951 0.3155 -0.0279 0.0291 0.1777 0.5993 0.9584
increases body resistance p1 0.6019 -0.1419 0.4279 0.2697 0.1115 -0.1071 -0.0460 -0.0223 0.6647 0.9284
makes one feel younger/revitalized p21 0.5385 0.2420 0.0759 0.0593 0.4474 0.0337 0.0197 -0.0787 0.5657 0.9504
makes bones/teeth strong p17 0.4911 0.3848 0.0205 0.4081 -0.2044 0.1072 -0.0340 -0.1211 0.6253 0.9346
promotes healthy hair p13 0.3052 0.7404 -0.0344 0.0623 0.0135 -0.0018 0.0163 0.1088 0.6588 0.8737
promotes growth/height p15 0.3753 0.7333 0.0804 -0.0518 0.0170 0.0207 0.0197 -0.1111 0.7011 0.8948
has nice packaging p12 0.3400 0.5110 0.4477 0.0419 0.1127 -0.0874 -0.0094 0.0197 0.5997 0.8950
enhances/increases appetite p4 0.5125 0.0465 0.6112 -0.0120 0.0445 0.0715 -0.0659 0.0641 0.6541 0.9228
promotes weight gain p7 0.5185 0.2128 0.5535 0.0786 -0.1165 0.0476 0.0417 -0.0886 0.6521 0.9403
has complete vitamins and minerals p10 0.5240 0.0359 0.1337 0.6233 0.1102 -0.0374 -0.0166 0.0312 0.6971 0.9206

fa8.oblimin <- fa(r = fa.vitamins, 
                        nfactors = 8, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "oblimin", 
                        fm = "pa")
fa8.oblimin.comm.kmo <- data.frame(communality = fa8.oblimin$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables)
fa8.oblimin.final <- as.data.frame(unclass(fa.sort(fa8.oblimin$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa8.oblimin.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa8.oblimin.final
variables code PA3 PA1 PA6 PA2 PA5 PA7 PA4 PA8 communality KMO.MSAi
enhances/increases appetite p4 0.7632 0.1148 -0.0412 -0.0035 -0.0136 -0.0251 0.0519 0.0915 0.6541 0.9228
promotes weight gain p7 0.6464 0.1048 -0.0430 0.1191 0.1325 0.0799 0.0251 -0.1432 0.6521 0.9403
increases body resistance p1 0.5398 -0.0426 0.2357 -0.1834 0.2886 -0.0253 0.1224 0.0411 0.6647 0.9284
makes body strong and healthy p2 0.3930 -0.0486 0.1242 -0.0290 0.0790 0.1619 0.1700 0.3133 0.5993 0.9584
has no side effects p6 0.3319 0.2491 0.2844 0.1113 -0.1631 0.1508 0.1123 -0.0105 0.6105 0.9699
readily available p16 0.1059 0.7211 0.0549 0.0296 -0.0290 0.1284 -0.1320 -0.0024 0.6590 0.9115
extends peak hours p22 0.0426 0.6083 -0.0462 -0.1158 0.1226 0.1222 0.2829 0.0444 0.6851 0.9392
keeps one full of energy p23 -0.0522 0.5744 0.2492 -0.0003 -0.0693 -0.0372 0.3031 0.1068 0.7234 0.9301
fights lack of sleep p11 0.1665 0.4808 0.2199 0.0444 0.1912 0.1050 -0.0875 -0.2028 0.6529 0.9521
promotes good skin p19 0.2162 0.3440 -0.0955 0.2590 0.1094 0.2651 -0.0393 0.2151 0.6441 0.9609
provides extra energy/strength p3 -0.1172 -0.0016 0.7300 -0.0353 0.0741 0.1413 0.0721 0.0909 0.7288 0.9139
relieves tiredness/fatigue/stress p9 0.0442 0.0623 0.6502 -0.0581 0.0423 0.2141 -0.0018 0.0022 0.6884 0.9430
revitalizes/conditions body p8 0.3471 0.1387 0.4752 0.1510 0.1479 -0.0008 -0.0647 -0.0891 0.6952 0.9612
has affordable price p14 0.2361 0.2160 0.3639 0.1393 -0.2023 0.1201 0.1129 0.0920 0.5897 0.9639
promotes healthy hair p13 -0.0793 -0.0103 -0.0255 0.7545 0.0859 0.1150 -0.0541 0.1232 0.6588 0.8737
promotes growth/height p15 0.0545 0.0092 0.0077 0.7470 -0.0415 0.0816 0.1468 -0.1118 0.7011 0.8948
has nice packaging p12 0.4807 -0.1876 0.0208 0.4895 0.0133 0.0089 0.0284 0.0319 0.5997 0.8950
has complete vitamins and minerals p10 0.1260 -0.0928 0.1051 -0.0429 0.6937 0.0479 0.0912 0.1099 0.6971 0.9206
makes bones/teeth strong p17 -0.0352 0.2137 -0.0135 0.3508 0.5296 0.0256 0.0406 -0.1459 0.6253 0.9346
promotes better blood circulation p18 -0.0625 0.2785 0.2595 0.2074 0.3024 -0.1819 0.1335 0.2790 0.6212 0.9466
sharpens memory/enhances mental alertness p5 -0.0852 0.0387 0.1779 0.1099 0.0001 0.7004 0.0615 0.0006 0.7602 0.9307
promotes good eyesight p20 0.0608 0.1333 -0.0605 0.0600 0.2562 0.1447 0.5149 0.1232 0.7091 0.9421
makes one feel younger/revitalized p21 0.1345 -0.1404 0.0957 0.2133 0.0086 0.1206 0.5050 0.0888 0.5657 0.9504

Remove p5

If we take a look at the variable “p5”, notice that it doesn’t have any companion variables for it to be considered as a factor. Hence, we removed it from the list of variables.

fa.vitamins <- fa.vitamins %>% select(-"p5")

6 FACTORS

fa6.varimax <- fa(r = fa.vitamins, 
                        nfactors = 6, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "varimax", 
                        fm = "pa")
fa6.varimax.comm.kmo <- data.frame(communality = fa6.varimax$communality, 
                                   "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>%
                        rownames_to_column("code") %>% 
                          cbind(variables = variables$variables[-5])
fa6.varimax.final <- as.data.frame(unclass(fa.sort(fa6.varimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa6.varimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa6.varimax.final
variables code PA1 PA3 PA6 PA2 PA4 PA5 communality KMO.MSAi
readily available p16 0.7481 0.1635 0.2046 0.1353 0.0158 0.0446 0.6489 0.9075
extends peak hours p22 0.6676 0.1419 0.1605 0.0272 0.3983 0.1868 0.6859 0.9363
keeps one full of energy p23 0.6263 0.0605 0.3430 0.0281 0.4259 0.0680 0.7004 0.9269
fights lack of sleep p11 0.6091 0.2779 0.3113 0.1755 -0.0573 0.2624 0.6481 0.9488
promotes good skin p19 0.4422 0.2891 0.1622 0.4296 0.2764 0.1471 0.5880 0.9576
has no side effects p6 0.4261 0.3895 0.4137 0.2422 0.2122 -0.0448 0.6100 0.9663
enhances/increases appetite p4 0.2125 0.7347 0.0708 0.1189 0.2104 0.0568 0.6516 0.9191
promotes weight gain p7 0.2586 0.6727 0.0791 0.2903 0.0489 0.1840 0.6462 0.9395
increases body resistance p1 0.1250 0.5980 0.3074 -0.0500 0.2739 0.3448 0.6641 0.9300
provides extra energy/strength p3 0.2256 0.0374 0.7514 0.0292 0.2703 0.1819 0.7240 0.9118
relieves tiredness/fatigue/stress p9 0.3046 0.1726 0.7109 0.0636 0.1602 0.1426 0.6780 0.9363
revitalizes/conditions body p8 0.3415 0.4588 0.4841 0.2340 0.0486 0.2605 0.6864 0.9587
has affordable price p14 0.3815 0.2962 0.4774 0.2340 0.2770 -0.0790 0.5989 0.9603
promotes growth/height p15 0.1519 0.1586 0.0732 0.7800 0.1170 0.0401 0.6774 0.8830
promotes healthy hair p13 0.0876 0.0317 0.0543 0.7655 0.1300 0.1206 0.6291 0.8686
has nice packaging p12 -0.0423 0.5064 0.0795 0.5616 0.1295 0.0715 0.6018 0.8972
promotes good eyesight p20 0.2756 0.1932 0.1638 0.2227 0.6397 0.3004 0.6893 0.9409
makes one feel younger/revitalized p21 0.0476 0.2275 0.2413 0.3244 0.5572 0.0882 0.5358 0.9466
makes body strong and healthy p2 0.1160 0.4333 0.3065 0.1279 0.4912 0.1353 0.5711 0.9578
promotes better blood circulation p18 0.3278 0.0987 0.2793 0.1744 0.4240 0.3732 0.5447 0.9590
has complete vitamins and minerals p10 0.0573 0.2787 0.2060 0.0945 0.3284 0.6732 0.6934 0.9178
makes bones/teeth strong p17 0.3214 0.1349 0.0653 0.4437 0.0792 0.5398 0.6203 0.9323

fa6.quartimax <- fa(r = fa.vitamins, 
                        nfactors = 6, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "quartimax", 
                        fm = "pa")
fa6.quartimax.comm.kmo <- data.frame(communality = fa6.quartimax$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables[-5])
fa6.quartimax.final <- as.data.frame(unclass(fa.sort(fa6.quartimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa6.quartimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa6.quartimax.final
variables code PA1 PA2 PA4 PA5 PA3 PA6 communality KMO.MSAi
keeps one full of energy p23 0.7763 -0.0943 -0.2139 -0.1127 0.0129 -0.1738 0.7004 0.9269
extends peak hours p22 0.7473 -0.0761 -0.1071 0.0089 -0.0661 -0.3252 0.6859 0.9363
revitalizes/conditions body p8 0.7275 0.1161 0.2295 0.0772 -0.1701 0.2369 0.6864 0.9587
relieves tiredness/fatigue/stress p9 0.7225 -0.0714 -0.0905 -0.0300 -0.0226 0.3758 0.6780 0.9363
has no side effects p6 0.7216 0.1194 0.1544 -0.2120 -0.0236 0.0753 0.6100 0.9663
has affordable price p14 0.7152 0.1086 0.0537 -0.2333 0.0628 0.1198 0.5989 0.9603
provides extra energy/strength p3 0.7001 -0.1003 -0.2287 0.0366 0.1022 0.3996 0.7240 0.9118
promotes good eyesight p20 0.6858 0.1470 -0.0260 0.2279 0.3149 -0.2134 0.6893 0.9409
fights lack of sleep p11 0.6849 0.0650 0.0608 0.0292 -0.4126 0.0027 0.6481 0.9488
promotes better blood circulation p18 0.6640 0.0900 -0.1219 0.2556 0.1022 -0.0711 0.5447 0.9590
promotes good skin p19 0.6639 0.3397 0.0901 -0.0041 -0.0403 -0.1485 0.5880 0.9576
readily available p16 0.6514 0.0255 -0.0497 -0.1904 -0.3893 -0.1831 0.6489 0.9075
makes body strong and healthy p2 0.6316 0.0438 0.2326 0.0824 0.3291 0.0315 0.5711 0.9578
increases body resistance p1 0.6199 -0.1301 0.4100 0.2675 0.1094 0.1066 0.6641 0.9300
makes one feel younger/revitalized p21 0.5348 0.2583 0.0567 0.0633 0.4191 -0.0099 0.5358 0.9466
makes bones/teeth strong p17 0.4937 0.3949 -0.0004 0.4002 -0.2264 -0.0960 0.6203 0.9323
promotes healthy hair p13 0.2915 0.7343 -0.0385 0.0538 0.0216 -0.0054 0.6291 0.8686
promotes growth/height p15 0.3620 0.7342 0.0695 -0.0466 -0.0039 -0.0122 0.6774 0.8830
has nice packaging p12 0.3431 0.5238 0.4344 0.0387 0.1143 0.0805 0.6018 0.8972
enhances/increases appetite p4 0.5314 0.0521 0.5956 -0.0161 0.0568 -0.0913 0.6516 0.9191
promotes weight gain p7 0.5293 0.2240 0.5408 0.0708 -0.1299 -0.0391 0.6462 0.9395
has complete vitamins and minerals p10 0.5358 0.0470 0.1181 0.6142 0.1073 0.0385 0.6934 0.9178

fa6.oblimin <- fa(r = fa.vitamins, 
                        nfactors = 6, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "oblimin", 
                        fm = "pa")
fa6.oblimin.comm.kmo <- data.frame(communality = fa6.oblimin$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables[-5])
fa6.oblimin.final <- as.data.frame(unclass(fa.sort(fa6.oblimin$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa6.oblimin.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa6.oblimin.final
variables code PA1 PA6 PA3 PA2 PA5 PA4 communality KMO.MSAi
extends peak hours p22 0.7800 -0.0232 0.0594 -0.0558 0.1244 0.0737 0.6859 0.9363
keeps one full of energy p23 0.6989 0.2257 -0.0444 -0.0294 -0.0201 0.1345 0.7004 0.9269
readily available p16 0.6773 0.0841 0.0937 0.0611 -0.0899 -0.2778 0.6489 0.9075
promotes good eyesight p20 0.4004 0.0082 0.0774 0.1658 0.3021 0.3907 0.6893 0.9409
fights lack of sleep p11 0.3972 0.2386 0.1697 0.0720 0.1355 -0.3681 0.6481 0.9488
promotes good skin p19 0.3892 0.0286 0.1882 0.3730 0.0625 0.0269 0.5880 0.9576
provides extra energy/strength p3 0.0160 0.8496 -0.1422 -0.0149 0.0835 0.0703 0.7240 0.9118
relieves tiredness/fatigue/stress p9 0.0445 0.7879 0.0213 -0.0039 0.0175 -0.0522 0.6780 0.9363
revitalizes/conditions body p8 0.0354 0.4750 0.3448 0.1195 0.1382 -0.2007 0.6864 0.9587
has affordable price p14 0.2487 0.4511 0.2105 0.1783 -0.2091 0.0916 0.5989 0.9603
has no side effects p6 0.2731 0.3608 0.3213 0.1649 -0.1791 0.0080 0.6100 0.9663
enhances/increases appetite p4 0.1281 -0.0700 0.7843 -0.0211 -0.0013 0.0668 0.6516 0.9191
promotes weight gain p7 0.0733 -0.0416 0.6684 0.1607 0.1080 -0.1351 0.6462 0.9395
increases body resistance p1 -0.0162 0.2408 0.5628 -0.2030 0.3153 0.0760 0.6641 0.9300
makes body strong and healthy p2 0.0921 0.2295 0.3792 0.0413 0.1022 0.3342 0.5711 0.9578
promotes healthy hair p13 -0.0211 0.0144 -0.1123 0.8111 0.0697 0.0254 0.6291 0.8686
promotes growth/height p15 0.0181 0.0174 0.0389 0.8066 -0.0377 0.0052 0.6774 0.8830
has nice packaging p12 -0.2223 0.0266 0.4681 0.5165 0.0187 0.0677 0.6018 0.8972
has complete vitamins and minerals p10 -0.0251 0.1354 0.1397 -0.0112 0.7085 0.0795 0.6934 0.9178
makes bones/teeth strong p17 0.1960 -0.0366 -0.0299 0.3889 0.5107 -0.2028 0.6203 0.9323
promotes better blood circulation p18 0.3337 0.1879 -0.0518 0.1167 0.3479 0.1527 0.5447 0.9590
makes one feel younger/revitalized p21 0.0838 0.1716 0.1362 0.3024 0.0711 0.4366 0.5358 0.9466

Remove p6

Now, if we look at the variable “p6”, it seems like it does not appear to have any factors that are strongly correlated to it. In other words, it doesn’t offer significant insights for the other factors. Hence, we removed it from the list of variables.

fa.vitamins <- fa.vitamins %>% select(-"p6")

6 FACTORS with p5 and p6 removed

fa6.varimax <- fa(r = fa.vitamins, 
                        nfactors = 6, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "varimax", 
                        fm = "pa")
fa6.varimax.comm.kmo <- data.frame(communality = fa6.varimax$communality, 
                                   "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>%
                        rownames_to_column("code") %>% 
                          cbind(variables = variables$variables[c(-5,-6)])
fa6.varimax.final <- as.data.frame(unclass(fa.sort(fa6.varimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa6.varimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa6.varimax.final
variables code PA4 PA3 PA2 PA6 PA1 PA5 communality KMO.MSAi
readily available p16 0.7517 0.1633 0.1382 0.1993 0.0262 0.0367 0.6525 0.8990
extends peak hours p22 0.6619 0.1421 0.0287 0.1573 0.4108 0.1755 0.6834 0.9324
keeps one full of energy p23 0.6265 0.0619 0.0319 0.3396 0.4378 0.0458 0.7064 0.9208
fights lack of sleep p11 0.6134 0.2812 0.1766 0.3115 -0.0435 0.2545 0.6502 0.9443
promotes good skin p19 0.4389 0.2872 0.4304 0.1553 0.2851 0.1430 0.5863 0.9531
enhances/increases appetite p4 0.2133 0.7357 0.1218 0.0654 0.2145 0.0422 0.6537 0.9126
promotes weight gain p7 0.2597 0.6717 0.2911 0.0752 0.0565 0.1793 0.6444 0.9339
increases body resistance p1 0.1228 0.5993 -0.0505 0.3052 0.2848 0.3361 0.6640 0.9274
promotes growth/height p15 0.1501 0.1551 0.7790 0.0650 0.1192 0.0458 0.6740 0.8775
promotes healthy hair p13 0.0853 0.0303 0.7646 0.0501 0.1328 0.1244 0.6284 0.8633
has nice packaging p12 -0.0407 0.5129 0.5677 0.0802 0.1285 0.0532 0.6129 0.8947
provides extra energy/strength p3 0.2270 0.0425 0.0336 0.7524 0.2799 0.1605 0.7247 0.9051
relieves tiredness/fatigue/stress p9 0.3077 0.1768 0.0685 0.7116 0.1691 0.1227 0.6806 0.9289
revitalizes/conditions body p8 0.3439 0.4596 0.2354 0.4790 0.0621 0.2523 0.6819 0.9539
has affordable price p14 0.3812 0.2931 0.2392 0.4649 0.2811 -0.0878 0.5913 0.9546
promotes good eyesight p20 0.2669 0.1932 0.2221 0.1600 0.6511 0.2902 0.6916 0.9380
makes one feel younger/revitalized p21 0.0423 0.2268 0.3265 0.2357 0.5586 0.0765 0.5333 0.9427
makes body strong and healthy p2 0.1139 0.4376 0.1318 0.3056 0.4971 0.1094 0.5743 0.9545
promotes better blood circulation p18 0.3245 0.1046 0.1745 0.2830 0.4368 0.3545 0.5432 0.9572
has complete vitamins and minerals p10 0.0581 0.2894 0.0925 0.2184 0.3440 0.6433 0.6755 0.9221
makes bones/teeth strong p17 0.3191 0.1359 0.4399 0.0671 0.0931 0.5512 0.6307 0.9291

fa6.quartimax <- fa(r = fa.vitamins, 
                        nfactors = 6, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "quartimax", 
                        fm = "pa")
fa6.quartimax.comm.kmo <- data.frame(communality = fa6.quartimax$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables[c(-5,-6)])
fa6.quartimax.final <- as.data.frame(unclass(fa.sort(fa6.quartimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa6.quartimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa6.quartimax.final
variables code PA1 PA2 PA3 PA4 PA5 PA6 communality KMO.MSAi
keeps one full of energy p23 0.7886 -0.0796 -0.1811 -0.0060 -0.1645 -0.1350 0.7064 0.9208
extends peak hours p22 0.7607 -0.0645 -0.0841 -0.0785 -0.0320 -0.2939 0.6834 0.9324
relieves tiredness/fatigue/stress p9 0.7123 -0.0518 -0.0454 -0.0340 -0.0475 0.4064 0.6806 0.9289
revitalizes/conditions body p8 0.7052 0.1345 0.2622 -0.1760 0.0796 0.2457 0.6819 0.9539
promotes good eyesight p20 0.7026 0.1541 -0.0070 0.3171 0.1803 -0.2028 0.6916 0.9380
provides extra energy/strength p3 0.6998 -0.0833 -0.1833 0.0965 0.0107 0.4302 0.7247 0.9051
has affordable price p14 0.6936 0.1301 0.0907 0.0355 -0.2501 0.1457 0.5913 0.9546
promotes better blood circulation p18 0.6815 0.0974 -0.0972 0.1082 0.2128 -0.0539 0.5432 0.9572
fights lack of sleep p11 0.6758 0.0798 0.0869 -0.4223 0.0270 0.0240 0.6502 0.9443
promotes good skin p19 0.6548 0.3526 0.1095 -0.0522 -0.0225 -0.1339 0.5863 0.9531
readily available p16 0.6446 0.0409 -0.0264 -0.4127 -0.2038 -0.1512 0.6525 0.8990
makes body strong and healthy p2 0.6278 0.0580 0.2641 0.3224 0.0363 0.0417 0.5743 0.9545
increases body resistance p1 0.6110 -0.1177 0.4345 0.1123 0.2553 0.1015 0.6640 0.9274
makes one feel younger/revitalized p21 0.5340 0.2683 0.0789 0.4115 0.0250 -0.0014 0.5333 0.9427
makes bones/teeth strong p17 0.5014 0.3978 0.0024 -0.2116 0.4077 -0.1005 0.6307 0.9291
promotes growth/height p15 0.3413 0.7413 0.0769 -0.0118 -0.0428 -0.0114 0.6740 0.8775
promotes healthy hair p13 0.2805 0.7383 -0.0345 0.0222 0.0535 -0.0061 0.6284 0.8633
has nice packaging p12 0.3166 0.5382 0.4526 0.1095 0.0240 0.0741 0.6129 0.8947
enhances/increases appetite p4 0.5073 0.0677 0.6165 0.0417 -0.0347 -0.0936 0.6537 0.9126
promotes weight gain p7 0.5029 0.2379 0.5555 -0.1379 0.0723 -0.0449 0.6444 0.9339
has complete vitamins and minerals p10 0.5562 0.0493 0.1349 0.1362 0.5711 0.0298 0.6755 0.9221

fa6.oblimin <- fa(r = fa.vitamins, 
                        nfactors = 6, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "oblimin", 
                        fm = "pa")
fa6.oblimin.comm.kmo <- data.frame(communality = fa6.oblimin$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables[c(-5,-6)])
fa6.oblimin.final <- as.data.frame(unclass(fa.sort(fa6.oblimin$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa6.oblimin.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa6.oblimin.final
variables code PA1 PA6 PA3 PA2 PA5 PA4 communality KMO.MSAi
extends peak hours p22 0.7636 -0.0178 0.0608 -0.0569 0.1332 0.0886 0.6834 0.9324
keeps one full of energy p23 0.6953 0.2318 -0.0357 -0.0244 -0.0291 0.1465 0.7064 0.9208
readily available p16 0.6876 0.0871 0.0989 0.0637 -0.0888 -0.2698 0.6525 0.8990
fights lack of sleep p11 0.4048 0.2392 0.1710 0.0678 0.1393 -0.3626 0.6502 0.9443
promotes good skin p19 0.3883 0.0320 0.1897 0.3690 0.0711 0.0329 0.5863 0.9531
provides extra energy/strength p3 0.0172 0.8472 -0.1345 -0.0107 0.0686 0.0676 0.7247 0.9051
relieves tiredness/fatigue/stress p9 0.0531 0.7880 0.0279 0.0016 0.0015 -0.0567 0.6806 0.9289
revitalizes/conditions body p8 0.0480 0.4691 0.3420 0.1169 0.1391 -0.2014 0.6819 0.9539
has affordable price p14 0.2627 0.4501 0.2158 0.1872 -0.2153 0.0869 0.5913 0.9546
enhances/increases appetite p4 0.1381 -0.0628 0.7824 -0.0171 -0.0132 0.0654 0.6537 0.9126
promotes weight gain p7 0.0839 -0.0380 0.6619 0.1576 0.1095 -0.1357 0.6444 0.9339
increases body resistance p1 -0.0221 0.2369 0.5517 -0.2076 0.3208 0.0759 0.6640 0.9274
makes body strong and healthy p2 0.0879 0.2378 0.3841 0.0450 0.0833 0.3357 0.5743 0.9545
promotes healthy hair p13 -0.0189 0.0166 -0.1066 0.8014 0.0788 0.0266 0.6284 0.8633
promotes growth/height p15 0.0275 0.0194 0.0438 0.7989 -0.0287 0.0041 0.6740 0.8775
has nice packaging p12 -0.2112 0.0390 0.4780 0.5191 -0.0042 0.0621 0.6129 0.8947
has complete vitamins and minerals p10 -0.0479 0.1370 0.1370 -0.0262 0.7001 0.0915 0.6755 0.9221
makes bones/teeth strong p17 0.1796 -0.0421 -0.0389 0.3688 0.5458 -0.1945 0.6307 0.9291
promotes better blood circulation p18 0.3145 0.1919 -0.0479 0.1090 0.3484 0.1641 0.5432 0.9572
makes one feel younger/revitalized p21 0.0744 0.1762 0.1394 0.3025 0.0680 0.4355 0.5333 0.9427
promotes good eyesight p20 0.3759 0.0104 0.0757 0.1586 0.3143 0.4028 0.6916 0.9380

5 FACTORS

fa5.varimax <- fa(r = fa.vitamins, 
                        nfactors = 5, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "varimax", 
                        fm = "pa")
fa5.varimax.comm.kmo <- data.frame(communality = fa5.varimax$communality, 
                                   "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>%
                        rownames_to_column("code") %>% 
                          cbind(variables = variables$variables[c(-5,-6)])
fa5.varimax.final <- as.data.frame(unclass(fa.sort(fa5.varimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa5.varimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa5.varimax.final
variables code PA4 PA1 PA3 PA2 PA5 communality KMO.MSAi
readily available p16 0.7632 0.0354 0.1575 0.1338 0.2045 0.6683 0.8990
extends peak hours p22 0.6448 0.4491 0.1293 0.0392 0.1773 0.6671 0.9324
fights lack of sleep p11 0.6258 0.0938 0.3126 0.1723 0.2772 0.6047 0.9443
keeps one full of energy p23 0.5888 0.4040 0.0412 0.0419 0.3752 0.6542 0.9208
promotes good eyesight p20 0.2497 0.7169 0.1819 0.2395 0.1743 0.6972 0.9380
promotes better blood circulation p18 0.3295 0.5564 0.1226 0.1847 0.2695 0.5400 0.9572
has complete vitamins and minerals p10 0.1144 0.5551 0.3451 0.1201 0.1694 0.4834 0.9221
makes one feel younger/revitalized p21 0.0238 0.5050 0.2009 0.3348 0.2708 0.4814 0.9427
makes body strong and healthy p2 0.0967 0.4766 0.4118 0.1476 0.3310 0.5374 0.9545
promotes weight gain p7 0.2719 0.1261 0.6918 0.2950 0.0568 0.6587 0.9339
enhances/increases appetite p4 0.1979 0.2086 0.6855 0.1395 0.0931 0.5807 0.9126
increases body resistance p1 0.1301 0.4160 0.6312 -0.0438 0.2776 0.6675 0.9274
revitalizes/conditions body p8 0.3627 0.1767 0.4870 0.2330 0.4432 0.6506 0.9539
promotes growth/height p15 0.1519 0.1046 0.1447 0.7855 0.0782 0.6780 0.8775
promotes healthy hair p13 0.0939 0.1580 0.0300 0.7730 0.0508 0.6348 0.8633
has nice packaging p12 -0.0414 0.1186 0.5042 0.5738 0.0901 0.6074 0.8947
promotes good skin p19 0.4361 0.3112 0.2769 0.4373 0.1668 0.5827 0.9531
makes bones/teeth strong p17 0.3404 0.3242 0.2117 0.4171 0.0365 0.4411 0.9291
provides extra energy/strength p3 0.2265 0.3212 0.0611 0.0313 0.7430 0.7112 0.9051
relieves tiredness/fatigue/stress p9 0.3092 0.2022 0.1929 0.0640 0.7078 0.6788 0.9289
has affordable price p14 0.3551 0.2018 0.2593 0.2374 0.4921 0.5325 0.9546

fa5.quartimax <- fa(r = fa.vitamins, 
                        nfactors = 5, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "quartimax", 
                        fm = "pa")
fa5.quartimax.comm.kmo <- data.frame(communality = fa5.quartimax$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables[c(-5,-6)])
fa5.quartimax.final <- as.data.frame(unclass(fa.sort(fa5.quartimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa5.quartimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa5.quartimax.final
variables code PA1 PA2 PA3 PA4 PA5 communality KMO.MSAi
keeps one full of energy p23 0.7597 -0.0739 -0.2180 0.1497 -0.0402 0.6542 0.9208
extends peak hours p22 0.7477 -0.0663 -0.1150 0.1796 -0.2412 0.6671 0.9324
promotes good eyesight p20 0.7268 0.1480 -0.0551 -0.2903 -0.2443 0.6972 0.9380
revitalizes/conditions body p8 0.7123 0.1224 0.2730 0.1111 0.2035 0.6506 0.9539
relieves tiredness/fatigue/stress p9 0.7060 -0.0580 -0.0506 0.0335 0.4163 0.6788 0.9289
promotes better blood circulation p18 0.6988 0.0886 -0.1094 -0.1347 -0.1168 0.5400 0.9572
provides extra energy/strength p3 0.6974 -0.0886 -0.1921 -0.1067 0.4108 0.7112 0.9051
has affordable price p14 0.6726 0.1299 0.0447 0.0901 0.2307 0.5325 0.9546
fights lack of sleep p11 0.6633 0.0694 0.1138 0.3827 0.0208 0.6047 0.9443
promotes good skin p19 0.6554 0.3480 0.0862 0.1144 -0.1075 0.5827 0.9531
increases body resistance p1 0.6451 -0.1332 0.4341 -0.2120 0.0137 0.6675 0.9274
makes body strong and healthy p2 0.6438 0.0583 0.2078 -0.2730 0.0432 0.5374 0.9545
readily available p16 0.6141 0.0369 -0.0293 0.5344 -0.0574 0.6683 0.8990
has complete vitamins and minerals p10 0.5931 0.0450 0.1575 -0.2938 -0.1359 0.4834 0.9221
makes one feel younger/revitalized p21 0.5487 0.2627 0.0253 -0.3327 0.0038 0.4814 0.9427
makes bones/teeth strong p17 0.5216 0.3520 0.0639 0.0471 -0.1970 0.4411 0.9291
promotes growth/height p15 0.3450 0.7430 0.0663 0.0497 0.0068 0.6780 0.8775
promotes healthy hair p13 0.2906 0.7400 -0.0377 -0.0235 -0.0267 0.6348 0.8633
has nice packaging p12 0.3382 0.5340 0.4352 -0.1191 0.0652 0.6074 0.8947
promotes weight gain p7 0.5199 0.2274 0.5667 0.1074 -0.0639 0.6587 0.9339
enhances/increases appetite p4 0.5187 0.0717 0.5507 -0.0077 -0.0564 0.5807 0.9126
fa5.oblimin <- fa(r = fa.vitamins, 
                        nfactors = 5, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "oblimin", 
                        fm = "pa")
fa5.oblimin.comm.kmo <- data.frame(communality = fa5.oblimin$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables[c(-5,-6)])
fa5.oblimin.final <- as.data.frame(unclass(fa.sort(fa5.oblimin$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa5.oblimin.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa5.oblimin.final
variables code PA5 PA3 PA1 PA2 PA4 communality KMO.MSAi
provides extra energy/strength p3 0.8440 -0.1037 0.0868 -0.0146 -0.0206 0.7112 0.9051
relieves tiredness/fatigue/stress p9 0.7885 0.0493 -0.0617 -0.0007 0.0900 0.6788 0.9289
has affordable price p14 0.4968 0.1319 -0.0116 0.1684 0.1810 0.5325 0.9546
revitalizes/conditions body p8 0.4137 0.4014 -0.0627 0.1224 0.1924 0.6506 0.9539
enhances/increases appetite p4 -0.0240 0.7127 0.0709 -0.0081 0.0960 0.5807 0.9126
promotes weight gain p7 -0.0742 0.7024 -0.0242 0.1589 0.1892 0.6587 0.9339
increases body resistance p1 0.1991 0.6379 0.2660 -0.2054 -0.0482 0.6675 0.9274
makes body strong and healthy p2 0.2829 0.3482 0.3376 0.0393 -0.1113 0.5374 0.9545
promotes good eyesight p20 0.0421 0.0699 0.7013 0.1490 0.0638 0.6972 0.9380
promotes better blood circulation p18 0.1803 -0.0007 0.5006 0.1088 0.1629 0.5400 0.9572
has complete vitamins and minerals p10 0.0703 0.2972 0.4993 0.0133 -0.0551 0.4834 0.9221
makes one feel younger/revitalized p21 0.2339 0.0939 0.4118 0.2826 -0.1809 0.4814 0.9427
promotes healthy hair p13 0.0057 -0.1106 0.0881 0.8066 -0.0045 0.6348 0.8633
promotes growth/height p15 0.0259 0.0125 -0.0035 0.7989 0.0526 0.6780 0.8775
has nice packaging p12 0.0401 0.4666 -0.0387 0.5178 -0.1723 0.6074 0.8947
promotes good skin p19 0.0479 0.1630 0.2095 0.3628 0.3218 0.5827 0.9531
makes bones/teeth strong p17 -0.0947 0.1211 0.2836 0.3583 0.2562 0.4411 0.9291
readily available p16 0.0972 0.0598 -0.0667 0.0567 0.7532 0.6683 0.8990
extends peak hours p22 0.0251 0.0270 0.4260 -0.0644 0.5650 0.6671 0.9324
fights lack of sleep p11 0.1881 0.2251 -0.0586 0.0753 0.5584 0.6047 0.9443
keeps one full of energy p23 0.3021 -0.1001 0.3187 -0.0359 0.4633 0.6542 0.9208

Testing 4 FACTORS

fa4.varimax <- fa(r = fa.vitamins, 
                        nfactors = 4, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "varimax", 
                        fm = "pa")
fa4.varimax.comm.kmo <- data.frame(communality = fa4.varimax$communality, 
                                   "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>%
                        rownames_to_column("code") %>% 
                          cbind(variables = variables$variables[c(-5,-6)])
fa4.varimax.final <- as.data.frame(unclass(fa.sort(fa4.varimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa4.varimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa4.varimax.final
variables code PA4 PA1 PA3 PA2 communality KMO.MSAi
readily available p16 0.7773 0.0315 0.1537 0.1615 0.6549 0.8990
fights lack of sleep p11 0.6837 0.1270 0.3120 0.1832 0.6144 0.9443
keeps one full of energy p23 0.6664 0.4576 0.0227 0.0699 0.6589 0.9208
extends peak hours p22 0.6191 0.3934 0.1214 0.1100 0.5650 0.9324
relieves tiredness/fatigue/stress p9 0.5205 0.4548 0.1919 0.0173 0.5149 0.9289
has affordable price p14 0.4930 0.3658 0.2534 0.2048 0.4831 0.9546
revitalizes/conditions body p8 0.4882 0.3217 0.4786 0.2062 0.6135 0.9539
promotes good eyesight p20 0.2628 0.6573 0.1709 0.2954 0.6176 0.9380
makes body strong and healthy p2 0.1827 0.5747 0.3980 0.1474 0.5438 0.9545
makes one feel younger/revitalized p21 0.0875 0.5744 0.1883 0.3413 0.4895 0.9427
promotes better blood circulation p18 0.3748 0.5698 0.1072 0.2226 0.5263 0.9572
provides extra energy/strength p3 0.4595 0.5592 0.0754 -0.0121 0.5297 0.9051
has complete vitamins and minerals p10 0.1439 0.5481 0.3290 0.1569 0.4540 0.9221
promotes weight gain p7 0.2629 0.1097 0.6939 0.3100 0.6587 0.9339
enhances/increases appetite p4 0.2047 0.2161 0.6769 0.1542 0.5706 0.9126
increases body resistance p1 0.2037 0.4928 0.6189 -0.0386 0.6689 0.9274
promotes growth/height p15 0.1533 0.1020 0.1543 0.7754 0.6590 0.8775
promotes healthy hair p13 0.0869 0.1396 0.0368 0.7748 0.6288 0.8633
has nice packaging p12 -0.0171 0.1554 0.5062 0.5519 0.5853 0.8947
promotes good skin p19 0.4441 0.2943 0.2714 0.4676 0.5761 0.9531
makes bones/teeth strong p17 0.3080 0.2513 0.2089 0.4582 0.4116 0.9291

fa4.quartimax <- fa(r = fa.vitamins, 
                        nfactors = 4, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "quartimax", 
                        fm = "pa")
fa4.quartimax.comm.kmo <- data.frame(communality = fa4.quartimax$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables[c(-5,-6)])
fa4.quartimax.final <- as.data.frame(unclass(fa.sort(fa4.quartimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa4.quartimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa4.quartimax.final
variables code PA1 PA2 PA3 PA4 communality KMO.MSAi
keeps one full of energy p23 0.7590 -0.0655 -0.2422 -0.1407 0.6589 0.9208
revitalizes/conditions body p8 0.7257 0.0854 0.2596 -0.1104 0.6135 0.9539
extends peak hours p22 0.7253 -0.0177 -0.1234 -0.1531 0.5650 0.9324
promotes good eyesight p20 0.7080 0.1825 -0.0607 0.2817 0.6176 0.9380
relieves tiredness/fatigue/stress p9 0.7072 -0.1056 -0.0478 -0.0377 0.5149 0.9289
promotes better blood circulation p18 0.6922 0.1079 -0.1245 0.1415 0.5263 0.9572
provides extra energy/strength p3 0.6912 -0.1319 -0.1685 0.0787 0.5297 0.9051
has affordable price p14 0.6832 0.0891 0.0355 -0.0848 0.4831 0.9546
fights lack of sleep p11 0.6701 0.0645 0.1048 -0.3877 0.6144 0.9443
promotes good skin p19 0.6547 0.3608 0.0777 -0.1063 0.5761 0.9531
increases body resistance p1 0.6526 -0.1422 0.4191 0.2171 0.6689 0.9274
makes body strong and healthy p2 0.6508 0.0453 0.1936 0.2842 0.5438 0.9545
readily available p16 0.6144 0.0477 -0.0428 -0.5228 0.6549 0.8990
has complete vitamins and minerals p10 0.5866 0.0656 0.1437 0.2915 0.4540 0.9221
makes one feel younger/revitalized p21 0.5512 0.2582 0.0153 0.3447 0.4895 0.9427
makes bones/teeth strong p17 0.5143 0.3764 0.0604 -0.0424 0.4116 0.9291
promotes healthy hair p13 0.2920 0.7363 -0.0282 0.0248 0.6288 0.8633
promotes growth/height p15 0.3504 0.7268 0.0764 -0.0472 0.6590 0.8775
has nice packaging p12 0.3499 0.5076 0.4373 0.1184 0.5853 0.8947
promotes weight gain p7 0.5268 0.2290 0.5640 -0.1035 0.6587 0.9339
enhances/increases appetite p4 0.5253 0.0730 0.5377 0.0160 0.5706 0.9126
fa4.oblimin <- fa(r = fa.vitamins, 
                        nfactors = 4, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "oblimin", 
                        fm = "pa")
fa4.oblimin.comm.kmo <- data.frame(communality = fa4.oblimin$communality, 
                                     "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>% 
                          rownames_to_column("code") %>% 
                            cbind(variables = variables$variables[c(-5,-6)])
fa4.oblimin.final <- as.data.frame(unclass(fa.sort(fa4.oblimin$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa4.oblimin.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa4.oblimin.final
variables code PA4 PA1 PA3 PA2 communality KMO.MSAi
readily available p16 0.8292 -0.1356 0.0373 0.0680 0.6549 0.8990
fights lack of sleep p11 0.6797 -0.0576 0.2222 0.0658 0.6144 0.9443
keeps one full of energy p23 0.5971 0.4038 -0.1135 -0.0150 0.6589 0.9208
extends peak hours p22 0.5516 0.3092 0.0050 0.0168 0.5650 0.9324
relieves tiredness/fatigue/stress p9 0.4227 0.3811 0.1097 -0.0889 0.5149 0.9289
has affordable price p14 0.4006 0.2552 0.1621 0.1064 0.4831 0.9546
promotes good eyesight p20 0.0597 0.6351 0.0663 0.2263 0.6176 0.9380
makes one feel younger/revitalized p21 -0.1151 0.5604 0.1106 0.2925 0.4895 0.9427
provides extra energy/strength p3 0.3369 0.5415 -0.0182 -0.0975 0.5297 0.9051
promotes better blood circulation p18 0.2213 0.5415 -0.0056 0.1542 0.5263 0.9572
makes body strong and healthy p2 -0.0173 0.5035 0.3665 0.0375 0.5438 0.9545
has complete vitamins and minerals p10 -0.0464 0.4972 0.2935 0.0655 0.4540 0.9221
enhances/increases appetite p4 0.0868 0.0201 0.7076 0.0076 0.5706 0.9126
promotes weight gain p7 0.1717 -0.1243 0.7027 0.1701 0.6587 0.9339
increases body resistance p1 0.0210 0.3615 0.6506 -0.2003 0.6689 0.9274
has nice packaging p12 -0.1506 0.0035 0.4883 0.4875 0.5853 0.8947
revitalizes/conditions body p8 0.3864 0.1456 0.4240 0.0681 0.6135 0.9539
promotes healthy hair p13 0.0012 0.0803 -0.0973 0.8041 0.6288 0.8633
promotes growth/height p15 0.0748 -0.0039 0.0304 0.7782 0.6590 0.8775
makes bones/teeth strong p17 0.2173 0.1485 0.1078 0.4079 0.4116 0.9291
promotes good skin p19 0.3489 0.1588 0.1553 0.3912 0.5761 0.9531

Removing Unnecessary variables

fa.vitamins <- fa.vitamins %>% select(-"p10",-"p12",-"p14",-"p16")

If we take a look at the variable “p10” and the other variables that are in the same factor group, notice that having “p10” in the group doesn’t really fit the mix. The vitamin having complete vitamins and minerals doesn’t always associate with the vitamin promoting good eyesight, making the body strong, making one feel revitalized, promoting better circulation and providing extra energy. If we look at the analysis of the other variables removed from this table, we can see that having complete vitamins and minerals can also be a selling point of the vitamin that can attract more customers. In that case, we can justify the removal of the variable.

Taking a look at the variable “p12” and the other variables grouped with it, “p12” look out of place compared to the rest. The other variables talkes about enhancing the appearance of a person while “p12” is only about the packaging of the vitamin itself.

Also, “p14” and “p16” are related on the business side of things if you look at it. Having affordable price and readily available vitamins are ways to attract people to purchase the vitamin, which is clearly unrelated to the other variables in their group which tales about how vitamins are energy boosters.

5 FACTORS

fa5.varimax <- fa(r = fa.vitamins, 
                        nfactors = 5, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "varimax", 
                        fm = "pa")
fa5.varimax.comm.kmo <- data.frame(communality = fa5.varimax$communality, 
                                   "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>%
                        rownames_to_column("code") %>% 
                          cbind(variables = variables$variables[c(-5,-6,-10,-12,-14,-16)])
fa5.varimax.final <- as.data.frame(unclass(fa.sort(fa5.varimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa5.varimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa5.varimax.final
variables code PA3 PA2 PA1 PA5 PA4 communality KMO.MSAi
promotes weight gain p7 0.7195 0.3123 0.1553 0.0869 0.0833 0.6538 0.9114
enhances/increases appetite p4 0.7133 0.1157 0.1701 0.0557 0.2255 0.6050 0.9050
increases body resistance p1 0.6302 -0.0042 0.1531 0.3094 0.3322 0.6267 0.9058
revitalizes/conditions body p8 0.5307 0.2812 0.2447 0.5004 0.0676 0.6756 0.9415
promotes healthy hair p13 0.0394 0.7922 0.0492 0.0454 0.1468 0.6552 0.8280
promotes growth/height p15 0.1678 0.7679 0.0690 0.0602 0.1383 0.6454 0.8397
makes bones/teeth strong p17 0.2494 0.5007 0.3345 0.1493 0.0712 0.4521 0.9186
promotes good skin p19 0.3389 0.4721 0.3748 0.1795 0.2364 0.5663 0.9623
extends peak hours p22 0.2169 0.0961 0.7487 0.2094 0.2203 0.7092 0.9102
keeps one full of energy p23 0.1357 0.0948 0.6182 0.3793 0.2682 0.6254 0.9254
fights lack of sleep p11 0.4083 0.2689 0.5131 0.3902 -0.1770 0.6859 0.9187
promotes better blood circulation p18 0.1673 0.2424 0.4349 0.3291 0.3588 0.5129 0.9572
provides extra energy/strength p3 0.0685 0.0555 0.2453 0.7792 0.2662 0.7459 0.8856
relieves tiredness/fatigue/stress p9 0.2239 0.0973 0.2455 0.7225 0.1620 0.6682 0.9085
makes one feel younger/revitalized p21 0.1944 0.3048 0.1506 0.1943 0.5743 0.5209 0.9269
promotes good eyesight p20 0.2175 0.2611 0.4588 0.1704 0.5624 0.6713 0.9333
makes body strong and healthy p2 0.4157 0.1211 0.1717 0.2789 0.5292 0.5749 0.9428

4 FACTORS

Different parameters for the solution were adjusted to attain the final solution for the exploratory factor analysis. “Varimax” rotation were chosen since it provides a more interpretable results compared to “quartimax” and “oblimin”.

In general, it was quite difficult to get interpretations for the data involving other variables. To help give a clearer interpretation for the data, we removed some of the variables (p5, p6, p10, p12, p14, p16) as shown in the disucussion. After removing the variables, it resulted to a much clearer table and is easier to interpret. The groupings of the values were much more visible and concise than the other one.

fa4.varimax <- fa(r = fa.vitamins, 
                        nfactors = 4, 
                        SMC = T, 
                        scores = "regression", 
                        rotate = "varimax", 
                        fm = "pa")
fa4.varimax.comm.kmo <- data.frame(communality = fa4.varimax$communality, 
                                   "KMO MSAi" = KMO(fa.vitamins)$MSAi) %>% round(4) %>%
                        rownames_to_column("code") %>% 
                          cbind(variables = variables$variables[c(-5,-6,-10,-12,-14,-16)])
fa4.varimax.final <- as.data.frame(unclass(fa.sort(fa4.varimax$loadings))) %>%
  round(4) %>% rownames_to_column("code") %>% inner_join(y = fa4.varimax.comm.kmo, by = "code") %>% 
  relocate(variables, .before = code) %>% kable()
fa4.varimax.final
variables code PA1 PA3 PA2 PA4 communality KMO.MSAi
provides extra energy/strength p3 0.7093 0.0984 0.0257 0.2494 0.5756 0.8856
keeps one full of energy p23 0.6897 0.1283 0.1386 0.2785 0.5889 0.9254
relieves tiredness/fatigue/stress p9 0.6842 0.2299 0.0674 0.1640 0.5524 0.9085
fights lack of sleep p11 0.6359 0.3960 0.3026 -0.1701 0.6817 0.9187
extends peak hours p22 0.6096 0.2145 0.1792 0.2406 0.5077 0.9102
promotes better blood circulation p18 0.5381 0.1555 0.2634 0.3673 0.5179 0.9572
revitalizes/conditions body p8 0.5375 0.5200 0.2660 0.0719 0.6353 0.9415
promotes weight gain p7 0.1581 0.7241 0.3304 0.0839 0.6655 0.9114
enhances/increases appetite p4 0.1516 0.7090 0.1380 0.2293 0.5973 0.9050
increases body resistance p1 0.3421 0.6270 -0.0095 0.3251 0.6159 0.9058
promotes healthy hair p13 0.0522 0.0385 0.7718 0.1517 0.6228 0.8280
promotes growth/height p15 0.0748 0.1639 0.7585 0.1442 0.6287 0.8397
makes bones/teeth strong p17 0.3276 0.2377 0.5284 0.0781 0.4491 0.9186
promotes good skin p19 0.3746 0.3292 0.5010 0.2461 0.5602 0.9623
makes one feel younger/revitalized p21 0.2402 0.1927 0.2986 0.5758 0.5155 0.9269
promotes good eyesight p20 0.4290 0.2105 0.2990 0.5567 0.6278 0.9333
makes body strong and healthy p2 0.3241 0.4145 0.1137 0.5290 0.5696 0.9428

4 Factors w/ Varimax Rotation is selected for the final solution.