Skip to content

neurostatx.utils.factor

Classes

NameDescription
MethodTypesFactor extraction methods for exploratory factor analysis.
RotationTypesFactor rotation methods for exploratory factor analysis.

Functions

NameDescription
cfaFit a confirmatory factor analysis model with semopy.
efaFit an exploratory factor analysis with factor_analyzer.
horn_parallel_analysisEstimate the number of factors and components with Horn's method.

MethodTypesclass#

class MethodTypes(StrEnum, Enum)

Bases: StrEnum, Enum

Factor extraction methods for exploratory factor analysis.

minresattributeclass attributeinstance attribute#

minres = 'minres'

mlattributeclass attributeinstance attribute#

ml = 'ml'

principalattributeclass attributeinstance attribute#

principal = 'principal'

RotationTypesclass#

class RotationTypes(StrEnum, Enum)

Bases: StrEnum, Enum

Factor rotation methods for exploratory factor analysis.

equamaxattributeclass attributeinstance attribute#

equamax = 'equamax'

oblimaxattributeclass attributeinstance attribute#

oblimax = 'oblimax'

obliminattributeclass attributeinstance attribute#

oblimin = 'oblimin'

promaxattributeclass attributeinstance attribute#

promax = 'promax'

quartimaxattributeclass attributeinstance attribute#

quartimax = 'quartimax'

quartiminattributeclass attributeinstance attribute#

quartimin = 'quartimin'

varimaxattributeclass attributeinstance attribute#

varimax = 'varimax'

cfafunction#

def cfa(df, model)

Fit a confirmatory factor analysis model with semopy.

Parameters

NameTypeDescription
dfpd.DataFrameObserved indicators included in the CFA.
modelstrsemopy model specification.

Returns

fittedsemopy.Model
Fitted CFA model.
scorespd.DataFrame
Predicted factor scores.
statspd.DataFrame
Parameter estimates from inspect.

Examples

>>> import pandas as pd
>>> import numpy as np
>>> from neurostatx.utils.factor import cfa
>>> rng = np.random.RandomState(0)
>>> f = rng.randn(40)
>>> df = pd.DataFrame({"x1": f + 0.1 * rng.randn(40),
... "x2": f + 0.1 * rng.randn(40),
... "x3": f + 0.1 * rng.randn(40)})
>>> fitted, scores, stats = cfa(df, "F =~ x1 + x2 + x3")
>>> "F" in scores.columns
True

efafunction#

def efa(df, method, rotation, nfactors=1)

Fit an exploratory factor analysis with factor_analyzer.

Parameters

NameTypeDefaultDescription
dfpd.DataFramerequiredVariables to include in the EFA.
methodstrrequiredExtraction method: "minres", "ml", or "principal".
rotationstrrequiredRotation applied to the loadings, or None.
nfactorsint1Number of factors to extract. Defaults to 1.

Returns

modelFactorAnalyzer
Fitted factor analyzer.
evnp.array
Original eigenvalues.
vnp.array
Common-factor eigenvalues.
scoresnp.array
Factor scores.
loadingsnp.array
Factor loadings.
communalitiesnp.array
Communalities.

Examples

>>> import pandas as pd
>>> import numpy as np
>>> from neurostatx.utils.factor import efa
>>> rng = np.random.RandomState(0)
>>> df = pd.DataFrame(rng.rand(40, 4), columns=list("abcd"))
>>> model, ev, v, scores, loadings, communalities = efa(
... df, method="minres", rotation="varimax", nfactors=1
... )
>>> scores.shape[0]
40

horn_parallel_analysisfunction#

def horn_parallel_analysis(x, output_folder, method='minres', rotation=None, nfactors=1, niter=20)

Estimate the number of factors and components with Horn’s method.

Compares observed eigenvalues to those from random data, following psych’s fa.parallel.

Parameters

NameTypeDefaultDescription
xnp.arrayrequiredVariables to include in the analysis.
output_folderstrrequiredDirectory where horns_parallel_screeplot.png is written.
methodstr'minres'Extraction method: "minres", "ml", or "principal". Defaults to "minres".
rotationstrNoneRotation applied when fitting. Defaults to None.
nfactorsint1Number of factors extracted while computing eigenvalues. Defaults to 1.
niterint20Number of random-data iterations. Defaults to 20.

Returns

suggfactorsint
Suggested number of factors.
suggcomponentsint
Suggested number of components.

Examples

>>> import numpy as np
>>> from neurostatx.utils.factor import horn_parallel_analysis
>>> rng = np.random.RandomState(0)
>>> x = rng.rand(40, 5)
>>> suggfactors, suggcomponents = horn_parallel_analysis(
... x, output_folder=".", niter=2
... )