Kalman filter basics
Here, we summarize the basic theory of Kalman filtering. For more details, see, e.g., Brown and Hwang (1997).
In a Kalman filter, the estimation is done sequentially, epoch by epoch. It is assumed that the unknown parameters, \(\vec {x}\), can be described by stochastic processes. Thus, their values at epoch t
_{
i
} can be related to their values at epoch t
_{
i−1} by:
$$ \vec{x}(t_{i})= F(t_{i})\,\vec{x}(t_{i1})+\vec{w}_{i} $$
((1))
where F(t
_{
i
}) is the state transition matrix and \(\vec {w}_{i}\) the process noises of the stochastic processes. At epoch t
_{
i
}, we have the observations \(\vec {z}(t_{i})\), which are related to \(\vec {x}(t_{i})\) by:
$$ \vec{z}(t_{i})= H(t_{i})\,\vec{x}(t_{i})+\vec{v}_{i} $$
((2))
where H(t
_{
i
}) is the design matrix of the observation model and \(\vec {v}\) is the observation noise.
Given the estimates of the parameters at epoch t
_{
i−1}, \(\vec {x}(t_{i1})\) and their variancecovariance matrix P(t
_{
i−1}), we can predict their values at epoch t
_{
i
}, \(\vec {x}_{p}(t_{i})\) by:
$$\begin{array}{@{}rcl@{}} \vec{x}_{p}(t_{i})&=&F(t_{i})\,\vec{x}_{i1} \end{array} $$
((3))
$$\begin{array}{@{}rcl@{}} P_{p}(t_{i})&=&F(t_{i})\,P(t_{i1})\,F(t_{i})^{T}+Q(t_{i}) \end{array} $$
((4))
P
_{
p
}(t
_{
i
}) is the variancecovariance matrix of \(\vec {x}_{p}(t_{i})\) and Q(t
_{
i
}) the variancecovariance matrix of the process noise (prediction error) (\(Q(t_{i})=\left <\vec {w}_{i}\vec {w}_{i}^{T}\right >\)). The prediction can be combined with the observations \(\vec {z}(t_{i})\) to find the optimum estimates of the parameters at t
_{
i
}, \(\vec {x}(t_{i})\), and the corresponding variancecovariance matrix P(t
_{
i
}):
$$\begin{array}{@{}rcl@{}} \vec{x}(t_{i})&=&\vec{x}_{p}(t_{i})+K(t_{i})\left[z(t_{i})H(t_{i})\,\vec{x}_{p}(t_{i})\right] \end{array} $$
((5))
$$\begin{array}{@{}rcl@{}} P(t_{i})&=&P_{p}(t_{i})K(t_{i})\,H(t_{i})\,P_{p}(t_{i}) \end{array} $$
((6))
The Kalman filter gain, K(t
_{
i
}), is given by:
$$ K(t_{i})=P_{p}(t_{i})\,H(t_{i})^{T}\,\left[R(t_{i})+H_{i}\,P_{p}(t_{i})\,H(t_{i})^{T}\right]^{1} $$
((7))
where R(t
_{
i
}) denotes the variancecovariance matrix of the observation noise (\(R(t_{i})=\left <\vec {v}_{i}\vec {v}_{i}^{T}\right >\)).
The Kalman filter is initialized by an initial guess for the unknown parameters at the first epoch, \(\vec {x}_{p}(t_{0})\), and its corresponding variancecovariance matrix P
_{
p
}(t
_{0}). Then, the filter runs forward in time, epoch by epoch, until the last epoch is processed. The parameters modeled as being constant in time, e.g., what is normally the case for station and radio source coordinates, are improved at every epoch and thus the estimates at the last epochs are the final estimates of these parameters. For parameters having temporal variations, like the clocks and the tropospheric parameters, the situation is different. Since the filter is run sequentially forward in time, the estimates of these parameters at a specific epoch will only be dependent on the observations acquired at and prior to this epoch. Thus, especially in the beginning before the Kalman filter has converged, the results will have a high uncertainty and thus be rather unreliable. As an example, Fig. 1 shows the ZWD for NyÅlesund estimated with a Kalman filter running forward in time for the VLBI session on 12 August 2008. We can see that the ZWD is highly variable in the first couple of hours before it stabilizes. To solve this issue and get reliable results also in the beginning, we also run the filter backward in time, starting from the last epoch and finishing at the first epoch. This backward Kalman filter loop is initialized with the estimates of the forward Kalman filter loop at the last epoch, thus it does not need any time to converge like the forward Kalman filter loop and gives more reliable estimates for all epochs (see Fig. 1). Nevertheless, the results from the backward Kalman filter loop will still not be optimal since the estimates at an epoch will mostly depend on the estimates at this and later epochs and not so much on the observations at earlier epochs. Thus, we calculate a smoothed solution, \(\vec {x}_{s}\), by optimally combining the results of the forward loop, \(\vec {x}_{f}\), with those obtained by the backward loop, \(\vec {x}_{b}\):
$$\begin{array}{@{}rcl@{}} P_{s}(t_{i})&=&\left[P_{f}(t_{i})^{1}+P_{b}(t_{i})^{1}\right]^{1} \end{array} $$
((8))
$$\begin{array}{@{}rcl@{}} \vec{x}_{s}(t_{i})&=&P_{s}(t_{i})\,\left[P_{f}(t_{i})^{1}\vec{x}_{f}(t_{i})+P_{b}(t_{i})^{1}\vec{ x}_{b}(t_{i})\right] \end{array} $$
((9))
where P
_{
s
}(t
_{
i
}), P
_{
f
}(t
_{
i
}), and P
_{
b
}(t
_{
i
}) are the variancecovariance matrices of \(\vec {x}_{s}(t_{i})\), \(\vec {x}_{f}(t_{i})\), and \(\vec {x}_{b}(t_{i})\), respectively. As seen in Fig. 1, this gives more smoothed time series compared to the forward and backward Kalman filter solutions.
Implementation in VieVS@GFZ
We have implemented a Kalman filter solution, using the algorithms described in the previous subsection, in VieVS@GFZ (Karbon et al. 2013). This is an extended version of VieVS version 2.1 (Madzak et al. 2013), which has been developed at the GFZ since 2013. The software is written in Matlab, which makes it flexible and easy to adapt for special investigations. The general structure of this software is shown in Fig. 2. The main modules of VieVS@GFZ are:

