5.12 Rotated factor solution

In this illustration, we assume there exist correlation between the factors. So, we will use the oblique rotation with rotate = "oblimin", and common factor analysis as maximum likelihood, i.e., fm = "ml".

We use the codes below to examine the rotated factor solutions.

# three factor solution
rotated_three_factors <- fa(data.us.only, nfactors = 3, rotate = "oblimin", fm = "ml")
print(rotated_three_factors, sort = T, cut = .30)
## Factor Analysis using method =  ml
## Call: fa(r = data.us.only, nfactors = 3, rotate = "oblimin", fm = "ml")
## Standardized loadings (pattern matrix) based upon correlation matrix
##          item   ML1   ML3   ML2   h2   u2 com
## AUICT4     15  0.85             0.68 0.32 1.0
## AUICT1     12  0.72             0.51 0.49 1.1
## AUICT2     13  0.65             0.53 0.47 1.3
## AUICT5     16  0.62             0.48 0.52 1.2
## AUICT3     14  0.62             0.49 0.51 1.2
## COMPICT5   11  0.51             0.47 0.53 1.5
## COMPICT4   10  0.49             0.46 0.54 1.6
## COMPICT2    8  0.38  0.35       0.46 0.54 2.2
## INTICT3     3        0.73       0.49 0.51 1.0
## INTICT6     6        0.73       0.56 0.44 1.0
## INTICT2     2        0.62       0.37 0.63 1.0
## COMPICT3    9        0.59       0.48 0.52 1.3
## INTICT4     4        0.56       0.48 0.52 1.4
## INTICT1     1        0.51       0.24 0.76 1.1
## INTICT5     5        0.44       0.23 0.77 1.4
## COMPICT1    7        0.40       0.30 0.70 1.5
## SOIAICT4   20              0.85 0.73 0.27 1.0
## SOIAICT5   21              0.77 0.60 0.40 1.0
## SOIAICT2   18              0.74 0.58 0.42 1.0
## SOIAICT1   17              0.64 0.43 0.57 1.0
## SOIAICT3   19              0.61 0.43 0.57 1.0
## 
##                        ML1  ML3  ML2
## SS loadings           3.55 3.42 3.05
## Proportion Var        0.17 0.16 0.15
## Cumulative Var        0.17 0.33 0.48
## Proportion Explained  0.35 0.34 0.30
## Cumulative Proportion 0.35 0.70 1.00
## 
##  With factor correlations of 
##      ML1  ML3  ML2
## ML1 1.00 0.44 0.47
## ML3 0.44 1.00 0.28
## ML2 0.47 0.28 1.00
## 
## Mean item complexity =  1.2
## Test of the hypothesis that 3 factors are sufficient.
## 
## df null model =  210  with the objective function =  9.5 with Chi Square =  51537.58
## df of  the model are 150  and the objective function was  1.03 
## 
## The root mean square of the residuals (RMSR) is  0.04 
## The df corrected root mean square of the residuals is  0.05 
## 
## The harmonic n.obs is  5433 with the empirical chi square  3918.91  with prob <  0 
## The total n.obs was  5433  with Likelihood Chi Square =  5603.36  with prob <  0 
## 
## Tucker Lewis Index of factoring reliability =  0.851
## RMSEA index =  0.082  and the 90 % confidence intervals are  0.08 0.084
## BIC =  4313.32
## Fit based upon off diagonal values = 0.98
## Measures of factor score adequacy             
##                                                    ML1  ML3  ML2
## Correlation of (regression) scores with factors   0.94 0.92 0.94
## Multiple R square of scores with factors          0.88 0.86 0.88
## Minimum correlation of possible factor scores     0.77 0.71 0.76

The three factor solution produces fine solution. We noticed that AUICT1-5 and COMPICT2, COMPICT4, COMPICT5 load on the first factor; INTICT1-6, COMPICT3, COMPICT1 load on the second factor; and SOIAICT1-5 load on the third factor. The model fit result shows that the three factor solution has poor model data fit.

# Extract model fit indices
RMSEA_three_fac <- rotated_three_factors$RMSEA[1]
TLI_three_fac <- rotated_three_factors$TLI
RMSR_three_fac <- rotated_three_factors$rms

# Combined the fit indices
fit.indices_three_fac <- round(rbind(RMSEA_three_fac, TLI_three_fac, RMSR_three_fac), 
                               digits = 3)
colnames(fit.indices_three_fac) <- "Model fit indices"
fit.indices_three_fac
##                 Model fit indices
## RMSEA_three_fac             0.082
## TLI_three_fac               0.851
## RMSR_three_fac              0.041

Let’s explore the rotated six factor solution.

