Пример #1
0
Observations
MultivariateModel
::SimulateData(io::DataSettings &DS) 
{
  /// This function simulates observations (Patients and their measurements y_ij at different time points t_ij) 
  /// according to the model, with a given noise level e_ij, such that y_ij = f(t_ij) + e_ij
  /// Their is two option: 
  /// 1) The model is not initialized (neither random variables of number of realizations) and it has to be
  /// This case corresponds to simulated data used to test the model, meaning if it can recover the random variables
  /// used to simulate the data
  /// 2) The model is already initialized, thus it should rely on its current state (random variables, realizations, ...)
  /// This case corresponds to new data, for a dataset augmentation for instance
  
  // TODO :
  /// PITFALL  : As for now, only the first option is implemented
  /// PITFALL2 : Take a closer look at / merge with InitializeFakeRandomVariables 
  
  
  /// Initialize the model
  m_ManifoldDimension = DS.GetCognitiveScoresDimension();
  m_NumberOfSubjects  = DS.GetNumberOfSimulatedSubjects();
  
  m_RealizationsPerRandomVariable["G"] = 1;
  
  for(size_t i = 1; i < m_ManifoldDimension; ++i)
    m_RealizationsPerRandomVariable["Delta#" + std::to_string(i)] = 1;

  for(size_t i = 0; i <  m_NbIndependentSources*(m_ManifoldDimension - 1); ++i)
    m_RealizationsPerRandomVariable["Beta#" + std::to_string(i)] = 1;

  m_RealizationsPerRandomVariable["Ksi"] = m_NumberOfSubjects;
  m_RealizationsPerRandomVariable["Tau"] = m_NumberOfSubjects;

  for(int i = 0; i < m_NbIndependentSources; ++i)
    m_RealizationsPerRandomVariable["S#" + std::to_string(i)] = m_NumberOfSubjects;

  auto R = SimulateRealizations();
  
  /// Update the model
  m_G = exp(R.at("G", 0));
  ComputeDeltas(R);
  ComputeOrthonormalBasis();
  ComputeAMatrix(R);
  ComputeSpaceShifts(R);
  ComputeBlock(R);
  
  /// Simulate the data
  std::random_device RD;
  std::mt19937 RNG(RD());
  std::uniform_int_distribution<int> Uni(DS.GetMinimumNumberOfObservations(), DS.GetMaximumNumberOfObservations());
  UniformRandomVariable NumberOfTimePoints(60, 95);
  GaussianRandomVariable Noise(0, m_Noise->GetVariance());
  
  /// Simulate the data
  Observations Obs;
  for(int i = 0; i < m_NumberOfSubjects; ++i)
  { 
    /// Get a random number of timepoints and sort them
    VectorType T = NumberOfTimePoints.Samples(Uni(RNG));
    T.sort();
    m_SubjectTimePoints.push_back(T);
    
    /// Simulate the data base on the time-points
    IndividualObservations IO(T);   
    std::vector<VectorType> Landmarks;
    for(size_t j = 0; j < T.size(); ++j)
    {
      Landmarks.push_back(ComputeParallelCurve(i, j) + Noise.Samples(m_ManifoldDimension));
    }
    
    IO.AddLandmarks(Landmarks);
    Obs.AddIndividualData(IO);
  }
  
  /// Initialize the observation and model attributes
  Obs.InitializeGlobalAttributes();
  m_IndividualObservationDate = Obs.GetObservations();
  m_SumObservations           = Obs.GetTotalSumOfLandmarks();
  m_NbTotalOfObservations     = Obs.GetTotalNumberOfObservations();
  
  return Obs;
  
}
Пример #2
0
void
MultivariateModel
::Initialize(const Observations& Obs) 
{
  /// The function initialize different attributes of the model
  /// As well as the specific random variables and their realizations used by the model
  // TODO : Pitfall : How to have a smart initialization, that may come out of a .txt / .csv file
  // TODO : instead of using the same initialization or modifiying it in the code
  // TODO : Some cases may fall in between the two cases (default values needed)
  
  
  /// Data-related attributes
  m_ManifoldDimension         = Obs.GetSubjectObservations(0).GetCognitiveScore(0).size();
  m_NumberOfSubjects          = Obs.GetNumberOfSubjects();
  m_IndividualObservationDate = Obs.GetObservations();
  m_SubjectTimePoints         = Obs.GetObservations();
  m_NbTotalOfObservations     = Obs.GetTotalNumberOfObservations();
  m_SumObservations           = Obs.GetTotalSumOfCognitiveScores();
  
  /// Initialize the size of some parameters
  m_Deltas.set_size(m_ManifoldDimension);
  m_Block.set_size(m_ManifoldDimension);
  
  /// Population variables 
  /// (Initialization of the random variable m_Random Variable 
  /// and the associated number of realizations m_RealizationPerRandomVariable)
  m_Noise = std::make_shared<GaussianRandomVariable>(0.0, 0.00001);
  
  m_RandomVariables.AddRandomVariable("G", "Gaussian", {0.12, 0.0001 * 0.0001});
  m_RealizationsPerRandomVariable["G"] = 1;
  
  for(size_t i = 1; i < m_ManifoldDimension; ++i)
  {
    std::string NameDelta = "Delta#" + std::to_string(i);
    m_RandomVariables.AddRandomVariable(NameDelta, "Gaussian", {0, 0.003 * 0.003});
    m_RealizationsPerRandomVariable[NameDelta] = 1;
  }
  
  for(int i = 0; i < m_NbIndependentSources*(m_ManifoldDimension - 1); ++i)
  {
    std::string Name = "Beta#" + std::to_string(i);
    m_RandomVariables.AddRandomVariable(Name, "Gaussian", {0, 0.001*0.001});
    m_RealizationsPerRandomVariable[Name] = 1;
  }
  
  /// Individual realizations 
  /// (Initialization of the random variable m_Random Variable 
  /// and the associated number of realizations m_RealizationPerRandomVariable)
  m_RandomVariables.AddRandomVariable("Ksi", "Gaussian", {0.13, 0.0004});
  m_RealizationsPerRandomVariable["Ksi"] = m_NumberOfSubjects;
  
  m_RandomVariables.AddRandomVariable("Tau", "Gaussian", {75, 0.025});
  m_RealizationsPerRandomVariable["Tau"] = m_NumberOfSubjects;
  
  for(int i = 0; i < m_NbIndependentSources; ++i)
  {
    std::string Name = "S#" + std::to_string(i);
    m_RandomVariables.AddRandomVariable(Name, "Gaussian", {0.0, 1});
    m_RealizationsPerRandomVariable[Name] = m_NumberOfSubjects;
  }
}