code: def data_shapes(self):
          
          independent_shapes = []
          for var, data in self.independent_data.items():
              if data is not None:
                  independent_shapes.append(data.shape)
  
          dependent_shapes = []
          for var, data in self.dependent_data.items():
              if data is not None:
                  dependent_shapes.append(data.shape)
  
          return list(set(independent_shapes)), list(set(dependent_shapes))
docs: Returns the shape of the data. In most cases this will be the same for
          all variables of the same type, if not this raises an Exception.
  
          Ignores variables which are set to None by design so we know that those
          None variables can be assumed to have the same shape as the other in
          calculations where this is needed, such as the covariance matrix.
  
          :return: Tuple of all independent var shapes, dependent var shapes.