# six factor solution
rotated_six_factors <- fa(data.us.only, nfactors = 6, rotate = "oblimin", fm = "ml")
print(rotated_six_factors, sort = T, cut = .30)
## Factor Analysis using method =  ml
## Call: fa(r = data.us.only, nfactors = 6, rotate = "oblimin", fm = "ml")
## Standardized loadings (pattern matrix) based upon correlation matrix
##          item   ML2   ML1   ML4   ML3   ML5   ML6   h2   u2 com
## SOIAICT4   20  0.85                               0.73 0.27 1.0
## SOIAICT5   21  0.79                               0.61 0.39 1.0
## SOIAICT2   18  0.72                               0.58 0.42 1.0
## SOIAICT1   17  0.69                               0.46 0.54 1.1
## SOIAICT3   19  0.58                               0.44 0.56 1.1
## COMPICT5   11        0.84                         0.70 0.30 1.0
## COMPICT4   10        0.80                         0.65 0.35 1.0
## COMPICT2    8        0.64                         0.57 0.43 1.1
## COMPICT3    9        0.44                         0.52 0.48 2.9
## COMPICT1    7        0.41                         0.34 0.66 1.7
## AUICT3     14              0.81                   0.68 0.32 1.0
## AUICT5     16              0.73                   0.61 0.39 1.0
## AUICT4     15              0.44        0.36       0.65 0.35 2.5
## INTICT2     2                    0.81             0.61 0.39 1.0
## INTICT3     3                    0.60             0.56 0.44 1.3
## AUICT1     12                          0.73       0.64 0.36 1.0
## AUICT2     13                          0.68       0.64 0.36 1.1
## INTICT5     5                                0.64 0.41 0.59 1.0
## INTICT6     6                    0.32        0.42 0.58 0.42 2.3
## INTICT1     1                                0.35 0.27 0.73 1.7
## INTICT4     4                    0.34        0.35 0.52 0.48 3.1
## 
##                        ML2  ML1  ML4  ML3  ML5  ML6
## SS loadings           2.92 2.56 1.86 1.62 1.47 1.32
## Proportion Var        0.14 0.12 0.09 0.08 0.07 0.06
## Cumulative Var        0.14 0.26 0.35 0.43 0.50 0.56
## Proportion Explained  0.25 0.22 0.16 0.14 0.13 0.11
## Cumulative Proportion 0.25 0.47 0.62 0.76 0.89 1.00
## 
##  With factor correlations of 
##      ML2  ML1  ML4  ML3  ML5  ML6
## ML2 1.00 0.42 0.34 0.17 0.47 0.31
## ML1 0.42 1.00 0.58 0.41 0.46 0.36
## ML4 0.34 0.58 1.00 0.43 0.53 0.28
## ML3 0.17 0.41 0.43 1.00 0.07 0.47
## ML5 0.47 0.46 0.53 0.07 1.00 0.07
## ML6 0.31 0.36 0.28 0.47 0.07 1.00
## 
## Mean item complexity =  1.4
## Test of the hypothesis that 6 factors are sufficient.
## 
## df null model =  210  with the objective function =  9.5 with Chi Square =  51537.58
## df of  the model are 99  and the objective function was  0.2 
## 
## The root mean square of the residuals (RMSR) is  0.01 
## The df corrected root mean square of the residuals is  0.02 
## 
## The harmonic n.obs is  5433 with the empirical chi square  504.69  with prob <  1.1e-55 
## The total n.obs was  5433  with Likelihood Chi Square =  1087.12  with prob <  5e-166 
## 
## Tucker Lewis Index of factoring reliability =  0.959
## RMSEA index =  0.043  and the 90 % confidence intervals are  0.041 0.045
## BIC =  235.69
## Fit based upon off diagonal values = 1
## Measures of factor score adequacy             
##                                                    ML2  ML1  ML4  ML3  ML5  ML6
## Correlation of (regression) scores with factors   0.94 0.93 0.91 0.89 0.90 0.83
## Multiple R square of scores with factors          0.88 0.87 0.84 0.79 0.80 0.69
## Minimum correlation of possible factor scores     0.76 0.74 0.67 0.57 0.61 0.39

The six factor solution is quite messy but produces good model data fit.

# Extract model fit indices
RMSEA_six_fac <- rotated_six_factors$RMSEA[1]
TLI_six_fac <- rotated_six_factors$TLI
RMSR_six_fac <- rotated_six_factors$rms

# Combined the fit indices
fit.indices_six_fac <- round(rbind(RMSEA_six_fac, TLI_six_fac, RMSR_six_fac), 
                               digits = 3)
colnames(fit.indices_six_fac) <- "Model fit indices"
fit.indices_six_fac
##               Model fit indices
## RMSEA_six_fac             0.043
## TLI_six_fac               0.959
## RMSR_six_fac              0.015

Let’s explore the rotated four factor solution.