VIE_INIT: This module reads in the VLBI observations (and auxiliary parameters like meteorological data and cable calibration) from the observation data files. Currently, the software is working with NGScard files, however it is planned to also implement the new vgosDB format (Gipson 2014) in the near future.

VIE_MOD: This module calculates the theoretical delays as well as the partial derivatives w.r.t. the parameters of interest. These calculations are by default done according to the latest IERS Conventions (Petit and Luzum 2010) and the IVS Standards regarding thermal deformations (Nothnagel 2009), however, the software is flexible and for some parts, alternative models can be applied. For example, in all the analyzes presented in this work, we have also taken into account nontidal atmospheric loading (Petrov and Boy 2004).

VIE_LSM: This module estimates the unknown parameters with LSM. It is possible to estimate clocks, tropospheric zenith wet delays (ZWD), tropospheric gradients, station coordinates, radio source coordinates, and EOP. The parameters are typically modeled as continuous piecewise linear functions (Teke et al. 2009). The lengths of the estimation intervals can be freely chosen; for the LSM solutions presented in this work, we applied 30 min for clocks and ZWD, 2 h for gradients, while for station coordinates, radio source coordinates, and EOP, we estimated constant offsets valid for the whole session. The datum of the station coordinates was realized by applying NoNetTranslation (NNT) and NoNetRotation (NNR) condition relative to the a priori ITRF2008 (Altamimi et al. 2011) coordinates. Similarly, the datum of the radio source coordinates was realized by applying NNR conditions for the ICRF2 (Fey et al. 2009) defining sources. In order to stabilize the solution, relative constraints are applied for the piecewise linear functions as pseudoobservations. In this work, we used the following constraints: 1.5 cm/(30 min) for ZWD, 0.5 mm/(2 h) for the gradients, and 1.3 cm/(30 min) for the clocks.

