<p>I have this question once, and it is what I've found:</p>
<p>This passage from a report about it by a prominent pioneer of SEM pretty much sums it up:</p>
<p>&quot;This misunderstanding probably stems from classical exploratory factor analysis where factor loadings are correlations if a correlation matrix is analyzed and the factors are standardized and uncorrelated (orthogonal). However, if the factors are correlated (oblique), the factor loadings are regression coefficients and not correlations and as such they can be larger than one in magnitude.&quot;</p>
<p>The absolute value of factor loadings can be greater than 1 (please read this for more details: <a href="https://stats.stackexchange.com/questions/266304/in-factor-analysis-or-in-pca-what-does-it-mean-a-factor-loading-greater-than">https://stats.stackexchange.com/questions/266304/in-factor-analysis-or-in-pca-what-does-it-mean-a-factor-loading-greater-than</a>)</p>
<p>You can have a look about EFA, CFA in this doc <a href="https://arxiv.org/abs/1905.05598" rel="nofollow noreferrer">https://arxiv.org/abs/1905.05598</a></p>
Interpretation of factor loadings in Confirmatory Factor Analysis using factor_analyzer
<p>I made factor analysis using ConfirmatoryFactorAnalyzer from factor_analyzer package.
As far as I understand SEM, the factor loadings should be the Pearson's coefficients of latent variables and measured variables, but one of them is equal to -1.17, so it cannot be correlation coefficient.</p>
<p>Does it mean something else in case of this package? Should I standarize it somehow (but my data is standarized)? Docs don't really help:</p>
<blockquote>
<p>loadings_: The factor loadings matrix.</p>
</blockquote>
<p>Here is my code:</p>
<pre><code>def sem_analysis(data, group1, group2):
    scaler = StandardScaler()
    scaled_data = pd.DataFrame(scaler.fit_transform(data), columns=data.columns)
    required_data = scaled_data[group1 + group2]
    model_dict = {&quot;F1&quot;: group1, &quot;F2&quot;: group2}
    model_spec = ModelSpecificationParser.parse_model_specification_from_dict(required_data, model_dict)
    cfa = ConfirmatoryFactorAnalyzer(model_spec, disp=False)
    cfa.fit(required_data.values)
    return cfa.loadings_
</code></pre>
<p>And the result I get on randomly generated data:</p>
<pre><code>[[ 0.81664434  0.        ]
 [ 0.76591388  0.        ]
 [-0.84197706  0.        ]
 [ 0.         -0.27572329]
 [ 0.         -1.17491134]
 [ 0.          0.39020765]]
</code></pre>