def test_fit_drift(self):
     """A simple one-parameter fit"""
     m = ddm.Model(name="DDM", drift=ddm.DriftConstant(drift=2))
     s = m.solve()
     sample = s.resample(10000)
     mfit = ddm.Model(
         name="DDM",
         drift=ddm.DriftConstant(drift=ddm.Fittable(minval=0, maxval=10)))
     ddm.fit_adjust_model(model=mfit, sample=sample)
     # Within 10%
     if SHOW_PLOTS:
         mfit.name = "Fitted solution"
         sfit = mfit.solve()
         plot_compare_solutions(s, sfit)
         plt.show()
     _verify_param_match("drift", "drift", m, mfit)
Exemple #2
0
    def setUp(self):
        self.basic = ddm.Model(dx=.005,
                               dt=.01,
                               T_dur=2,
                               drift=ddm.DriftConstant(drift=.4),
                               noise=ddm.NoiseConstant(noise=1),
                               bound=ddm.BoundConstant(B=1))

        class NoiseCond(ddm.Noise):
            name = "Noise with a condition"
            required_conditions = ['cond']
            required_parameters = []

            def get_noise(self, conditions, **kwargs):
                return conditions["cond"]

        self.withcond = ddm.Model(noise=NoiseCond())

        class FancyBounds(ddm.Bound):
            name = "Increasing/decreasing bounds"
            required_conditions = []
            required_parameters = []

            def get_bound(self, conditions, t, **kwargs):
                if t <= 1:
                    return 1 + t
                if t > 1:
                    return 2 / t

        self.bound = ddm.Model(bound=FancyBounds())
Exemple #3
0
 def test_ICPoint_collapsing_bounds(self):
     m = ddm.Model(name='ICPoint_BCollapsingLin_test',
                   drift=ddm.DriftConstant(drift=2),
                   noise=ddm.NoiseConstant(noise=1.5),
                   bound=ddm.BoundCollapsingLinear(B=1, t=0.5),
                   IC=ddm.ICPoint(x0=-.25))
     _modeltest_numerical_vs_analytical(m,
                                        method="implicit",
                                        max_diff=.3,
                                        mean_diff=.2,
                                        prob_diff=.05)
Exemple #4
0
 def test_get_set_parameters_functions(self):
     """Test get_parameters, set_parameters, and get_parameter_names"""
     p1 = ddm.Fittable(minval=0, maxval=1)
     p2 = ddm.Fittable(minval=.3, maxval=.9, default=.4)
     m = ddm.Model(drift=ddm.DriftConstant(drift=p1), noise=ddm.NoiseLinear(noise=p2, x=.2, t=p1))
     print(m.get_model_parameters())
     assert all(id(a) == id(b) for a,b in zip(m.get_model_parameters(), [p1, p2]))
     assert all(a == b for a,b in zip(m.get_model_parameter_names(), ["drift/t", "noise"]))
     m.set_model_parameters(m.get_model_parameters())
     assert all(id(a) == id(b) for a,b in zip(m.get_model_parameters(), [p1, p2]))
     m.set_model_parameters([.5, .5])
     assert all(a == b for a,b in zip(m.get_model_parameters(), [.5, .5]))
