Source code for psy.ctt.ctt

# coding=utf-8
from __future__ import division, print_function
import numpy as np

from psy import Factor


[docs]class BaseCtt(object): def __init__(self, scores): self._scores = scores self.sum_scores = np.sum(scores, axis=1) self.sum_scores.shape = self.sum_scores.shape[0], 1 self.item_size = scores.shape[1]
[docs] def get_composite_reliability(self): # 组合信度 f = Factor(self._scores, 1) loadings = f.loadings lambda_sum_square = np.sum(loadings) ** 2 lambda_square_sum = np.sum(loadings ** 2) return lambda_sum_square / (lambda_sum_square - lambda_square_sum + self.item_size)
[docs] def get_alpha_reliability(self): scores = self._scores item_size = self.item_size # 每道试题的方差 items_var = np.var(scores, axis=0) # 所有试题方差的和 sum_items_var = np.sum(items_var) # 计算总分方差 sum_scores_var = np.var(self.sum_scores) return item_size / (item_size - 1) * (1 - sum_items_var / sum_scores_var)
[docs]class BivariateCtt(BaseCtt):
[docs] def get_discrimination(self): # 区分度 scores = self._scores # 题目分数均值 scores_mean = np.mean(scores, axis=0) # 总分均值 sum_scores_mean = np.mean(self.sum_scores) # 中心化 center = (scores - scores_mean) * (self.sum_scores - sum_scores_mean) # 协方差 cov = np.mean(center, axis=0) # 方差 std = np.std(scores, axis=0) * np.std(self.sum_scores) return cov / std
[docs] def get_difficulty(self): # 难度(通俗度) return np.mean(self._scores, axis=0)