Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
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
Beispiel #4
0
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