Exemple #5
0
 def test_ICPoint(self):
     """Arbitrary pointwise initial condition"""
     m = ddm.Model(name='ICPoint_test',
                   drift=ddm.DriftConstant(drift=2),
                   noise=ddm.NoiseConstant(noise=1.5),
                   bound=ddm.BoundConstant(B=1),
                   IC=ddm.ICPoint(x0=-.25))
     _modeltest_numerical_vs_analytical(m,
                                        method="implicit",
                                        max_diff=.3,
                                        mean_diff=.2,
                                        prob_diff=.05)
 def test_overlay_chain_distribution_integrates_to_1(self):
     """Overlays integrate to 1"""
     m = ddm.Model(name="Overlay_test",
                   drift=ddm.DriftConstant(drift=2),
                   T_dur=5,
                   overlay=ddm.OverlayChain(overlays=[
                       ddm.OverlayPoissonMixture(pmixturecoef=.2, rate=2),
                       ddm.OverlayUniformMixture(umixturecoef=.2),
                       ddm.OverlayNonDecision(nondectime=.2)
                   ]))
     s = m.solve()
     distsum = s.prob_correct() + s.prob_error()
     assert .99 < distsum < 1.0001, "Distribution doesn't sum to 1"
    def test_double_fit(self):
        """Fit different parameters in the same (or a different) model using a single Fittable object"""
        class NoiseDouble(ddm.Noise):
            name = "time-varying noise"
            required_parameters = ["noise1", "noise2"]

            def get_noise(self, **kwargs):
                if np.random.rand() > .5:
                    return self.noise1
                else:
                    return self.noise2

        class NoiseConstantButNot(ddm.Noise
                                  ):  # To avoid the numerical simulations
            name = "almost noise constant"
            required_parameters = ["noise"]

            def get_noise(self, **kwargs):
                return self.noise

        # Generate data
        m = ddm.Model(name="DDM",
                      drift=ddm.DriftConstant(drift=1),
                      noise=ddm.NoiseConstant(noise=1.7))
        s = m.solve_numerical(
        )  # Solving analytical and then fitting numerical may give a bias
        sample = s.resample(10000)
        mone = ddm.fit_model(
            sample,
            drift=ddm.DriftConstant(drift=1),
            noise=NoiseConstantButNot(noise=ddm.Fittable(minval=.5, maxval=3)))
        sigs = ddm.Fittable(minval=.5, maxval=3)
        msam = ddm.fit_model(sample,
                             drift=ddm.DriftConstant(drift=1),
                             noise=NoiseDouble(noise1=sigs, noise2=sigs))
        assert msam._noisedep.noise1 == msam._noisedep.noise2, "Fitting to be the same failed"
        assert abs(msam._noisedep.noise1 -
                   mone._noisedep.noise) < 0.1 * mone._noisedep.noise
    def setUp(self):
        self.basic = ddm.Model(dx=.005,
                               dt=.01,
                               T_dur=2,
                               drift=ddm.DriftConstant(drift=.4),
                               noise=ddm.NoiseConstant(noise=1),
                               bound=ddm.BoundConstant(B=1))

        class NoiseCond(ddm.Noise):
            name = "Noise with a condition"
            required_conditions = ['cond']
            required_parameters = []

            def get_noise(self, conditions, **kwargs):
                return conditions["cond"]

        self.withcond = ddm.Model(noise=NoiseCond())
Exemple #9
0
    )
    c.ax(axname).axis("off")
    c.ax(axname + "_top").axis("off")
    c.ax(axname + "_bot").axis("off")
# End top bottom axes

# Begin finalize hist
def finalize_hists(axname):
    c.ax(axname + "_bot").set_ylim(c.ax(axname + "_top").get_ylim())
    c.ax(axname + "_bot").invert_yaxis()
# End finalize hist


# Begin model
T_dur = 2
model = Model(drift=ddm.DriftConstant(drift=0.8), dt=0.01, dx=0.01)
# End model

# Begin create trajectories
def draw_trials(model, axname, N=1, seedstart=7, alpha=1):
    # Create three-rowed figure
    add_hists(axname)

    # Draw DDM axes
    ax = c.ax(axname)
    ax.plot([0, T_dur], [0, 0], c="gray", clip_on=False, lw=0.5)
    ax.plot([0, T_dur], [1.04, 1.04], c="red", clip_on=False, lw=2)
    ax.plot([0, T_dur], [-1.04, -1.04], c="red", clip_on=False, lw=2)
    # sns.despine(bottom=True, ax=ax_main)
    ax.get_xaxis().set_ticks([])
    ax.get_yaxis().set_ticks([])