예제 #1
0
 def testNoneParameters(self):
     if IGNORE_TEST:
         return
     self._init()
     fitter = ModelFitterCore(th.ANTIMONY_MODEL, self.timeseries, None)
     fitter.fitModel()
     self.assertIsNone(fitter.params)
     self.assertGreater(len(fitter.fittedTS), 0)
예제 #2
0
 def test(method):
     fitter = ModelFitterCore(th.ANTIMONY_MODEL, self.timeseries,
           list(th.PARAMETER_DCT.keys()), fitterMethods=method)
     fitter.fitModel()
     for parameter in ["k1", "k2", "k3", "k4", "k5"]:
         diff = np.abs(th.PARAMETER_DCT[parameter]
               - dct[parameter])
         frac = diff/dct[parameter]
         self.assertLess(diff/dct[parameter], 5.0)
예제 #3
0
 def calc(method, probNan=0.2):
     nanTimeseries = self.timeseries.copy()
     for col in self.timeseries.colnames:
         for idx in range(len(nanTimeseries)):
             if np.random.random() <= probNan:
                 nanTimeseries[col][idx] = np.nan
     fitter = ModelFitterCore(th.ANTIMONY_MODEL, nanTimeseries,
           list(th.PARAMETER_DCT.keys()), fitterMethods=method)
     fitter.fitModel()
     diff = np.abs(th.PARAMETER_DCT[PARAMETER]
           - fitter.params.valuesdict()[PARAMETER])
     return diff
예제 #4
0
 def test(col, func, maxDifference=0.0):
     timeseries = self.timeseries.copy()
     timeseries[col] = func(timeseries)
     fittedDataTransformDct = {col: func}
     fitter = ModelFitterCore(th.ANTIMONY_MODEL, timeseries,
           list(th.PARAMETER_DCT.keys()),
           fittedDataTransformDct=fittedDataTransformDct)
     fitter.fitModel()
     for name in self.fitter.params.valuesdict().keys():
         value1 = self.fitter.params.valuesdict()[name]
         value2 = fitter.params.valuesdict()[name]
         diff = np.abs(value1-value2)
         self.assertLessEqual(diff, maxDifference)
예제 #5
0
 def test(method):
     compareDct = {}
     for numFitRepeat in NUM_FIT_REPEATS:
         fitter = ModelFitterCore(th.ANTIMONY_MODEL, self.timeseries,
               list(th.PARAMETER_DCT.keys()), fitterMethods=method,
               numFitRepeat=numFitRepeat)
         fitter.fitModel()
         compareDct[numFitRepeat] = self.checkParameterValues()
     for parameter in ["k1", "k2", "k3", "k4", "k5"]:
         first = NUM_FIT_REPEATS[0]
         last = NUM_FIT_REPEATS[1]
         self.assertLessEqual(compareDct[first][parameter],
               compareDct[last][parameter])
예제 #6
0
 def testGetFittedModel(self):
     if IGNORE_TEST:
         return
     self._init()
     fitter1 = ModelFitterCore(th.ANTIMONY_MODEL, self.timeseries,
           list(th.PARAMETER_DCT.keys()))
     fitter1.fitModel()
     fittedModel = fitter1.getFittedModel()
     fitter2 = ModelFitterCore(fittedModel, self.timeseries,
           list(th.PARAMETER_DCT.keys()))
     fitter2.fitModel()
     # Should get same fit without changing the parameters
     std1 = np.var(fitter1.residualsTS.flatten())
     std2 = np.var(fitter2.residualsTS.flatten())
     if tcn.IGNORE_ACCURACY:
         return
     self.assertTrue(np.isclose(std1, std2, rtol=0.1))
예제 #7
0
class ModelFitterWrapper(AbstractFitter):

    def __init__(self, modelSpecification, observedTS, parametersToFit,
          trainIdxs=None, testIdxs=None,  **kwargs):
        """
        Parameters
        ----------
        modelSpecification: str
            antimony model
        observedTS: NamedTimeseries
        parametersToFit: list-str/SBstoat.Parameter/None
            parameters in the model that you want to fit
            if None, no parameters are fit
        trainIdxs: list-int
            rows of observedData used for estimating parameters
        testIdxs: list-int
            rows of observedData used for scoring fit
        """
        super().__init__()
        self.trainIdxs = trainIdxs
        self.testIdxs = testIdxs
        self.observedTS = observedTS
        if self.trainIdxs is None:
            self.trainIdxs = list(range(len(self.observedTS)))
        if self.testIdxs is None:
            self.testIdxs = list(range(len(self.observedTS)))
        self.trainTS = observedTS[self.trainIdxs]
        self.testTS = observedTS[self.testIdxs]
        self.modelFitter = ModelFitterCore(modelSpecification, self.trainTS,
              parametersToFit, **kwargs)
        self.columns = self.modelFitter.selectedColumns
        self.testObservedArr = self.testTS[self.columns]
    
    @property
    def parameters(self):
        """
        Returns
        -------
        lmfit.Parameters
        """
        return self.modelFitter.params

    def fit(self):
        """
        Estimates parameters.
        Parameters
        ----------
        
        Returns
        -------
        """
        self.modelFitter.fitModel()

    def score(self):
        """
        Returns an R^2 for predicting testData
        Parameters
        ----------
        
        Returns
        -------
        float
        """
        fullFittedTS = self.modelFitter.runSimulation(
              parameters=self.modelFitter.params,
              modelSpecification=self.modelFitter.modelSpecification,
              endTime=self.observedTS.end,
              numPoint=len(self.observedTS),
              _logger=self.modelFitter.logger,
              _loggerPrefix=self.modelFitter._loggerPrefix,
              )
        testFittedArr = fullFittedTS[self.modelFitter.selectedColumns]
        testFittedArr = testFittedArr[self.testIdxs, :]
        residualsArr = self.testObservedArr - testFittedArr
        rsq = 1 - np.var(residualsArr.flatten())  \
              / np.var(self.testObservedArr.flatten())
        return rsq