Пример #1
0
    def to_carmapack_params(self, p):
        p = self.to_params(p)

        mu = par.bounded_values(p['logit_mu'],
                                low=self.mu_min,
                                high=self.mu_max)
        sigma = par.bounded_values(p['logit_sigma'],
                                   low=self.sigma_min,
                                   high=self.sigma_max)
        nu = par.bounded_values(p['logit_nu'],
                                low=self.nu_min,
                                high=self.nu_max)

        pc = np.zeros(self.nparams)

        pc[0] = sigma
        pc[1] = nu * nu  # carma_pack wants variance scaling
        pc[2] = mu

        assert self.p >= 1, 'Must have at least one AR root'
        pc[3:3 + self.p] = self._roots_to_quad(
            par.stable_polynomial_roots(p['ar_roots_p'], self.root_min,
                                        self.root_max))

        if self.q >= 1:
            pc[3 + self.p:] = self._roots_to_quad(
                par.stable_polynomial_roots(p['ma_roots_p'], self.root_min,
                                            self.root_max))

        return pc
Пример #2
0
    def kep_deparameterize(self, kps):
        dkps = np.zeros_like(kps)

        dkps[:,0] = par.bounded_values(kps[:,0], low=0, high=0.1) # bounded(K, 0, 100 m/s) => K
        dkps[:,1] = par.bounded_values(kps[:,1], low=0, high=self.T) # bounded(P, 0, T) => P
        dkps[:,2] = par.bounded_values(kps[:,2], low=0, high=1) # bounded(e, 0, 1) => e
        dkps[:,3] = par.bounded_values(kps[:,3], low=0, high=2*np.pi) # bounded(omega, 0, 2*pi) => omega
        dkps[:,4] = par.bounded_values(kps[:,4], low=0, high=1) # bounded(chi, 0, 1) => chi

        return dkps
Пример #3
0
    def log_prior(self, p):
        p = self.to_params(p)

        lp = 0.0

        # mu
        lp += par.bounded_log_jacobian(p['logit_mu'],
                                       low=self.mu_min,
                                       high=self.mu_max)

        # sigma
        lp += par.bounded_log_jacobian(p['logit_sigma'],
                                       low=self.sigma_min,
                                       high=self.sigma_max)
        sigma = par.bounded_values(p['logit_sigma'],
                                   low=self.sigma_min,
                                   high=self.sigma_max)
        lp -= np.log(sigma)

        # nu
        lp += par.bounded_log_jacobian(p['logit_nu'],
                                       low=self.nu_min,
                                       high=self.nu_max)
        nu = par.bounded_values(p['logit_nu'],
                                low=self.nu_min,
                                high=self.nu_max)
        lp -= np.log(nu)

        # ar roots
        lp += par.stable_polynomial_log_jacobian(p['ar_roots_p'],
                                                 self.root_min, self.root_max)
        roots = par.stable_polynomial_roots(p['ar_roots_p'], self.root_min,
                                            self.root_max)

        lp -= np.sum(np.log(np.abs(roots)))

        if self.q >= 1:
            lp += par.stable_polynomial_log_jacobian(p['ma_roots_p'],
                                                     self.root_min,
                                                     self.root_max)
            roots = par.stable_polynomial_roots(p['ma_roots_p'], self.root_min,
                                                self.root_max)

            lp -= np.sum(np.log(np.abs(roots)))

        if np.isnan(lp):
            lp = -np.inf

        return lp
Пример #4
0
    def deparameterize(self, p):
        p = self.to_params(p)

        mu = par.bounded_values(p['logit_mu'],
                                low=self.mu_min,
                                high=self.mu_max)
        sigma = par.bounded_values(p['logit_sigma'],
                                   low=self.sigma_min,
                                   high=self.sigma_max)
        nu = par.bounded_values(p['logit_nu'],
                                low=self.nu_min,
                                high=self.nu_max)

        ar_roots = self.ar_roots(p)

        arr = []
        for i in range(0, ar_roots.shape[0] - 1, 2):
            ar1 = ar_roots[i]
            ar2 = ar_roots[i + 1]
            if np.imag(ar1) > 0:
                arr.append(np.real(ar1))
                arr.append(np.abs(np.imag(ar1)))
            else:
                arr.append(np.real(ar1))
                arr.append(np.real(ar2))
        if ar_roots.shape[0] % 2 == 1:
            arr.append(np.real(ar_roots[-1]))
        arr = np.array(arr)

        if self.q > 0:
            ma_roots = self.ma_roots(p)

            mar = []
            for i in range(0, ma_roots.shape[0] - 1, 2):
                ma1 = ma_roots[i]
                ma2 = ma_roots[i + 1]
                if np.imag(ma1) > 0:
                    mar.append(np.real(ma1))
                    mar.append(np.abs(np.imag(ma1)))
                else:
                    mar.append(np.real(ma1))
                    mar.append(np.real(ma2))
            if ma_roots.shape[0] % 2 == 1:
                mar.append(np.real(ma_roots[-1]))
            mar = np.array(mar)

            return np.concatenate((mu, sigma, nu, arr, mar))
        else:
            return np.concatenate((mu, sigma, nu, arr))
