# How Many Factors to Retain in Factor Analysis

# The method agreement procedure

When running a factor analysis, one often needs to know how many components / latent variables to retain. Fortunately, many methods exist to statistically answer this question. Unfortunately, there is no consensus on which method to use. Therefore, the `n_factors()`

function, available in the psycho package, performs the **method agreement procedure**: it runs all the routines and returns the number of factors with the highest consensus.

```
# devtools::install_github("neuropsychology/psycho.R") # Install the last psycho version if needed
library(tidyverse)
library(psycho)
results <- attitude %>%
psycho::n_factors()
print(results)
```

```
## The choice of 1 factor is supported by 5 (out of 9; 55.56%) methods (Optimal Coordinates, Acceleration Factor, Parallel Analysis, Velicer MAP, VSS Complexity 1).
```

We can have an overview of all values by using the `summary`

method.

n.Factors | n.Methods | Eigenvalues | Cum.Variance |
---|---|---|---|

1 | 5 | 3.72 | 0.53 |

2 | 3 | 1.14 | 0.69 |

3 | 1 | 0.85 | 0.81 |

4 | 0 | 0.61 | 0.90 |

5 | 0 | 0.32 | 0.95 |

6 | 0 | 0.22 | 0.98 |

7 | 0 | 0.14 | 1.00 |

And, of course, plot it :)

```
plot(results)
```

The plot shows the **number of methods** (in yellow), the **Eigenvalues** (red line) and the cumulative proportion of **explained variance** (blue line).

For more details, we can also extract the final result (the optimal number of factors) for each method:

```
summary(results)
```

Method | n_optimal |
---|---|

Optimal Coordinates | 1 |

Acceleration Factor | 1 |

Parallel Analysis | 1 |

Eigenvalues (Kaiser Criterion) | 2 |

Velicer MAP | 1 |

BIC | 2 |

Sample Size Adjusted BIC | 3 |

VSS Complexity 1 | 1 |

VSS Complexity 2 | 2 |

# Tweaking

We can also provide a correlation matrix, as well as changing the rotation and the factoring method.

```
df <- psycho::affective
cor_mat <- psycho::correlation(df)
cor_mat <- cor_mat$values$r
results <- cor_mat %>%
psycho::n_factors(rotate = "oblimin", fm = "mle", n=nrow(df))
print(results)
```

```
## The choice of 2 factors is supported by 5 (out of 9; 55.56%) methods (Parallel Analysis, Eigenvalues (Kaiser Criterion), BIC, Sample Size Adjusted BIC, VSS Complexity 2).
```

```
plot(results)
```

# Credits

This package helped you? Donâ€™t forget to cite the various packages you used :)

You can cite `psycho`

as follows:

- Makowski, (2018).
*The psycho Package: an Efficient and Publishing-Oriented Workflow for Psychological Science*. Journal of Open Source Software, 3(22), 470. https://doi.org/10.21105/joss.00470

# Previous blogposts

- Copy/paste t-tests Directly to Manuscripts
- APA Formatted Bayesian Correlation
- Fancy Plot (with Posterior Samples) for Bayesian Regressions
- How Many Factors to Retain in Factor Analysis
- Beautiful and Powerful Correlation Tables
- Format and Interpret Linear Mixed Models
- How to do Repeated Measures ANOVAs
- Standardize (Z-score) a dataframe
- Compute Signal Detection Theory Indices