create_synthetic_mirt_dichotomous
def create_synthetic_mirt_dichotomous(difficulty, discrimination, thetas, seed=None)Creates dichotomous multidimensional synthetic IRT data.
Assumes the model P(theta) = 1.0 / (1 + exp(-1 * (dot(discrimination,theta) + difficulty)))
Args
difficulty- [array, M] of difficulty parameters
discrimination- [2-D array, MxN] of discrimination parameters
thetas- [2-D array, NxP] of person abilities
seed- Optional setting to reproduce results
Returns
synthetic_data- (2d array) realization of possible response given parameters
Example
n_factors = 3 n_items = 15 n_people = 500 difficulty = np.linspace(-2.5, 2.5, n_items) discrimination = np.random.randn(n_items, n_factors) thetas = np.random.randn(n_factors, n_people)
synthetic_data = create_synthetic_mirt_dichotomous(difficulty, discrimination, thetas)
Expand source code
def create_synthetic_mirt_dichotomous(difficulty, discrimination, thetas, seed=None): """ Creates dichotomous multidimensional synthetic IRT data. Assumes the model P(theta) = 1.0 / (1 + exp(-1 * (dot(discrimination,theta) + difficulty))) Args: difficulty: [array, M] of difficulty parameters discrimination: [2-D array, MxN] of discrimination parameters thetas: [2-D array, NxP] of person abilities seed: Optional setting to reproduce results Returns: synthetic_data: (2d array) realization of possible response given parameters Example: n_factors = 3 n_items = 15 n_people = 500 difficulty = np.linspace(-2.5, 2.5, n_items) discrimination = np.random.randn(n_items, n_factors) thetas = np.random.randn(n_factors, n_people) synthetic_data = create_synthetic_mirt_dichotomous(difficulty, discrimination, thetas) """ if seed: np.random.seed(seed) # If the input is just a vector of discriminations if (np.ndim(discrimination) == 1) or (discrimination.shape[0] == 1): discrimination = np.vstack((discrimination,) * difficulty.shape[0]) # Inline computation of the logistic kernel kernel_terms = discrimination @ thetas kernel_terms += difficulty[:, None] continuous_output = 1.0 / (1.0 + np.exp(-kernel_terms)) # convert to binary based on probability random_compare = np.random.rand(*continuous_output.shape) return random_compare <= continuous_output
Last modified April 15, 2020: Adding doc strings to utility functions. (99abcbc)