# four factor solution
rotated_four_factors <- fa(data.us.only, nfactors = 4, rotate = "oblimin", fm = "pa")
print(rotated_four_factors, sort = T, cut = .30)
## Factor Analysis using method =  pa
## Call: fa(r = data.us.only, nfactors = 4, rotate = "oblimin", fm = "pa")
## Standardized loadings (pattern matrix) based upon correlation matrix
##          item   PA2   PA4   PA3   PA1   h2   u2 com
## SOIAICT4   20  0.85                   0.72 0.28 1.0
## SOIAICT5   21  0.76                   0.59 0.41 1.0
## SOIAICT2   18  0.75                   0.59 0.41 1.0
## SOIAICT1   17  0.63                   0.43 0.57 1.0
## SOIAICT3   19  0.60                   0.43 0.57 1.0
## AUICT4     15        0.77             0.68 0.32 1.1
## AUICT3     14        0.70             0.56 0.44 1.2
## AUICT5     16        0.67             0.54 0.46 1.2
## AUICT1     12        0.66             0.51 0.49 1.1
## AUICT2     13        0.61             0.54 0.46 1.4
## INTICT3     3              0.73       0.54 0.46 1.0
## INTICT6     6              0.66       0.57 0.43 1.1
## INTICT2     2              0.60       0.40 0.60 1.1
## INTICT4     4              0.53       0.49 0.51 1.5
## INTICT1     1              0.49       0.26 0.74 1.1
## INTICT5     5              0.41       0.23 0.77 1.5
## COMPICT5   11                    0.81 0.67 0.33 1.0
## COMPICT4   10                    0.77 0.62 0.38 1.0
## COMPICT2    8                    0.69 0.59 0.41 1.1
## COMPICT1    7                    0.46 0.34 0.66 1.5
## COMPICT3    9              0.40  0.45 0.50 0.50 2.1
## 
##                        PA2  PA4  PA3  PA1
## SS loadings           3.02 2.63 2.63 2.53
## Proportion Var        0.14 0.13 0.13 0.12
## Cumulative Var        0.14 0.27 0.39 0.51
## Proportion Explained  0.28 0.24 0.24 0.23
## Cumulative Proportion 0.28 0.52 0.77 1.00
## 
##  With factor correlations of 
##      PA2  PA4  PA3  PA1
## PA2 1.00 0.44 0.20 0.43
## PA4 0.44 1.00 0.32 0.62
## PA3 0.20 0.32 1.00 0.45
## PA1 0.43 0.62 0.45 1.00
## 
## Mean item complexity =  1.2
## Test of the hypothesis that 4 factors are sufficient.
## 
## df null model =  210  with the objective function =  9.5 with Chi Square =  51537.58
## df of  the model are 132  and the objective function was  0.52 
## 
## The root mean square of the residuals (RMSR) is  0.03 
## The df corrected root mean square of the residuals is  0.03 
## 
## The harmonic n.obs is  5433 with the empirical chi square  1598.07  with prob <  5.9e-250 
## The total n.obs was  5433  with Likelihood Chi Square =  2830.5  with prob <  0 
## 
## Tucker Lewis Index of factoring reliability =  0.916
## RMSEA index =  0.061  and the 90 % confidence intervals are  0.059 0.063
## BIC =  1695.27
## Fit based upon off diagonal values = 0.99
## Measures of factor score adequacy             
##                                                    PA2  PA4  PA3  PA1
## Correlation of (regression) scores with factors   0.94 0.93 0.91 0.93
## Multiple R square of scores with factors          0.88 0.87 0.83 0.86
## Minimum correlation of possible factor scores     0.76 0.73 0.65 0.73
# Extract model fit indices
RMSEA_four_fac <- rotated_four_factors$RMSEA[1]
TLI_four_fac <- rotated_four_factors$TLI
RMSR_four_fac <- rotated_four_factors$rms

# Combined the fit indices
fit.indices_four_fac <- round(rbind(RMSEA_four_fac, TLI_four_fac, RMSR_four_fac), 
                               digits = 3)
colnames(fit.indices_four_fac) <- "Model fit indices"
fit.indices_four_fac
##                Model fit indices
## RMSEA_four_fac             0.061
## TLI_four_fac               0.916
## RMSR_four_fac              0.026

The four factor solution produces finer solution with good model data fit. One observation worth considering is COMPICT3 loading on the same factor with INTICT1-6. Let’s compare the question COMPICT3 which is IC014Q06NA with those of INTICT1-6. This results shows that students of Chile perceived COMPICT3 as an item measuring ICT Interest. Also, COMPICT3 has cross loading, i.e., load strongly on both the second and third factor. By changing fm = "ml" to fm = "pa", the problem is solved and all the items load on their respective factors. COMPICT3 still has cross loading, but it is evident that this item loads well on the third factor. Additionally, the least communality for the rotated four factor solution are acceptable.

From these results, it is evident that the four factor solution produces the best factor structure with a good model data fit. This answers the research question. Thus, the ICT engagement questionnaire has four factor structure, which confirms prior study findings.

We can export the factor loading and model data fit as follows.

# Extract and export factor loadings
f.loadings <- round(rotated_four_factors$loadings[c(1:21),], digits=3)
write(f.loadings, file = "Results of factor loadings.csv")

# Export model fit indices
write.csv(fit.indices_four_fac, file = "Model fit indices for factor loadings.csv")