def split_channel(self, by): """ Returns a list TemporalDataset splited by channels Args: by(String): the descriptor by which the splitting is made Returns: list of TemporalDataset, split by the selected channel_descriptor """ unique_values, inverse = get_unique_inverse( self.channel_descriptors[by]) dataset_list = [] for i_v, v in enumerate(unique_values): selection = np.where(inverse == i_v)[0] measurements = self.measurements[:, selection, :] descriptors = self.descriptors.copy() descriptors[by] = v obs_descriptors = self.obs_descriptors channel_descriptors = subset_descriptor(self.channel_descriptors, selection) time_descriptors = self.time_descriptors dataset = TemporalDataset(measurements=measurements, descriptors=descriptors, obs_descriptors=obs_descriptors, channel_descriptors=channel_descriptors, time_descriptors=time_descriptors, check_dims=False) dataset_list.append(dataset) return dataset_list
def split_obs(self, by): """ Returns a list Datasets splited by obs Args: by(String): the descriptor by which the splitting is made Returns: list of Datasets, splitted by the selected obs_descriptor """ unique_values, inverse = get_unique_inverse(self.obs_descriptors[by]) dataset_list = [] for i_v, _ in enumerate(unique_values): selection = np.where(inverse == i_v)[0] measurements = self.measurements[selection, :] descriptors = self.descriptors.copy() obs_descriptors = subset_descriptor(self.obs_descriptors, selection) channel_descriptors = self.channel_descriptors dataset = Dataset(measurements=measurements, descriptors=descriptors, obs_descriptors=obs_descriptors, channel_descriptors=channel_descriptors, check_dims=False) dataset_list.append(dataset) return dataset_list
def cov_from_unbalanced(dataset, obs_desc, dof=None, method='shrinkage_diag'): """ Estimates a covariance matrix from an unbalanced dataset, i.e. from a dataset that contains different numbers of samples for different stimuli. Args: dataset(data.Dataset): rsatoolbox Dataset object dof(int or list of int): degrees of freedom for covariance estimation defaults to n_measurements - n_stimuli, should be corrected if this is not the case method(str): which estimate to use: 'diag': provides a diagonal matrix, i.e. univariate noise normalizer 'full': computes the sample covariance without shrinkage 'shrinkage_eye': shrinks the data covariance towards a multiple of the identity. 'shrinkage_diag': shrinks the covariance matrix towards the diagonal covariance matrix. Returns: numpy.ndarray (or list): sigma_p: covariance matrix over channels """ if isinstance(dataset, Iterable): cov_mat = [] for i, dat in enumerate(dataset): if dof is None: cov_mat.append( cov_from_unbalanced(dat, obs_desc=obs_desc, method=method)) elif isinstance(dof, Iterable): cov_mat.append( cov_from_unbalanced(dat, obs_desc=obs_desc, method=method, dof=dof[i])) else: cov_mat.append( cov_from_unbalanced(dat, obs_desc=obs_desc, method=method, dof=dof)) else: assert "Dataset" in str( type(dataset)), "Provided object is not a dataset" assert obs_desc in dataset.obs_descriptors.keys(), \ "obs_desc not contained in the dataset's obs_descriptors" matrix = dataset.measurements means, values, _ = average_dataset_by(dataset, obs_desc) values, inverse = get_unique_inverse(dataset.obs_descriptors[obs_desc]) matrix -= means[inverse] # calculate sample covariance matrix s if dof is None: dof = matrix.shape[0] - len(values) cov_mat = _estimate_covariance(matrix, dof, method) return cov_mat
def average_dataset_by(dataset, by): """ computes the average of a dataset per value of a descriptor Args: dataset(rsatoolbox.data.Dataset): the dataset to operate on by(String): which obs_descriptor to split by Returns: numpy.ndarray: average: average activation vector """ unique_values, inverse = get_unique_inverse(dataset.obs_descriptors[by]) average = np.nan * np.empty( (len(unique_values), dataset.measurements.shape[1])) n_obs = np.nan * np.empty(len(unique_values)) for i_v, _ in enumerate(unique_values): measurements = dataset.measurements[inverse == i_v, :] average[i_v] = np.mean(measurements, axis=0) n_obs[i_v] = measurements.shape[0] return average, unique_values, n_obs