Source code for psy.fa.factors

# coding=utf-8
import numpy as np
from psy.utils import cached_property


[docs]class Factor(object): # 简单的因子分析,服务于mirt的初值估计 def __init__(self, scores, factors_num): self._scores = scores self._factors_num = factors_num @cached_property def cor(self): # 相关矩阵 scores_cor = np.corrcoef(self._scores, rowvar=False) return scores_cor @cached_property def polycor(self): # 伪polycor return np.abs(self.cor) ** (1 / 1.15) * np.sign(self.cor) @property def mirt_loading(self): cov = self.polycor score_eig = self._get_eigen(cov) loadings = score_eig[1][:, :self._factors_num] return loadings @staticmethod def _get_eigen(cov): score_eig = np.linalg.eig(cov) idx = score_eig[0].argsort() eigenvalues = score_eig[0][idx][::-1] _eigenvectors = score_eig[1][:, idx][:, ::-1] eigenvectors = _eigenvectors * np.sign(np.sum(_eigenvectors, 0)) return eigenvalues, eigenvectors @property def loadings(self): # 因子载荷 cov = self.cor score_eig = self._get_eigen(cov) _loadings = score_eig[0] ** 0.5 * score_eig[1] loadings = _loadings[:, :self._factors_num] return loadings