Пример #5
0
    def kep_deparameterize(self, kps):
        dkps = np.zeros_like(kps)

        dkps[:,
             0] = par.bounded_values(kps[:, 0], low=0,
                                     high=0.1)  # bounded(K, 0, 100 m/s) => K
        dkps[:, 1] = par.bounded_values(kps[:, 1], low=0,
                                        high=self.T)  # bounded(P, 0, T) => P
        dkps[:, 2] = par.bounded_values(kps[:, 2], low=0,
                                        high=1)  # bounded(e, 0, 1) => e
        dkps[:,
             3] = par.bounded_values(kps[:, 3], low=0, high=2 *
                                     np.pi)  # bounded(omega, 0, 2*pi) => omega
        dkps[:, 4] = par.bounded_values(kps[:, 4], low=0,
                                        high=1)  # bounded(chi, 0, 1) => chi

        return dkps
Пример #6
0
    def white_noise(self, p, bw):
        p = self.to_params(p)

        nu = par.bounded_values(p['logit_nu'],
                                low=self.nu_min,
                                high=self.nu_max)

        return self.wn_var * nu * nu / bw
Пример #7
0
    def simulate(self, p, ts, dys=None):
        p = self.to_params(p)

        kfilter = self._make_kalman_filter(p)

        vtime = cm.vecD()
        vtime.extend(ts)

        ysim = np.asarray(kfilter.Simulate(vtime))

        if dys is not None:
            nu = par.bounded_values(p['logit_nu'],
                                    low=self.nu_min,
                                    high=self.nu_max)
            ysim = ysim + np.random.randn(ysim.shape[0]) * dys * nu

        mu = par.bounded_values(p['logit_mu'],
                                low=self.mu_min,
                                high=self.mu_max)

        return ysim + mu
Пример #8
0
    def residuals(self, p):
        p = self.to_params(p)

        kfilter = self._make_kalman_filter(p)

        kmean = np.asarray(kfilter.GetMean())
        kvar = np.asarray(kfilter.GetVar())

        mu = par.bounded_values(p['logit_mu'],
                                low=self.mu_min,
                                high=self.mu_max)

        return (self.y - mu - kmean), kvar
Пример #9
0
    def _make_kalman_filter(self, p):
        p = self.to_params(p)

        ar_roots = self.ar_roots(p)
        ma_coefs = self.ma_poly(p)

        mu = par.bounded_values(p['logit_mu'],
                                low=self.mu_min,
                                high=self.mu_max)
        nu = par.bounded_values(p['logit_nu'],
                                low=self.nu_min,
                                high=self.nu_max)

        s = par.bounded_values(p['logit_sigma'],
                               low=self.sigma_min,
                               high=self.sigma_max)

        sigma = s / np.sqrt(cm.carma_variance(1.0, ar_roots, ma_coefs))
        sigmasq = sigma * sigma
        sigmasq = float(sigmasq)

        tv = cm.vecD()
        tv.extend(self.t)
        yv = cm.vecD()
        yv.extend(self.y - mu)
        dyv = cm.vecD()
        dyv.extend(self.dy * nu)
        arv = cm.vecC()
        arv.extend(ar_roots)
        mav = cm.vecD()
        mav.extend(ma_coefs)
        kfilter = cm.KalmanFilterp(tv, yv, dyv, sigmasq, arv, mav)

        kfilter.Filter()

        return kfilter
Пример #10
0
    def predict(self, p, ts):
        p = self.to_params(p)

        kfilter = self._make_kalman_filter(p)

        ypred = []
        ypred_var = []
        for t in ts:
            yp = kfilter.Predict(t)
            ypred.append(yp.first)
            ypred_var.append(yp.second)

        mu = par.bounded_values(p['logit_mu'],
                                low=self.mu_min,
                                high=self.mu_max)

        return np.array(ypred) + mu, np.array(ypred_var)
Пример #11
0
    def power_spectrum(self, fs, p):
        p = self.to_params(p)

        ar_roots = self.ar_roots(p)
        ma_roots = self.ma_roots(p)

        ar_coefs = np.real(np.poly(ar_roots))

        ma_coefs = np.real(np.poly(ma_roots))
        ma_coefs /= ma_coefs[-1]
        ma_coefs = ma_coefs[::-1]

        s = par.bounded_values(p['logit_sigma'],
                               low=self.sigma_min,
                               high=self.sigma_max)

        sigma = s / np.sqrt(cm.carma_variance(1.0, ar_roots, ma_coefs))

        return cm.power_spectrum(fs, sigma, ar_coefs, ma_coefs)