def ability_map(dataset, difficulty, discrimination, options=None)
Estimates the abilities for dichotomous models.
Estimates the ability parameters (theta) for dichotomous models via maximum a posterior likelihood estimation.
dataset
difficulty
discrimination
options
abilities
distribution
If distribution is uniform, please use ability_mle instead. A large set of probability distributions can be found in scipy.stats https://docs.scipy.org/doc/scipy/reference/stats.html
def ability_map(dataset, difficulty, discrimination, options=None):
"""Estimates the abilities for dichotomous models.
Estimates the ability parameters (theta) for dichotomous models via
maximum a posterior likelihood estimation.
Args:
dataset: [n_items, n_participants] (2d Array) of measured responses
difficulty: (1d Array) of difficulty parameters for each item
discrimination: (1d Array) of disrimination parameters for each item
options: dictionary with updates to default options
Returns:
abilities: (1d array) estimated abilities
Options:
distribution:
Notes:
If distribution is uniform, please use ability_mle instead. A large set
of probability distributions can be found in scipy.stats
https://docs.scipy.org/doc/scipy/reference/stats.html
"""
options = validate_estimation_options(options)
distribution = options['distribution']
if np.atleast_1d(discrimination).size == 1:
discrimination = np.full(dataset.shape[0], discrimination,
dtype="float")
n_takers = dataset.shape[1]
the_sign = convert_responses_to_kernel_sign(dataset)
thetas = np.zeros((n_takers,))
for ndx in range(n_takers):
# pylint: disable=cell-var-from-loop
scalar = the_sign[:, ndx] * discrimination
def _theta_min(theta):
otpt = 1.0 / (1.0 + np.exp(scalar * (theta - difficulty)))
return -(np.log(otpt).sum() + np.log(distribution(theta)))
# Solves for the ability for each person
thetas[ndx] = fminbound(_theta_min, -6, 6)
return thetas