VIE_KALMAN: This is the newly implemented Kalman filter solution, which is an alternative to VIE_LSM. It is able to estimate exactly the same parameters as VIE_LSM does.
It should be noted that the first two parts (VIE_INIT and VIE_MOD) are independent on what estimation module is used (VIE_LSM or VIE_KALMAN). In addition to these main modules, there are separate modules for scheduling (VIE_SCHED, (Sun et al. 2014)), simulations (VIE_SIM, (Pany et al. 2011)), and global solution (VIE_GLOB, (Krásná et al. 2014)). VIE_GLOB can currently only use the normal equations produced by VIE_LSM, but it is planned to also make it possible to use the output from VIE_KALMAN in the future.
Currently, the software starts the analysis with version 4 NGS card files, meaning that the group delay ambiguities have already been resolved and the ionospheric corrections have been calculated. We are presently developing a module for doing also these parts, which would allow us to start from the version 1 NGS/vgosDB files. Outliers are detected after running VIE_LSM/VIE_KALMAN by applying an outlier test (here, a simple 5 σ outlier test was used) or by manual inspection and are then removed in a second run already when reading in the data in VIE_INIT. Clock breaks currently need to be manually detected by investigating the postfit residuals. The clock breaks are then removed in a first, simple solution where in principle only clock parameters are estimated. For VIE_LSM, this first solution is an LSM solution, while for VIE_KALMAN, it is possible to choose between a Kalman filter and an LSM solution. In this work, we applied the LSM option in VIE_KALMAN, however tests show that this has only a minor impact on the results. We consistently applied the outliers and the clock breaks detected in the GFZ contribution to ITRF2014 (Heinkelmann et al. 2014) (a solution calculated with VIE_LSM) in both the LSM and Kalman filter solutions.
For the Kalman filter, we need to specify the stochastic processes driving the variations in the parameters, what is needed for calculating the matrices F(t
_{
i
}) and Q(t
_{
i
}) of Eqs. (3) and (4). For an overview of different stochastic processes which are suitable for modeling the parameters estimated by VLBI, see Herring et al. (1990). In our implementation, the clocks can be modeled as random walk processes or integrated random walk processes. In this work, we used the integrated random walk process and we set the power spectral density (PSD) of the clock rates process noise to 0.64 ns^{2}/day^{3}, what corresponds to an Allan standard deviation of 10^{14} over 50 min (typical stability of an hydrogen maser used at the VLBI stations). The ZWD are modeled as random walk processes, and in this work, we assumed a PSD of 58 cm^{2}/day for the process noise, as suggested (Herring et al. 1990). For a description of how to estimate the PSD for the different parameters and the effect of using these values, see of using these values, see (2015). The tropospheric gradients are modeled as firstorder GaussMarkov processes, and we assumed a time constant of 3 h and a process noise PSD of 0.025 cm^{2}/day in the present study. The station coordinates, the radio source coordinates, and the EOP are all modeled as random walk processes. However, in this work, we set the PSD of the white noises driving these random walk processes to zero, thus effectively constant values were estimated for these parameters. Furthermore, for the station and radio source coordinates we realized the datum by including additional pseudoobservations in the matrix H
_{
i
} (Eq. (2)) at every epoch. The datum of the station coordinates was defined by NNT and NNR conditions relative to ITRF2008 (Altamimi et al. 2011) for all the stations of the session included in the ITRF2008 catalog. In this way, we make sure that the Kalman filter update will not introduce any net translation or rotation for the datum stations. For the radio source coordinates, we similarly imposed a NNR condition for all the ICRF2 (Fey et al. 2009) defining sources observed in the session.