exploratory factor analysis, non-normal data
The data I am analyzing are non-normal for nearly each observed variable. I would like to do an exploratory factor analysis (EFA) in R. KMO-test and Bartlett's test indicate that the data are eligible for EFA. In the documentation of the psych package I have not found how non-normally distributed data should be handled (https://personality-project.org/r/psych/HowTo/factor.pdf). My sample is relatively small (N=60).
While doing a confirmatory factor analysis, I can use Satorra-Bentler correction in the lavaan package for the non-normal data, cfa() function, e.g. cfa(model = spec, data = df_data, std.lv=TRUE, estimator = "MLM") , this correction with the robust standard error is an acceptable approach. estimator="MLM" stands for Satorra-Bentler correction. Can I do it somehow also with the psych package?
The psych package carries out the EFA, fa() function, e.g. fa(data, nfactors = 4, rotate = "oblimin") and delivers feasible factors but it is designed to be used with normally distributed data, if I am not much mistaken.
If I try to use efa() with Satorra-Bentler correction from the lavaan package, it delivers warnings that the co/variance matrix contains small negative values which might be an indication that the model is not identified:
So the question: How can I compute an EFA with non-normal data, possibly with the psych package?
Nothing in EFA assumes that the data are normally distributed. However, EFA is based on covariances or correlations and some forms of non-normality may make correlations inappropriate - this depends on the specific case and also on what you want to get from the EFA.
One possible solution (if it is, in fact, a problem) is to use Spearman's rank correlations. This ameliorates problems with outliers. But it is possible that you want those "problems" with outliers - they may be useful.
You can try both methods and see which gives you more useful results. After all, EFA is, inherently, an exploratory technique. Just be careful to note this, both when interpreting your results yourself and when writing them up.
Depending on why you are doing the EFA, you may need to treat this as a pilot study with suggestive results and then try again when you have more data. E.g. if you are working on test construction, and using the EFA to develop subscales, you will want to confirm your results and you will want a larger sample. But if you are really just exploring, that may not be needed.
If you tell us why you are doing EFA and how the data are non-normal, either I or someone else may be able to give a more specific answer.
There are two issues that you may be encountering. First, $N = 60$ is rather small for factor analysis, and lavaan may be throwing an error due to the fact that you're trying to extract 4 factors, where that might be too many.
In general, to answer your question, it depends upon the non-normality. Here are your options in the psych package:
Choose a different factor extraction method. The default is minres, and there are several others that are robust to non-normality. This only works well for observed variables that are at least ordinal, with more than 5 or so categories, and works best for continuous variables.
If your data are binary, or ordinal categorical, you can use the cor argument of the fa() function to ask for polychoric, tetrachoric, biserial, correlations etc. These are methods for estimating the correlation between underlying continuous variables from ordinal categorical variables. See this answer for an explainer.
If you update your question with the kinds of variables you have, I can include sample code for you. Here's what it might look like:
You may not need the correct = 0 argument, but with a small dataset, the use of polychoric correlations might break down if your data are sparse
If you simply want to change the extraction method, say to principal axis: